TCP的AIMD(加法增大乘法减小)算法详解
字数 1632 2025-11-12 02:22:02
TCP的AIMD(加法增大乘法减小)算法详解
一、AIMD算法的基本概念
AIMD(Additive Increase Multiplicative Decrease)是TCP拥塞控制的核心算法之一,用于动态调整发送方的拥塞窗口(cwnd)大小。其核心思想是:
- 加法增大(Additive Increase):在网络未检测到拥塞时,每经过一个RTT(往返时间),cwnd线性增加1个MSS(最大报文段长度),缓慢探测可用带宽。
- 乘法减小(Multiplicative Decrease):当检测到拥塞(如超时重传或收到重复ACK)时,立即将cwnd减半(乘以0.5),快速缓解网络拥塞。
二、AIMD的详细工作流程
-
初始阶段:
- 连接建立后,cwnd初始化为1个MSS(慢启动阶段实际使用指数增长,但AIMD特指拥塞避免阶段的行为)。
- 当cwnd达到慢启动阈值(ssthresh)后,进入拥塞避免阶段,启动AIMD算法。
-
加法增大过程:
- 发送方每收到一个新的ACK(非重复ACK),表明数据包成功到达接收方且网络通畅。
- 此时cwnd的更新规则为:
cwnd = cwnd + 1/cwnd(以字节为单位时)
或更直观的:每收到1个ACK,cwnd增加1/cwnd个MSS(例如cwnd=10时,每ACK增加0.1个MSS)。 - 效果:经过1个RTT内所有ACK后,cwnd总共增加1个MSS(因为1个RTT内会收到cwnd个ACK)。例如:
- 当前cwnd=10 MSS,每ACK增加0.1 MSS,收到10个ACK后增加1 MSS,最终cwnd=11 MSS。
-
乘法减小过程:
- 触发条件:
- 收到3个重复ACK(快速重传机制):说明部分数据包丢失,但网络仍有流动性。
- 发生超时重传:说明网络拥塞严重,连ACK都无法返回。
- 操作步骤:
- 将ssthresh更新为当前cwnd的一半:
ssthresh = max(cwnd/2, 2 MSS)。 - 若是超时重传,cwnd直接重置为1 MSS(进入慢启动);若是快速重传,cwnd设为ssthresh+3 MSS(进入快速恢复,后接拥塞避免)。
- 将ssthresh更新为当前cwnd的一半:
- 触发条件:
三、AIMD的公平性证明
AIMD的经典之处在于其公平性。假设多个TCP连接共享同一瓶颈链路:
- 收敛到公平:
- 当多个连接同时使用AIMD时,若某个连接占用过多带宽,其遇到拥塞的概率更高,会频繁触发“乘法减小”,从而让出带宽。
- 经过多次增减周期后,所有连接的cwnd会趋于相等(公平带宽分配)。
- 效率与稳定性:
- 加法增大避免激进占用带宽,乘法减小确保拥塞快速缓解,使网络总吞吐量保持在接近瓶颈带宽的水平。
四、实例演示
假设TCP连接初始cwnd=10 MSS,ssthresh=16 MSS(已进入拥塞避免阶段):
- 正常传输:
- RTT1:发送10个报文,收到10个ACK后,cwnd=11 MSS。
- RTT2:发送11个报文,收到11个ACK后,cwnd=12 MSS。
- 持续线性增长至cwnd=20 MSS。
- 发生拥塞:
- 假设cwnd=20时收到3个重复ACK,触发快速重传。
- 执行乘法减小:ssthresh = 20/2 = 10 MSS,cwnd = ssthresh + 3 = 13 MSS。
- 进入快速恢复重传丢失包,之后回到拥塞避免阶段,从cwnd=10 MSS重新开始加法增大。
五、AIMD的局限性及改进
- 对高带宽延迟积(BDP)网络响应慢:
- 线性增长导致需要多个RTT才能充分利用高速网络带宽(如1Gbps链路需数千RTT)。
- 改进:HighSpeed TCP、CUBIC等算法优化了增长函数。
- 对非TCP流不公平:
- UDP等无拥塞控制的流会挤占TCP带宽。
- 解决方案:网络层设备采用AQM(主动队列管理)如RED(随机早期检测)。
通过以上步骤,AIMD以简单而优雅的方式实现了拥塞控制的核心目标:公平性、效率与稳定性。