logo
Published on

tcp-拥塞控制

Authors
  • Name
    zoe
    Twitter

拥塞控制

作用于网络,防止过多的数据注入到网络中,避免出现网络负载过大的情况;常用方法:

  • 慢开始
  • 拥塞避免
  • 快重传
  • 快恢复

慢开始:

开始:cwnd 的大小被设置为最大报文段 MSS 的数值 发送方发送一个 cwnd(congestion window) 收到确认后,cwnd 数量加倍(1,2,4,8....)

但是:为了防止 cwnd 增长过大引起网络拥塞,设置一个慢开始门限 ssthresh 状态变量 ,用法如下

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

当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。

当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞控制避免算法。

一个传输轮次所经历的时间其实就是往返时间RTT。不过“传输轮次”更加强调:把拥塞窗口cwnd所允许发送的报文段都连续发送出去,并收到了对已发送的最后一个字节的确认。

拥塞避免算法:

每经过一个往返时间 RTT 就把发送方的 cwnd+1 而不是加倍。

image

发送方判断出现拥塞:将 ssthresh 设置为出现拥塞时发送方窗口值的一半但不小于 2,然后将 cwnd 重设为 1,执行慢开始算法。

快重传算法

要求接收方每收到一个失序的报文段后就立即发出重复确认,不要等到自己发送数据时才进行捎带确认。

image

快重传算法的规定,接收方应及时发送对 M2 的重复确认,这样做可以让发送方及早知道报文段 M3 没有到达接收方。发送方接着发送了 M5 和 M6。接收方收到这两个报文后,也还要再次发出对 M2 的重复确认。

发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段 M3,而不必继续等待 M3 设置的重传计时器到期。由于发送方尽早重传未被确认的报文段,因此采用快重传后可以使整个网络吞吐量提高约 20%。

快恢复算法

(1)当发送方连续收到三个重复确认,就执行“乘法减小”算法,把慢开始门限 ssthresh 减半。这是为了预防网络发生拥塞。

(2)由于发送方现在认为网络很可能没有发生拥塞,因此与慢开始不同之处是现在不执行慢开始算法(即拥塞窗口 cwnd 现在不设置为 1),而是把 cwnd 值设置为慢开始门限 ssthresh 减半后的数值,然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大。

参考链接:http://www.ruanyifeng.com/blog/2017/06/tcp-protocol.html https://blog.csdn.net/yechaodechuntian/article/details/25429143