TCP的拥塞控制算法演进与比较
字数 2089 2025-11-25 14:49:54
TCP的拥塞控制算法演进与比较
描述
TCP拥塞控制算法是TCP协议的核心机制之一,用于防止网络因过载而瘫痪。其目标是通过动态调整发送速率,使网络资源得到高效利用,同时避免拥塞崩溃。自20世纪80年代TCP Tahoe提出以来,拥塞控制算法经历了多次重要演进,出现了Reno、NewReno、BIC、CUBIC、BBR等多种算法,每种算法针对不同的网络环境设计了独特的拥塞响应策略。
解题过程
-
拥塞控制的基本目标
- 核心矛盾:发送方不知道网络的承载能力,盲目发送会导致路由器队列溢出(拥塞)。
- 目标:
- 高效性:充分利用可用带宽。
- 公平性:多个流共享链路时各自获得均衡资源。
- 收敛性:网络变化后能快速稳定到新状态。
- 核心机制:通过维护一个拥塞窗口(cwnd) 限制未确认数据量,通过拥塞信号(如丢包、延迟增加)调整cwnd。
-
经典算法演进(基于丢包反馈)
-
Tahoe(1988年)
- 三个阶段:慢启动、拥塞避免、快速重传。
- 拥塞信号:发生超时重传(RTO)或收到3个重复ACK(DupACK)。
- 响应:无论何种拥塞信号,均将cwnd重置为1,重新慢启动。
- 问题:对轻微拥塞(单个包丢失)反应过度,效率低。
-
Reno(1990年)
- 改进:区分拥塞程度。
- 超时重传:视为严重拥塞,cwnd=1,进入慢启动。
- 3个DupACK:视为轻微拥塞,触发快速重传,cwnd减半后进入拥塞避免(而非重置为1)。
- 新增快速恢复:重传后保留cwnd=原cwnd/2,每收到一个DupACK则cwnd+1,直到新数据被确认后退出恢复。
- 问题:多个包丢失时,快速恢复可能停滞(需等待超时)。
- 改进:区分拥塞程度。
-
NewReno(1999年)
- 改进快速恢复:引入部分确认(ACK确认部分新数据但非全部)。
- 机制:在快速恢复期间,每收到一个部分确认,立即重传下一个疑似丢失的包,避免等待超时。
- 优势:在多个包丢失时性能显著优于Reno。
-
-
基于延迟的算法:Vegas(1995年)
- 创新:使用RTT(往返时间)变化作为拥塞预信号,而非等待丢包。
- 原理:
- 计算基准RTT(最小观测值)和实际RTT。
- 定义期望吞吐量 = cwnd / 基准RTT,实际吞吐量 = cwnd / 实际RTT。
- 若(期望 - 实际)超过阈值,则减小cwnd;反之增加。
- 优势:提前避免拥塞,队列延迟低。
- 劣势:与基于丢包的流竞争时不公平(后者更激进)。
-
现代混合算法:CUBIC(2005年默认)
- 背景:高速网络中Reno的AIMD(加性增乘性减)收敛慢。
- 原理:
- 使用三次函数 \(W(t) = C \cdot (t - K)^3 + W_{\text{max}}\) 控制cwnd增长,其中 \(t\) 为上次拥塞后的时间,\(W_{\text{max}}\) 为拥塞前窗口,\(K = \sqrt[3]{{W_{\text{max}} \cdot \beta / C}}\)(\(\beta\) 为减窗因子)。
- 增长与时间无关,而非与ACK数量相关(Reno的“每个RTT加1”)。
- 优势:在高带宽延迟积(BDP)网络中填充速度快,公平性好。
-
模型驱动算法:BBR(2016年)
- 革命性思路:直接估计网络瓶颈带宽(BtlBw)和最小RTT(RTprop),计算BDP = BtlBw × RTprop。
- 阶段:
- 启动:指数增长至估计的BDP。
- 排空:轻微降速以清空队列。
- 稳定:交替探测带宽(增益周期)和利用BDP。
- 优势:无视丢包(非拥塞丢包不影响),低延迟,高吞吐。
- 挑战:与基于丢包的流共存时可能过于激进。
-
算法比较总结
算法 拥塞信号 核心机制 适用场景 Tahoe 丢包/超时 AIMD,拥塞时cwnd=1 早期网络 Reno 丢包 快速恢复,单包丢失优化 普通互联网 NewReno 丢包 改进快速恢复,多包丢失优化 丢包率较高的网络 CUBIC 丢包 三次函数增长,时间驱动 高速长距离网络(如5G、光纤) BBR 延迟/带宽 模型估计,主动排空队列 高BDP、非拥塞丢包场景
关键点
- 算法演进是从被动响应丢包到主动避免拥塞的过程。
- 选择算法需权衡:效率、公平性、延迟敏感性、部署环境(如BBR需内核支持)。
- 现代Linux默认使用CUBIC,但BBR在谷歌等大型网络中逐步推广。