TCP拥塞控制


为什么会发生拥塞

  • 不同连接会共享网络上的路由器,路由器的传输能力有限,导致传输的数据包不得不在链路中排队.
  • 一条链路上有多个路由器,由于某个连接抢占了中间的某个路由器的容量,可能会导致其它连接的数据包在中途某个路由器中丢失,进而引起重传,引起拥塞.
  • 数据包并没有被丢弃,主机在一定时间内没有收到ACK,进行数据包的重传,导致链路变得拥塞.这种情况称为过早超时.

如何感知拥塞

  1. 链路拥塞:丢失事件(超时或者接收到三个重复的ACK)暗示拥塞,发送者应该限制发送速率.
  2. 链路不拥塞:收到ACK暗示着数据包正确到达目的,发送者应该加快发送速率.

TCP如何限制发送速率

使用拥塞窗口cwnd,发送速率限制的公式如下:LastByteSent – LastByteAcked 应该小于等于 min{cwnd, rwnd}

具体实现

1.慢开始.一开始发送1个MSS,如果正确收到ACK,则进行加倍,发送2个MSS,4个MSS,以此类推.当发生超时事件时,设置一个叫ssthresh的值,等于cwnd的一半,并且重新一轮新的慢开始阶段,如果到达ssthresh,则结束慢开始阶段,进入拥塞避免阶段.另外,如果不是超时,而是收到3个重复的ACK,对于早期的Tahoe算法,如果收到3个重复的ACK,则重新进入慢开始阶段.对于Reno算法,则会让此时的ssthresh窗口先减半,然后加上3个MSS后继续线性增加,这个过程也叫做快恢复.

2.拥塞避免.正确收到一个ACK后,每次只增加一个MSS.如果发生超时事件,让ssthresh的值等于cwnd的一半,重新进入慢开始阶段.另外,如果收到3个重复的ACK,对于早期的Tahoe算法,如果收到3个重复的ACK,则重新进入慢开始阶段.对于Reno算法,则会让此时的ssthresh窗口加上3个MSS后继续线性增加,这个过程也叫做快恢复.

如图所示:

img

参考资料

  • 计算机网络自顶向下方法3.6.1 The Causes and the Costs of Congestion 3.7.1 Classic TCP Congestion Control

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!