TCP/IP学习笔记18--TCP--拥塞控制 (慢开始, 拥塞避免, 快重传和快恢复)

                                                        用最多的梦面对未来   -- 李嘉诚


在某段时间,若对网络资源的需求超过了该资源所能提供的可用部分,网络的性能就要变化,这种情况叫做拥塞

在TCP的窗口控制下,发送端一次发送的数据量为窗口大小,在网络状态不好的情况下,一下子发送过多的数据,可能会导致网络瘫痪。 为了应对这种情况,TCP需要对发送端发送到网络中的数据量进行控制。


拥塞控制 和 流(量)控制的差别:

     所谓拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制所要做的都有一个前提,就是网络能承受现有的网络负荷。拥塞问题是一个全局性的问题,涉及到所有的主机、所有的路由器、以及与降低网络传输性能有关的所有因素。

流量控制往往指的是点对点通信量的控制,是个端到端的问题。流量控制所要做的就是控制发送端发送数据的速率,以便使接收端来得及接受。前面已经整理过。


拥塞控制方法

因特网建议标准RFC2581定义了进行拥塞控制的四种算法,即慢开始(Slow-start)、拥塞避免(Congestion Avoidance)、快重传(Fast Restrangsmit) 和快回复(Fast Recovery)

 慢开始和拥塞避免

发送方维持一个叫做拥塞窗口cwnd(congestion window)的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口,另外考虑到接受方的接收能力(点对点的流量控制),发送窗口可能小于拥塞窗口。  发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就增大一些,以便把更多的分组发送出去。但是只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络的分组数。

慢开始算法的思路:最初的TCP在连接建立成功后会向网络中发送大量的数据包,这样很容易导致网络中路由器缓存空间耗尽,从而发生拥塞。因此新建立的连接不能够一开始就大量发送数据包,而只能根据网络情况逐步增加每次发送的数据量,以避免上述现象的发生。具体来说,当新建连接时,cwnd初始化为1个最大报文段(MSS)大小(MSS即TCP的每个包的大小),发送端开始按照拥塞窗口大小发送数据,每当有一个报文段(一个数据包)被确认,cwnd就增加至多1个MSS大小。用这样的方法来逐步增大 拥塞窗口CWND。

 这里用报文段的个数(数据包的个数)的拥塞窗口大小举例说明慢开始算法,实时拥塞窗口大小是以字节为单位的。如下图:

上图中的轮次,指的是 一个窗口内的所有数据包被全部回复 称为一轮,所以每轮过后cwnd值翻倍,指数增长。

 

为了防止cwnd增长过大引起网络拥塞,还需设置一个慢开始门限ssthresh状态变量,避免一直指数增长。ssthresh的用法如下:

  当cwnd<ssthresh时,使用慢开始算法。

  当cwnd>ssthresh时,改用拥塞避免算法。

  当cwnd=ssthresh时,慢开始与拥塞避免算法任意。

 

拥塞避免算法思路:让拥塞窗口缓慢增长,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。这样拥塞窗口按线性规律缓慢增长。

       无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认,虽然没有收到确认可能是其他原因的分组丢失,但是因为无法判定,所以都当做拥塞来处理),就把慢开始门限设置为出现拥塞时的发送窗口大小的一半。然后把拥塞窗口设置为1,执行慢开始算法。这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。
  如下图:

 

乘法减小和加法增大

  乘法减小:是指不论在慢开始阶段还是拥塞避免阶段,只要出现超时,就把慢开始门限减半,即设置为当前的拥塞窗口的一半(于此同时,执行慢开始算法)。当网络出现频繁拥塞时,ssthresh值就下降的很快,以大大将小注入到网络中的分组数。

  加法增大:是指执行拥塞避免算法后是拥塞窗口缓慢增大,以防止网络过早出现拥塞。

 

快重传和快恢复

一条TCP连接有时会因收不到对端的ACK, 等待重传计时器的超时而空闲较长的时间,慢开始和拥塞避免无法很好的解决这类问题,因此提出了快重传和快恢复的拥塞控制方法。

快重传算法并非取消了重传机制,只是在某些情况下更早的重传丢失的报文段(如果当发送端接收到三个重复的确认ACK时,则断定分组丢失,立即重传丢失的报文段,而不必等待重传计时器超时)。

快重传要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方)。快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。如下图:

快重传配合使用的还有快恢复算法,有以下两个要点:

  ①当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把ssthresh门限减半。但是接下去并不执行慢开始算法。

  ②考虑到如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为网络可能没有出现拥塞。所以此时不执行慢开始算法,而是将cwnd设置为ssthresh减半后的大小,然后执行拥塞避免算法。如下图:

 

在采用快恢复算法时,慢开始算法只是在TCP连接建立时和网络出现超时时才使用。

Ref:

https://www.cnblogs.com/wxgblogs/p/5616829.html

《图解TCP/IP》--竹下隆史  6.4章节

 

posted @ 2019-01-19 14:42  JadeCicada  阅读(765)  评论(0编辑  收藏  举报