ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

AIMD公平性极简推导:加性增乘性减的收敛本质

AIMD公平性极简推导:加性增乘性减的收敛本质 公平性这三个字在拥塞控制里大概是讨论最多、也最容易绕晕的问题之一。很多人刚接触 TCP 的时候都会看到“加性增、乘性减”这个说法也就是 AIMD但很少有人真正想明白为什么这么简单的两条规则就能让多个数据流最终公平地共享一条瓶颈带宽我早年做网络仿真的时候也被这个问题卡过好久后来发现其实只需要一张纸、几行公式就能把核心逻辑推清楚一点都不玄乎。这篇就专门写这个极简推导顺便把里面容易踩的思维误区也一起捋一遍适合刚接触协议栈的开发者、面试前临时抱佛脚的候选人以及所有想在五分钟内搞懂 AIMD 公平性本质的人。1. 把 AIMD 拆开它不是背下来的口诀而是一对精心设计的操作1.1 没有拥塞控制的互联网差点自己把自己挤垮先回到最早的故事。上世纪 80 年代中期的互联网其实没有真正意义上的拥塞控制。发送端只管发网络一堵就会丢包丢了包靠超时重传然后继续发。结果就是著名的“拥塞崩溃”因为丢包越多超时重传越多重传越多网络越堵越堵丢得更多。整个链路陷入死循环有效吞吐几乎归零。后来 Jacobson 在 1988 年那篇经典论文里引入了拥塞控制窗口核心思路很简单发送端不要直接猜带宽而是用一个窗口慢慢往上试探收到 ACK 就加一点一旦发现拥塞比如丢包立刻把窗口降下来。这个“慢慢加、猛下降”的节奏就是 AIMD 的雏形。它不是拍脑袋设计出来的而是从“如何在不知道链路容量的情况下既保持高利用率又避免崩溃”这个约束里长出来的。我后来做实验有一个很直观的类比假设两个人在一个水管下接水水管的水量时够时不够。如果每次发现水不够就把两个人手里已有的水都倒掉一半然后每人再得到同样一大杯水多接水的那个人在比例上会越来越吃亏最后两个人手里的水量趋于相等。AIMD 里的加性增就是这个“每人再加同样一杯水”乘性减就是那个“所有人手里减半”。比例上的追赶效应就是公平性收敛的全部秘密。1.2 为什么偏偏是“加性增 乘性减”而不是别的组合这个问题我面试常被问也是理解 AIMD 的钥匙。乘性减有个极重要的几何性质它保持流量之间的比例不变。假设流 A 的窗口是 100流 B 是 50二者比例是 2:1。发生拥塞后两个窗口都乘以 0.5变成 50 和 25比例还是 2:1。也就是说乘性减本身不贡献任何公平性它只负责快速逃离拥塞。加性增则相反如果 A 和 B 每轮各加 1那就是 101 和 51。原比例是 2加完后比例约 1.98明显更接近 1。所以“相同的增量会让低窗口流在比例上追上来”这才是公平性的驱动器。那为什么不用纯加性增和加性减AIAD因为加性减在不知道链路容量的情况下减得不够狠网络稍有波动又得靠反复探测踩油门容易振荡收敛慢甚至不收敛。为什么不用乘性增和乘性减MIMD乘性增会保持比例不变也就是强者恒强两个流永远无法均分带宽长期处于不公平状态。AIMD 的精妙之处在于乘性减负责稳定和控制损失加性增负责在每个周期让状态点朝公平线迈一步。两者缺一不可这个互补关系就是后续所有推导的根基。2. 公平性的定义先统一“公平”到底指什么2.1 公平性不是简单的平均主义而是收敛方向提到公平很多人第一反应是“每个流平分带宽”。粗略这么说没错但不够准确。设想一个 10Gbps 的瓶颈链路流 A 有大量数据要发流 B 只有一个交互小包强行均分反而浪费。而且现实里还有 RTT 差异、应用优先级、不同拥塞控制算法所以公平性需要更精确的描述。在 AIMD 的语境下公平性通常指长期运行时每个竞争流的窗口或者带宽占有率能够收敛到同一个稳定点。对于两个流的场景就是窗口比例 w1/w2 无限趋近于 1。你可以用 Jain 公平性指数来量化公式也不复杂就是 (Σxi)^2 / (n·Σxi²)等于 1 时表示完全公平接近 1/n 表示极端不公平。但极简推导其实用不到这么重的工具只要抓住“比例趋于 1”这个核心即可。注意公平和效率是两个维度。公平是“各自分到的份额均不均匀”效率是“瓶颈带宽有没有被充分利用”。AIMD 的乘性减在拥塞后会牺牲一部分效率换来的正是公平性的改善加性增再把效率拉回来。最终系统会在公平线附近震荡而不是稳定占用 100% 的容量这个“震荡收敛”本身很关键。2.2 用二维坐标把公平性问题画出来把两个流的窗口建模成平面上的一个点 (w1, w2)。理想公平状态落在直线 w1 w2 上也就是 45 度对角线。瓶颈容量限制表现为 w1 w2 C这是一条向下倾斜 45 度的直线。两个流同时公平又高效的理想点就是 w1 w2 和 w1 w2 C 的交点即 (C/2, C/2)。AIMD 中乘性减的操作是让点 (w1, w2) 沿从原点出发的射线向原点缩放因为缩放不改变横纵坐标之比所以这个点始终在同一条射线上移动也就是不改变公平程度。加性增的操作是让点沿着斜率 1 的方向向右上平移每次平移都让这个点离公平对角线更近一点。两者叠加的效果是状态点在每个拥塞周期里都会绕着一个目标点转一圈并且更靠近公平线。这个几何图像一旦建立后面的数学推导就很自然了。3. AIMD 公平性的极简数学推导一个递推式解决战斗3.1 先建一个最简单的双流模型为了看清本质我们先做几个理想化假设只有一条瓶颈链路两个连接一直有数据要发且 RTT 相同丢包信号对所有流完全同步也就是说一旦拥塞两个流在同一个时刻收到信号并一起降窗窗口调整在一个 RTT 内完成。这些假设在真实网络里几乎不成立但它们是推导公平性收敛逻辑的最小舞台。设第 n 个周期乘性减后开始时两个流的窗口分别是 w1(n) 和 w2(n)。从这个状态出发两个流各自加性增加直到总窗口达到链路容量 C触发下一次拥塞。因为加性增的步长相等所以从拥塞触发点到减半点之间的增量是同一个值 δ(n)它等于 C 减去当前总窗口 w1(n) w2(n)。注意这里的 δ(n) 可能随周期变化但不影响比例推导。乘性减之后下一个周期开始时的窗口就是w1(n1) (w1(n) δ(n)) / 2 w2(n1) (w2(n) δ(n)) / 2这里我把乘性因子写成了 1/2也就是标准 TCP Reno 的参数。后面你再换成通用的 β 也不难核心结论不变。3.2 比例序列的单调收敛证明现在看两个流窗口的比例 r(n) w1(n) / w2(n)为了推导方便先假设 w1 大于 w2也就是 r(n) 1。由上面的递推式r(n1) [w1(n) δ(n)] / [w2(n) δ(n)]关键在于下面这个初等不等式如果你把两个正数 x 和 y且 x y同时加上同一个正数 d那么它们之间的比例会变小即 (x d) / (y d) x / y但新的比例仍然大于 1。用一句话说同加一个正数会让“大数比例”趋向 1但不会越过 1。严格证明也简单交叉相乘一下(x d) / (y d) x / y 等价于 y(x d) x(y d)展开就是 yd xd因为 x y 且 d 0显然成立。把 x w1(n)y w2(n)d δ(n) 代进去就得到 r(n1) r(n)同时 r(n1) 1。也就是说如果本轮流 A 比流 B 多下一轮它的比例会变小但仍然大于 1反过来如果 w1 w2则比例会变大但仍小于 1。于是 r(n) 是一个有界且单调向 1 收敛的序列收敛到哪就是公平线 w1 w2。整个过程不需要解微分方程不需要矩阵特征值只需要一个不等式这就是我一直说的“极简推导”。3.3 几何直觉和数学推导其实是同一件事上面那个不等式的几何意义正是第 2 节我画的图像。平面上点 (w1, w2) 在加性增时沿 45 度方向平移。想象一个点原来落在公平线下方比如 (100, 50)加上同一个 δ 后变成 (130, 80)。用尺子量一下点离公平线的垂直距离其实没变等等这里要注意公平线是 w1 w2点 (100,50) 到公平线在横轴方向的差是 50加 δ 以后 (130,80) 的差还是 50。所以加性增不改“绝对差值”只改“比例”。这看起来好像没推动作用但乘性减出场后把点按比例拉回原点绝对差值也从 50 变成 25。再结合加性增保持绝对差值因此每轮这个差值都会减半最终收敛到 0。换一个更直观的说法乘性减每次把“不公平的绝对量”按比例压缩加性增虽然不改变绝对量但它保证系统每一次都能重新回到同一类压缩过程中。所以公平性的真正引擎是乘性减“添柴”的加性增则负责把系统推进到下一条射线二者配合状态点就一圈一圈地螺旋逼近对角线。4. 一般化与实操视野参数怎么选公平性受过什么真实影响4.1 换成通用的加性因子和乘性因子结论依然成立刚才用的是 TCP Reno 的标准化参数加性增 α 1乘性减 β 1/2。其实把推导换成一般参数也不费劲。设每个周期加性增量为 a乘性减因子为 b0 b 1递推变成w1(n1) b · (w1(n) δ(n)) w2(n1) b · (w2(n) δ(n))比例递推里δ(n) 仍是由链路容量 C 和当前总窗口决定的同一个增量不等式照用所以任意 a 0、0 b 1 的组合都收敛到公平。这意味着 AIMD 公平性对参数并不挑剔它是一个结构性质而不是某个特定参数的运气。也正因如此后来很多拥塞控制算法虽然改得花里胡哨但底层如果还想保留公平收敛就会保留这个“加性增、乘性减”的骨架。不过参数会影响收敛速度和效率。b 越小每轮乘性压缩越狠公平收敛越快但拥塞后带宽掉得也越多利用率更差。a 越大每轮加性增越快探测带宽更积极但也更容易频繁触发拥塞造成丢包和振荡。标准 TCP 选 a 1、b 0.5 是因为在早期有线网络上这是个不错的折中但并没有谁规定这是唯一正确的参数。实际调优时比如在数据中心里你会看到 DCTCP 用更小的 b 配合 ECN 标记在无线网络上又有人用更温和的升降策略都是在公平、效率和响应速度之间做权衡。4.2 为什么 MIMD 和 AIAD 注定玩不转把 AIMD 和它的几个“亲戚”放一起对比更容易看清公平性的来龙去脉。MIMD乘性增乘性减的问题是乘性增和乘性减都会保持流量比例不变。也就是说不管经历多少次拥塞周期两个流的相对关系一直不变强者恒强弱者恒弱。最后谁抢到的带宽取决于初始窗口完全谈不上收敛到公平。AIAD加性增加性减看起来对称它也有类似的“加性”追赶效应在比例上会向公平线靠但问题出在稳定性。加性减没有乘性收缩那么强的“刹车力”一旦网络负载接近容量加性减往往减得不够多系统需要反复撞到拥塞点再慢慢爬回来容易形成大范围振荡而且它对瓶颈容量没有任何先验知识时可能永远停不下来。AIMD 的核心智慧就是升得慢、降得快。升得慢避免过度注入降得快避免拥塞持续一个顶两个用。还有个容易忽略的细节AIMD 的公平性并不依赖知道链路容量 C 的具体数值。发送端只需要收到“拥塞/不拥塞”这样的二元反馈就能通过反复试探收敛到正确平衡点。这在互联网那种完全分布式、没有任何全局协调的环境里是非常宝贵的性质。这也是为什么 AIMD 能作为 TCP 拥塞避免基石活了几十年而不是像一些更“聪明”但需要全局信息的方法一样只停在论文里。4.3 真实网络里的坑RTT 不公平、不同 α、多瓶颈有了极简推导打底再看真实网络就会格外清醒。推导假设所有流 RTT 相同可实际上 RTT 差别大了去了。加性增是按“每个 ACK/RTT”加的RTT 短的流在相同时间里能加更多次。乘性减则是同时触发、按比例降因此短 RTT 流每次重新爬升的速度也更快。最终窗口比例大致会收敛到 RTT 比值的倒数附近也就是短 RTT 流分到更多带宽。这就是著名的“长 RTT 流被短 RTT 流压制”现象我刚工作那会儿用模拟器跑跨洲链路时经常被这个问题坑。多瓶颈和随机丢包也会让极简模型失效。一条流经过多个瓶颈每个瓶颈上和其他流竞争全局公平未必成立随机丢包会让不同流的拥塞信号不同步有的降窗有的不降比例收敛的单调性被破坏。另外不同实现如果 α 不同比如老版本某些 TCP 实现用了不同的增量那么同一条瓶颈上两个流即使 RTT 相同最终公平点也会偏移。后来出现的 CUBIC、BBR 这类算法本质上就是想修正 AIMD 在这些场景下的不公平但它们的理论起点仍然绕不开 AIMD 的这张图纸。5. 常见误区与实操心得搞清这几件事才算真正理解 AIMD5.1 四个高频认知误区我见过不少人把 AIMD 和“均分带宽”直接画等号这是第一个误区。AIMD 证明的是“相同条件下比例收敛到 1”但真实条件不同RTT 不同、丢包率不同、拥塞信号不同步最终公平点就不在 1 的位置。所以准确说法是AIMD 提供了一种在理想同质环境下收敛到公平的机制而不是对一切环境做公平承诺。第二个误区是把乘性减当成公平性的直接原因。前面推导已经说明乘性减只负责按比例缩放它本身不改变公平程度把它和加性增组合起来才形成了每轮收敛的闭环。如果你只做乘性减不做加性增两个流的比例永远不变根本没有公平可言。所以面试时千万别答成“因为乘性减所以公平”。第三个误区是认为 β 选得越小越好。β 小确实让收敛更快但会让拥塞后的带宽塌陷幅度也更大。一个链路容量为 C 的网络上每轮拥塞后总窗口会掉到 C/2对 β0.5 而言如果 β0.1则会掉到 0.1C之后需要更长的时间爬回。实际模拟你会发现β 过小时平均吞吐反而下降因为大部分时间都花在恢复上。第四个误区是觉得“只要大家都用 AIMD 就万事大吉”。同是用 AIMD参数不同、RTT 不同、是否开启 ECN、路由器是否启用公平排队都会改变结果。把它看作一个开放控制环路而不是一条写死的法则才符合工程现实。5.2 我在模拟和实测中反复用到的验证方法如果你也想像我当年一样亲手验证这个推导不需要复杂平台。拿 ns-3 或者 Python 自带的最小拥塞模拟都行关键是搭一个哑铃拓扑两个发送端、两个接收端中间共用一条 10Mbps、延迟 20ms 的瓶颈链路。开两个 TCP 流一个从 0 秒起一个从 2 秒起然后记录每个 TCP 流收到的累计吞吐量。你会看到后启动的流爬升、触发拥塞、大家一起降窗如此往复两条吞吐曲线最终咬合在一起窗口时间序列出现锯齿。用 Jain 指数算一下稳态时数值会一路逼近 0.99 而不是 1因为总有一些同步噪声存在。如果这时候你把一条流的 RTT 改成 100ms另一条保持 20ms再跑一次你会看到拥塞发生时两者确实都降窗但短 RTT 流恢复得更快最终两条流的带宽占比可能变成接近 3:1 或者更夸张。这个实验我强烈建议刚接触拥塞控制的同学亲手跑一遍它比看十篇文章更能帮你建立直觉。另一个特别有意思的变体是在路由器上打开 RED 或启用显式拥塞通知ECN就会看到丢包同步性被打破后的公平性变化非常耐人寻味。5.3 记住两条针对“极简推导”的最终结论如果只允许我从这篇文章里带两个结论走我会选这两条。第一AIMD 的公平性来自“乘性减保持比例、加性增拉近比例”的分工配合而不是某一个操作单独起作用。第二只要加性因子大于 0乘性因子严格在 0 到 1 之间双流模型中的窗口比例就是一个单调收敛序列最终收敛到 1。这个结论不需要矩阵、不需要控制论一个不等式就能证完。我自己在调试各种拥塞控制算法时最大的体会是AIMD 就像一张稳定性图纸后续算法要么在图纸上调整参数要么把线性增加换成别的探测函数但这些改动都必须尊重乘性负反馈这条底线。一旦丢掉乘性收缩任何看起来更聪明的算法都可能在真实网络中暴露出公平性或稳定性问题。所以下次看到某某新协议宣称自己在复杂链路上如何优秀你不妨先问一句它在公平性上是否还保留了那根乘性压舱石答案往往很快就出来了。
返回列表