网络编程5——TCP协议的五大效率机制:滑动窗口+流量控制+拥塞控制+延时应答+捎带应答

news2024/11/16 17:49:56

文章目录

  • 前言
  • 一、TCP协议段与机制
    • TCP协议的特点
    • TCP报头结构
    • TCP协议的机制与特性
  • 二、TCP协议的 滑动窗口机制
  • 三、TCP协议的 流量控制机制
  • 四、TCP协议的 拥塞控制机制
  • 五、TCP协议的 延时应答机制
  • 六、TCP协议的 捎带应答机制
  • 总结


前言

本人是一个普通程序猿!分享一点自己的见解,如果有错误的地方欢迎各位大佬莅临指导,如果这篇文章可以帮助到你,劳请大家点赞转发支持一下!

本文讲解了TCP在保证安全可靠的前提下,提高效率的五大机制。


一、TCP协议段与机制

TCP协议的特点

特点说明
有连接刻意保存对端的相关信息
可靠传输尽全力将数据传输过去不是百分百成功,自己会知道数据传输是否成功
面向字节流以一个字节为基本单位(一个数据可以分成几份 多次发多次收)
有接收缓冲区,也有发送缓冲区后续文章介绍
大小不受限对于要传输的数据大小没有要求
全双工一条通信路径,双向通信。(可以同时发送和接收数据)

TCP报头结构

在这里插入图片描述

6位标志位
在这里插入图片描述


TCP协议的机制与特性

TCP的协议段格式,比UDP的协议段格式复杂一万倍!😵😵
所以他的机制与功能也比UDP更加强大!!😇😇

TCP对数据传输提供的管控机制,主要体现在两个方面: 安全和效率
这些机制和多线程的设计原则类似: 保证数据传输安全的前提下,尽可能的提高传输效率

TCP协议的机制与特性
1️⃣确认应答
2️⃣超时重传
3️⃣连接管理
4️⃣滑动窗口
5️⃣流量控制
6️⃣拥塞控制
7️⃣延时应答
8️⃣捎带应答
9️⃣面向字节流
🔟异常处理

  • 1️⃣-5️⃣是TCP协议保证数据传输安全的 安全机制
  • 6️⃣-8️⃣是TCP协议提高传输效率的 效率机制
  • 9️⃣-🔟是TCP协议的 其他特性

二、TCP协议的 滑动窗口机制

TCP协议中确认应答机制,对每一个发送的数据段,都要给一个ACK确认应答。收到ACK后再发送下一个数据段。
这样做有一个比较大的缺点,就是性能较差。

在这里插入图片描述

如上图,如果在数据往返的时间较长的时候,等待数据送达后,还要再等待ACK,这一来一返的时间就浪费了,后面要发送的数据全都得等着排队,效率就不高。


因此为了在保证可靠传输的前提下尽可能的提高效率,就引入了 滑动窗口机制

在这里插入图片描述

如上图,规定可以批量传输数据(同时发送多个数据段)。
相当于有一个窗口,窗口里的数据都可以同时发送,这些数据段的大小加在一起等于窗口大小。


假设窗口大小为4000个字节,每条数据段的大小为1000字节。

同时发送4个数据段,然后等待ACK,等到了一个呢,就可以证明有1个大小为1000个字节的数据段,送到了,那么此时就是只有3个数据段,3000个字节大小的数据在发送中。

但是窗口大小为4000个字节,所以我还可以再同时发送1000个字节的数据。窗口向下移动,再发送一个数据大小为1000字节的数据段。

这就是滑动窗口的原理: 规定一个窗口可以同时发送多少数据,当有ACK返回,确定有多少数据送到了,就再发送多少数据,从而达到了提高效率的目的。 规当传输速度足够快时,那么窗口就变成了滑动,因此叫做窗口滑动。


那么如果发生了丢包怎么办?

第一种情况:ACK丢包了

在这里插入图片描述

如上图,前三个ACK都丢包了,那也毫无影响,只要第四个ACK送达了,就没啥,因为ACK中的确认序号就是告诉他,确实序号之前的字节都收到了,因此只要最后一个ACK没丢就没事。

如果是最后一个包丢了,或者是最后几个都丢了,那就会触发超时重传机制。TCP安全第一位


第二种情况:数据丢包了

此时采取的策略为:只重传丢了的数据,不丢的数据不重传。
这个策略也称之为快速重传。

在这里插入图片描述

如上图,第二个数据段丢了,那么 后续所有应答报文中的确认序号就会一直是1001(即索要1001及以后的数据), 不会因为2001-3000送达而改变,会一直保持到1001以后的数据送到。

在这里插入图片描述

主机B当中会有一个接收缓冲区,采用特定的数据结构去组织这些收到的数据, 当1001-2000的数据送达时, 会自动排序调整位置。然后ACK中的确认序号就继续变为4001。

使用数据会从缓冲区当中拿数据,但是如果传输速度太快,那么缓冲区也会满。
如果缓冲区满了,你再发送过来数据,不会阻塞等待而是将你发来的数据直接丢掉,这就造成了效率浪费。


这就引出了另外两个个效率机制:流量控制机制与拥塞控制机制。


三、TCP协议的 流量控制机制

流量控制机制也对保证可靠传输有一定作用。

窗口滑动机制,提高了效率。但是接收缓冲区的空间也有限,如果接收缓冲区满了,那么再传输数据也是丢包,此时还不如传的慢一点。

所以啊就有了流量控制机制。

流量控制机制: 让报文中携带一个"窗口大小"这样的字段,来进行流量控制,只有ACK标志位为1时,即ACK报文才会生效

"窗口大小"的作用:建议发送方的滑动窗口大小(建议不是一定,但是作用也很大)

接收缓冲区满了,即"窗口大小"为0: 发送方暂停发送,每隔一段时间发一个窗口探测报文,如果"窗口大小"不是0了,就继续发送。


四、TCP协议的 拥塞控制机制

一条数据由一台设备发送到另一台设备中,这中间序列经过一系列的中间节点(很多个交换机和路由器)。

如果传输路径上的任何一个节点的发送能力遇到瓶颈(收发数据太多等问题),那么对经过这个节点的数据的传输速率都会产生明显的影响。
即数据传输的快不快,取决于整体路径上最慢的节点(木桶效应)。

拥塞控制: 衡量中间节点(传输路径上发送方与接收方之外的节点)的传输能力,得出一个拥塞窗口大小 ,来避免因为个别节点拉跨而带来的效率浪费。

因为网络环境复杂,每次传输可能走的路径都不同,且各个节点的传输能力也不是一成不变的(用户多时,可能就慢,用户少时,可能就快)。
因此拥塞窗口的计算方法是实验法:通过实验的方式,找到一个合适的发送速率,实现动态平衡。

拥塞窗口的计算方法:
1️⃣:开始时,以一个小速率来传输数据。
2️⃣:如果没有发送丢包,慢慢加快这个速率。
3️⃣:如果出现丢包,立即把速率再减小。
4️⃣:重复2️⃣3️⃣。

感兴趣的朋友可以去搜一下具体的计算方法。

“窗口大小” 取 流量控制(衡量接收方的处理能力) 拥塞控制(衡量中间节点的处理能力) 这两个中最小的那一个。


五、TCP协议的 延时应答机制

延时应答机制:将确认应答机制中的ACK应答报文,延时发送。

为什么延时发送ACK会提高效率呢?

TCP中决定传输效率的关键元素是"窗口大小"。
"窗口大小"取决与流量控制与拥塞控制。
而流量控制就取决于接收方的接收缓冲区。


这里咱们要搞清楚一个事情:
发送方一直发送数据(一直生产),而应用程序一直从接收方的接收缓冲区中读取数据(一直消费)。


如果立刻返回ACK,那么ACK的"窗口大小"假设为n
如果稍微等一会会,那么等的这一会,应用程序就会在这一会中消费一些数据,因此再返回ACK,那么"窗口大小"就大概率会比n大。


所以通过延时一会发送ACK,使得ACK中的"窗口大小"变大一点,传输速率也就快一点。

不是所有的包都可以延迟应答

  • 数量限制:每隔N个包就应答一次(操作系统不同N也各有差异)
  • 时间限制:超过最大延迟时间就应答一次

六、TCP协议的 捎带应答机制

捎带应答机制是基于延时应答机制开发的。

一般客户端服务器模型都是一问一答的形式。 即客户端发送一个请求request,服务器返回一个响应response。

正常流程:

1️⃣客户端向服务器发送一个request。
2️⃣服务器收到reques,并返回一个应答报文ACK
3️⃣服务器返回一个response
4️⃣客户端收到response,并返回一个应答报文

基于延时应答于捎带应答机制:

1️⃣客户端向服务器发送一个request。
2️⃣服务器收到reques(延时应答,让ACK暂缓发送)
3️⃣服务器返回一个 (response+ACK)报文 (如果response在ACK发送前就计算完毕,那么就会触发捎带应答机制,把response与ACK合并)
4️⃣客户端收到(response+ACK)报文,并返回一个应答报文

四次挥手有可能是三次挥手也与上述流程相同。

发送一个一定比发送两个快,所以效率得到了提高。


总结

以上就是今天要讲的内容,本文分享了TCP协议的五大效率机制,讲述了TCP在保证安全可靠的前提下是如何提高效率的,尽管如此,TCP的效率仍然没有UDP快,保证安全可靠必然会牺牲一部分效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/734742.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c语言进阶-printf的用法拓展

Printf函数打印方法拓展: 字符串赋值给指针,相当于把h的地址赋值给p了。 printf函数直接放字符串也是把首地址给printf,然后printf从首地址打印到\0。 打印时可以直接传p地址

IDEA使用教程

1. 查看代码历史版本 若要查看特定 Java 类的代码历史版本,请执行以下操作: 鼠标右键点击所需查看的 Java 类。 在弹出菜单中选择 "Local History"(本地历史) >> "Show History"(显示历史…

云尚办公项目-搭建环境

硅谷项目,由尚硅谷分享,具体项目视频可以根据B站尚硅谷进行学习。搭建项目可以直接根据Spring Boot进行获取,本次主要是个人的的一些分析操作 后面代码主要以分析为主,相关内容不会的,可以观看尚硅谷视频 一、下载配套…

MySQL数据库——多表查询练习

一、练习素材 创建表 -- 创建部门表 create table if not exists dept3( deptno varchar(20) primary key , -- 部门号 name varchar(20) -- 部门名字 );-- 创建员工表 create table if not exists emp3( eid varchar(20) primary key , -- 员工编号 ename varchar(20), -- 员…

【雕爷学编程】Arduino动手做(153)---2.4寸TFT液晶触摸屏模块6

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

详解c++---布隆过滤器

目录标题 位图的优缺点为什么会有布隆过滤器:布隆过滤器的应用场景:布隆过滤器的实现布隆过滤器的测试 位图的优缺点 位图的优点: 1.位图可以节省空间,位图判断存储的数据是在还是不在只用一个比特位就可以记录数据出现的情况&a…

【毕业季·进击的技术er】大学生计算机毕业设计应该这样写

活动地址:毕业季进击的技术erhttps://marketing.csdn.net/p/f4a818f6455f3a9a7a20c89f60ad35f7 目录 扉页 摘要 目录 一 绪论 二、相关技术环境介绍 三、系统需求分析 四、系统架构设计 五、系统实现 六、系统测试 致谢 参考文献 以一个过来学长的角度来看…

SQl排序与分页

1. 排序数据 1.1 排序规则 使用 ORDER BY 子句排序 ASC(ascend): 升序DESC(descend):降序 ORDER BY 子句在SELECT语句的结尾。 1.2 单列排序 SELECT last_name, job_id, department_id, hire_date FROM employees ORDER…

元素配对----贪心1 (爱思创)

源代码 #include <bits/stdc.h> using namespace std; int main() {int n,data,sum0;cin>>n;vector<int> vec1,vec2;for(int i0; i<n; i){cin>>data;vec1.push_back(data);}for(int i0; i<n; i){cin>>data;vec2.push_back(data);}sort(ve…

linux下查看cpu使用率和内存占用

top top命令是Linux下常用的性能分析工具&#xff0c;能够实时显示系统中各个进程的资源占用状况&#xff0c;类似于Windows的任务管理器&#xff0c;下面详细介绍它的使用方法&#xff1b; top是一个动态显示过程&#xff0c;即可通过用户按键来不断刷新当前状态。如果在前台…

前端启动出现报错,提示vue-cli-service serve的解决办法

前端启动出现报错&#xff0c;提示vue-cli-service serve的解决办法 在命令行中使用命令 npm run dev运行从网上下载的一个vue项目时出现了以下报错&#xff1a; 原因&#xff1a; 原因是因为 node_modules文件的缺失 npm install再次执行 npm run dev启动成功

Java爬虫之CentOS7 安装Selenium+chrome+chromedriver+java【Java动态爬虫爬取数据环境安装一篇文章精通系列】

在这篇文章中&#xff0c;我们将学习如何在 CentOS 7 系统上安装 Java 动态爬虫所需的环境&#xff1a;Selenium、Chrome 浏览器和 ChromeDriver。这个教程将帮助你掌握如何搭建一个用于数据爬取的环境。 一、安装 chrome yum install https://dl.google.com/linux/direct/go…

JConsole或者JvisualVM远程连接jetty进行jvm监控

最近项目发现了服务有内存泄漏的问题&#xff0c;但是在jvm上并没有配置即jvm没有配置 -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/tmp/heapdump.hprof 这两个参数&#xff0c;导致在发生了oom后只能看到日志中有OOM异常&#xff0c;其他的并不能分析出来&#xff0c;等…

手机快充协议

高通:QC2.0、QC3.0、QC3.5、QC4.0、QC5.0、 FCP、SCP、AFC、SFCP、 MTKPE1.1/PE2.0/PE3.0、TYPEC、PD2.0、PD3.0/3.1、VOOC 支持 PD3.0/PD2.0 支持 QC3.0/QC2.0 支持 AFC 支持 FCP 支持 PE2.0/PE1.1 联发科的PE&#xff08;Pump Express&#xff09;/PE 支持 SFCP 在PP…

【035】C++泛型编程(模板)实践:设计数组类模板模仿vector容器

C泛型编程&#xff08;模板&#xff09;实践 引言一、类模板的概述二、实现数组类模板三、类模板的继承3.1、类模板派生出普通类3.2、类模板派生出类模板 总结 引言 &#x1f4a1; 作者简介&#xff1a;专注于C/C高性能程序设计和开发&#xff0c;理论与代码实践结合&#xff0…

[MySQL]MySQL表的约束

[MySQL]表的约束 文章目录 [MySQL]表的约束1. 约束的概念2. 空属性(null/not null)3. 默认值(default)4. 列描述(comment)5. 填充零(zerofill)6. 主键(primary key)7. 自增长(auto_increment)8. 唯一键(unique)9. 外键(foreign key) 1. 约束的概念 数据库通过技术手段限制数据的…

ping是什么,有什么作用?

什么是Ping Ping是一种计算机网络管理员软件实用程序&#xff0c;通常用于检查主机的可访问性。可访问性包括两个方面。一个是可用性&#xff0c;另一个是响应时间。 ping 请求可以通过大多数命令行界面中标准的 ping 命令执行。Ping是什么意思&#xff1f;它是一个实用程序&…

同步锁-线程安全问题解决方案

同步锁-线程安全问题解决方案 目录 同步锁-线程安全问题解决方案1 同步锁1.1 前言1.2 同步与异步1.3 synchronized同步关键字1.3.1 写法1.3.2 前提1.3.3 特点1.4.1练习-改造售票案例implements Runnable1.4.2 练习-改造售票案例extends Thread 1.5 之前遇到过的同步例子 2 线程…

IIC(硬件实现)-GD32

IIC&#xff08;硬件实现&#xff09;-GD32 #include "i2c.h"void i2c_init(void){i2c_deinit(I2C0);//使能外设时钟rcu_periph_clock_enable(RCU_I2C0);rcu_periph_clock_enable(RCU_GPIOB);//设置gpio口gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO…