KCP2
目录
- TCP 如何实现拥塞控制
核心组件
- 拥塞窗口(cwnd)
- 本质上是一个buffer 用来存储还未被ack的数据包
- cwnd的大小变化可以动态调整发送速率。
- 慢启动阈值(ssthresh)
- cwnd从指数增长(慢启动 slow start) 切换为线性增长(拥塞避免)的临界值。
- 值由算法动态调整。
核心流程
- 慢启动
- 指数增长cwnd
- 拥塞避免
- 超过阈值 线性增长cwnd
- 快速重传与快速恢复
- 触发条件: 收到3个重复的ACK(表明某个数据包没有收到,但后续包已经到达)
- 快速重传: 立即重传丢失的包
- 调整窗口:(这里将窗口减半,实际TCP的占用带宽缩小,TCP的目标通过此来减少网络中的竞争)
- ssthresh = max(cwnd / 2, 2MSS) 阈值减半
- cwnd = sssthresh + 3MSS
- 恢复阶段
- 收到新ACK后, cwnd = sshtresh 进入拥塞避免阶段
- 超时重传
- 触发条件:RTO超时(未收到任何ACK, 表明拥塞严重)
- 响应策略
- 重置窗口
- ssthresh = max(cwnd / 2, 2MSS)
- cwnd = 1MSS
- 指数退避:超时后RTO*2
- 重置窗口
TCP 拥塞控制算法演变
| 算法 | 核心改进 | 适用场景 |
|---|---|---|
| Tahoe | 首次引入慢启动、拥塞避免、快速重传 | 早期网络(已淘汰) |
| Reno | 新增快速恢复阶段,减少超时重传概率 | 普通有线网络 |
| New Reno | 优化快速恢复,支持多个包丢失时的恢复(Partial ACK 处理) | 高丢包网络 |
| CUBIC | 基于三次函数调整 cwnd,替代线性增长(Linux 默认) | 高带宽长距离网络(如 5G) |
| BBR | 基于带宽和延迟测量(而非丢包)动态调整发送速率 | 高吞吐、低延迟场景(如 CDN) |