| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 【深入浅出地详解】TCP可靠传输的保证: 重传、滑动窗口、流量控制、拥塞控制 -> 正文阅读 |
|
[网络协议]【深入浅出地详解】TCP可靠传输的保证: 重传、滑动窗口、流量控制、拥塞控制 |
目录
一、重传机制????????TCP实现可靠传输的基础,是通过序列号与确认应答。 ????????当发送端的数据到达接受主机时,接收端主机会返回一个确认应答消息,表示已经收到消息。
1.1 超时重传:????????重传机制的一个方式,以时间为驱动就是在发送数据时设定一个定时器,当超过指定的时 间RTO后,没有收到对方的ACK确认报文,就会重发该数据,也就是超时重传。 ????????以下两种情况会发生超时重传:
????????那么,首先解决 超时时间 应当怎么设置?
综上:超时重传时间RTO应当略大于报文往返时间RTT
????????如果超时重发的数据,再次超时的时候,又需要重传的时候,TCP 的策略是超时间隔加倍。 也就是每当遇到一次超时重传的时候,都会将下一次超时时间间隔设为先前值的两倍。两次超时,就说明网络环境差,不宜频繁反复发送。 ????????它存在的问题是:超时重传的周期可能相对较长,也就引出了快速重传机制。 1.2 快速重传????????TCP还有快速重传(Fast Retransmit)机制,不以时间为驱动,而是以数据驱动重传:当收 到三个相同的ACK报文时,会在定时器过期之前重传丢失的报文段。 (短时间内,比超时重传快,但是堵塞时间长了,则是快速重传更快,因为前者策略是:下一次超时时间间隔设置为先前值的两倍) ????????快速重传只解决了超时时间的问题,但是仍然面临另一个问题:重传的时候,是重传之前 的一个,还是所有的数据包?(说明这是双刃剑)
????????为了解决不知道该重传哪些报文,就有了SACK方法。 1.3 SACK方法在TCP头部【选项】中加一个SACK的东西,它可以将缓存的地图 应答 给发送方,这样发送方就知道哪些数据受到了,哪些没收到,知道了这些信息就可以只重传丢失的数据。 ????????如果要支持?SACK,必须双方都要支持。在 Linux 下,可以通过?net.ipv4.tcp_sack?参数打开这个功能(Linux 2.4 后默认打开)。 1.4 Duplicate SACK????????D-SACK,主要使用了SACK来告诉【发送方】有哪些数据被重复接受了。 ????????原因1:ACK丢包:(基于超时重发)????????原因2:网络延时(基于快速重发):? ? ? ?可见,D-SACK?有这么几个好处:
????????在 Linux 下可以通过?net.ipv4.tcp_dsack?参数开启/关闭这个功能(Linux 2.4 后默认打开)。 二、滑动窗口2.1 窗口的引入????????TCP每发送一个数据,都要进行一次确认应答,上一个数据包受到了应答信号,再发送下 一个。这样的传输方式有一个缺点:数据包的往返时间越长,通信的效率就越低。 ????????因此,TCP引入窗口的概念,不会被降低网络通信的效率。有了窗口,就可以指定窗口的 大小,窗口大小是指无需等待确认应答,因而可以据需发送数据的最大值。 ????????窗口实际上就是操作系统开辟的一个缓存空间,发送方主机在等到确认应答返回之前,必 须在缓冲区中保留已发送的数据。如果按期收到确认应答,此时数据就可以从缓存区清除。
2.2 窗口大小由接收方决定????????TCP头里有一个字段叫Window,也就是窗口大小。 ????????这个字段是接收端告诉发送端自己还有多少缓冲区可以接受数据。于是发送端就可以根据 这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。 ????????所以,通常窗口的大小是由接收方决定的。 发送方发送的数据大小不能超过接收方的窗口大小,否则接收方就无法正常接收到数据。 2.3?发送的滑动窗口????????在下图,当发送方把数据「全部」都一下发送出去后,可用窗口的大小就为 0 了,表明可 用窗口耗尽,在没收到 ACK 确认之前是无法继续发送数据了。 2.4 接收方的滑动窗口2.5? 接收窗口的大小是约等于发送窗口
三、流量控制:????????TCP通过让接收方指明希望从发送方接受的数据大小(窗口大小)来进行流量控制。 3.1? 流量控制机制(基于窗口)????????如果发送方无脑发送数据,会导致重发机制,导致网络流量的无端浪费。为了解决这种现 象,TCP提供了流量控制机制: ????????【发送方】根据【接收方】的实际接受能力控制发送的数据量,这就是流量控制。 3.2? 操作系统缓冲区与滑动窗口的关系????????实际上,发送窗口和接受窗口中所存放的字节数,都是放在操作系统内存缓冲区中的,而 操作系统的缓冲区会被操作系统调整。 ????????当应用进程没办法及时读取缓冲区的内容时,也会对我们的缓冲区造成影响。 3.3? 操作系统的缓冲区如何影响发送窗口和接收窗口呢?????????情况1:????????服务端接收窗口初始值为200,服务端收到 140 字节数据,但是服务端非常繁忙,应用进程只读取了 40 个字节,还有 100 字节占用着缓冲区,于是接收窗口收缩到了 100 (200 - 100)。 ????????情况2:? ? ? ?当接收方系统资源非常紧张时,操作系统可能直接减少了接受缓冲区大小,这是应用程序又无法及时读取缓存数据,故收缩窗口,(导致发送数据会超过接收窗口大小),那么更严重的情况就发生了,会出现数据丢失现象。 ???????? ????????所以,如果发生了先减少缓存,再收缩窗口,就会出现丢包的现象。 ????????为了防止这种情况发生,TCP 规定是不允许同时减少缓存又收缩窗口的,而是采用先收缩窗口,过段时间在减少缓存,这样就可以避免了丢包情况。 3.4? 窗口关闭????????情况1:死锁????????TCP通过让接收方指明希望从发送方接受的数据大小(窗口大小)来进行流量控制。 ????????如果窗口大小为 0 时,就会阻止发送方给接收方传递数据,直到窗口变为非 0 为止,这就是窗口关闭。 ????????(如果接收方向发送方发送的窗口非0的ACK报文在网络中丢失了,会造成死锁) ????????这会导致发送方一直等待接收方的非 0 窗口通知,接收方也一直等待发送方的数据,如不不采取措施,这种相互等待的过程,会造成了死锁的现象。 ????????情况2:定时发送窗口探测报文????????只要TCP一方受到了对方的零窗口通知,就启动持续计时器。计时器超时引起窗口探测报文,对方ACK信号会给出现在的接收窗口大小。(一般设置探测3次,每次30—60s,超次数则RST中断连接) 3.6? 糊涂窗口综合征(小数据量,大发送次数)
????????两个策略解决: ????????策略1:接收方不通告小窗口
????????策略2:发送方不发送小数据????????Nagle算法(属于延迟处理,是默认打开的,在交互性比较强的场景中,如游戏、在线聊天,则需要关闭Nagle算法),满足下面两个条件则发送数据:
四、拥塞控制4.1? 拥塞控制与流量控制区别
????????网络中出现拥塞时,如果继续发送大量数据包,可能会导致数据包时延、丢失等,这时TCP就会重传数据, ????????但是一重传就会导致网络的负担更重,于是会导致更大的延时以及更多的丢包,从而进入恶性循环。 ????????当TCP发现网络出现拥塞时,会自我牺牲,降低发送的数据量。 ????????为了在发送方调节所要发送数据的量,定义了拥塞窗口的概念。 4.2? 拥塞窗口与发送窗口????????拥塞窗口cwnd是发送方维护的一个状态变量,根据网络的拥塞程度动态变化的。 ????????之前的发送窗口swnd和接受窗口rwnd是约等于的关系。现在发送窗口为:
????????规则:
????????发生了超时重传,就会认为网络出现了拥塞。 4.3??拥塞窗口的4个控制算法
(1)慢启动算法:
? (2)拥塞避免算法:
????????始终增长,网络会慢慢进入拥塞情况,出现丢包现象,这时候要进行重传(超时重传、快速重传)。 ????????当触发了重传机制,也就进入了【拥塞发生算法】 (3)拥塞发生算法:????????超时重传和快速重传的拥塞发生算法是不同的:
(4)快速恢复算法:????????快速重传和快速恢复算法一般同时使用。快速恢复算法认为,TCP还能收到3个重复ACK,说明网络不是非常糟糕,不用像RTO超时(超时重传)那么强烈(快速恢复后,仍然呈线性增长)。 ????????在进入快速恢复之前cwnd和ssthresh已经被更新:
然后,进入快速恢复算法:
|
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 5:48:09- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |