拥塞控制算法的 rtt 公平性

news2025/1/5 7:34:12

我强调过,拥塞控制的核心在公平可用性,公平性由 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] + I
        wy[n] = wy[n-1] + I
    else:
        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] + I
    else:
        z[n] = z[n-1]
        wz[n] = wz[n-1]

    if wx[n] + wy[n] + wz[n] > 2*C*R:
        # 注释为 westwood
        if random.random() < 0.5:
            wx[n] = wx[n]/2
            #wx[n] = x[n] * R
        if random.random() < 0.5:
            wy[n] = wy[n]/2
            #wy[n] = y[n] * R
        if random.random() < 0.5:
            wz[n] = wz[n]/2
            #wz[n] = z[n] * R

    r[n] = (wx[n] + wy[n] + wz[n]) / C
    if 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 + I
        wy[n] = y[n-1]*R + I
    else:
        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 + I
    else:
        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*R
    wy[n] = max_y*R
    wz[n] = max_z*R
    if 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.coloradmin.cn/o/2151204.html

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

相关文章

HTTP中的event-stream,eventsource,SSE,chatgpt,stream request,golang

我们都知道chatgpt是生成式的&#xff0c;因此它返回给客户端的消息也是一段一段的&#xff0c;所以普通的HTTP协议无法满足&#xff0c;当然websocket是能满足的&#xff0c;但是这个是双向的通信&#xff0c;其实 SSE&#xff08;Server-Sent Events&#xff09; 正好满足这个…

树与图的深度优先遍历(dfs的图论中的应用)

模板题 846. 树的重心 给定一颗树&#xff0c;树中包含 nn 个结点&#xff08;编号 1∼n&#xff09;和 n−1条无向边。 请你找到树的重心&#xff0c;并输出将重心删除后&#xff0c;剩余各个连通块中点数的最大值。 重心定义&#xff1a;重心是指树中的一个结点&#xff…

RabbitMQ 高级特性——发送方确认

文章目录 前言发送方确认confirm 确认模式return 退回模式 常见面试题 前言 前面我们学习了 RabbitMQ 中交换机、队列和消息的持久化&#xff0c;这样能够保证存储在 RabbitMQ Broker 中的交换机和队列中的消息实现持久化&#xff0c;就算 RabbitMQ 服务发生了重启或者是宕机&…

【Android】浅析MVC与MVP

【Android】浅析MVC与MVP 什么是架构&#xff1f; 架构&#xff08;Architecture&#xff09;在软件开发中指的是软件系统的整体设计和结构&#xff0c;它描述了系统的高层组织方式&#xff0c;包括系统中各个组件之间的关系、依赖、交互方式&#xff0c;以及这些组件如何协同…

基于OpenCV的YOLOv5图片检测

利用OpenCV的DNN模块加载onnx模型文件进行图片检测。 1、使用的yolov5工程代码&#xff0c;调用export.py导出onnx模型。 2、下载opencv版本&#xff0c;https://opencv.org/releases/ 使用opencv版本4.5.3或以上&#xff0c;本文使用的opencv4.6.0 3、使用vc20…

4.使用 VSCode 过程中的英语积累 - View 菜单(每一次重点积累 5 个单词)

前言 学习可以不局限于传统的书籍和课堂&#xff0c;各种生活的元素也都可以做为我们的学习对象&#xff0c;本文将利用 VSCode 页面上的各种英文元素来做英语的积累&#xff0c;如此做有 3 大利 这些软件在我们工作中是时时刻刻接触的&#xff0c;借此做英语积累再合适不过&a…

STM32 使用 CubeMX 实现按键外部中断

目录 问题背景知识参考需要改什么注意尽量不要在中断函数使用 循环函数做延时中断函数中延时方法调试 问题 我想实现按钮触发紧急停止类似功能&#xff0c;需要使用按键中断功能。 背景知识 GPIO 点亮 LED。stm32cubemx hal学习记录&#xff1a;GPIO输入输出。STM32—HAL库 …

【实战篇】MySQL是怎么保证高可用的?

背景 在一个主备关系中&#xff0c;每个备库接收主库的 binlog 并执行。正常情况下&#xff0c;只要主库执行更新生成的所有 binlog&#xff0c;都可以传到备库并被正确地执行&#xff0c;备库就能达到跟主库一致的状态&#xff0c;这就是最终一致性。 但是&#xff0c;MySQL…

免费在线压缩pdf 压缩pdf在线免费 推荐简单好用

压缩pdf在线免费&#xff1f;在日常生活和工作学习中&#xff0c;处理PDF文件是常见任务。但有时PDF文件体积较大&#xff0c;给传输、存储和分享带来不便。因此&#xff0c;学习PDF文件压缩技巧十分必要。压缩PDF文件是指通过技术手段减小文件占用的存储空间&#xff0c;同时尽…

[Redis][Hash]详细讲解

目录 0.前言1.常见命令1.HSET2.HGET3.HEXISTS4.HDEL5.HKEYS6.HVALS7.HGETALL8.HMGET9.HLEN10.HSETNX11.HINCRBY12.HINCRBYFLOAT 2.内部编码1.ziplist(压缩链表)2.hashtable(哈希表) 3.使用场景4.缓存方式对比1.原⽣字符串类型2.序列化字符串类型3.哈希类型 0.前言 在Redis中&am…

CSS - 通用左边图片,右边内容,并且控制长度溢出处理模板(vue | uniapp | 微信小程序)

前言 通用模板&#xff0c;可适用于任意前端项目。 如下图所示&#xff0c;手机电脑通用。 示例代码 根据自己的需求修改即可。 <body><div class"container"><!-- 头像图片 --><img class"avatar" src"https://cdn.uviewui.com…

C++初阶学习——探索STL奥秘——标准库中的priority_queue与模拟实现

1.priority_queque的介绍 1.priority_queue中文叫优先级队列。优先队列是一种容器适配器&#xff0c;根据严格的弱排序标准&#xff0c;它的第一个元素总是它所包含的元素中最大的。 2. 此上下文类似于堆&#xff0c;在堆中可以随时插入元素&#xff0c;并且只能检索最大堆元…

学习大数据DAY59 全量抽取和增量抽取实战

目录 需求流程&#xff1a; 需求分析与规范 作业 作业2 需求流程&#xff1a; 全量抽取 增量抽取 - DataX Kettle Sqoop ... 场景: 业务部门同事或者甲方的工作人员给我们的部门经理和你提出了新的需 求 流程: 联系 > 开会讨论 > 确认需求 > 落地 需求文档( 具体…

Vue 项目中引入 Axios 详解

Vue 项目中引入 Axios 详解 在 Vue 项目中&#xff0c;axios 是一个非常流行的 HTTP 客户端&#xff0c;用于向服务器发送请求并处理响应。本文将详细说明如何在 Vue 项目中引入 Axios 插件&#xff0c;以及如何进行基本的配置&#xff0c;包括构建、配置域名、设置全局错误拦…

WEB攻防-JS项目Node.js框架安全识别审计验证绕过

知识点&#xff1a; 1、原生JS&开发框架-安全条件 2、常见安全问题-前端验证&未授权 详细点&#xff1a; 1、什么是JS渗透测试&#xff1f; 在JavaScript中也存在变量和函数&#xff0c;当存在可控变量及函数调用即可参数漏洞 2、流行的Js框架有哪些&#xff1f; …

CC1链的第二种方式-LazyMap版调用链

文章目录 CC1链的第二种方式-LazyMap版调用链LazyMap构造payloadCC1的调用链 CC1链的第二种方式-LazyMap版调用链 CC1链的第一种方式可以参考另一篇文章&#xff1a;CC1链_全网最菜的分析思路 LazyMap 在之前的CC1链中分析&#xff0c;其实是其中一种方式&#xff08;国内版本…

全面解析流量态势感知与网络性能监控:IT运维中的核心技术

在现代IT运维中&#xff0c;网络的稳定性和业务的连续性是企业赖以生存的基石。随着数字化转型的深入&#xff0c;网络流量日益复杂&#xff0c;安全威胁愈加严峻&#xff0c;运维人员不仅需要确保网络的顺畅运行&#xff0c;还必须及时发现潜在风险并快速响应。流量态势感知与…

如何查看Android设备的dpi

adb shell getprop ro.sf.lcd_density adb shell cat /system/build.prop > build_prop.txt shell cat system/build.prop 结果&#xff1a;参考&#xff1a; 如何查看Android设备的dpi_安卓 查看手机dpi-CSDN博客

ABAP-Swagger 一种公开 ABAP REST 服务的方法

ABAP-Swagger An approach to expose ABAP REST services 一种公开 ABAP REST 服务的方法 Usage 1: develop a class in ABAP with public methods 2: implement interface ZIF_SWAG_HANDLER, and register the public methods(example method zif_swag_handler~meta) 3: …

ElementUI 用span-method实现循环el-table组件的合并行功能

需要把指定列的相同数据合并起来&#xff08;项目中用的是updateTime&#xff09; 后端返回的数据格式&#xff1a; html&#xff1a; <el-tab-pane label"执行记录概览" name"fourth" v-loading"loading"><el-timeline v-if"re…