70.jpg?x-oss-process=image/auto-orient,1/quality,q_90/watermark,image_bG9nby5wbmc_eC1vc3MtcHJvY2Vzcz1pbWFnZS9yZXNpemUsUF8yMA,g_center,t_50,x_10,y_10

拥塞避免算法基本思想:一旦进入拥塞避免状态,拥塞窗口的值置1,慢开始门限设为上次的值的一半。此时每个往返时延只将拥塞窗口的值增加一个最大报文长度。一种通用的方法是对于TCP发送方无论何时到达一个新的确认,就将拥塞窗口增加一个最大报文长度。

技术介绍

大家都听过国王与象棋的故事吧,国王想要奖励象棋的发明者,发明家说我要填满象棋棋盘,第一个格放一粒米,第二个格放2粒米,第三个放4粒,以此类推。开始还好,最后国库都放空了。可以看出,指数增长很恐怖的。

而慢启动就是使用指数增长,所以终会有一个点,超过网络负载能力,这时会发生什么呢?

技术扩展

为防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个慢速开始门限ssthresh状态变量。

之前的文章已经介绍了,慢启动以指数增长,在收到接收端的确认后,下次传输两倍的数据量。

如果发送之后,并没有收到接收端确认,发送端会判断当前网络处于拥塞状态。

下图中拥塞阈值在24处,发送端发送16个报文时,可以收到接收端的确认,它会发送32个报文。但是当前网络只能承载24个,所以说会有8个报文收不到确认。

技术图解

通过下面图片,我们简单说下慢启动的算法:

70-1.jpg?x-oss-process=image/auto-orient,1/quality,q_90/watermark,image_bG9nby5wbmc_eC1vc3MtcHJvY2Vzcz1pbWFnZS9yZXNpemUsUF8yMA,g_center,t_50,x_10,y_10

看图说话

如果发送方设置超时计时器时限已到但还没有收到确认,那么很可能是网络出现拥塞,致使报文段在网络中某处被丢弃。这时,TCP马上把拥塞窗口减小到1,并执行慢开始算法,同时把慢开始门限值ssthresh减半。

当发送端判断网络拥塞之后,会将门限ssthresh减为之前的一半,之前是32,新值就是16个。

然后重新开始慢速启动。第一次1,第二次2,第三次4,第四次8,第五次16,第五次达到了新门限ssthresh。

接下来还是执行拥塞避免的算法,第六次发送17个包,第七次18,每次加一,线性增长。当达到24个时,实际上网络可以承载的,但加到25个时,会有一个包收不到确认,这时,最终数值为24。


 评论