无懈可击的 TCP AIMD

不特指 TCP AIMD,而泛指控制范畴的所有 Additive Increase / Multiplicative Decrease 算法,继 难以超越的 TCP AIMD 再叙。

“你永远不能仅凭 BBR 的吞吐更高就说 BBR 比 CUBIC 更好” 这句话怎么总是没人看,这句话是这一系列文章的前提论点,但却总有人看了全文后用 “BBR 性能更高” 来表明自己见多识广。

再次给出 AIMD 算法吞吐率 T 和丢包率 p 以及 RTT 关系的公式:

T=γRTT⋅p−0.5T=\dfrac{\gamma}{\text{RTT}}\cdot p^{-0.5}T=RTTγp0.5

在三维坐标系里画图,结论就是:

  • AIMD 算法受 RTT 影响巨大,RTT 越大,吞吐越低;
  • AIMD 算法受丢包率 p 影响巨大,p 越大,吞吐越低;

如来自 IBM Aspera 的广告图描述上述正合适:
在这里插入图片描述

还有个推论:

  • 端到端传输控制是 “and” 关系,丢包与路径长度正相关,往往 RTT 越大,p 也越大;

这些即 “长肥管道中 TCP 窗口张开难的故有问题” 的量化描述,长肥管道问题历经 30 年,终于在 2010 年代不能再无视,必须解决,原因在于 “依照 AIMD 公式,高速 TCP 需要控制 p 在某个值 Q 之下,而大多数传输介质的固有丢包率都在 Q 之上”,换句话说,介质由于固有丢包率太高而无法满足高速 TCP 的要求。

如何解决长肥管道的问题,还得从本质入手。

这明明是介质不中用了,关 AIMD 公式什么事。引力距离超过洛希极限掌控不了了,就是牛顿错了?介质不中用了就优化介质,介质电气特性本身就有定义了传输吞吐极限的含义,比如所谓五类,超五类双绞线,目前面对超高速 TCP 而言,只是没有哪种介质对应 400Gbps 传输带宽而已,而不是 AIMD 算法不好。

相反,综合考虑成本,带宽利用率,公平性等,AIMD 是综合效能最好的算法,没有之一,AIMD 恰如其分适应尽力而为的网络。参考 难以超越的 TCP AIMD。

AIMD 公式的正则推导不难,我的总结看这里:

  • AIMD 公式的一般推导(附几何推导引用)
  • TCP AIMD 公式的推导

更正式的论文参考 The Macroscopic Behavior of the TCP Congestion Avoidance Algorithm。

但这次我们用更加直观的方式重新审视 AIMD 公式,-0.5 次幂值得注意,这意味着 p 和 W 的平方存在反比关系,这个平方如何理解。按照生灭守恒,MD 视作丢包惩罚,AI 视作奖励,则:

(惩罚量)⋅(惩罚概率)∝(奖励量)⋅(奖励概率)(惩罚量)\cdot (惩罚概率) \propto (奖励量)\cdot(奖励概率)(惩罚量)(惩罚概率)(奖励量)(奖励概率)

AIMD 的惩罚量为 β·W,惩罚概率即丢包率 p,奖励量为 1,奖励概率即每个 RTT 一次,即 RWR=1W\dfrac{\frac{R}{W}}{R}=\dfrac{1}{W}RWR=W1,总体上就是:
β⋅W⋅p∝1⋅1W\beta\cdot W\cdot p \propto 1\cdot\dfrac{1}{W}βWp1W1

至于为什么如此,直观上即可理解。

以吹气球为例,气球的破裂容量决定了两个维度的度量,一个是气球的最大容量,另一个是把气球吹到最大容量的时间,而 AIMD 的过程非常像吹气球,buffer 满了丢包视为气球吹爆,它决定了丢包时的最大窗口 W 以及到达最大窗口的时间 0.5·W·RTT,因此 W2∝1pW^2 \propto \frac{1}{p}W2p1,剩下的就是待定系数了。

用吹气球的过程套用生灭守恒,则气球爆裂瞬间释放 W 气体,吹爆气球的频率为 p,按照 AIMD 将气球吹起来需要 W 口气,则吹气频率即 1W\dfrac{1}{W}W1,那么 W⋅p=1⋅1WW\cdot p=1\cdot\dfrac{1}{W}Wp=1W1,还是一样的结论。

考虑一个有 n +1 个气孔的气球,其中 1 个气孔出气,n 个气孔进气,如果我们要求气球内部必须保留一定气体从出气孔持续放出,考虑 n 人一起从 n 个进气孔吹同一个气球的场景。如果 n = 1,为了照顾人有限的肺活量,气球容量必须至少等于人的最大肺活量,且吹得太快容易爆裂,吹得太慢换气时出气孔没气体,但 n = 3 时,一个人换气时,另外 2 人可能依然保持吹气,就这样让 n 不断增大。

随 n 不断增大,单个人的换气行为导致的气体波动被稀释了。流越多,所需 buffer 越小,但带宽利用率仍然很高,这就是网络对 buffer 需求的平方反比律,参见 交换机 buffer 的平方反比律。

流越多,峰越容易被平滑到谷,总体方差越小,大数中心极限定理,整体越收敛,这就是统计的力量,勾勒出的是现实的美感。

因此 AIMD 算法对 buffer 的需求是向内敛的,不会膨胀,这意味着 AIMD 算法具有良好的扩展性。从这个论点再次看出,AIMD 只需要非常小的代价便可以保持网络在整体上公平高效的可用性,且随着流增多,buffer 需求却不增反降,抖动也被平滑,时延亦具有扩展性。这一切竟然都是自动的,只要执行最简洁的 AIMD。

维持互联网公平高效可用的根基竟然就是多人吹气球。

在这个和谐的场景,单独侵入一条 BBR 流,然后说 BBR 可以获得更大的吞吐,从而证明 BBR 比 AIMD 更优,这是当前绝大多数人的观点,我早已抛弃了这个观点,经历了满怀激情的无果优化,深入理解了 TCP/IP 尽力而为的本质后,我明白了 AIMD 少就是多。

现在开始考虑更加现实的情况。

网络是一个开放系统而非封闭系统,这意味着网络状态时刻随输入,输出,反馈而改变,正如股票,有人买它就会涨,有人卖它就会跌,让你永远捉摸不定它的下一步走势,因为这个走势直接由买卖者自己的行为决定。同样, AIMD 公式需要修正,修正的重点在于,p 在 “多大程度” 上决定 AIMD 周期和最大窗口,这个程序是非线性的,因此需要重新建模:

T=γRTProp⋅p−αT=\dfrac{\gamma}{\text{RTProp}}\cdot p^{-\alpha}T=RTPropγpα,其中 0<α≤10<\alpha\le 10<α1

以上更加实际的模型显然无法通过理论推导计算出来参数,接下来就是在每一个特定场景用海量测量数据喂这个模型,求出该场景下最佳拟合结果的 α,β。区别就在于 “理论计算” 还是 “经验总结”。
该模型可以精确预测一个开发中的系统最终的预期理论吞吐,比如用各种 p 得到的实际结果求出 α,β 后,就可以根据系统的结构蕴含的 p 求出 T。它比理论上的 -0.5 次幂以及各种不同 AIMD 算法理论上的 β 更具有实际意义。

以下是这件事和这场论述的缘起,我先给出我的一个拟合模型:

T=1.05⋅MSSRTT⋅p−0.75T=1.05\cdot\dfrac{\text{MSS}}{\text{RTT}}\cdot p^{-0.75}T=1.05RTTMSSp0.75

我的 tun/tap 背靠背转发程序里设置了 40MB buffer,在处理 RingBuffer 边界回绕时没处理好,意味着每 40MB 数据丢一个 MSS,测下来只有 490Mbps,fix bug 前需要一个期望,我的期望是跑满千兆,依据就是以上公式。该模型的参数基于 cubic 精确拟合过,至于 40MB 还是 5MB,也可反算,最终得到最佳解。

将 p 视作通用损耗率,该模型几乎适合任何系统求解最佳吞吐。

该总结一下了,形而上时间。

AIMD 公式虽简洁,但与性能挂钩就很不好看,吞吐随 p 衰减太厉害。人们总觉得有 “巨大优化空间”,总想着去 “优化” 它,BBR 出来了,吞吐上来了,但付出了更大的公平性和测量的代价,代码越搞越复杂。问题是如何定义 “更优”,值得编程者注意的是,网络是一个开放非线性系统,而非线性系统的问题不仅仅关乎计算机技术,遗憾的是,BBR 出自计算机技术学科内线性的假设。

如果快速衰减就是不可违抗的自然律呢,而自然本就是典型的非线性系统,这种函数随自变量非线性变化的自然律太正常了。观测被编程者膜拜的无敌香农公式,设信号为 1,噪声为 p,信道容量为

C=B⋅log⁡2(1+1p)C=B\cdot\log_2(1+\dfrac{1}{p})C=Blog2(1+p1)

与 AIMD 几乎一致,二者均显示非线性衰减特征:
在这里插入图片描述

噪声增加一点点,信道容量下降很多。

类似的,材料疲劳寿命和应力波动,金融投资收益与风险,生态学种群增长与流行病,均描述了相似的非线性特征。

这并非意味着这些公式描述的衰减存在优化空间,恰恰相反,这说明这些公式描述的世界本质上就是这样的,这是真实世界中真实的衰减,无法抗拒的衰减。而真实世界符合最小作用量,这意味着它们已经是最优解。

回到 AIMD,它是一种极其自然的作用力,自然作用力天然具有公平性特征,其不变量就是时间在共享 buffer 里的弹性,一条流的 buffer 排队时间多了,该作用力会更强烈让其排出更多。

为什么收敛行为这么简洁和优雅?只因为它是自然的,多一点都是多。

更直观的例子是非牛顿流体,不管形状如何,只要质量相同,在重力的作用下,它们最终肯定占据相同的占地面积,因为重心高了,重力会拉低它,将高度补偿给面积后,拉低的力度逐渐变弱,最终大家一致,就好像大家刚挤上一辆公交车时气都喘不过来,车开了点播一段时间后,就逐渐宽松且公平了,RTT=InfltBW\text{RTT}=\dfrac{\text{Inflt}}{\text{BW}}RTT=BWInflt 表达的也是一个意思。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/920546.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/920546.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据集数量与神经网络参数关系分析

1. 理论基础 1.1 经验法则与理论依据 神经网络的参数量与所需数据集大小之间存在重要的关系&#xff0c;这直接影响模型的泛化能力和训练效果。 经典经验法则10倍法则&#xff1a;数据样本数量应至少为模型参数量的10倍 公式&#xff1a;数据量 ≥ 10 参数量适用于大多数监督学…

项目经验处理

订单取消和支付成功并发问题 这是一个非常经典且重要的分布式系统问题。订单取消和支付成功同时发生&#xff0c;本质上是一个资源竞争问题&#xff0c;核心在于如何保证两个并发操作对订单状态的修改满足业务的最终一致性&#xff08;即一个订单最终只能有一种确定的状态&…

rabbitmq学习笔记 ----- 多级消息延迟始终为 20s 问题排查

问题现象 在实现多级延迟消息功能时&#xff0c;发现每次消息延迟间隔始终为20s&#xff0c;无法按照预期依次使用20s→10s→5s的延迟时间。日志显示每次处理时移除的延迟时间都是20000L。 问题代码片段 1.生产者 Testvoid sendDelayMessage2() {List<Long> expireTimeLi…

软件测试(三):测试流程及测试用例

1.测试流程1.需求分析进行测试之前先阅读需求文档&#xff0c;分析指出不合理或不明确的地方2.计划编写与测试用例测试用例用例即&#xff1a;用户使用的案例测试用例&#xff1a;执行测试的文档作用&#xff1a;用例格式&#xff1a;----------------------------------------…

Python:列表的进阶技巧

列表&#xff08;list&#xff09;作为 Python 最常用的数据结构之一&#xff0c;不仅能存储有序数据&#xff0c;还能在推导式、函数参数传递、数据处理等场景中发挥强大作用。下面介绍一些进阶技巧与常见应用。一、去重与排序1、快速去重&#xff08;不保序&#xff09;nums …

【完整源码+数据集+部署教程】硬币分类与识别系统源码和数据集:改进yolo11-SWC

背景意义 随着经济的发展和数字支付的普及&#xff0c;传统硬币的使用逐渐减少&#xff0c;但在某些地区和特定场合&#xff0c;硬币仍然是重要的支付手段。因此&#xff0c;硬币的分类与识别在自动化支付、智能零售和物联网等领域具有重要的应用价值。尤其是在银行、商超和自助…

莱特莱德:以“第四代极限分离技术”,赋能生物发酵产业升级

莱特莱德&#xff1a;以“第四代极限分离技术”&#xff0c;赋能生物发酵产业升级Empowering Upgrades in the Bio-Fermentation Industry with "Fourth-Generation Extreme Separation Technology生物发酵行业正经历从 “规模扩张” 向 “质效提升” 的关键转型&#xff…

外卖大战之后,再看美团的护城河

美团&#xff08;03690.HK&#xff09;于近日发布了2025年Q2财报&#xff0c;市场无疑将更多目光投向了其备受关注的外卖业务上。毫无悬念&#xff0c;受外卖竞争和加大投入的成本影响&#xff0c;美团在外卖业务上的财务数据受到明显压力&#xff0c;利润大幅下跌&#xff0c;…

R包fastWGCNA - 快速执行WGCNA分析和下游分析可视化

最新版本: 1.0.0可以对着视频教程学习和使用&#xff1a;然而还没录呢, 关注B站等我更新R包介绍 开发背景 WGCNA是转录组或芯片表达谱数据常用得分析, 可用来鉴定跟分组或表型相关得模块基因和核心基因但其步骤非常之多, 每次运行起来很是费劲, 但需要修改的参数并不多所以完全…

GitHub 热榜项目 - 日榜(2025-08-29)

GitHub 热榜项目 - 日榜(2025-08-29) 生成于&#xff1a;2025-08-29 统计摘要 共发现热门项目&#xff1a;11 个 榜单类型&#xff1a;日榜 本期热点趋势总结 本期GitHub热榜展现出三大技术趋势&#xff1a;1&#xff09;AI应用持续深化&#xff0c;ChatGPT等大模型系统提示…

【深度学习实战(58)】bash方式启动模型训练

export \PATHPYTHONPATH/workspace/mmlab/mmdetection/:/workspace/mmlab/mmsegmentation/:/workspace/mmlab/mmdeploy/:${env:PYTHONPATH} \CUDA_VISIBLE_DEVICES0 \DATA_ROOT_1/mnt/data/…/ \DATA_ROOT_2/mnt/data/…/ \DATA_ROOT_MASK/…/ \PATH_COMMON_PACKAGES_SO…sonoh…

【物联网】关于 GATT (Generic Attribute Profile)基本概念与三种操作(Read / Write / Notify)的理解

“BLE 读写”在这里具体指什么&#xff1f; 在你的系统里&#xff0c;树莓派是 BLE Central&#xff0c;Arduino 是 BLE Peripheral。 Central 和 Peripheral 通过 **GATT 特征&#xff08;Characteristic&#xff09;**交互&#xff1a;读&#xff08;Read&#xff09;&#x…

JavaSE丨集合框架入门(二):从 0 掌握 Set 集合

这节我们接着学习 Set 集合。一、Set 集合1.1 Set 概述java.util.Set 接口继承了 Collection 接口&#xff0c;是常用的一种集合类型。 相对于之前学习的List集合&#xff0c;Set集合特点如下&#xff1a;除了具有 Collection 集合的特点&#xff0c;还具有自己的一些特点&…

金属结构疲劳寿命预测与健康监测技术—— 融合能量法、红外热像技术与深度学习的前沿实践

理论基础与核心方法 疲劳经典理论及其瓶颈 1.1.疲劳失效的微观与宏观机理&#xff1a; 裂纹萌生、扩展与断裂的物理过程。 1.2.传统方法的回顾与评析。 1.3.引出核心问题&#xff1a;是否存在一个更具物理意义、能统一描述疲劳全过程&#xff08;萌生与扩展&#xff09;且试验量…

【贪心算法】day4

&#x1f4dd;前言说明&#xff1a; 本专栏主要记录本人的贪心算法学习以及LeetCode刷题记录&#xff0c;按专题划分每题主要记录&#xff1a;&#xff08;1&#xff09;本人解法 本人屎山代码&#xff1b;&#xff08;2&#xff09;优质解法 优质代码&#xff1b;&#xff…

AI 与脑机接口的交叉融合:当机器 “读懂” 大脑信号,医疗将迎来哪些变革?

一、引言&#xff08;一&#xff09;AI 与脑机接口技术的发展现状AI 的崛起与广泛应用&#xff1a;近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术迅猛发展&#xff0c;已广泛渗透至各个领域。从图像识别、自然语言处理到智能决策系统&#xff0c;AI 展现出强大的数…

uniapp vue3 canvas实现手写签名

userSign.vue <template><view class"signature"><view class"btn-box" v-if"orientation abeam"><button click"clearClick">重签</button><button click"finish">完成签名</butt…

页面跳转html

实现流程结构搭建&#xff08;HTML&#xff09;创建侧边栏容器&#xff0c;通过列表或 div 元素定义导航项&#xff0c;每个项包含图标&#xff08;可使用字体图标库如 Font Awesome&#xff09;和文字&#xff0c;为后续点击交互预留事件触发点。样式设计&#xff08;CSS&…

Spring Boot自动装配机制的原理

文章目录一、自动装配的核心触发点&#xff1a;SpringBootApplication二、EnableAutoConfiguration的作用&#xff1a;导入自动配置类三、自动配置类的加载&#xff1a;SpringFactoriesLoader四、自动配置类的条件筛选&#xff1a;Conditional注解五、自动配置的完整流程六、自…

(未完结)阶段小总结(一)——大数据与Java

jdk8-21特性核心特征&#xff1a;&#xff08;8&#xff09;lambda&#xff0c;stream api&#xff0c;optional&#xff0c;方法引用&#xff0c;函数接口&#xff0c;默认方法&#xff0c;新时间Api&#xff0c;函数式接口&#xff0c;并行流&#xff0c;ComletableFuture。&…