难以超越的 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−rT=\alpha\cdot p^{-r}T=α⋅p−r 的约束范围(该公式定义了长肥管道问题本身),而在该公式约束范围以内,AIMD 各种变体早就定义了综合表现的上限,而这是 30 多年以前的事。
昨晚做梦又梦到做 TCP 优化,写篇短文。
浙江温州皮鞋湿,下雨进水不会胖。