TCP的拥塞避免算法详解
字数 1563 2025-12-05 21:25:24
TCP的拥塞避免算法详解
题目描述:
TCP的拥塞避免(Congestion Avoidance)算法是TCP拥塞控制的核心机制之一,用于在检测到网络拥塞后,将拥塞窗口(cwnd)从较小的值(例如1个MSS)逐渐增长,以平稳地探索网络可用带宽,避免再次触发拥塞。本题目要求详细解释拥塞避免算法的触发条件、工作原理、窗口增长规则,及其与慢启动算法的区别和切换关系。
解题过程循序渐进讲解:
-
背景与目标:
- 在网络发生拥塞(如超时重传或收到3个重复ACK)后,TCP会将拥塞窗口
cwnd大幅降低(例如设为1个MSS或当前值的一半),以缓解拥塞。 - 但窗口不能一直保持在低位,否则会浪费带宽。拥塞避免的目标是线性增长
cwnd,逐步探测更多可用带宽,同时避免激进增长导致再次拥塞。
- 在网络发生拥塞(如超时重传或收到3个重复ACK)后,TCP会将拥塞窗口
-
触发条件:
- 当TCP从慢启动阶段切换到拥塞避免阶段时,拥塞避免算法开始运行。
- 切换的典型条件是:
cwnd达到慢启动阈值(ssthresh)。例如,在连接建立或重传后,ssthresh被设为当前cwnd的一半,之后cwnd从较低值开始进入拥塞避免阶段。
-
核心规则——加法增大(Additive Increase):
- 在拥塞避免阶段,每收到一个非重复的ACK,
cwnd增加约1/cwnd个MSS。 - 更精确地说:每经过一个RTT(往返时间),
cwnd增加1个MSS。 - 实现方式:TCP维护一个“窗口增长计数器”,每收到一个ACK,计数器增加
1/cwnd(以MSS为单位),当计数器达到1时,cwnd增加1个MSS,并重置计数器。 - 效果:
cwnd呈线性增长,例如从10 MSS开始,经过1个RTT→11 MSS,再1个RTT→12 MSS,缓慢逼近网络容量上限。
- 在拥塞避免阶段,每收到一个非重复的ACK,
-
与慢启动的区别:
- 慢启动:每收到一个非重复ACK,
cwnd增加1个MSS(即每RTT指数增长,例如1→2→4→8...)。 - 拥塞避免:每RTT只增加1个MSS(线性增长)。
- 类比:慢启动是“快速冲刺”,拥塞避免是“稳步爬坡”。
- 慢启动:每收到一个非重复ACK,
-
算法执行流程示例:
- 假设发生拥塞后,
ssthresh被设为16 MSS,cwnd重置为1 MSS。 - 慢启动阶段:
cwnd从1开始指数增长,直到cwnd=16 MSS达到ssthresh。 - 拥塞避免阶段:
- RTT1:
cwnd=16 → 17 MSS(线性增加1) - RTT2:
cwnd=17 → 18 MSS - ...持续增长直到再次检测到拥塞(如丢包)。
- RTT1:
- 假设发生拥塞后,
-
拥塞检测与响应:
- 如果发生超时重传:认为网络严重拥塞,
ssthresh设为当前cwnd的一半(至少2 MSS),cwnd重置为1 MSS,重新进入慢启动。 - 如果收到3个重复ACK(快速重传触发):认为轻度拥塞,执行快速恢复(Fast Recovery),
ssthresh设为当前cwnd的一半,cwnd设为ssthresh+3 MSS,之后进入拥塞避免阶段。
- 如果发生超时重传:认为网络严重拥塞,
-
算法意义:
- 线性增长使得发送速率平缓上升,给予网络中的其他流量共享带宽的机会。
- 与“乘法减小”(发生拥塞时窗口减半)结合,形成经典的AIMD(Additive Increase Multiplicative Decrease)策略,平衡效率和公平性。
-
现代TCP的改进:
- 标准TCP(如Reno)的拥塞避免算法是基础,后续算法如CUBIC在高带宽时使用三次函数增长,但核心思想仍包含线性增长阶段。
总结:
拥塞避免算法通过“每RTT增加1 MSS”的线性增长,在拥塞发生后温和地探索带宽,是TCP实现公平性和稳定性的关键。其与慢启动的切换由ssthresh控制,与快速恢复协同应对不同程度的拥塞。