AIMD 为什么收敛(tcp reno/cubic 为什么好)
TCP 拥塞控制目标是缓解并解除网络拥塞,让所有流量公平共享带宽,合在一起就是公平收敛。
 AIMD(几乎所有与拥塞控制相关的协议或算法都有 AIMD 的影子,包括 RoCE,BBRv2) 为什么收敛?我一般会给出下面的老图:
 
虽然只展示了两条流的收敛,但 n 条流收敛的展示无非就是将 2 维坐标系换成 n 维坐标系,只要能证明任意的 2 维截面都如上图所示就行,而这件事简单推导一下就行,比画坐标系还要直观,再说超过 3 维的坐标系也画不出来。
设一个 AIMD 系统的 AIMD 参数为 α \alpha α, β \beta β, w i 0 w_{i0} wi0 和 w j 0 w_{j0} wj0 分别为任意两条流的初始窗口,且 w i 0 > w j 0 w_{i0}>w_{j0} wi0>wj0,二者之差 d 0 = W i 0 − W j 0 d_0=W_{i0}-W_{j0} d0=Wi0−Wj0。
假设所有流同步(异步流和 RED 作用下相对复杂,用统计分布代替公式),一个 AIMD 周期后,两条流的 cwnd 分别为 w i 0 = w i = β ∗ ( w i 0 + α ) w_{i0}=w_i= \beta*(w_{i0}+\alpha) wi0=wi=β∗(wi0+α) 和 w j 0 = w j = β ∗ ( w j 0 + α ) w_{j0}=w_j= \beta*(w_{j0}+\alpha) wj0=wj=β∗(wj0+α),此时两条流 cwnd 之差 d = β ∗ d 0 d=\beta*d_0 d=β∗d0。
再下一个周期, w i 0 = w i = β ∗ ( β ∗ ( w i 0 + α ) + α ) w_{i0}=w_i= \beta*(\beta*(w_{i0}+\alpha)+\alpha) wi0=wi=β∗(β∗(wi0+α)+α) 和 w j 0 = w j = β ∗ ( β ∗ ( w j 0 + α ) + α ) w_{j0}=w_j= \beta*(\beta*(w_{j0}+\alpha)+\alpha) wj0=wj=β∗(β∗(wj0+α)+α),两条流 cwnd 之差 d = β 2 ∗ d 0 d=\beta^2*d_0 d=β2∗d0。
容易得到,在第 n 个 AIMD 周期后,两条流 cwnd 之差为 d = β n d 0 d=\beta^nd_0 d=βnd0,趋向于 0,这意味着无论初始时刻任意两条流差异多么大,最终它们将趋同。
值得注意的是,无论是 AI 过程还是 MD 过程,都单独对收敛有贡献,假设持续 AI,从不 MD,观察一个比值 w i 0 + x w j 0 + x \dfrac{w_{i0}+x}{w_{j0}+x} wj0+xwi0+x, x 越大,比值越趋向于 1,在总体量面前,差异将无关紧要,另一方面,假设持续 MD,从不 AI,观察一个差值 β x ∗ w i 0 − β x ∗ w j 0 \beta^x*w_{i0}-\beta^x*w_{j0} βx∗wi0−βx∗wj0, x 越大,该差值趋向于 0,宏观上看,差异消失。
总体而言,AI 的过程与初始值无关,它是一种与初始优势相反的力量,保持差值不变,比例趋向公平,削减掉相对差异,而 MD 则与初始值强相关,但它下降的速率越来越慢,保持差值趋向公平,比例不变,削减掉绝对差异。AIMD 共同作用,各自效用独立积累,无论在比例差异还是在绝对差异均被时间抹平。
举个例子,A 有 1 块钱,B 有 9 块钱,两人很公平,因为购买力有绝对值下限,虽然 A 和 B 相差 9 倍,但他们可能都买不到东西,但 A 有 100 万块,B 有 900 万块,就不再公平了,此时 9 倍的差异关乎他们生活在不同层次,如果 A 有 1 亿零 100 块,B 有 1 亿零 900 块,又会非常公平。
大概社会平均工资,普调,年终奖,股权被稀释,工资被倒挂,就和 AIMD,AIAD,MIMD,MIAD 有关。用上述的简单推导可以证明,除了 AIMD 可以收敛到公平,其它 3 种均不行。
AIMD-based cc,比如 reno,cubic,scalable,highspeed,它们被认为不如 BBR,但事后看,这些算法并不是在根本上不如 BBR,而 BBR 也不是根本上就优秀,前面说过,BBR 的高效来自于瞬时记住并憋住的 maxbw,而 cubic(包括其它 AIMD cc) 的问题在于它不能识别随机丢包。而 AIMD 本身与效率无关,它只关注公平收敛。
cubic 只要增加丢包分类识别就能解决问题, 而 BBR 无论 probebw 还是 probertt 均无法完备论证收敛,只在 “效果” 上显示出 “加速比与带宽占比负相关”,而这是过不了审的。
已经有了很多 “cubic-改” 算法,大多数引入了 delay 甚至 delay 梯度,在丢包发生时二次确认拥塞是否真实存在,事实上 westwood 就是一种比较合理的算法,它收敛到瓶颈带宽,而不是固定比例。然而由于实现粗糙(依然是受制于 Linux 拥塞状态机),westwood 未竟全功。
还有另一种拥塞判定方法,二次机会法,事先为 AIMD 准备两个 beta 参数,当检测到丢包时,随即将 cwnd 下降一个更小的 beta 比例,进入包守恒开始重传恢复,如果重传率超过一个阈值,则将 cwnd 下降更大的 beta,视情况从两个 MD 中任意一个开始进行 AI:
 
 避开的只是随机丢包,丝毫不影响拥塞丢包后的收敛。
非常简单,不需要像 westwood 还要计算瓶颈带宽,代价就是误判会增加重传率,好在只有二次机会,只会增加一点点,不像 BBR 憋住 10 round 那样执着。
公平收敛,抓住一个小基本点就行了,这是控制平面的底座,其它的,留给应用自己以及底层链路,就好像线路断了,再好的算法也无济于事,另一方面,application-limited 传输,再好的算法也用不上,但无论如何,公平是刚需。
其实菜市场摊贩就遵循 AIMD 以避开相互内耗的价格战,最终你会发现各个摊贩的菜价都一样,差别只是质量口碑而已。菜市场刚开张时,各家促销,缓慢加价,最终发现客户流失时,又大减价(注意这个 “大” 字),大促销,最终他们的价格趋向于一致。当然,TCP 这方面属于后生,但 AIMD 是一个放之四海而皆准的通用控制论模型,在它的框架下做事就对了,但凡违背的,事情将会越发精细,复杂。
浙江温州皮鞋湿,下雨进水不会胖。
相关文章:
AIMD 为什么收敛(tcp reno/cubic 为什么好)
TCP 拥塞控制目标是缓解并解除网络拥塞,让所有流量公平共享带宽,合在一起就是公平收敛。 AIMD(几乎所有与拥塞控制相关的协议或算法都有 AIMD 的影子,包括 RoCE,BBRv2) 为什么收敛?我一般会给出下面的老图:…...
医院智能导诊系统,医院导航解决方案
随着现代医院规模不断扩大,功能区域越来越细化,面对复杂的楼宇结构,集中的就诊人流,患者在就诊中经常会面临找不到目的地的困境,就诊体验变差。针对这个问题,一些面积和规模都比较大的医院,已经…...
【论文复现】基于区块链的分布式光伏就地消纳交易模式研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
在滴滴和字节跳动划水4年,过于真实了...
先简单交代一下吧,沅哥是某不知名211的本硕,18年毕业加入滴滴,之后跳槽到了头条,一直从事测试开发相关的工作。之前没有实习经历,算是四年半的工作经验吧。 这四年半之间他完成了一次晋升,换了一家公司&am…...
tensorflow GPU训练环境布置
tensorflow GPU训练环境布置 一、显卡驱动安装1.1 如何处理**Failed to initialize NVML: Driver/library version mismatch的问题**1.2 卸载旧的版本1.3 驱动安装 1.3.1 利用apt 安装1.3.2 手动安装 二、安装CUDA2.1 确定CUDA版本2.2 下载文件1. 找匹配版本2. 选合适的平台 2…...
理解和使用Java中的枚举
枚举是一种特殊的数据类型,用于定义一组具名的常量。Java中的枚举类型可以包含多个枚举常量,每个常量都具有唯一的名称和值。本文将详细介绍Java中的枚举,包括为什么要使用枚举、枚举的好处、如何定义和使用枚举等。 为什么要使用枚举&#…...
C++和Java:哪种语言更适合你
C和Java:哪种语言更适合你 一、引言1 背景介绍2 问题阐述3 目的和意义 二、C与Java的介绍1 C的特点和优缺点2 Java的特点和优缺点3 两种语言的比较4 选择C的理由4.1 适合底层开发的特点4.2高效的编译器和运行速度4.3 自由且灵活的语言风格4.4 良好的内存管理能力 5 …...
FE_Vue学习笔记 框架的执行流程详解
1 分析脚手架结构 (1)CLI就是 command line interface 的缩写。Vue CLI官网:Vue CLI (2)安装过程: (PS: 提前安装过node.js了,没有安装的可以打开这个:Downl…...
KingbaseES V8R6 等待事件之LWLock Buffer_IO
等待事件含义 当进程同时尝试访问相同页面时,等待其他进程完成其输入/输出(I/O)操作时,会发生LWLock:BufferIO等待事件。其目的是将同一页读取到共享缓冲区中。 每个共享缓冲区都有一个与LWLock:BufferIO等待事件相关联的I/O锁,每次都必须在共…...
桂院导航小程序 静态项目 二次开发教程
Gitee代码仓库:桂院导航小程序 先 假装 大伙都成功安装了静态项目,并能在 微信开发者工具 和 手机 上正确运行。 接着就是 将项目 改成自己的学校。 代码里的注释我就不说明了,有提到 我的学校 的文字都改成你自己的就行 1. 全局 app.json…...
即时通讯APP开发费用成本多少?
移动互联网的发展,为人们的通讯交流提供了非常多的便利,一些即时通讯APP的出现,将人与人的距离再一次缩短。通过即时通讯APP软件,人们可以随时随地了解身边发生的新鲜事物,以及和朋友探讨各类趣事,甚至可以…...
女生学大数据好找工作么
好不好找工作和性别无关,无论你是男生还是女生,找工作的时候首先要看的都是学历,然后是个人能力,其中还有一定的面试经验和简历加分项~ 不要自己先把这个性别限定死,你有能力都能找到工作,不满足企业要求都…...
02-mysql升级篇(rpm方式+压缩包升级)
文章目录 升级方式一、二进制方式安装1、下载mysql-5.7.42安装包(mysql-5.7.37升级mysql-5.7.42)2、备份数据库、my.cnf文件,停止mysql服务(重要)3、查看当前数据库版本3、上传 mysql-5.7.42-1.el7.x86_64.rpm-bundle.…...
【Java零基础入门篇】第 ④ 期 - 继承(三)
【Java零基础入门篇】第 ④ 期 - 继承(三) 博主:命运之光专栏:Java零基础入门 学习目标 1.掌握继承性的主要作用、实现、使用限制; 2.掌握this和super的含义及其用法; 3.掌握方法覆写的操作; 4.…...
Python Selenium搭建UI自动化测试框架
自动化测试是软件测试中非常重要的一部分,可以提高测试效率和测试覆盖率。在UI自动化测试中,Selenium是非常流行的工具。本文将介绍如何使用Python和Selenium搭建UI自动化测试框架。 一、环境准备 在开始搭建UI自动化测试框架之前,需要先安装…...
开发大语言模型需要数据?算法?算力?
开发大语言模型的关键是什么。最近看到不少文章为了流量,甚至连 5G 通讯都说成了是开发大语言模型的关键 其实从前面的原理介绍,不难看出,大语言模型的其中一个关键点是数据。 关键一:数据 训练数据主要是所谓的语料库。今天的很多语言模型的语料库主要有以下几种: …...
CSS选择器的常见用法
目录 1、CSS编写方式 2.CSS选择器 1.标签选择器 2.类选择器 3.id选择器 4.后代选择器 3.CSS属性 CSS叫做"层叠样式表",作用就是装饰网页.类似于我们平时所说的化妆。 字体、大小、间距、颜色、位置、边框、背景等等统称为样式,用来描述一个网页。 …...
Oracle EBS修改密码
FNDCPASS修改密码 用户名必须出现在FND_USER或FND_ORACLE_USERID表中。FNDCPASS实用程序和ALLRACLE功能是为应用程序用户/模式设计的。 对于FND_USER或FND_ORACLE_USERID中不存在的用户,可以使用alter命令更改密码。 查询用户是否存在FND_USER或FND_ORACLE_USERI…...
《花雕学AI》33:如何用XMind制作AI思维导图、鱼骨图和组织结构图
思维导图是一种有效的思维工具,它可以帮助我们整理信息,激发创意,提高效率。思维导图是一种以中心主题为核心,以分支结构为形式,以关键词和图像为内容的图形表示法。它可以让我们一目了然地看到知识的层次和逻辑&#…...
【rust】| 06——语言特性 | 所有权
系列文章目录 【rust】| 00——开发环境搭建 【rust】| 01——编译并运行第一个rust程序 【rust】| 02——语法基础 | 变量(不可变?)和常量 【rust】| 03——语法基础 | 数据类型 【rust】| 04——语法基础 | 函数 【rust】| 05——语法基础 | 流程控制 【rust】| 06——语言特…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...
