TCP 拥塞控制详解
TCP 拥塞控制的核心目标是避免网络因数据量过大而陷入拥塞状态,确保整个网络的传输效率。它与流量控制的区别在于:流量控制关注点对点的速率匹配(如 sender 与 receiver 之间),而拥塞控制则从全局视角出发,考虑整个网络的负载情况。
TCP 拥塞控制主要通过以下算法协同实现:
1. 慢启动算法(Slow Start)
- 核心思想:发送方刚建立连接时,对网络状况一无所知,因此从极小的发送速率开始,逐步增加数据量,避免突然发送大量数据导致网络拥塞。
- 具体机制:
- 引入拥塞窗口(cwnd,Congestion Window) 变量,控制发送方在未收到确认前最多能发送的字节数。
- 初始时,cwnd 取值较小(通常为 1~2 个 MSS,MSS 为最大报文段长度)。
- 每收到一个对新报文段的确认(ACK),cwnd 就加倍(指数增长)。例如:cwnd=1 → 收到 ACK 后→ cwnd=2 → 再收到 ACK→ cwnd=4,以此类推。
- 当 cwnd 增长到慢启动阈值(ssthresh,Slow Start Threshold) 时,慢启动阶段结束,进入拥塞避免阶段。
2. 拥塞避免算法(Congestion Avoidance)
- 核心思想:当网络接近拥塞阈值时,不再快速增加发送量,而是缓慢增长,试探性地提升速率,避免触发拥塞。
- 具体机制:
- 当 cwnd ≥ ssthresh 时,进入拥塞避免阶段。
- 此时,每收到一个 ACK,cwnd 不再加倍,而是加 1 个 MSS(线性增长)。例如:cwnd=10 → 收到 ACK 后→ cwnd=11,逐步提升。
- 该阶段持续到网络出现拥塞(如超时未收到 ACK),此时触发拥塞处理机制。
3. 拥塞发生后的处理:快重传与快恢复
当网络出现拥塞(如报文段丢失)时,TCP 会调整策略以快速恢复:
- 快重传(Fast Retransmit):
- 若接收方收到失序的报文段(如预期收到 M3,却先收到 M4),会立即发送对已收到的最后一个有序报文段的重复 ACK(如重复确认 M2)。
- 若发送方连续收到3 个重复 ACK,则判断对应报文段(如 M3)已丢失,无需等待超时,立即重传该报文段,避免因超时导致的拥塞窗口骤降。
- 快恢复(Fast Recovery):
- 配合快重传使用,当触发快重传时,发送方认为网络并未严重拥塞(只是个别报文丢失),因此不执行慢启动,而是:
- 将 ssthresh 设为当前 cwnd 的一半(ssthresh = cwnd / 2);
- 将 cwnd 设为 ssthresh 的值(或 ssthresh + 3 ,补偿 3 个重复 ACK 已确认的报文);
- 之后进入拥塞避免阶段,cwnd 线性增长。
- 配合快重传使用,当触发快重传时,发送方认为网络并未严重拥塞(只是个别报文丢失),因此不执行慢启动,而是: