六张图带你深刻理解TCP的拥塞避免控制,建议收藏本文

TCP进行拥塞控制的算法有四种:

  1. 慢开始
  2. 拥塞避免
  3. 快重传
  4. 快恢复

首先我们需要知道一个概念就是拥塞窗口cwnd慢开始门限ssthresh传输轮次

  1. 拥塞窗口即为发送方的发送窗口,每次可以发送的数据量大小。拥塞窗口大小主要取决于网络的拥塞程度。最开始为1.
  2. 慢开始门限主要作用是起一个界定作用,当拥塞窗口大于慢开始门限后,就需要停止慢开始算法,大部分都设置为16,具体原因不详。
  3. 传输轮次就是一个往返时间RTT(非恒定)。比如如果拥塞窗口是4,那么RTT就是发送4个报文段,并收到这四个报文段总共的时间。RTT也可以理解为一次发送接收总共时间。

一,慢开始

慢开始:

       最开始发送数据时,由于不清楚网络的负载情况,所以如果立即把大量数据自己注入网络,那么就可能引发网络拥塞。
       因此需要慢慢注入,即由小到大逐渐增大发送窗口
       经过一个RTT时间,拥塞窗口翻一倍

       但是这个慢并不是指由小到大的速率慢,而是指最开始为1,然后再逐渐增加。

如下图:

六张图带你深刻理解TCP的拥塞避免控制,建议收藏本文_第1张图片

最开始的这一段即为慢开始,等到增加到16时,碰到了慢开始门限。然后就用到了拥塞避免算法


因为慢开始的增长速率是指数级增长,速度很快,所以需要用慢开始门限加以限制。慢开始门限的用法:

  • 当拥塞窗口 < 慢开始门限时,使用上述的慢开始算法
  • 当拥塞窗口 > 慢开始门限时,停止使用慢开始算法而改用拥塞避免算法
  • 当拥塞窗口 = 慢开始门限时,即可以使用慢开始算法也可以使用拥塞避免算法

二,拥塞避免算法

拥塞避免算法:

这个地方是让拥塞窗口缓慢增加,没经过一个往返时间RTT,就把拥塞窗口加1,而不是成倍增加。

因此在拥塞避免阶段就有“加法增大”的特点,拥塞窗口按线性规律缓慢增长。

如下图:

六张图带你深刻理解TCP的拥塞避免控制,建议收藏本文_第2张图片

红色这一部分就是拥塞避免算法,每次拥塞窗口仅仅增加一个大小,当增加到一定大小时,就碰到了网络超时,即出现网络拥塞。


三,出现阻塞后调整

当出现阻塞之后,会调整慢开始门限ssthresh以及拥塞窗口的值:

新的慢开始门限的值:ssthresh=cwnd/2。
        如上图所示,此时cwnd已经增长到了24大小,所以此时ssthresh=24/2=12。

拥塞窗口则再次变为1..

调整后的运行过程如下图所示:

六张图带你深刻理解TCP的拥塞避免控制,建议收藏本文_第3张图片

如上图所示,当在24出现阻塞后,将cwnd变为了1,将ssthresh变为了12

然后在12之前依旧是进行慢开始算法,在12之后进行拥塞避免算法,直到16发生了3个ACK情况(这个后面讲)又一次出现了网络阻塞。

上面三步就展示了普通情况下传输的方法以及调整


四,快重传+快恢复

从上面可知,在16的时候又一次出现了拥塞,而这次拥塞出现的原因就是这3个ACK。这个也就是快重传。

快重传:

当发生包文丢失时,为了让发送方尽早知道发生了个别报文段的丢失,因此立即发送确认,怎样让发送方知道是哪个报文段丢失的方法就是连读发送三个确认。

如下图所示:

六张图带你深刻理解TCP的拥塞避免控制,建议收藏本文_第4张图片

当丢失某个数据包时,连续发送三个确认,则发送方就知道某个包丢失了,然后立即启动快重传。

快恢复:

发送方知道现在只是丢失了个别的报文段。于是不执行慢开始,而是执行快恢复算法。

新的慢开始门限的值:ssthresh=cwnd/2。
        如上图所示,此时新的cwnd已经增长到了16大小,所以此时ssthresh=16/2=8。

拥塞窗口不是变为1,而是和门限值一样,此时cwnd=ssthresh=8,然后开始执行拥塞避免算法

如下图所示:

六张图带你深刻理解TCP的拥塞避免控制,建议收藏本文_第5张图片

如上图是怎样判断出现了丢包现象,以及出现丢包情况下进行快恢复的流程。


在拥塞避免阶段,拥塞窗口时按照线性规律增大的,这通常称为"加法增大"

而一旦出现超时或者3个重复的确认,就要把门限变为当前的一半,这个称为”乘法减小“


最后一张流程图表示TCP的拥塞控制流程图

六张图带你深刻理解TCP的拥塞避免控制,建议收藏本文_第6张图片

只要上面几张图都能够理解,大概就知道了拥塞避免控制的方法。

 

你可能感兴趣的:(计算机网络,网络,http)