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

TCP 中常见的拥塞控制算法有哪些?
拥塞控制主要是四个算法:
1.慢启动 2.拥塞避免 3.拥塞发生 4.快速恢复
1.慢启动算法 - Slow Start
在 TCP 连接刚建立时,一点一点提速,先试探网络的状况,避免扰乱了网络通道的秩序。
慢启动是指一开始向网络注入的报文段少,并不是指拥塞窗口 cwnd 增长速度慢。
- 慢启动算法:
- 连接建好的开始先初始化拥塞窗口的 cwnd 大小为 1,表明可以传送一个 MSS 大小的数据。
- 每当收到一个 ACK,cwnd 大小加 1,呈线性上升。
- 每当过了一个往返延迟时间 RTT(Round-Trip TIme),cwnd 大小直接翻倍,乘以 2,呈指数上升。
- 还有一个 ssthresh(slow start threshold),是一个上限(阈值),当 cwnd >= ssthresh 时就会进入“拥塞避免算法”。
2. 拥塞避免算法- Congestion Avoidance
当窗口大小 cwnd >= 慢启动的阈值后,就会进入拥塞避免算法。
拥塞避免 不能完全避免拥塞,而是指在拥塞避免阶段将拥塞窗口控制为线性增长,避免窗口增长过快导致窗口拥塞。缓慢的增加调整到最佳状态,使网络比较不容易出现拥塞。
- 拥塞避免算法:
- 收到一个 ACK,则 cwnd = cwnd + 1/cwnd
- 每当经过了一个往返延迟时间 RTT,cwnd 大小加 1。
3.拥塞状态时的算法
TCP 拥塞控制默认认为网络丢包是由于网络拥塞导致的,所以一般的 TCP 拥塞控制算法以丢包为网络进入拥塞状态的信号。对于丢包有两种判断方式,一种是超时重传 RTO(Retransmission Timeout)超时,另一个是收到三个重复确认 ACK。
- 超时重传 RTO(Retransmission Timeout)超时,TCP 会重传数据包。TCP 认为这种情况比较糟糕,反应也比较激烈:
- 由于发生丢包,将慢启动阈值(ssthresh)设置为当前 cwnd 的一半,即 ssthresh = cwnd / 2
- cwnd 重置为 1
- 进入慢启动过程
早期的 TCP Tahoe 算法就是使用上述处理方法,由于一丢包就一切重来,导致 cwnd 又重置为 1,十分不利于网络数据的稳定传递。
所以,TCP Reno 算法进行了优化。当收到三个重复确认 ACK 时,TCP 开启快速重传 Fast Retransmit 算法,而不用等到 RTO 超时再进行重传
- 三个重复确认 ACK:
- cwnd 大小缩减为当前的一半。
- ssthresh 设置为缩小后的 cwnd 大小
- 进入快速恢复算法 Fast Recovery。
4.快速恢复算法 - Fast Recovery
TCP Tahoe 是早期的算法,所以没有快速恢复算法,而 Reno 算法有。在进入快速恢复之前,cwnd 和 ssthresh 已经被改为原有的 cwnd 的一半。
- cwnd = cwnd + 3 MSS,加 3 MSS 的原因是收到 3 个重复的 ACK。
- 重传 DACKs 指定数据包。
- 如果再收到 DACKs,那么 cwnd 大小增加 1。
- 如果收到新的 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