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.mfbz.cn/a/567483.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python-VBA函数之旅-input函数

目录 一、input函数的常见应用场景: 二、input函数使用注意事项: 三、如何用好input函数? 1、input函数: 1-1、Python: 1-2、VBA: 2、推荐阅读: 个人主页:神奇夜光杯-CSDN博…

hcia datacom课程学习(7):直连路由、静态路由

直连路由路由器接口上的网络(接口配置了IP地址并且开启)静态路由管理员手工添加的网络动态路由路由器之间动态学习形成的网络 1.直连路由 每当给路由器的一个接口配置了ip,路由表中就会产生对应的直连路由 配置路由接口ip的命令&#xff1…

web测试基础知识

目录 web系统的基础 web概念(worldwideweb) 网络结构 发展 架构 B/S C/S P2P 工作原理 静态页面 动态页面 web客户端技术 浏览器的核心--渲染引擎 web服务器端技术 web服务器 应用服务器 集群环境 数据库 案例-URL 协议类型 主机名 端口 IP地址 分类 …

【国产替代】航空电子通信总线航空电子通信总线产品为MIL-STD-1553和ARINC 429等协议提供原生支持

航空电子通信总线 航空电子通信总线产品为MIL-STD-1553和ARINC 429等协议提供原生支持。这些产品用于进行航空电子应用所需的开发、生产和系统测试。 PXIe,2通道PXI ARINC-664接口模块 AIM ARINC-664具有板载处理器,可自动处理所有与协议相关的活动&…

Java进阶-日志框架

概述 小结 体系 Logback概述 Logback快速入门 1.下载 一般情况,Logback日志框架只需要下载slf4j-api、logback-core、logback-classic这三个jar包即可。 slf4j-api-1.7.26.jar官网下载链接: https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7…

docker部署通义千问-7B-Chat的openai-api环境

服务器环境: 显卡驱动:Driver Version: 530.30.02 CUDA版本:CUDA Version: 12.1 显卡:NVIDIA GeForce RTX 3090共4张 注意:最好把显卡驱动升级到530,CUDA版本之前使用11.7有问题。 一、下载模型文件 …

炉管设备的内部构造详解

知识星球(星球名:芯片制造与封测社区)里的学员问:炉管设备(立式)的内部构造是怎样的? 如上图,是一个典型的: 上半部: Heating Element(加热线圈…

ThingsBoard服务端使用RPC通过网关给设备发送消息

一、概述 1、发送服务器端网关RPC 二、案例: 1、建立设备与网关之间的通讯 2、查看设备和网关是否在线状态啊 3、通过 仪表盘,创建设备A的模拟RPC调用的窗口链接 4、在客户端的网关设备上订阅RPC网关的主题信息 5、通过服务端的窗口,发…

24V转2.8V2A降压芯片WT6030

24V转2.8V2A降压芯片WT6030 WT6030是一种高效同步整流降压开关模式转换器,集成内部功率MOSFET。该器件在宽输入电源范围内提供3A峰值输出电流,展现出卓越的负载和线路调节性能。其设计仅需要最小数量的外部现成组件,并且采用了节省空间的ESO…

JRT多服务器同步程序

之前的JRT只部署在一个服务器,实际运用可能会有数台、数十台、或者更多服务器。那么多台服务器就需要程序同步机制。这里借助Rsync同步,但是有个问题是Rsync同步jar之后他不知道是否需要重启站点,为此实现java控制台驱动Rsync,重定…

8.4.1 实验1:创建 VLAN 和划分端口

1、实验目的 通过本实验可以掌握: VLAN的概念。创建VLAN的方法。把交换机端口划分到VLAN中的方法。 2、实验拓扑 创建 VLAN 和划分端口的实验拓扑如下图所示。 图8-5 创建 VLAN 和划分端口的实验拓扑 3、实验步骤 (1)实验准备 S1#eras…

【Elasticsearch】Elasticsearch 从入门到精通(一):基本介绍

《Elasticsearch 从入门到精通》共包含以下 2 2 2 篇文章: Elasticsearch 从入门到精通(一):基本介绍Elasticsearch 从入门到精通(二):基础使用 😊 如果您觉得这篇文章有用 ✔️ 的…

​Gu‘reum 工作室在The Sandbox推出 2024 年农历新年活动!

通过区块链游戏分享韩国文化并建立社区! 去年 12 月,Gurenum 工作室 在The Sandbox 元宇宙上发起了 2023 年年末 Lan Party 直播活动。 https://sandboxgame.medium.com/gureum-studio-hosts-a-year-end-lan-party-in-the-sandbox-metaverse-b9a3fc6e7b9…

Vue Router基础知识整理

Vue Router基础知识整理 1. 安装与使用(Vue3)安装使用 2. 配置路径别名和VSCode路径提示(了解)3. 使用查询字符串或路径传参query动态路由 与 params 4. router-link、定义别名、定义路由名称、编程式导航定义别名 aliasrouter-li…

目标检测——行人交通信号灯数据集

一、重要性及意义 行人交通信号灯检测的重要性及意义主要体现在以下几个方面: 首先,行人交通信号灯检测对于提高道路安全性至关重要。通过准确识别交通信号灯的状态,行人可以更加清晰地了解何时可以安全地过马路,从而避免与车辆…

混合云构建-如何创建一个高可用的Site to Site VPN 连接 Azure 和GCP云

在现代云计算环境中,企业通常会采用多云战略,将工作负载分布在不同的云服务提供商上。这种方式可以提高可用性、降低供应商锁定风险,并利用每个云提供商的独特优势。然而,在这种情况下,需要确保不同云环境之间的互联互通,以实现无缝的数据传输和应用程序集成。 本文将详细介绍…

利用ollama和open-webui本地部署通义千问Qwen1.5-7B-Chat模型

目录 1 安装ollama 2 安装open-webui 2.1 镜像下载 3 配置ollama的模型转换工具环境 3.1 下载ollama源码 3.2 下载ollama子模块 3.3 创建ollama虚拟环境 3.4 安装依赖 3.5 编译量化工具 7 创建ollama模型 8 运行模型 参考文献: 1 安装ollama curl -fsSL …

C语言单向链表的经典算法

1.分割链表 2.移除链表元素 3.反转链表 4.合并两个有序链表 5.链表的中间结点 6.环形链表的约瑟夫问题 1.分割链表: 1.思路:创建新链表,小链表和大链表。如图 代码如下 /*** Definition for singly-linked list.* struct ListNode {* int val…

android学习笔记(二)

1、自定义View。 package com.example.view; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.view.View; //可以在View测量和布局完成后…

前端性能分析工具及使用

Lighthouse Lighthouse (谷歌浏览器的插件商店中搜索并安装,浏览器中点击F12,开发者工具中可使用)是 Google 开发的一款工具,用于分析网络应用和网页,收集现代性能指标并提供对开发人员最佳实践的意见。只要…