浅谈TCP拥塞控制算法

发布者:上海IT外包来源:http://www.lanmon.net点击数:1336

最近,我花了一些时间研究TCP/IP协议。主要原因是我对TCP/IP的长期理解仅限于三次握手,所以我希望能有更深入的了解。此外,TCP/IP和Linux系统级别的许多设计可用于中间件系统体系结构。例如,TCP拥塞控制算法也可以用于受响应时间限制的中间件。更深层次的是,TCP/IP协议等基础知识和原理技术都经过了长时间的测试。它们是前辈们智慧的结晶,可以给你很多灵感和帮助。
本文中将有一些缩写。由于问题的长度,你无法解释每个问题。如果您不理解其含义,请自行搜索并成为积极寻求知识的人。
TCP协议有两个重要的控制算法,一个是流控制,另一个是阻塞控制。
TCP协议通过滑动窗口执行流控制,该窗口控制发送方的发送速度,以便接收方可以接收和处理它。拥塞控制作用于整个网络。它可以防止过多的数据包被发送到网络,避免网络过载和网络拥塞。
拥塞算法需要掌握其状态机和四种算法。拥塞控制状态机有五种状态,即开放,无序,CWR,恢复和丢失状态。这四种算法是慢启动,拥塞避免,拥塞生成算法和快速恢复。
拥塞控制状态机
与TCP一样,拥塞控制算法也有自己的状态机。当发送方收到ACK时,Linux TCP通过状态机的状态确定其下一个行为。它应该减少拥塞窗口的cwnd大小,或保持cwnd不变,或继续增加cwnd。如果处理不当,可能会导致数据包丢失或超时。
1打开状态
Open状态是拥塞控制状态机的默认状态。在这种状态下,当ACK到达时,发送方根据拥塞窗口cwnd(拥塞窗口)是小于还是大于慢启动阈值ssthre threshold(慢启动阈值),根据慢启动或拥塞避免算法调整拥塞窗口。 )。2无序状态
当发送方检测到DACK(重复确认)或SACK(选择性确认)时,状态机将转换到Disorder状态。在这种状态下,发送方遵循飞行中数据包保存的原则,即只有在旧数据包离开网络后才发送新数据包,也就是说,在发送方收到旧数据包的ACK之后,它会发送另一个包。新包装。
3 CWR状态
当发送方收到显示拥塞通知时,它不会立即减少拥塞窗口cwnd,而是将每个段减少两个ACK,直到窗口大小减半。当cwnd减少并且网络中没有重传分组时,该状态称为CWR(减少拥塞窗口)。 CWR状态可以转换为恢复或丢失状态。
4恢复状态
当发送方收到足够的(建议的三个)DACK(重复的确认)时,进入该状态。在这种状态下,每次接收到两个ACK时,拥塞窗口cnwd减少一个段,直到cwnd等于慢启动阈值ssthresh,即进入恢复状态时cwnd的大小的一半。发件人保持恢复状态,直到成功确认发送的所有数据段,然后发件人恢复到打开状态。重传超时可能会中断恢复状态并进入丢失状态。
5损失状态
当RTO(重传超时)到期时,发送方进入丢失状态。发送的所有数据都被标记为丢失,拥塞窗口cwnd被设置为段,并且发送方再次使用慢启动算法增加拥塞窗口cwnd。
丢失和恢复状态之间的区别在于,在:丢失状态中,在发送方设置为一个段之后拥塞窗口增加,而在恢复状态中,拥塞窗口只能减少。丢失状态不能被其他状态中断,因此在成功确认在丢失开始时传输的所有数据之后,发送方只能回退到打开状态。
四种算法
拥塞控制主要有四种算法:1)慢启动,2)拥塞避免,3)拥塞,4)快速恢复。这四种算法不是在一天内创建的。这四种算法的开发经历了很多时间,并且至今仍在进行优化。
慢速热启动算法 - 慢启动
所谓慢启动,即刚刚建立的TCP连接,一点一点地加速,并测试网络的承受能力,以免直接干扰网络通道的顺序。慢启动算法:
1)当建立连接时,首先用cwnd大小为1初始化拥塞窗口,指示可以发送MSS大小数据。
2)每当收到ACK时,cwnd大小增加1并线性上升。
3)每当往返延迟时间RTT(往返时间)通过时,cwnd大小直接加倍,乘以2,并且索引增加。
4)还有一个ssthresh(慢启动阈值),这是cwnd>时的上限
=ssthresh,它将进入“拥塞避免算法”(此算法将在后面提到)
拥塞避免算法 - 拥塞避免
如前所述,当拥塞窗口大小cwnd大于或等于慢启动阈值ssthresh时,进入拥塞避免算法。算法如下:
1)当接收到ACK时,cwnd=cwnd + 1/cwnd 2)每当往返延迟时间RTT通过时,cwnd大小增加1。
在慢启动阈值之后,拥塞避免算法可以避免窗口增长引起的窗口拥塞,但是缓慢增加调整到网络的最佳值。
拥塞状态算法
通常,TCP拥塞控制认为网络数据包丢失是由网络拥塞引起的。因此,通用TCP拥塞控制算法使用分组丢失作为网络进入拥塞状态的信号。有两种方法可以确定数据包丢失。一种是超时RTO [重传超时]超时,另一种是接收三次重复确认。
超时重传是TCP协议确保数据可靠性的重要机制。原理是在发送数据后启用计时器。如果在一段时间内没有收到数据报的ACK消息,则重新发送数据。直到传输成功。
但是,如果发送方收到的重复ACK超过3个,则TCP会识别出数据丢失并需要重新传输。这种机制不需要等到重传定时器到期,因此称为快速重传,而快速重传不使用慢启动算法,而是拥塞避免算法,因此这称为快速恢复算法。
超时重传RTO [重传超时]超时,TCP将重传该数据包。 TCP认为这种情况更糟,反应更强烈:
由于数据包丢失,将慢启动阈值ssthresh设置为当前cwnd的一半,即ssthresh=cwnd/2。
Cwnd重置为1
输入慢启动过程
最早的TCP Tahoe算法使用上述处理方法,但由于数据包丢失,导致cwnd重置为1,这不利于网络数据的稳定传输。因此,TCP Reno算法得到优化。当收到三个重复的确认时,TCP启动快速重传快速重传算法,而不等待重新传输RTO超时:
Cwnd大小减少到当前的一半
Ssthresh设置为减小的cwnd大小
然后输入快速恢复算法快速恢复。
快速恢复算法 - 快速恢复
TCP Tahoe是一种早期算法,因此没有快速恢复算法,而Reno算法也是如此。在进入快速恢复之前,cwnd和ssthresh已经改为原始cwnd的一半。快速恢复算法的逻辑如下:
Cwnd=cwnd + 3 * MSS,加上3 * MSS是由于收到3个重复的ACK。
重新传输DACK指定的数据包。
如果再次收到DACK,则cwnd大小增加1。
如果接收到指示重传的分组成功的新ACK,则退出快速恢复算法。将cwnd设置为ssthresh,然后输入拥塞避免算法。
如图所示,第五个数据包丢失,因此接收器接收三个重复的ACK,即ACK5。因此,当时将ssthresh设置为cwnd的一半,即6/2=3,并且cwnd设置为3 + 3=6.然后重新发送第五个包。当接收到新的ACK,即ACK11时,退出快速恢复阶段,将cwnd重置为当前的ssthresh,即3,然后进入拥塞避免算法阶段。
IT外包
>
400-635-8089
立即
咨询
电话咨询
服务热线
400-635-8089
微信咨询
微信咨询
微信咨询
公众号
公众号
公众号
返回顶部