
AIMD公平性这个知识点我在教科书、面经、技术博客里见过太多次了。大多数资料都会告诉你AIMD是TCP拥塞控制的基石它能收敛到公平。然后就没有然后了——为什么能收敛、收敛有多快、凭什么乘法减小比加法增大更关键没人细讲。我当年背结论背得很熟但真到需要给同事讲清楚、或者在模拟器上复现问题时才发现自己连“公平”这两个字到底指什么都没完全想明白。这篇博客就写我后来彻底想通的过程核心是一个极简推导代数版两三行几何版一张图的事。无论你是准备面试、做课程设计还是正在调网络参数看完应该都能自己推一遍并且能讲得比大多数资料更明白。1. 先搞明白AIMD到底在做什么1.1 为什么互联网需要拥塞控制从“拥堵崩溃”说起设想一个十字路口没有红绿灯所有车都只想着快点通过结果路口彻底堵死谁也别想走。网络其实是一模一样的发送方如果都拼命往链路里灌数据路由器缓存会满新到的包被丢弃丢掉的包被重传重传的包又加剧拥塞最终吞吐量反而暴跌——这个现象在文献里叫拥塞崩溃congestion collapse上世纪八十年代的互联网真的遇到过。拥塞控制就是给网络装上的“红绿灯”让所有发送方既能充分利用带宽又别把链路冲垮。1988年Jacobson把AIMD这套机制正式引入TCP从那时起它就成为拥塞控制领域最经典、最核心的算法。哪怕后来出现了CUBIC、BBR这些新算法AIMD依然是理解整个领域的基准坐标系。所以搞懂AIMD不只是为了应付考试它是你理解一切拥塞控制算法的起点。1.2 三个字母拆开看加法增大、乘法减小分别是什么动作要把AIMD讲清楚先得认识拥塞窗口congestion windowcwnd。你可以把它理解成“发送方允许同时在途的数据量”单位通常是MSS最大报文段长度。窗口越大发送方越激进窗口越小发送方越保守。AIMD对窗口的操纵规则就两条加法增大Additive Increase每个往返时间RTT内窗口加一个固定值。经典取值是1也就是每个RTT窗口增加1个MSS。乘法减小Multiplicative Decrease一旦收到拥塞信号比如丢包、ECN标记窗口乘以一个小于1的因子。经典取值是0.5也就是直接砍半。注意这里的“加法”和“乘法”是不对称的加法用来慢吞吞地探索空闲带宽乘法用来凶猛地踩刹车。窗口本身不是速率但可以通过窗口除以RTT换算成发送速率。一个RTT内窗口加1个MSS相当于每个RTT多探测出1个MSS的可用带宽而窗口减半相当于瞬间把发送速率压回一半以下。这种“缓升猛降”的锯齿状波形就是AIMD最明显的特征。1.3 为什么偏偏是“加性增乘性减”配错了会怎样这个不对称不是拍脑袋定的。如果两个方向都用加法也就是拥塞时每条流各减1个MSSAIAD会发生什么假设流1窗口100流2窗口50差值50。各自加1再减1差值永远是50。大窗口的那条流保留了绝对优势小窗口的永远追不上系统永远不会收敛到公平。这是典型的“大者恒大”困境。如果两个方向都用乘法MIMD窗口按指数增长两三个RTT就能把链路打爆拥塞时按比例砍又会在小窗口场景下造成剧烈震荡。所以只有“加性增乘性减”这个组合在效率上线性探索、不猛冲和公平性上按比例惩罚大窗口恰好互补。下面这张表可以更直观地对比算法组合公平性效率表现核心问题AIAD加性增加性减永不收敛线性探索温和差值不缩小绝对优势永远保留MIMD乘性增乘性减收敛性依赖具体参数指数增长过于激进容易瞬间拥塞崩溃震荡剧烈AIMD加性增乘性减指数收敛线性探索温和、退避迅速兼顾效率与公平成为经典方案这个对照是理解AIMD设计哲学的关键它不是唯一可能的拥塞控制算法而是在“能不能收敛”和“效率会不会崩”两个约束下自然浮现的解。2. 公平性到底是什么意思不是平均主义是动力学收敛2.1 公平的数学定义共享瓶颈带宽的n条流要趋向哪里很多人直觉上觉得“公平平均”方向对但缺少一个关键视角网络里的公平不是由中央调度器“分配”出来的而是每条流只根据自己观察到的拥塞信号独立行动最终自发涌现出来的稳定状态。所以我们讨论的公平本质上是一个动力学概念得回答两个问题系统的不动点在哪里所有轨道是否被吸引到那个不动点教科书标准说法是n条流共享一条瓶颈链路公平分配意味着每条流获得的吞吐量趋近链路容量除以n。在AIMD分析里通常先看两条流因为多流情形只是二维情形的自然推广。用生活类比就是两个人分一锅汤规则是每轮各往自己碗里加一勺但如果发现锅快空了每个人把自己碗里的汤倒掉一半。谁碗里汤多谁这一轮倒掉的就多所以两碗汤的量会越来越接近。这个类比虽然简单但抓住了AIMD公平性的精髓不需要任何人统筹分配每条流只根据“是否有拥塞”这个局部信息行动全局公平自动涌现。2.2 效率与公平为什么天然冲突公平不是唯一目标另一条线是效率——链路要尽量被填满。AIMD的锯齿形状就体现了这个折中AI阶段窗口一路上涨把链路利用率顶上去涨到链路容量附近触发拥塞MD立刻砍半牺牲一点利用率换取公平和稳定。如果只考虑公平最简单的办法是每条流按比例分配——但互联网没有中央协调器做不到。如果只考虑效率全速发送即可——但立刻拥塞崩溃。AIMD在两者之间找到了一个用局部信息就能执行的折中每条流只需要知道“有没有发生拥塞”这一个比特信息有就减半没有就加一。这一点信息就够了这就是它最了不起的地方。2.3 窗口公平还是带宽公平一个经常被忽略的前提上面说的“公平”都是针对拥塞窗口的。窗口W时发送速率约等于W/RTT。如果两条流RTT不同W相等并不等于速率相等——RTT小的一方窗口更新更快单位时间能走更多轮抢占带宽的能力更强。这就是经典的“RTT不公平”问题。很多人在推导AIMD公平性时忽略了这个前提结果在真实网络里验证时发现对不上。AIMD公平性推导中通常默认两条流RTT相同、同时收到拥塞信号。真实世界RTT差异普遍存在所以理论公平和实际公平之间天然有偏差。把前提提前讲清楚后面的推导才不会误导人。这个“先确认边界再建模型”的习惯在做网络调优时尤其重要。3. AIMD公平性的极简推导两个版本任选其一3.1 代数版一个完整周期后差值直接减半直接进入核心推导。建模如下两条流1和2共享一条瓶颈链路拥塞窗口分别为x和y且x y谁大谁小无所谓对称处理即可。假设两条流同步经历拥塞每个拥塞周期内AI阶段持续T个RTTMD阶段的收缩因子为b。从某个时刻比如刚经历完MD开始观察记这一刻两流窗口的差值为D x - y。接下来进入AI阶段。每个RTT两条流窗口各加1把a归一化为1经过T个RTT两个窗口变成xT和yT。关键点来了差值不变仍然是(xT) - (yT) x - y D。然后链路发生拥塞两条流同时进入MD阶段窗口都乘以b。此时差值变成b·x - b·y b·(x - y) b·D把这个“AI阶段 MD阶段”当做一个完整周期周期结束时的差值就是b·D。经典参数b0.5因此每个拥塞周期结束后两流窗口的绝对差值精确缩小为原来的一半。迭代n个周期后Dₙ bⁿ · D₀ → 0指数收敛证明结束。总共两三行没有复杂的数学工具连微积分都用不上。我第一次推到这里的时候有种“原来这么简单”的震撼——之前总觉得公平性证明应该是很高级的东西。3.2 几何版在二维相图里看收敛代数证明虽然短但有个缺点它没有展示“为什么AI阶段不改变差值、MD阶段却缩小差值”的深层几何原因。所以我很推荐再掌握一个几何版本理解更透彻面试时讲这个也更有说服力。把两条流的窗口(x, y)当做一个二维平面上的点。x轴是流1的窗口y轴是流2的窗口。公平线就是x y那条45°线线上任意一点都代表两流窗口相等也就是公平状态。AI阶段两条流同时加1点在平面上沿方向(1, 1)移动。这个方向恰好与公平线平行。所以无论从哪个点出发AI阶段都让点沿着公平线的平行方向移动点到公平线的垂直距离完全不变。MD阶段两条流同时乘以b点在平面上从当前位置沿着“指向原点”的射线收缩到原来的b倍。公平线是经过原点的一条直线一个点沿指向原点的射线收缩为一半时它到这条过原点的直线的垂直距离也精确地缩小为一半。合起来每个拥塞周期里AI阶段不改变到公平线的距离MD阶段把距离乘b。每周期距离至少减半于是点被指数级吸向公平线。实际TCP窗口轨迹在相图中就是锯齿形折线折线每一段要么沿45°方向平移、要么沿径向跳回一半两股力量合起来就是螺旋式收敛。3.3 为什么这个证明不需要知道T的具体值细心的读者会问每轮AI阶段到底持续多少个RTT这个T由链路容量、队列长度、其他流的行为等因素决定变化很大。但上面的证明完全不需要知道T的具体值——因为AI阶段无论持续多久只要两条流同步经历了同样的T个RTT它们窗口同时加了T差值就不变。这个“差值不变”对任意T都成立所以推导是干净的。这一点也解释了AIMD鲁棒性的来源它不依赖精确测量带宽、延迟只需要知道拥塞发生与否。拥塞信号就是“有没有丢包/ECN标记”这一个比特。相比之下那些需要估算带宽的算法一旦测量误差大性能就崩。AIMD的价值正在于用最简单的信息换来了最稳健的收敛行为。3.4 这个证明成立依赖哪些前提差值减半推导有四个前提少一个都不成立同步拥塞假设两条流必须在几乎同一时刻收到拥塞信号并进入MD。实际网络里不同路径时延不同同步并不完美但瓶颈路由器缓存溢出时往往会在很短时间内对多条流同时造成影响所以统计意义上依然收敛。相同RTT假设两条流拥有相同的往返时间否则AI阶段的T不同窗口增加量不同差值会被破坏。理想AIMD行为假设没有超时、没有慢启动干扰每条流严格按“AI到拥塞、MD砍半”循环。真实TCP还有超时重传、快速恢复等机制等价于给理想模型加了噪声。独占瓶颈假设两条流的共享链路确实是唯一的瓶颈其他路径不会成为新的瓶颈。把前提列出来不是为了否定证明而是让你知道结论的边界在哪。面试时主动说出前提条件比只会背证明要亮眼得多——它说明你不是死记硬背而是真的理解模型与现实的差距。4. 常见误区与实操心得4.1 误区一公平性主要靠“加法增大”很多人想当然大家每轮加同样的量慢慢就一样了。但前面的证明已经说明AI阶段根本不改变绝对差值代数视角也不改变到公平线的垂直距离几何视角。它带来的只是“比值略微向1靠近”的相对改善真正让绝对差距指数缩小的是MD按比例收缩的动作。用几何语言说AI方向与公平线平行它是平移MD才是真正的“吸力”。所以面试官如果问“AIMD公平性的本质是什么”最准确的说法是加法增大负责高效探索带宽乘法减小负责按比例惩罚窗口差距两者周期组合形成收敛。两者缺一不可但公平性的主引擎是乘法减小。4.2 误区二AIMD保证公平为什么实际网络还是不公平证明归证明现实归现实。三层原因导致现实里看不到“绝对公平”RTT不同窗口公平不等于带宽公平。RTT小的流一个周期内能执行更多次AI同样时间内抢到更多带宽这是最普遍的不公平来源。拥塞信号不对称有的流走的路由器队列策略不同AQM、ECN、丢包策略能不能及时收到拥塞信号、收到多少信号都不对称。算法变种和叠加Linux默认的CUBIC不是严格AIMD它用三次函数增长在高带宽长RTT下吞吐更好但和传统Reno流共存时更容易抢占带宽BBR更是采用基于模型的方式丢包不再是主要信号公平性分析完全是另一套框架。所以AIMD的公平性结论是“理想模型下的动力学收敛”现实中的问题不是这个结论错了而是物理现实不满足模型的简化假设。排查实际网络不公平问题时先查两边的RTT和拥塞信号是否对称这是最有效的第一步比瞎调参数强得多。4.3 面试/考试怎么把这个问题答出层次如果被问到“AIMD为什么是公平的”我建议按这个框架来答第一步定义模型共享瓶颈链路、两条流、同步拥塞、窗口x和y。让提问者知道你清楚自己在分析什么理想场景。第二步极简推导AI阶段差值不变MD阶段差值乘b每周期差值乘b指数收敛到0。用两三行推到收敛这是整个回答的核心。第三步点出本质AI保公平线的平行移动效率MD保距离收缩公平配合“一个比特的拥塞信号”即可运行不需要中央协调器。第四步给前提和边界同步、同RTT、理想行为、独占瓶颈现实偏差导致不完全公平。这个四步回答大约两分钟既有推导又有批判性思考比干巴巴说“AIMD是公平的”好得多。考试时如果允许把相图那幅几何解释画出来直接加印象分。我见过太多人卡在第一步——一上来就直接说“每轮减一半所以公平”没有说明白模型假设。预设场景不交代后面的推导再有道理也容易被人挑刺“真实网络不是这样的”。4.4 一个小实验在模拟器里亲眼看公平收敛理论推完建议动手验证一次。用ns-3或者mininet搭一个哑铃拓扑两条TCP流共享一条瓶颈链路带宽比如10Mbps时延20ms队列长度100。让流1先启动20秒流2后启动观察两条流吞吐量随时间的变化曲线。你会看到流1一开始独占带宽流2加入后两者开始各占约5Mbps并且在锯齿状波动中逐渐稳定。用Jain公平指数算一下理想情况下F趋近1。公式是F (Σxi)² / (n·Σxi²)F1表示完全公平F趋近1/n表示极度不公平。这个指数在实际网络评估里很常用比肉眼观察吞吐曲线要精确得多。一个小技巧把窗口轨迹画在二维平面上x轴流1窗口y轴流2窗口你能看到书本里那张锯齿收敛图在自己数据上复现出来——点一路沿45°方向推进然后径向缩回一半越来越靠近公平线。看到那张图的时候再回头读3.2节的几何证明会觉得那两句话把整个动力学都说透了。我在实际测试里还有一个体会光看吞吐量曲线有时会很困惑因为曲线抖动大不好判断是否收敛但看窗口差值的对数图特别清晰——它几乎就是一条直线向下斜率刚好是log(b)。一个周期一个周期数下去差值一个比一个少一半这种直观感受比任何文字都强。如果你手头有模拟环境强烈建议跑一次几十秒就能看到指数收敛的全过程。