过冲拥塞控制的呼吸与盲行任何基于反馈的控制系统都逃不过过冲。你踩刹车车不会立刻停你转方向盘车头指向总比手慢一拍。拥塞控制也一样。过冲不是错误AIMD加法增乘法减之所以叫“加法增”是因为它每次增加一点点直到遇到问题再大幅减少。这个“直到遇到问题”的阶段就是在主动过冲。你不冲过那条线就永远不知道线在哪里。过冲是探测代价不是设计失误。为什么必须过冲不过冲会怎样先回答问题过冲不是“正确”或“错误”的道德判断。它是一个信息获取动作。如果我们选择永远不过冲——即发送速率严格不增加只停留在当前认为安全的值。那么你不会主动探测到闲置带宽但这并不意味着你不会遇到拥塞。因为网络是动态的其他流会启动路由会切换缓冲区会被人填满。即使你站在原地不动墙也可能会向你撞来。你可能会被动地遭遇丢包或延迟增加被迫降速。但你永远不会知道带宽是否已经变大了。最终你的速率要么卡在某个历史低点要么被其他流的拥塞信号拖垮。所以不过冲的后果不是“永远安全”而是丧失主动适应能力同时仍然无法避免被动拥塞。过冲是一种主动选择用可控的代价去获取信息而不是被动地等待墙来撞你。过冲不是因为正确而是因为没有过冲就没有信息而信息是控制的燃料。丢包不告诉你原因丢包只是一个信号某个队列满了。但它不告诉你为什么满可能是真实拥塞可能是瞬时突发多个流同时发送可能是浅缓冲区设备缓存小可能是 Bufferbloat队列早已深不见底你只是压死骆驼的最后一根稻草可能是路由切换、ECMP 哈希冲突可能是网卡或内核的微突发可能是无线链路的信道错误甚至可能是乱序导致的伪重传AIMD 不区分这些。它看到丢包就把窗口砍半。简单粗暴但有效——至少在它诞生的年代。滞后是原罪你看到的丢包是几百毫秒甚至更早之前发生的。你做出的降速决定作用于此刻。等你降完了拥塞可能已经自行消散。于是你白白降速浪费带宽。这就是反馈控制的先天残疾你永远在打上一场仗。过冲与滞后是一对双生子滞后迫使你过冲过冲又加剧滞后。AIMD 的锯齿形吞吐就是这个正反馈循环的外在表现。盲人摸墙过冲的本质就是盲人摸墙。你不知道墙在哪。你只能伸出手往前探。没摸到就再往前一步。直到手指触到冰冷坚硬的表面——那是墙。你知道了它的位置。但网络不是一堵静止的墙。墙在动你摸到的瞬间墙可能已经移动了。离你更近或者更远。其他流启动了墙向你推来。其他流退出了墙远离你而去。路由变了墙瞬间换了位置。缓冲区被填满了墙突然变得很近。噪声让RTT抖了一下你以为墙在其实不在。你永远在摸一个移动的目标。即使你站在原地不动墙也可能主动撞上来。小心翼翼的悖论你想不撞墙就得慢慢探。步子小安全但永远追不上墙移动的速度。你想追上墙就得大步跨。步子大可能直接撞上去头破血流。这就是过冲的两难慢则跟不上变化快则承担代价。任何想消除锯齿的算法本质上都是在尝试预测未来。预测有时成功有时失败。没有人能总是成功。没有最优步长最优步长取决于墙怎么动。但你不知道墙怎么动它也不告诉你。你能做的只是选一个你认为“差不多”的步长然后接受后果。有的算法步子大有的步子小。没有谁对谁错只有谁更适合当下的墙。而当下是什么你永远无法确知。所以过冲不是 bug是特性。我们无法消除过冲只能控制过冲的幅度和频率。幅度大收敛快但抖动剧烈幅度小平稳但响应迟钝。没有最优只有取舍。每一次过冲都是一次赌博。赌赢了带宽跑满赌输了丢包重传。没有人能一直赌赢。承认这一点比发明一个“永不撞墙”的算法更诚实。这就是拥塞控制的底色。
过冲:拥塞控制的呼吸与盲行
发布时间:2026/6/8 11:22:18
过冲拥塞控制的呼吸与盲行任何基于反馈的控制系统都逃不过过冲。你踩刹车车不会立刻停你转方向盘车头指向总比手慢一拍。拥塞控制也一样。过冲不是错误AIMD加法增乘法减之所以叫“加法增”是因为它每次增加一点点直到遇到问题再大幅减少。这个“直到遇到问题”的阶段就是在主动过冲。你不冲过那条线就永远不知道线在哪里。过冲是探测代价不是设计失误。为什么必须过冲不过冲会怎样先回答问题过冲不是“正确”或“错误”的道德判断。它是一个信息获取动作。如果我们选择永远不过冲——即发送速率严格不增加只停留在当前认为安全的值。那么你不会主动探测到闲置带宽但这并不意味着你不会遇到拥塞。因为网络是动态的其他流会启动路由会切换缓冲区会被人填满。即使你站在原地不动墙也可能会向你撞来。你可能会被动地遭遇丢包或延迟增加被迫降速。但你永远不会知道带宽是否已经变大了。最终你的速率要么卡在某个历史低点要么被其他流的拥塞信号拖垮。所以不过冲的后果不是“永远安全”而是丧失主动适应能力同时仍然无法避免被动拥塞。过冲是一种主动选择用可控的代价去获取信息而不是被动地等待墙来撞你。过冲不是因为正确而是因为没有过冲就没有信息而信息是控制的燃料。丢包不告诉你原因丢包只是一个信号某个队列满了。但它不告诉你为什么满可能是真实拥塞可能是瞬时突发多个流同时发送可能是浅缓冲区设备缓存小可能是 Bufferbloat队列早已深不见底你只是压死骆驼的最后一根稻草可能是路由切换、ECMP 哈希冲突可能是网卡或内核的微突发可能是无线链路的信道错误甚至可能是乱序导致的伪重传AIMD 不区分这些。它看到丢包就把窗口砍半。简单粗暴但有效——至少在它诞生的年代。滞后是原罪你看到的丢包是几百毫秒甚至更早之前发生的。你做出的降速决定作用于此刻。等你降完了拥塞可能已经自行消散。于是你白白降速浪费带宽。这就是反馈控制的先天残疾你永远在打上一场仗。过冲与滞后是一对双生子滞后迫使你过冲过冲又加剧滞后。AIMD 的锯齿形吞吐就是这个正反馈循环的外在表现。盲人摸墙过冲的本质就是盲人摸墙。你不知道墙在哪。你只能伸出手往前探。没摸到就再往前一步。直到手指触到冰冷坚硬的表面——那是墙。你知道了它的位置。但网络不是一堵静止的墙。墙在动你摸到的瞬间墙可能已经移动了。离你更近或者更远。其他流启动了墙向你推来。其他流退出了墙远离你而去。路由变了墙瞬间换了位置。缓冲区被填满了墙突然变得很近。噪声让RTT抖了一下你以为墙在其实不在。你永远在摸一个移动的目标。即使你站在原地不动墙也可能主动撞上来。小心翼翼的悖论你想不撞墙就得慢慢探。步子小安全但永远追不上墙移动的速度。你想追上墙就得大步跨。步子大可能直接撞上去头破血流。这就是过冲的两难慢则跟不上变化快则承担代价。任何想消除锯齿的算法本质上都是在尝试预测未来。预测有时成功有时失败。没有人能总是成功。没有最优步长最优步长取决于墙怎么动。但你不知道墙怎么动它也不告诉你。你能做的只是选一个你认为“差不多”的步长然后接受后果。有的算法步子大有的步子小。没有谁对谁错只有谁更适合当下的墙。而当下是什么你永远无法确知。所以过冲不是 bug是特性。我们无法消除过冲只能控制过冲的幅度和频率。幅度大收敛快但抖动剧烈幅度小平稳但响应迟钝。没有最优只有取舍。每一次过冲都是一次赌博。赌赢了带宽跑满赌输了丢包重传。没有人能一直赌赢。承认这一点比发明一个“永不撞墙”的算法更诚实。这就是拥塞控制的底色。