tcp inflight 守恒算法背后的哲学

tcp inflight 守恒拥塞控制的正确性

很久以前我开始纠结 tcp 锯齿,很多年后我知道这叫 capacity-seeking,甚至说 tcp 属于 capacity-seeking protocol 的原因就是它早已深入人心的 aimd 行为,而该行为生成了 tcp 锯齿。

在消除锯齿,自适应带宽的研究中,vegas 做了最初探索,但直到 bbr 还是不对路子。

我对这问题思考了非常多也非常久,也从经济学(主要是费雪的学说),社会学,博弈论中找到一些相似问题来看,得到两个法则作为对这问题思考的总结:

  • 法则 1:必须为拥塞控制支付代价,作为整体的网络才能为端主机反馈一个好的结果;
  • 法则 2:进(增加 inflight)的时候适可而止,退(收缩 inflight)的时候才可以什么都不做。

以此上述两条原则为根本,inflight 守恒算法如下:

  • 在 winmax 中追踪 alpha rounds 的 bw / srtt,将此 bw 记为 b;
  • 在 winmin 中追踪 k*alpha rounds 的 srtt,记为 minrtt;
  • 保持 inflight = b * minrtt + (minrtt / (srtt^gamma * bw)) * beta。

算法非常简单,但背后的含义并非它表达的那般直接。

首先看法则 1,要支付什么代价,又有哪些反例。

典型案例是 aimd,如 reno,cubic,它们填充 buffer 直到丢包,支付了时延和丢包重传双重代价,以此保证了网络的可用性和稳定,同时效率也不太差。

反例是 bbr。bbr 小心翼翼寻找 maxbw 和 minrtt,却不想支付任何时延,在 probe 阶段过后试图快速 drain 掉无效 inflight,但正因此 bbr 总找不到它要的 “最佳操作点”。maxbw 和 minrtt 并非总在同时获得,它们之间的 gap 给 bbr 带来错觉,导致无法区分 maxbw 是空闲资源带来的,还是从共享 buffer 中挤兑出来的。所以我一直说 bbr 是个单流模型。

看 inflight 守恒算法。没有免费午餐,互不沟通的分布式自组织网络的统计公平性必须靠不停腾挪报文获得,就像均分任何物品(比如绿豆)那样,不来回几次支付一些时延是无可能的。而腾挪空间则是 buffer,因此算法会提供一个 inflight 余量,主动 “侵占” 一些 buffer 作为支付。由于不存在真 O(1) 算法,流数量越多,侵占的 buffer 越多(但若以丢包重传交换代价,流数量越多反而所需 buffer 越小,不管怎样,buffer 排队时延还是重传时延,总有一个少不了,参见 Sizing Router Buffers),为最大削减此影响,inflight 余量中存在一个 minrtt / srtt^gamma 负反馈,把这种侵占 buffer 的行为向内收紧。

再看法则 2,它与博弈均衡相关。

法则 2 描述的是一个非常稳定的平衡。“适可而止” 核心在于算法追求最佳效能而不是最大带宽 maxbw,而最佳效能由于 E = bw / srtt 描述。寻找最佳效能是自我局部的,而寻找 maxbw 则会作用到全局,因此 inflight 守恒算法不存在 buffer 挤兑带宽问题,这显然会使 srtt 增加更快而造成 E 减小。

止步于最佳效能则对全局保有余量,每条流都遵循此原则,即可公平共享。

看一下该法则有趣的额外效果。

假设当前有 n - 1 条流共享链路,1 条新流进入:

  • 新流开始挤兑带宽,新流 bw 从 0 开始加速比很大,inflight 余量中小 bw 做分母负反馈使新流 E 开始增加;
  • n - 1 条流在若干 round 后共同检测到最大 E 减少,b * minrtt 减少,inflight 减少,共同向新流出让资源;
  • 新流注入 inflight 过程中被余量中 minrtt / srtt^gamma 收紧,但相对余量仍比 n - 1 条流更大;
  • 直到 n - 1 条流逐渐下降的 bw 与新流上升的 bw 相等(在 win 内颠簸),所有流 inflight 及其余量完全相等,均分带宽;
  • 所有 n 条流均没有任何动力再增加或减少 inflight,每条流执行 inflight 守恒。

如果有 1 条流退出,minrtt 减少,bw 被腾出 1 / n,所有剩下的流测得更大的 E,每条流在 buffer 中的余量自动均分 1 / n 带宽,系统倾向于 inflight 总和变小,流数减少,腾挪代价变小。

如果有流退出,其它所有流均分腾出的带宽同时,自动适可而止,因为继续注入更多 inflight 虽然能带来更大带宽比例,但 srtt 也会变大,E 反而减少,同时,inflight 余量里两个向内收紧 buffer 的负反馈也会阻止一条流无意识(可能是算法参数问题或系统颠簸导致)过分挤兑带宽:

  • 越用更大 inflight 挤兑带宽,srtt 越大,inflight 余量越小;
  • 越挤兑更大的带宽,bw 越大,inflight 余量越小;
  • 过分挤兑过程中 b * minrtt 不变,因为它们被 alpha 窗口保护。

这保证了系统不会偏离平衡态进入正反馈(算法实现 bug 不算)。

inflight 守恒算法在稳定的平衡态下将失去任何动力,只有新流进入或流退出等事件会激起算法的自动反应,而在没有这类事件期间,算法除了维持 inflight 守恒什么都不需要做。

有人会问,没了 probe 机制,不再 capacity-seeking,如果有新资源加入,1 条流如何自适应探知这些空闲资源。

必须提到,上述 inflight 守恒算法只勾勒一个轮廓,可随意在此基础上 probe,它竟可以全自动完成:

  • probe 行为发生时,可将 inflight = b * minrtt + (minrtt / (srtt^gamma * bw)) * beta + probe_delta * b * srtt;
  • 如果有空闲带宽,E 会瞬时增加,minrtt 不变,b * minrtt 增加,srtt 等于 minrtt,余量占次要因素,probe 余量被快速吸收,方可继续 probe;
  • 如果没有空闲资源,在 alpha-round win 周期 b*minrtt 不变,srtt 增加,bw 由于挤兑而增加,余量快速变小,占主要收紧因素,probe 的额外量被 inflight 余量卸掉。

是不是很有趣,随意 probe 吧,别的什么都不需要做,有空闲资源,自动用,没空闲资源,自动退。

既然算法可以自适应自己突发的一些额外 probe 报文,显而易见的是,算法对其它短突发流也免疫了,因为在 win 期内,b * minrtt 不变,短突发转瞬即逝,srtt 恢复即可撤销对余量的收紧,对 inflight 整体没什么影响。

依靠两个原则所做的推论,tcp 走上快车道,锯齿消失了。

看一下收敛图:
在这里插入图片描述

收敛图仅告知趋势。在实际收敛中,比如 n 条流,1 条流会把剩余 n - 1 条流的 inflight 余量总和作为收敛目标,所以靠两个负反馈往里收紧以达到自适应:

  • 1 条流将除自己外的剩余流的 inflight 余量总和 c 做收敛目标,在收敛过程中,c 在随 inflight 增大而减少。

再次表明,总的趋势看,虽然流数越多,所需 buffer 越大,但增量始终随时间上凸。

tcp aimd 为什么收敛 的最后一段 “公平收敛,抓住一个小基本点就行了,这是控制平面的底座”,剩下的交给统计律。

aimd 非常优秀的原因就在于它只执行简单行为就完成收敛,这对于 “首要保证网络可用性” 足够了,但摩尔定律效应见顶后,没有了看似无限的带宽供应用浪费(19 世纪可以浪费煤,21 世纪反而要集约化开采和使用),拥塞控制必须转入集约使用带宽,pacing,rate-based 因此大放送,背景均在于此。

而 inflight 守恒算法并没有太过复杂的采集和计算,原因在于它只是以另一种方式体现了 vegas 的假设,在不过分膨胀 buffer 的前提下充分且公平利用带宽。像 tcp,quic,rdma(rocev2),homa,falcon,… 这些端到端协议能获得的信息只有 ack/sack/nack,最多测个 rtt 还测不准,每一次复杂的运算都是对信息缺陷的放大,用这些有限的信息做成的算法必须不能太复杂,太复杂必受伤。

复杂且高效必须有丰富且精确的数据支撑,如果端与网控制分离,没有网络核心反馈,仅靠对端反馈的不准确信息,怎么也玩不出花。在数据中心,ecn,int(in-network telemetry) 提供了一些遥测信息,甚至更普遍的网络也在拟定类似 l4s 标准,这些均体现了最优化网络效能过程中信息要丰富且精确的刚需。

可以预测,未来的传输协议必然更加依赖更底层或更上层的更多信息。如果仅是 tcp 领域的优化,就这样了,别玩了。

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

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

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

相关文章

裸金属服务器和物理机有什么区别

今天,在我们生活的世界中,技术已经彻底改变了我们的生活。在开展在线业务时,服务器在快速高效地执行多项任务方面发挥了极其重要的作用。然而,很多人仍然对裡金属服务器和物理机感到很困惑。今天就给大家分析一下裡金属服务器和物…

算法训练营day15

一、层序遍历 参考链接7.2 二叉树遍历 - Hello 算法 (hello-algo.com) 层序遍历本质上属于广度优先遍历,也称广度优先搜索, BFS通常借助队列的先入先出的特性实现 参考链接102. 二叉树的层序遍历 - 力扣(LeetCode) 像这种较为…

利用技术优化医保购药体验:开发医保购药APP

为了解决线下医保买药繁琐的流程,利用技术优化医保购药体验成为了当务之急。因此,今天小编将为大家详解如何开发一款医保购药APP。 一、背景与意义 购药流程繁琐、耗时、信息不透明等问题日益凸显,亟需一种新的解决方案。开发医保购药APP可以…

【C++】类和对象④(类的默认成员函数:取地址及const取地址重载 | 再谈构造函数:初始化列表,隐式类型转换,缺省值)

🔥个人主页:Forcible Bug Maker 🔥专栏:C 目录 前言 取地址及const取地址操作符重载 再谈构造函数 初始化列表 隐式类型转换 explicit关键字 成员变量缺省值 结语 前言 本篇主要内容:类的六个默认成员函数中…

全网人气排行第一的免费开源ERP:Odoo电商功能应用亮点介绍

Odoo E-Commerce是一款创新型电子商务管理系统,旨在帮助企业建立以客户为中心的B2B与B2C电子商务平台,提高电商业务敏捷性,保障利润,并确保客户体验战略与时俱进。 —— 开源智造Odoo老杨 什么是Odoo免费开源电商管理系统&#xf…

C++:new与delete

hello,各位小伙伴,本篇文章跟大家一起学习《C:new与delete》,感谢大家对我上一篇的支持,如有什么问题,还请多多指教 ! 文章目录 :rocket: C内存管理:airplane: 初识new和delete:airplane: new和…

海康智能相机FTP本地存图流程

背景:近期一个新项目需要使用到智能相机,借助智能相机算法直接输出检测结果并将相机图像进行本地化保存和展示。由于申购目标智能相机未到,暂时使用测试智能相机。 目标智能相机型号:海康智能相机MV-SC3050XC 当前测试相机型号…

autodesk系列软件安装错误1603,手动安装Autodesk Desktop Licensing Service之后,启动服务提示错误1067

一般Autodesk Desktop Licensing Service这个服务没安装或者不正常会导致autodesk系列软件安装错误1603或者其他报错。 手动安装Autodesk Desktop Licensing Service之后,启动服务提示错误1067, 解决方法如下 打开autoremove点击扩展功能,输…

基于CAPL的S19文件解析

🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe&…

UDS报文传输的四种帧

ISO14229-1规定了26个诊断服务细节,也就是UDS诊断报文的细节。它只规定了各个服务每个字节的含义,它不关心底层到底是怎么传输的。 ISO15765-2规定了基于CAN总线进行UDS报文传输的细节(包括四种帧)。是在CAN总线传输的情况下&…

掉落回弹问题(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;float b 100;float sum 0;int i 0;//运算&#xff1b;for (i 1; i < 10; i){//运算&…

力扣HOT100 - 101. 对称二叉树

解题思路&#xff1a; class Solution {public boolean isSymmetric(TreeNode root) {if(root null) return true;return recur(root.left, root.right);}boolean recur(TreeNode L, TreeNode R) {if (L null && R null) return true;if (L null || R null || L.…

前端开发攻略---实现发送手机验证码60s倒计时效果(手机号验证+按钮文字自定义显示+Vue2写法+Vue3写法)

1、演示 2、说明 1、为了便于演示&#xff0c;本示例将在3秒后就再次发送。您可以根据需要自定义此时间间隔。 2、采用最少的变量以满足需求&#xff0c;以减少内存占用。 3、不仅仅局限于按钮情况&#xff0c;也可应用于不禁用按钮的情况&#xff0c;以实现更多的扩展性。 4、…

zkVM选型要点

1. 引言 当选择ZK工具&#xff0c;来做可验证链下计算来扩容区块链时&#xff0c;需考虑&#xff1a; 1&#xff09;为何应选择zkVM&#xff1f;2&#xff09;zkVM有哪些基本功能&#xff1f;3&#xff09;哪些zkVM可提供这些基本功能&#xff1f; 2. 为何应选择zkVM&#x…

大模型培训老师叶梓:通过微调提升小型语言模型的复杂推理能力

在人工智能的快速发展中&#xff0c;复杂推理能力的提升一直是研究者们追求的目标。最近&#xff0c;一项发表在arXiv上的研究成果【1】&#xff0c;提出了一种创新的方法&#xff0c;即通过微调小型语言模型&#xff08;LMs&#xff09;&#xff0c;并将其与大型语言模型&…

贪吃蛇游戏C语言破解:成为编程高手的必修课!

​ 个人主页&#xff1a;秋风起&#xff0c;再归来~ 文章专栏&#xff1a;C语言实战项目 个人格言&#xff1a;悟已往之不谏&#xff0c;知来者犹可追 克心守己&#xff0c;律己则安&#xff01; 1、游戏效果演示 贪吃蛇游戏效果演示 2、win32 A…

20240423给飞凌的OK3588-C开发板适配OV13855【绿屏】linux

20240423给飞凌的OK3588-C开发板适配OV13855【绿屏】 2024/4/22 20:29 开发板&#xff1a;飞凌的OK3588-C OS操作系统&#xff1a;linux R4/Buildroot 【OV13855接到CAM1上&#xff0c;如果要接到CAM2上请修改相关的DTS即可】 https://item.taobao.com/item.htm?_unju3ku2f4…

kerberos:适配华为FI

文章目录 一、hive1、hive thrift连接方式 一、hive 1、hive thrift连接方式 kerberos认证失败信息 缺少配置&#xff1a;{“hadoop.rpc.protection”:“privacy”}&#xff0c;具体可参考&#xff1a;kerbros认证相关问题 华为FI参考资料&#xff1a; https://github.com…

【MySQL 数据宝典】【磁盘结构】- 004 redolog 重做日志

一、背景介绍 持久性要求&#xff1a; 对于已提交的事务&#xff0c;即使系统发生崩溃&#xff0c;其对数据库的更改也不能丢失。问题&#xff1a; 在事务提交前将所有修改的页面刷新到磁盘浪费资源。随机IO导致刷新速度慢。 解决方案&#xff1a; 【数据副本】记录事务执行过…

linux信号机制分析

概念 信号递达&#xff1a;实际执行信号的处理动作就是信号递达 信号未决&#xff1a;信号从产生到递达之间的状态就是信号未决&#xff08;未决就是没有解决&#xff09; 收到某信号后&#xff0c;把未决信号集中的此信号置为1&#xff08;1表示未解决的信号&#xff09;&a…