拥塞控制算法的 rtt 公平性

我强调过,拥塞控制的核心在公平可用性,公平性由 buffer 动力学保证,而 buffer 动力学有两种表现形式:

  • buffer 占比决定带宽占比,以 aimd 为例;
  • 带宽越小,buffer 挤兑加速比越大,以 bbr 为例。

以这两种形式分类,可清晰获知,对于第一种,rtt 越小越有优势,而对于第二种,公平性与 rtt 无关,rtt 越小,收敛虽迟但到。

先来个直感,以下是一个带 red 的 aimd 实例:

for n in range(1, len(times)):if n % 5 == 0:x[n] = x[n-1] + dt * (C*wx[n-1]/(wx[n-1] + wy[n-1] + wz[n-1]) - x[n-1])y[n] = y[n-1] + dt * (C*wy[n-1]/(wy[n-1] + wx[n-1] + wz[n-1]) - y[n-1])wx[n] = wx[n-1] + Iwy[n] = wy[n-1] + Ielse:x[n] = x[n-1]y[n] = y[n-1]wx[n] = wx[n-1]wy[n] = wy[n-1]if n % 20 == 0:z[n] = z[n-1] + dt * (C*wz[n-1]/(wz[n-1] + wy[n-1] + wx[n-1]) - z[n-1])wz[n] = wz[n-1] + Ielse:z[n] = z[n-1]wz[n] = wz[n-1]if wx[n] + wy[n] + wz[n] > 2*C*R:# 注释为 westwoodif random.random() < 0.5:wx[n] = wx[n]/2#wx[n] = x[n] * Rif random.random() < 0.5:wy[n] = wy[n]/2#wy[n] = y[n] * Rif random.random() < 0.5:wz[n] = wz[n]/2#wz[n] = z[n] * Rr[n] = (wx[n] + wy[n] + wz[n]) / Cif r[n] < R:r[n] = R

代码给出一个 4 倍的 rtt 差别(此外还有西装),x,y 的 rtt 相等,z 为它们的 4 倍,结局如下:
在这里插入图片描述

这很容易理解,aimd 是一个线性系统( d w d t = 1 \dfrac{dw}{dt}=1 dtdw=1),rtt 差 n 倍,意味着固定时间内 cwnd 增量差 n 倍,带宽自然也差 n 倍。rtt 正比于 cwnd 增量,而我前面描述过 aimd inc 参数不同时的收敛效果,设 i1,i2 为两条 aimd 流的 cwnd 增量,则(加权)公平线在 y = (a/b)*x。

因此,解决 aimd 算法 rtt 不公平性的方法就是消除 rtt 的影响,用绝对时间替换相对时间,如 cubic 算法所示。

接下来看 inflt 守恒和 bbr,这两个算法都是非线性(其微分方程组没有解析解),它们的共同点是不通过持续占据 buffer 而做收敛,buffer 对它们的意义在于提供一个验证空间,它们的 buffer 动力学在于用完即走,不靠 buffer 持续占比收敛,而依靠带宽与加速比的负相关(注意,非反比,公式前面写过很多,不再赘述)关系来收敛。

这不难理解,假设流 1 最近一次获得带宽为 x,无论此后流 2 挤兑多少次,假设它获得了带宽 y,但它 drain 掉了 queue,此时 buffer 占率为 0,当流 1 再次挤兑时,它的基础还是 xR,而流 2 的基础为 yR,至于如何收敛,就看 x,y 谁大,越大加速比越小,最终获得公平分配。

先给出 inflt 守恒的直感,然后详细说说 bbr:

for n in range(1, len(times)):if n % 5 == 0:x[n] = x[n-1] + dt * (C*wx[n-1]/(wx[n-1] + wy[n-1] + wz[n-1]) - x[n-1])y[n] = y[n-1] + dt * (C*wy[n-1]/(wy[n-1] + wx[n-1] + wz[n-1]) - y[n-1])wx[n] = x[n-1]*R + Iwy[n] = y[n-1]*R + Ielse:x[n] = x[n-1]y[n] = y[n-1]wx[n] = wx[n-1]wy[n] = wy[n-1]if n % 20 == 0:z[n] = z[n-1] + dt * (C*wz[n-1]/(wz[n-1] + wy[n-1] + wx[n-1]) - z[n-1])wz[n] = z[n-1]*R + Ielse:z[n] = z[n-1]wz[n] = wz[n-1]

效果如下:
在这里插入图片描述

我们看到了虽迟但到。可想而知,bbr 也是虽迟但到的效果。但我想点 bbr 的另一个主题,看看 bbr 是如何解决的。

bbr 有个 maxbw window 滑动窗口,缺省 10-round,这意味着 maxbw 可以保留 10-round 这么久,一旦时间超过这么久,当前流的基础带宽 maxbw = x 就会滑走而不再有效,失去了这个挤兑基础,就失去了信任 “带宽与加速比负相关” 的前提,可想而知,收敛就崩塌了。

我来用一个相对真实的 bbr 实现模拟这个过程:

for n in range(1, len(times)):if n > WIN + 1:sublistx = x[n - WIN : n]sublisty = y[n - WIN : n]sublistz = z[n - WIN : n]max_x = max(sublistx)max_y = max(sublisty)max_z = max(sublistz)else:max_x = x[n-1]max_y = y[n-1]max_z = z[n-1]wx[n] = max_x*Rwy[n] = max_y*Rwz[n] = max_z*Rif n % 3 == 0:x[n] = x[n-1] + dt * (C*g*max_x*R/(g*max_x*R + wy[n-1] + wz[n-1]) - x[n-1])y[n] = y[n-1] + dt * (C*g*max_y*R/(g*max_y*R + wx[n-1] + wz[n-1]) - y[n-1])else:x[n] = C*(wx[n-1])/(wx[n-1] + wy[n-1] + wz[n-1])y[n] = C*(wy[n-1])/(wx[n-1] + wy[n-1] + wz[n-1])if n % 30 == 0:z[n] = z[n-1] + dt * (C*g*max_z*R/(g*max_z*R + wy[n-1] + wx[n-1]) - z[n-1])else:z[n] = C*(wz[n-1])/(wx[n-1] + wy[n-1] + wz[n-1])

我将两个 rtt 设定为 10 倍关系,但绝对值差 30 - 3 = 27 个时间单位,如果我用 WIN = 26(小于 27) 模拟,直接崩塌:
在这里插入图片描述

但如果 WIN = 30,则结局高尚:
在这里插入图片描述

一个 WIN 内至少 probe 一次是标准 bbr 的设定,但按照标准 bbr 的设定,这意味着什么?bbr 的 WIN 是以 rtt 为单位,而不是绝对时间,理论上这里就存在 rtt 的绝对时间不公平问题。

假设流 1 的 rtprop 为 10ms,流 2 的 rtprop 为 200ms,这意味着流 2 的 maxbw 可以保留 2s,而流 1 的 maxbw 仅可以保留 100ms,一旦遭遇拥塞排队,100ms 内没有 probe,流 1 将失去带宽收敛的基础。所以呢,所以 bbr 采用了 packet-timed 来计时,让计时单位和自身关联:

u32     rtt_cnt;            /* count of packet-timed rounds elapsed */
...
/* See if we've reached the next RTT */
if (!before(rs->prior_delivered, bbr->next_rtt_delivered)) {bbr->next_rtt_delivered = tp->delivered;bbr->rtt_cnt++;bbr->round_start = 1;bbr->packet_conservation = 0;
}

这确保了任何流在一个 WIN 内都可以完成一个 probe,确保了公平收敛。很多人咨询这个问题,我这里给出一个长篇回复。

理论很美,在实践中,tcp 的问题在于 ack self-clock,如果 ack 没来,来晚了,聚合了,什么都算不准,但它无疑还是驱动一切的基础,很多问题都来自于它,但很多优化也基于它,很烦,不谈。

想当副经理,就得多给经理送礼。

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

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

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

相关文章

如何选择高品质SD卡

如何选择高品质SD卡 SD卡&#xff08;Secure Digital Memory Card&#xff09;是一种广泛使用的存储器件&#xff0c;因其快速的数据传输速度、可热插拔的特性以及较大的存储容量&#xff0c;广泛应用于各种场景&#xff0c;例如在便携式设备如智能手机、平板电脑、运动相机等…

作者分享|eDNA研究梯级水坝对浮游植物和浮游动物群落变化的影响

研究梯级水坝的影响对于了解和减轻其对环境的负面影响至关重要&#xff0c;浮游植物和浮游动物群落都对梯级水坝引起的变化尤为敏感。凌恩客户重庆师范大学生命科学学院水生态健康与环境安全实验室沈彦君课题组&#xff0c;通过eDNA宏条码技术对梯级水坝河道的浮游植物和浮游动…

uniapp实现在表单中展示多个选项,并且用户可以选择其中的一个或多个选项

前言 uni-data-checkbox是uni-app的一个组件,用于在表单中展示多个选项,并且用户可以选择其中的一个或多个选项。该组件可以通过设置不同的参数来控制选项的样式、布局和行为。 提示:以下是本篇文章正文内容,下面案例可供参考 uni-data-checkbox组件具有以下特点:: 1、跨…

威雅学校:2024线上3D艺术展精彩纷呈,让我们为孩子们的想象力喝彩!

Wycombe Abbey International Imaginarium 2024 IMAGINARIUM&#xff0c;是一个源于拉丁语的词汇&#xff0c;意为“想象的地方”或“幻想的世界”。在艺术和文化的领域中&#xff0c;它代表着展示创意、想象力和幻想的空间。 2024年度的威雅大家庭线上3D艺术展&#xff0c;正以…

ChatGLM-6B 部署与使用——打造你的专属GLM

ChatGLM-6B 部署与使用指南 ChatGLM-6B 是清华大学与智谱 AI 开源的一款对话语言模型&#xff0c;基于 General Language Model (GLM) 架构&#xff0c;参数达到 62 亿&#xff0c;因其卓越的语言理解与生成能力&#xff0c;受到广泛关注。 一、在 DAMODEL 上部署 ChatGLM-6B…

Vue使用axios二次封装、解决跨域问题

1、什么是 axios 在实际开发过程中&#xff0c;浏览器通常需要和服务器端进行数据交互。而 Vue.js 并未提供与服务器端通信的接口。从 Vue.js 2.0 版本之后&#xff0c;官方推荐使用 axios 来实现 Ajax 请求。axios 是一个基于 promise 的 HTTP 客户端。 关于 promise 的详细介…

MQ入门(一):同步调用和异步调用--RabbitMQ基础入门

目录 1.初识MQ 1.1.同步调用 1.2.异步调用 1.3.技术选型 2.RabbitMQ 2.1.安装部署 2.2.RabbitMQ基本架构 2.3.收发消息 2.3.1.交换机 2.3.2.队列 2.3.3.绑定关系 2.3.4.发送消息 2.4.数据隔离 2.4.1.用户管理 2.4.2.virtual host 1.初识MQ 微服务一旦拆分&…

水面巡检船垃圾漂浮物检测系统源码分享

水面巡检船垃圾漂浮物检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of …

HarmonyOS异常处理实践

一、HarmonyOS应用异常处理框架 全面检测、精准记录异常传播路径、日志精简 二、FaultLog FaultLog是应用异常日志查询接口&#xff0c;提供QuerySelfFaultLog接口以查询自身故障。 JS_CRASH&#xff1a;ArkTS程序故障类型 CPP_CRASH&#xff1a;C程序故障类型 APP_FREEZE&…

ClickHouse | 查询

1 ALL 子句 2 ARRAY JOIN 使用别名 :在使用时可以为数组指定别名&#xff0c;数组元素可以通过此别名访问&#xff0c;但数组本身则通过原始名称访问 3 DISTINCT子句 DISTINCT不支持当包含有数组的列 4 FROM子句 FROM 子句指定从以下数据源中读取数据: 1.表 2.子…

学习threejs,添加环境光和点光源

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言二、&#x1f340;绘制任意字体模型…

一文读懂SpringIoC的工作原理和机制(面试经)

导览 前言IoC(Inversion of Control)必学必看1. DI&#xff08;Dependency Injection&#xff09;2. IoC核心思想3. 创建Bean的方式3.1 构造函数3.2 构造静态方法3.3 构造实例工厂方法 4 依赖注入的方式4.1 setter注入4.2 构造方法注入4.3 接口注入 结语精彩回顾 前言 我们在使…

什么是Node.js?

为什么JavaScript可以在浏览器中被执行&#xff1f; 在浏览器中我们加载了一些待执行JS代码&#xff0c;这些字符串要当中一个代码去执行&#xff0c;是因为浏览器中有JavaScript的解析引擎&#xff0c;它的存在我们的代码才能被执行。 不同的浏览器使用不同的javaScript解析引…

阴影的基本原理

1、现实中阴影的产生规则 如图所示&#xff0c;现实中的阴影产生规则是&#xff0c;在不考虑光线反射的前提下&#xff0c;当一个光源发射的一条光线遇到一个不透明物体A时&#xff0c;这条光线就不能够再继续照亮其他物体了&#xff08;物体B的一部分&#xff09;&#xff0c…

等保2.0数据库测评之达梦数据库测评

一、达梦数据库介绍 达梦数据库管理系统属于新一代大型通用关系型数据库&#xff0c;全面支持 ANSI SQL 标准和主流编程语言接口/开发框架。行列融合存储技术&#xff0c;在兼顾 OLAP 和 OLTP 的同时&#xff0c;满足 HTAP 混合应用场景。 本次安装环境为Windows10专业版操作…

Docker:解决开发运维问题的开源容器化平台

云计算de小白 Docker是一个开源的容器化平台&#xff0c;可以将应用程序及其依赖的环境打包成轻量级、可移植的容器。 Docker为什么这么受欢迎呢?原因很简单&#xff1a;Docker可以解决不同环境一致运行的问题&#xff0c;而且占用资源少&#xff0c;速度快。 所以好的东西…

erlang学习:Linux命令学习6

for循环学习 打印九九乘法表 for i in {1..9};do %%取1-9for j in $(seq 1 $i);do %%取1-iecho -n "$j*$i$((i*j)) " %%进行九九乘法表打印doneecho done尝试了很多次报错是因为后面的换行符不对&#xff0c;window系统中的换行符与linux对不上&#xff0c;因…

Spring Boot 快速入门教程

1. Spring Boot 简介 Spring Boot 是一个基于 Spring 框架的项目&#xff0c;它简化了基于 Spring 的 Java 应用程序的创建和部署。Spring Boot 通过提供一系列的“Starters”来简化 Maven 配置&#xff0c;同时使用约定大于配置的原则&#xff0c;让开发者能够以最少的配置启…

李沐深度学习-多层感知机、模型选择、过拟合、欠拟合

3.8.1 隐藏层 多层感知机在单层神经网络的基础上引入了一到多个隐藏层&#xff08;hidden layer&#xff09;。隐藏层位于输入层和输出层之间。图3.3展示了一个多层感知机的神经网络图&#xff0c;它含有一个隐藏层&#xff0c;该层中有5个隐藏单元。 图3.3 带有隐藏层的多层感…

Windows环境部署Oracle 11g

Windows环境部署Oracle 11g 1.安装包下载2. 解压安装包3. 数据库安装3.1 执行安装脚本3.2 电子邮件设置3.3 配置安装选项3.4 配置系统类3.5 选择数据库安装类型3.6 选择安装类型3.7 数据库配置3.8 确认安装信息3.9 设置口令 Oracle常用命令 2023年10月中旬就弄出大致的文章&…