79、TCP四大拥塞控制算法总结?(极其重要)

四大算法

拥塞控制主要是四个算法:1)慢启动,2)拥塞避免,3)拥塞发生,4)快速恢复。这四个算法不是一 天都搞出来的,这个四算法的发展经历了很多时间,到今天都还在优化中。

慢热启动算法 – Slow Start

所谓慢启动,也就是TCP连接刚建立,一点一点地提速,试探一下网络的承受能力,以免直接扰乱了 网络通道的秩序。

慢启动算法:

1) 连接建好的开始先初始化拥塞窗口cwnd大小为1,表明可以传一个MSS大小的数据。

2) 每当收到一个ACK,cwnd大小加一,呈线性上升。

3) 每当过了一个往返延迟时间RTT(Round-Trip Time),cwnd大小直接翻倍,乘以2,呈指数让升。

4) 还有一个ssthresh(slow start threshold),是一个上限,当cwnd >= ssthresh时,就会进入“拥塞避免算 法”(后面会说这个算法)

拥塞避免算法 – Congestion Avoidance

如同前边说的,当拥塞窗口大小cwnd大于等于慢启动阈值ssthresh后,就进入拥塞避免算法。算法如下:

1) 收到一个ACK,则cwnd = cwnd + 1 / cwnd

2) 每当过了一个往返延迟时间RTT,cwnd大小加一。

过了慢启动阈值后,拥塞避免算法可以避免窗口增长过快导致窗口拥塞,而是缓慢的增加调整到网络的最佳值。

拥塞发生状态时的算法

一般来说,TCP拥塞控制默认认为网络丢包是由于网络拥塞导致的,所以一般的TCP拥塞控制算法以 丢包为网络进入拥塞状态的信号。对于丢包有两种判定方式,一种是超时重传RTO[Retransmission Timeout]超时,另一个是收到三个重复确认ACK。

超时重传是TCP协议保证数据可靠性的一个重要机制,其原理是在发送一个数据以后就开启一个计时 器,在一定时间内如果没有得到发送数据报的ACK报文,那么就重新发送数据,直到发送成功为止。

但是如果发送端接收到3个以上的重复ACK,TCP就意识到数据发生丢失,需要重传。这个机制不需 要等到重传定时器超时,所以叫 做快速重传,而快速重传后没有使用慢启动算法,而是拥塞避免算法,所以这又叫做快速恢复算法。

超时重传RTO[Retransmission Timeout]超时,TCP会重传数据包。TCP认为这种情况比较糟糕,反应也比较强烈:

1.由于发生丢包,将慢启动阈值ssthresh设置为当前cwnd的一半,即ssthresh = cwnd / 2.

2.cwnd重置为1

3.进入慢启动过程

最为早期的TCP Tahoe算法就只使用上述处理办法,但是由于一丢包就一切重来,导致cwnd又重置为 1,十分不利于网络数据的稳定传递。

所以,TCP Reno算法进行了优化。当收到三个重复确认ACK时,TCP开启快速重传Fast Retransmit算 法,而不用等到RTO超时再进行重传:

1.cwnd大小缩小为当前的一半

2.ssthresh设置为缩小后的cwnd大小

3.然后进入快速恢复算法Fast Recovery。

快速恢复算法 – Fast Recovery

TCP Tahoe是早期的算法,所以没有快速恢复算法,而Reno算法有。在进入快速恢复之前,cwnd和 ssthresh已经被更改为原有cwnd的一半。快速恢复算法的逻辑如下:

1.cwnd = cwnd + 3 MSS,加3 MSS的原因是因为收到3个重复的ACK。

2.重传DACKs指定的数据包。

3.如果再收到DACKs,那么cwnd大小增加一。

4.如果收到新的ACK,表明重传的包成功了,那么退出快速恢复算法。将cwnd设置为ssthresh,然后进 入拥塞避免算法。

如图所示,第五个包发生了丢失,所以导致接收方接收到三次重复ACK,也就是ACK5。所以将 ssthresh设置当当时cwnd的一半,也就是6/2 = 3,cwnd设置为3 + 3 = 6。然后重传第五个包。当收到新的 ACK时,也就是ACK11,则退出快速恢复阶段,将cwnd重新设置为当前的ssthresh,也就是3,然后进入 拥塞避免算法阶段。

 

原文地址:https://www.cnblogs.com/crbhf/p/15124053.html