首页 > 代码库 > 《网络协议》TCP 拥塞控制

《网络协议》TCP 拥塞控制

TCP 拥塞控制主要有几种:慢启动拥塞避免快重传 以及快恢复


慢启动

       为了防止网络拥塞,TCP 采用了一种慢启动算法,对发送数据量进行控制。为了调节发送端的数据发送量,引入了拥塞窗口,在慢启动时,将这个拥塞窗口设为 1 个报文段发送数据,之后每收到一次确认应答,拥塞窗口的值就加 1 个报文段。在发送数据包时,将拥塞窗口的大小与接收端主机通知的窗口大小进行比较,然后选择较小的值来控制数据量的发送。拥塞窗口是发送端使用的流量控制,而通告窗口则是接收端使用的流量控制。

       慢启动算法步骤如下(cwnd全称Congestion Window):

  1. 初始化 cwnd = 1,表示可以传一个 MSS 大小的数据;
  2. 每当收到一个 ACK,cwnd++,即增加1,呈线性上升;
  3. 每当过了一个 RTT,cwnd = cwnd*2,呈指数让升;
  4.  ssthresh(slow start threshold),是一个上限,当 cwnd >= ssthresh 时,就会进入“拥塞避免算法”(后面会说这个算法);

拥塞避免

       拥塞避免算法是让拥塞窗口缓慢地增大,收到每一轮的确认后,将拥塞窗口的值加1,而不是加倍,这样拥塞窗口的值按照线性规律缓慢增长。在慢启动中,当cwnd >= ssthresh时,就会进入“拥塞避免算法”。一般来说ssthresh的值是65535,单位是字节,当cwnd达到这个值时后,算法如下:

  1. 收到一个 ACK 时,cwnd = cwnd + 1/cwnd;
  2. 当每过一个RTT时,cwnd = cwnd + 1;

快重传与快恢复

        快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认(重复发送对前面有序部分的确认),而不是等待自己发送数据时才进行捎带确认,也不是累积收到的报文发送累积确认,如果发送方连续收到三个重复确认,就应该立即重传对方未收到的报文段(有收到重复确认,说明后面的报文段都送达了,只有中间丢失的报文段没送达)。

         快恢复算法与快重传算法配合使用:

  1. 当发送方连续收到三个重复确认时,就把慢启动门限 ssthresh 设置为当前拥塞窗口 cwnd 的一半。重传丢失的报文段。设置 cwnd 为 ssthresh 加上3倍的报文段大小;
  2. 每次收到另一个重复的 ACK 时,cwnd 增加 1 个报文段大小并发送 1 个分组;
  3. 当下一个确认新数据的 ACK 达到时,设置 cwnd 为 ssthresh(跟第 1 步一样设置方法)。这个 ACK 应该是在进行重传之后的一个往返时间内对步骤 1 中重传的确认。另外,这个 ACK 也应该是对丢失的分组和收到的第一个重复的 ACK 之间的所以中间报文段的确认。这一步采用的是拥塞避免算法。


参考资料:

《TC/IP 详解》

《TCP 的拥塞控制机制》

《网络协议》TCP 拥塞控制