当前位置: 首页 > news >正文

BBR 之 ProbeRTT 新改

早在 1981 年,Jaffe 在 Flow Control Power is Nondecentralizable 中就给出过论证,测量 maxbw 必然引入队列,而获得 minrtt 时带宽必然欠载,这确定了后面 30 年的拥塞控制算法基调,但 BBR 在 35 年后非常聪明地在两者间切换,在一个相对长的周期时间尺度中保持近似逼近真实的 maxbw 和 minrtt,这是独创。

让我们从 BBR 存在两个典型的两难处境的细节展开:

  • maxbw 和 minrtt 作为正交量不可同时测得,因此 BBR 设计了复杂但不灵敏的状态机;
  • ProbeBW 的 ProbeUP phase 一定会挤出带宽而建立队列,因此 BBR 需要定期 ProbeRTT。

第一个是 BBR 的核心设计,直接看第二个,其实这第二个我在前几天的论述中也屡次提到过,具体看 BBRv1 到 BBRv3 的公平性。

核心还是 buffer 动力学和数据包守恒,buffer 动力学说的是 ProbeUP phase 改变了 buffer 占比,从而改变了 bw 分配比例,而数据包守恒意味着一旦队列形成,只要离开的数据量小于等于发出的数据量,队列就不会消失,0.75 · bw2 · minrtt 中的 bw2 即挤兑后的新带宽,在没有新流汇入且对方没有 ProbeUP 前提下(控制变量法)一定小于 bw1,队列一定会持续形成。

在一个没有队列反馈的尽力而为网络,通过 ProbeUP phase 挤兑带宽的拥挤网络,就好像多条汹涌急躁的支流汇入干流,形成的湖泊一定不会自动消失一样,队列一定会持续。于是 BBR 一定需要 ProbeRTT,这是 ProbeRTT 的设计初衷。

BBRv1 的 ProbeRTT 看起来别扭,它激进地将 inflight 降为 4 并持续 200ms,这一方面造成了吞吐抖动,另一方面造成了发送缓冲区的 yet another bufferbloat,也因此出现了非常多的 ‘优化’,比如我曾经将 ProbeRTT 的周期从固定 10s 改成了 5~15s randomized,虽避免了全局同步,但也破坏了全局同步,而 BBR 非常依赖 ProbeRTT 时间的同步,只有同步 ProbeRTT,才能保证 minrtt 的可靠。

BBRv2/v3 的 ProbeRTT 发生了改变,将 inflight = 4 改为了 inflight *= 0.5 并重构了 MinRTTFilterLen 和 ProbeRTTInterval 语义,但依然存在过度 ‘参数化’ 嫌疑,为什么是 0.5 而不是 0.4 和 0.7。

再看第二个两难之间,显而易见的是,如果 x 倍的 pacing_rate 没有带来 x 倍的 delivery_rate,就一定发生了在 buffer 中挤带宽,若不想形成队列,只要检测到这种情况(这很容易),就将 inflight 退回 bw1 · minrtt 而丢掉 bw2,但为什么这么简单的事却没做,理由也简单,因为 BBR 必须靠 buffer 动力学收敛到公平,若不在 buffer 中折腾,BBR 就丧失了公平性,这个两难处境说的是,若想公平就一定要形成队列在 buffer 中折腾,若不想要队列,就得不到公平,这直击了效率和公平的两难之正中间,怎么做都是错。

这意味着还得依赖 ProbeRTT,但前面说了 ProbeRTT 非常拧巴,于是目标就是重构一版新的 ProbeRTT 逻辑。

把所有这些揉杂,说的是,既要形成队列,在 buffer 中收敛到公平,又不能形成队列,恪守 BBR 承诺,就需要一个 ProbeRTT 机制来平衡两者。本质上来讲,ProbeRTT 只需要将自己为了公平收敛在 buffer 形成的队列退掉即可。

ProbeRTT 后的初始,设 bw 为 bw1,the next ProbeUP phase 后的 bw 为 bw2,只要 bw2 > bw1,那么 B1 = (bw2 - bw1) · minrtt 就是这次该流形成队列所占据的 buffer,在下一次 ProbeRTT 之前,把这些 B1,B2,B3,… 累加起来就是所有占据的 buffer 总和,将 inflight 减去这么多即可。
ProbeRTT 要做的事很简单:

if (inflght <= INFLIGHT - Sigma_B) {stat = ProbeBW;
}

这竟然也摆脱了全局同步的需要以及调参的需要,长期看来,所有的流均定期将自己 ProbeUP phase 形成的队列清除,稳定状态下就没有队列,也不再需要固定的周期,这就很高尚。

想到这个新算法处于一种最基本的假设,即明确了队列是必不可少后,又明确了队列是如何形成的,然后记录队列的大小,怎么长大的就怎么清除掉,长大多少清除多少,这就在 ProbeRTT 周期内既保证了平性收敛,在 ProbeRTT 之间又保证了效率,典型的 short-term 和 long-term 特征分门别类。

五一出行,全年无休,此刻正在安徽泾县体验蚊虫,明天去桃花潭喝酒作诗,今日先喝一壶试醉,随手写一文。

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

相关文章:

  • 基于随机森林的糖尿病预测模型研究应用(python)
  • 颠覆者DeepSeek:从技术解析到实战指南——开源大模型如何重塑AI生态
  • 企业级分布式 MCP 方案
  • 单片机-STM32部分:0、学习资料汇总
  • HTML5+JavaScript实现连连看游戏之二
  • QT6(32)4.5常用按钮组件:Button 例题的代码实现
  • Exa MCP Server - AI 搜索服务中间件
  • 计算机网络01-网站数据传输过程
  • 第37课 绘制原理图——放置离页连接符
  • 【计算机视觉】三维视觉:Open3D:现代三维数据处理的全栈解决方案
  • 第4篇:服务层抽象与复用逻辑
  • Java 中 Unicode 字符与字符串的转换:深入解析与实践
  • 精益数据分析(38/126):SaaS模式的流失率计算优化与定价策略案例
  • DeepSeek构建非农预测模型:量化关税滞后效应与非线性经济冲击传导
  • 【STM32】定时器输入捕获
  • 【AI面试准备】元宇宙测试:AI+低代码构建虚拟场景压力测试
  • 铸铁划线平板:多行业的精密测量工具(北重铸铁平板厂家)
  • react js 查看字体效果
  • 「Mac畅玩AIGC与多模态13」开发篇09 - 基于多插件协同开发智能体应用(天气+名言查询助手)
  • 从0到上线,CodeBuddy 如何帮我快速构建旅游 App?
  • 韩国国民力量党宣布金文洙为该党总统候选人
  • 从“土”到“潮”,唢呐何以“圈粉”年轻人
  • 旅游特种兵们,这个五一“躲进”书吧
  • “三桶油”一季度净赚966亿元:业绩分化加剧,有人欢喜有人愁
  • 解放日报:让算力像“水电煤”赋能千行百业
  • 拍摄《我们这一代》的肖全开展“江浙沪叙事”