目录

KCP2

  • TCP 如何实现拥塞控制

核心组件

  1. 拥塞窗口(cwnd)
    1. 本质上是一个buffer 用来存储还未被ack的数据包
    2. cwnd的大小变化可以动态调整发送速率。
  2. 慢启动阈值(ssthresh)
    1. cwnd从指数增长(慢启动 slow start) 切换为线性增长(拥塞避免)的临界值。
    2. 值由算法动态调整。

核心流程

  1. 慢启动
    1. 指数增长cwnd
  2. 拥塞避免
    1. 超过阈值 线性增长cwnd
  3. 快速重传与快速恢复
    • 触发条件: 收到3个重复的ACK(表明某个数据包没有收到,但后续包已经到达)
    • 快速重传: 立即重传丢失的包
    • 调整窗口:(这里将窗口减半,实际TCP的占用带宽缩小,TCP的目标通过此来减少网络中的竞争)
      • ssthresh = max(cwnd / 2, 2MSS) 阈值减半
      • cwnd = sssthresh + 3MSS
    • 恢复阶段
      • 收到新ACK后, cwnd = sshtresh 进入拥塞避免阶段
  4. 超时重传
    • 触发条件:RTO超时(未收到任何ACK, 表明拥塞严重)
    • 响应策略
      • 重置窗口
        • ssthresh = max(cwnd / 2, 2MSS)
        • cwnd = 1MSS
      • 指数退避:超时后RTO*2

TCP 拥塞控制算法演变

算法 核心改进 适用场景
Tahoe 首次引入慢启动、拥塞避免、快速重传 早期网络(已淘汰)
Reno 新增快速恢复阶段,减少超时重传概率 普通有线网络
New Reno 优化快速恢复,支持多个包丢失时的恢复(Partial ACK 处理) 高丢包网络
CUBIC 基于三次函数调整 cwnd,替代线性增长(Linux 默认) 高带宽长距离网络(如 5G)
BBR 基于带宽和延迟测量(而非丢包)动态调整发送速率 高吞吐、低延迟场景(如 CDN)