拥塞控制(计算机网络)

拥塞控制

拥塞控制通过拥塞窗口来防止过多的数据注入网络,使得网络中的路由器或者链路过载。

    拥塞窗口 cwnd 是发送方维护的一个状态变量,根据网络拥塞程度而变化。 发送窗口的值是 Swnd = min ( Cwnd , rwnd ),也就是拥塞窗口和接收窗口中的最小值。 网络中没有出现拥塞, cwnd 增大,出现拥塞, Cwnd 减小。

其实只要发送方没有在规定时间内接收到 ACK 应答报文,也就是发生了超时重传,就会认为网络出现了拥塞。

拥塞控制的算法

  1. 慢启动
  2. 拥塞避免
  3. 拥塞发生
  4. 快速恢复

1.慢启动

慢启动的算法记住一个规则就行:当发送方每收到一个 ACK ,拥塞窗口 cwnd 的大小就会加1。慢启动算法,发包的个数是指数性的増长。1->2->4->8->2的次方。 有一个慢启动门限 ssthresh 状态变量:

  1. 当 cwnd < ssthresh 时,使用慢启动算法。
  2. 当 Cwnd >= ssthresh 时,就会使用拥塞避免算法。

2.拥塞避免算法

那么进入拥塞避免算法后,它的规则是:发包个数按线性增长(一个一个向上加)。 拥塞避免算法就是将原本慢启动算法的指数增长变成了线性增长,还是增长阶段,但是增长速度缓慢了一些。 随着发包量的逐渐加大,网络就会慢慢进入了拥塞的状况了,于是就会出现丟包现象(即拥塞发生),这时就需要对丟失的数据包进行重传。当触发了重传机制,也就进入了拥塞发生算法。

3.拥塞发生

发生拥塞,进行数据重传2种方式:

  1. 超时重传
  2. 快速重传

(1)发生超时重传的发生算法: 这个时候, ssthresh 和 cwnd 的值会发生变化 1. ssthresh 设为 Cwnd /2。 2. cwnd 重置为1。

突然回到慢启动导致网络卡顿。

(2)快速重传拥塞算法: TCP 认为这种情况不严重,因为大部分没丢,只丢了一小部分,则 ssthresh 和 Cwnd 变化如下: 1. cwnd = Cwnd /2,也就是设置为原来的一半2. ssthresh = Cwnd 3.进入快速恢复算法

4.快速恢复

快速重传和快速恢复算法一般同时使用,快速恢复算法是认为,还能收到3个重复 ACK 说明网络也不那么糟糕,所以没有必要像 RTO 超时那么强烈。 进入快速恢复:

  1. 拥塞窗口 cwnd = Ssthresh +3(3的意思是确认有3个数据包被收到了);2.重传丢失的数据包;
  2. 如果再收到重复的 ACK ,那么 Cwnd 增加1;
  3. 如果收到新数据的 ACK 后,把 Cwnd 设置为第一步中的 ssthresh 的值,原因是该 ACK 确认了新的数据,说明从 duplicated ACK 时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进入拥塞避免状态;

而是还在比较高的值,后续呈线性増长。

经验分享 程序员 微信小程序 职场和发展