TCP 中常见的拥塞控制算法有哪些?
xxxixxxx

TCP 中常见的拥塞控制算法有哪些?

拥塞控制主要是四个算法:
1.慢启动 2.拥塞避免 3.拥塞发生 4.快速恢复

1.慢启动算法 - Slow Start

在 TCP 连接刚建立时,一点一点提速,先试探网络的状况,避免扰乱了网络通道的秩序。
慢启动是指一开始向网络注入的报文段少,并不是指拥塞窗口 cwnd 增长速度慢。

  • 慢启动算法:
  1. 连接建好的开始先初始化拥塞窗口的 cwnd 大小为 1,表明可以传送一个 MSS 大小的数据。
  2. 每当收到一个 ACK,cwnd 大小加 1,呈线性上升。
  3. 每当过了一个往返延迟时间 RTT(Round-Trip TIme),cwnd 大小直接翻倍,乘以 2,呈指数上升。
  4. 还有一个 ssthresh(slow start threshold),是一个上限(阈值),当 cwnd >= ssthresh 时就会进入“拥塞避免算法”。

2. 拥塞避免算法- Congestion Avoidance

当窗口大小 cwnd >= 慢启动的阈值后,就会进入拥塞避免算法。
拥塞避免 不能完全避免拥塞,而是指在拥塞避免阶段将拥塞窗口控制为线性增长,避免窗口增长过快导致窗口拥塞。缓慢的增加调整到最佳状态,使网络比较不容易出现拥塞。

  • 拥塞避免算法:
  1. 收到一个 ACK,则 cwnd = cwnd + 1/cwnd
  2. 每当经过了一个往返延迟时间 RTT,cwnd 大小加 1。

3.拥塞状态时的算法

TCP 拥塞控制默认认为网络丢包是由于网络拥塞导致的,所以一般的 TCP 拥塞控制算法以丢包为网络进入拥塞状态的信号。对于丢包有两种判断方式,一种是超时重传 RTO(Retransmission Timeout)超时,另一个是收到三个重复确认 ACK

  • 超时重传 RTO(Retransmission Timeout)超时,TCP 会重传数据包。TCP 认为这种情况比较糟糕,反应也比较激烈:
  1. 由于发生丢包,将慢启动阈值(ssthresh)设置为当前 cwnd 的一半,即 ssthresh = cwnd / 2
  2. cwnd 重置为 1
  3. 进入慢启动过程

早期的 TCP Tahoe 算法就是使用上述处理方法,由于一丢包就一切重来,导致 cwnd 又重置为 1,十分不利于网络数据的稳定传递。
所以,TCP Reno 算法进行了优化。当收到三个重复确认 ACK 时,TCP 开启快速重传 Fast Retransmit 算法,而不用等到 RTO 超时再进行重传

  • 三个重复确认 ACK:
  1. cwnd 大小缩减为当前的一半。
  2. ssthresh 设置为缩小后的 cwnd 大小
  3. 进入快速恢复算法 Fast Recovery。

4.快速恢复算法 - Fast Recovery

TCP Tahoe 是早期的算法,所以没有快速恢复算法,而 Reno 算法有。在进入快速恢复之前,cwnd 和 ssthresh 已经被改为原有的 cwnd 的一半。

  1. cwnd = cwnd + 3 MSS,加 3 MSS 的原因是收到 3 个重复的 ACK。
  2. 重传 DACKs 指定数据包。
  3. 如果再收到 DACKs,那么 cwnd 大小增加 1。
  4. 如果收到新的 ACK,表明重传的包成功了,退出快速恢复算法。将 cwnd 设置为 ssthresh,然后进入拥塞避免算法。
  • Post title:TCP 中常见的拥塞控制算法有哪些?
  • Post author:xxxixxxx
  • Create time:2021-02-05 20:00:00
  • Post link:https://xxxixxx.github.io/2021/02/05/1000-002TCP 中常见的拥塞控制算法有哪些?/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.
 Comments