流量控制和拥塞控制解决的是不同问题:前者根据接收方通告窗口保护接收端;后者通过拥塞窗口(cwnd)限制网络中的在途数据,避免路由器队列持续堆积。

怎样发现拥塞

端到端拥塞控制通常从丢包或时延变化推断网络状况。丢包信号直观,但不一定都由拥塞造成;时延会随着队列变长而上升,不过更难区分网络中的其他变化。路由器也可以显式提供拥塞信号,帮助发送端更早调整速率。

AIMD 与慢启动

拥塞避免阶段常用 AIMD(Additive Increase, Multiplicative Decrease):网络正常时逐步增加 cwnd;检测到拥塞时按比例减小。多个发送端共享瓶颈时,这种“缓慢试探、遇堵退让”的做法能在利用带宽和稳定性之间折中。

下图把两个发送端的速率画在坐标轴上:若瓶颈容量归一化为 1,x + y = 1 是容量边界;超过边界会拥塞,远低于边界则有带宽未被利用。

两个发送端共享瓶颈链路时的容量边界

TCP 慢启动则从较小窗口开始,在收到确认后较快增加发送量;达到慢启动阈值或检测到拥塞后,进入更谨慎的增长阶段。它不是先无限制发送再猜带宽,而是逐渐探测可用容量。

收到多个重复 ACK 时,发送端可能推断某段数据丢失并快速重传。快速恢复让发送端不必总把窗口降到初始值,从而减少丢包后的空闲时间。具体细节随 TCP 拥塞控制算法而异。

可以把瓶颈链路想成高峰期的收费站:入口车流(发送速率)太大时,队列会变长甚至溢出;拥塞控制根据反馈减慢放行,路况好转后再逐步加速。