拥塞避免算法基本思想:一旦进入拥塞避免状态,拥塞窗口的值置 1,慢开始门限设为上次的值的一半。此时每个往返时延只将拥塞窗口的值增加一个最大报文长度。一种通用的方法是对于 TCP 发送方无论何时到达一个新的确认,就将拥塞窗口增加一个最大报文长度。
技术介绍
大家都听过国王与象棋的故事吧,国王想要奖励象棋的发明者,发明家说我要填满象棋棋盘,第一个格放一粒米,第二个格放 2 粒米,第三个放 4 粒,以此类推。开始还好,最后国库都放空了。可以看出,指数增长很恐怖的。
而慢启动就是使用指数增长,所以终会有一个点,超过网络负载能力,这时会发生什么呢?
技术扩展
为防止拥塞窗口 cwnd 增长过大引起网络拥塞,还需要设置一个慢速开始门限 ssthresh 状态变量。
之前的文章已经介绍了,慢启动以指数增长,在收到接收端的确认后,下次传输两倍的数据量。
如果发送之后,并没有收到接收端确认,发送端会判断当前网络处于拥塞状态。
下图中拥塞阈值在 24 处,发送端发送 16 个报文时,可以收到接收端的确认,它会发送 32 个报文。但是当前网络只能承载 24 个,所以说会有 8 个报文收不到确认。
看图说话
如果发送方设置超时计时器时限已到但还没有收到确认,那么很可能是网络出现拥塞,致使报文段在网络中某处被丢弃。这时,TCP 马上把拥塞窗口减小到 1,并执行慢开始算法,同时把慢开始门限值 ssthresh 减半。
当发送端判断网络拥塞之后,会将门限 ssthresh 减为之前的一半,之前是 32,新值就是 16 个。
然后重新开始慢速启动。第一次 1,第二次 2,第三次 4,第四次 8,第五次 16,第五次达到了新门限 ssthresh。
接下来还是执行拥塞避免的算法,第六次发送 17 个包,第七次 18,每次加一,线性增长。当达到 24 个时,实际上网络可以承载的,但加到 25 个时,会有一个包收不到确认,这时,最终数值为 24。
条评论