详解TCP的拥塞控制机制


TCP的拥塞控制

拥塞控制:防止过多的数据注入到网络当中,这样可以使网络中的路由器或链路不致过载。(通过拥塞窗口处理网络拥塞现象的一种机制)

方法

慢启动

拥塞避免

![屏幕快照 2019-01-02 下午7.25.37](详解TCP的拥塞控制机制/屏幕快照 2019-01-02 下午7.25.37.png)

慢启动

当主机开始发送数据时,如果立即将大量数据字节注入到网络,那么就有可能因为不清楚当前网络的负荷情况而引起网络阻塞。所以,最好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是说,由小到大逐渐增大拥塞窗口数值。通常在刚刚发送报文段时,先把拥塞窗口cwnd设置为一个最大报文段MSS的数值。而在每收到一个新的报文段的确认后,把拥塞窗口增加至多一个MSS的数值。用这样的方法逐步增大发送方的拥塞窗口cwnd,可以使分组注入到网络的速率更加合理。(慢开始当中的“慢”并不是指cwnd的增长速率慢,而是在TCP开始发送报文段时先设置cwnd = 1,使得发送方在开始时只发送一一个报文段)

当rwnd足够大的时候,为了防止拥塞窗口cwnd的增长引起网络阻塞,还需要另外一个变量——慢开始门限ssthresh.

i.当cwnd < ssthresh时,使用上述慢启动算法;

ii.当cwnd >ssthresh时,停止使用慢启动算法,改用拥塞避免算法;

b.慢开始的局限性

i.需要获得网络内部流量分布的信息,浪费可用的网络容量,额外开销;

ii.估算合理的ssthresh值并不容易,可能耗时较长; 

注:i.接收端窗口rwnd,又称通知窗口(awnd),是接收端根据目前的接收缓存大小所许诺的最新窗口值,是来自接收端的流量控制。

   ii.拥塞窗口cwnd是发送端根据自己估计的网络阻塞程度而设置的窗口值,是来自发送端的流量控制。

   iii.MSS是TCP数据包每次能够传输的最大数据分段,其中并不包括TCP首部。而MSS只出现在syn报文段当中。一般来说MSS的值在不分段的情况下越大越好(eg:一个外出接口的MSS值时MTU减去IP和TCP首部长度)

2.拥塞避免

a.算法思路:让拥塞窗口cwnd缓慢的增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍,这样拥塞窗口cwnd按线性规律缓慢的增长,比慢开始算法的拥塞窗口增长速率缓慢的多

无论是慢启动算法还是拥塞避免算法,只要判断网络出现拥塞,就要把慢启动开始门限(ssthresh)设置为发送窗口的一半(>=2),cwnd设置为1,然后再使用慢启动算法,这样做的目的能迅速的减少网络当中的数据传输,使发生拥塞的路由器能够把队列中堆积的分组处理完毕。拥塞窗口是按照线性的规律增长

b.控制过程

(1)TCP连接初始化,将拥塞窗口cwnd设置为1个报文段,即cwnd = 1;

(2)执行慢开始算法,cwnd按指数规律增长,知道cwnd == ssthresh时,开始执行拥塞避免算法,cwnd开始按照线性规律增长;

(3)当网络发生拥塞,把ssthresh值更新为拥塞前ssthresh值的一半,cwnd重新设置为1,再按照2执行;


快恢复

快重传

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

![屏幕快照 2019-01-02 下午7.27.16](详解TCP的拥塞控制机制/屏幕快照 2019-01-02 下午7.27.16.png)

i.当发送方连续收到三个重复确认时,执行“乘法减小”算法,慢启动门限减半,为了预防网络发生阻塞

ii.由于发送方现在认为网络很可能没有发生阻塞,因此现在不执行慢启动算法,而是把cwnd值设置为慢启动门限减半后的值,然后开始执行拥塞避免算法,拥塞窗口cwnd值线性增大。


文章作者: Bxan
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Bxan !
  目录