tcp inflight 守恒算法背后的哲学

news2024/11/24 16:35:45

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.coloradmin.cn/o/1626438.html

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

相关文章

01.Scala概述及环境配置

文章目录 [toc] 1.**Scala概述**2.**Scala环境搭建**2.1下载2.2环境变量配置 1.Scala概述 特点: 同样运行在JVM上,可以与现存程序同时运行。可直接使用Java类库。同Java一样静态类型。语法和Java类似,比Java更加简洁(简洁而并不…

深度学习的瓶颈是什么!

深度学习主要的瓶颈: 数据依赖与标注问题:深度学习模型通常需要大量的标注数据来进行训练。然而,获取大量的标注数据不仅成本高昂,而且在某些领域(如医疗、金融等)中可能难以获取足够的标注数据。此外&…

换脸插件升级导致SDWebUI无法启动cannot import name ‘Undefined‘ from ‘pydantic.fields‘

今天在一台新的机器环境装了SDWEBUI,都使用最新的版本,升级了下换脸的插件,于是乎启动崩溃了。错误如下 Launching Web UI with arguments: --listen --skip-torch-cuda-test --disable-nan-check --skip-version-check --skip-python-versi…

简记在arduino安装esp32开发板包

主要参考来源:http://t.csdnimg.cn/Fuqg9,感谢原博主的文章,原文我有不够详细的地方本文会给出说明。 废话,不用看👇 本人安装时常大概2小时,按理说有离线文件了应该很快,我这2小时属实有点慢了…

Docker-概念及配置(超详细)

docker 第一章 1、什么是docker 答:docker是一种容器引擎,通过docker可以将软件安装并且配置好以后,做成一个镜像文件。通过这个镜像文件可以快速的安装、配置软件环境 2、3个概念 【docker镜像】:将软件环境安装配置好以后产生…

wstunnel (websocket模式ssh)

接上一篇 修改客户端运行参数 ssh -o ProxyCommand"./wstunnel client -L stdio://%h:%p ws://192.168.254.131:8080" 127.0.0.1 其中127.0.0.1为服务端的本地ssh访问,可以修改为通过服务端访问其他设备的ssh服务。例如: ssh -o ProxyComma…

吉布提国家概况

吉布提国家概况 (最近更新时间:2022年10月) 【国 名】 吉布提共和国(The Republic of Djibouti, La Rpublique de Djibouti)。 【面 积】 2.32万平方公里。 【人 口】约100万。主要有伊萨族和阿法尔族。…

42-巩固练习(二)

42-1 函数的递归 1、问:关于递归的描述错误的是() A.存在限制条件,当满足这个限制条件的时候。递归便不再维续 B.每次递归调用之后越来越接近这个限制条件 C.递归可以无限递归下去 D.递归层次太深,会出现栈溢出现…

C#基础|对象初始化器与构造方法对比总结

哈喽,你好啊,我是雷工! 01 对象初始化器的作用 为了更加灵活的初始化对象的“属性”,是对构造化方法的补充。 02 构造方法总结 2.1、存在的必要性:一个类中,至少要有一个构造方法(有无参数均…

C++对象的初始化和处理

生活中我们买的电子产品都基本会有出厂设置!在某一天我们不用时候也会删除一些自己信息数据保证安全。 C中的面向对象来源于生活,每个对象也都会有初始设置以及对象销毁前的清理数据的设置。 构造函数和析构函数 对象的初始化和清理也是两个非常重要的安全问题 一…

Unity 使用GPU计算物体距离

在游戏开发中,计算物体之间的距离是一个常见的需求,例如用于碰撞检测、视觉效果等。传统的计算方法可能会在大量物体时带来性能问题,而在 Unity 中,借助 GPU 进行计算可以有效提高性能。本文将介绍一种使用 Compute Shader 在 Uni…

OpenHarmony语言基础类库【@ohos.util.LinkedList (线性容器LinkedList)】

LinkedList底层通过双向链表实现,双向链表的每个节点都包含对前一个元素和后一个元素的引用。当需要查询元素时,可以从头遍历,也可以从尾部遍历,插入、删除效率高,查询效率低。LinkedList允许元素为null。 LinkedList…

大数据第七天

文章目录 吐槽一下这个是怎么需要真的这么大吗? 内核错误内核软死锁(soft lockup)我这个cpu很高吗?大模型都说了不超过80就行了 FinBi安装FinBI下载链接安装时间比较长 吐槽一下 dbeaver 查询hive 数据信息是真的慢,没有一点快的方式&…

使用Excel生成sql脚本(insert/update/delete)

目录 前言 一、Excel文件脚本变量 二、操作示例 前言 在系统使用初期,存在某种原因,需要对数据库数据进行批量处理操作。往往都是通过制定Excel表格,通过Excel导入到数据库中,所以就弄一个excel生成sql的导入脚本,希…

十七、Java网络编程(一)

1、Java网络编程的基本概念 1)网络编程的概念 Java作为一种与平台无关的语言,从一出现就与网络有关及其密切的关系,因为Java写的程序可以在网络上直接运行,使用Java,只需编写简单的代码就能实现强大的网络功能。下面将介绍几个与Java网络编程有关的概念。 2)TCP/IP协议概…

搞懂特殊的引用类型接口、枚举、注解、记录、包装类!

面向对象系列——特殊的引用类型(与class并列地位) 文章目录 面向对象系列——特殊的引用类型(与class并列地位)特殊的:接口、枚举、注解、记录,包装类一、interface接口(不是类)—提供一种规范(具有多态性…

基于harris角点和RANSAC算法的图像拼接matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 ....................................................................... I1_harris fu…

使用 Docker 部署 TailChat 开源即时通讯平台

1)介绍 TailChat 官网: https://tailchat.msgbyte.com/ 作者:https://www.moonrailgun.com/about/ GitHub : https://github.com/msgbyte/tailchat TailChat 是一款插件化易拓展的开源 IM 应用。可拓展架构赋予 Tailchat 无限可能…

[Java EE] 多线程(五):单例模式与阻塞队列

1. 单例模式 单例模式是校招中最长考的设计模式之一,首先我们来谈一谈什么是设计模式: 设计模式就好像象棋中的棋谱一样,如果红方走了什么样的局势,黑方就有一定地固定地套路,来应对这样的局势,按照固定地套路来,可以保证在该局势下不会吃亏. 软件开发也是同样的道理,有很多…

harbor私仓搭建及其他服务器如何使用私仓详解

目录 主机规划1.harbor安装(harbor服务器)1.harbor介绍2.为harbor生成自签发证书(可选)3.安装Harbor4.Harbor使用 2.宿主机docker安装(server服务器)1. 设置主机名2. 安装需要的软件包3. 设置yum源4. 查看docker版本5. 安装Docker…