难以超越的 TCP AIMD

我不是为了评价各种 TCP 算法的好坏,只是阐述一个观点,即 "为什么在尽力而为的网络,很难有什么 TCP 算法在综合表现上比 AIMD 做得更好"。

在端到端原则之内,AIMD 保证了网络传输收敛,稳定,它是互联网可用性的基石,这是下限,另一方面,它可能同时规定了难以逾越的上限,AIMD 在多流任意共享场景收敛到了这样一种状态,在不损害任何一方利益的前提下,无法再使至少一方变得更好。AIMD 通过其独特的动态调整机制,天然实现了网络资源分配的帕累托最优,也可以说 AIMD 天然实现了最大最小公平。

尽力而为也存在相似相容,一方水土养一方人。在尽力而为的网络,"足够好" 就是 "最好","更好" 反而 "更差"。互联网不维护状态,AIMD 仅依赖端系统感知的二元信号(丢包 or no)就能完成控制,完美匹配 IP 网络的 "哑管道" 哲学。

AIMD 可能已达到最大最小公平性的理论上限,任何改进本质上都是在特定场景下的帕累托改进,如 BBR 牺牲能耗和公平性换取单流高吞吐。

尽力而为网络无法反馈任何可靠信息,只能基于可信事件做反应,BBR 和 ECN 是其在反方向努力的代表。BBR 采集的 delivery rate 仅作为最后一跳信息,无法描述网络状态,以此做 pacing rate 必不准确且没根据,因此需要更加具有启发式意义的 probe 算法,且 BBR 强烈依赖主机时钟的稳定性,进一步挑战并偏离了最佳能效点,而 ECN 则依赖路由器交换机的 feature,这完全无法保证。

问题的根源不是算法不够好,而在于网络的尽力而为内在属性,若要最优化性能,首先要改变网络的尽力而为本性,若不改变网络的本性,很难超越 AIMD。

有人曾经问我,多流共存,存在最优解吗?我说,存在,但你无法找到,全局意义上,AIMD 就是你能找到的最优解。 我举的另一个例子,猜硬币正反面,在没有任何信息输入时,随机就是最优解,你做得越多,结果越偏离期望,就像时间不会倒流弥补误判一样,熵只会叠加坍缩而不会抵消,任何无效的信息熵都会叠加到负向。

基于 AIMD 的 Reno/NewReno 属于第一代杰作,后续 Cubic 长期作为默认算法被广泛部署,AIMD 支撑了互联网发展的黄金时代,无数人论证 AIMD 的良性特征并解释为什么它如此高效且稳定。

但 BBR 背后的 Google 让标准化组织口风变得松动,Google 提出的 issue 及解决之道,大概率最终会成为新的标准,换句话说,优先部署抢占了论证,而世界的逻辑往往由木已成舟决定,我们无法假设我们的食管和气管没有交叉时鼻子会长在哪,但我们必须接受现在的安排。

但 BBR 讨论组 BBR Development 不活跃了,可能都去卷 AI 了吧。

TCP 各类问题的根源是网络不行,不是 AIMD 不行,换更好的 BBR 无法解决根本问题。TCP 本身具有很强的可扩展性,从不到 1Mbps 的带宽适应到 200Gbps,在 100Mbps 之下,TCP 表现很好,从 100Mbps 长肥管道到 25Gbps,TCP 被普遍诟病但却依然适应良好,过了 40Gbps,性能瓶颈转移到了主机,但这些都不是协议的问题,200Gbps + TCP Reno + TSO/LRO + GBN + BigTCP + ZeroCopy 或许真比 200Gbps + BBR + TSO/LRO + SACK 表现更优秀。

一个没被大多数人意识到的事实是,TCP 的复杂性几乎都在应对丢包,而丢包属于异常,人们花大量精力进一步复杂化异常处理,其努力早就超越了 T = α ⋅ p − r T=\alpha\cdot p^{-r} T=α⋅p−r 的约束范围(该公式定义了长肥管道问题本身),而在该公式约束范围以内,AIMD 各种变体早就定义了综合表现的上限,而这是 30 多年以前的事。

昨晚做梦又梦到做 TCP 优化,写篇短文。

浙江温州皮鞋湿,下雨进水不会胖。

相关推荐
JaguarJack33 分钟前
PHP 的异步编程 该怎么选择
后端·php·服务端
BingoGo36 分钟前
PHP 的异步编程 该怎么选择
后端·php
JaguarJack16 小时前
为什么 PHP 闭包要加 static?
后端·php·服务端
ServBay2 天前
垃圾堆里编码?真的不要怪 PHP 不行
后端·php
用户962377954482 天前
CTF 伪协议
php
blasit3 天前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
YuMiao3 天前
gstatic连接问题导致Google Gemini / Studio页面乱码或图标缺失问题
服务器·网络协议
BingoGo4 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack4 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo5 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php