QUIC with CUBIC or BBR

拥塞控制¶

拥塞控制算法是 TCP/QUIC 协议的一个基础部分,多年来经过一个个版本的迭代(如 Tahoe、Reno、Vegas 等),拥塞控制算法得到了持续的提升。由于篇幅有限,本文就目前比较流行的两种拥塞控制算法(CUBIC,BBR),也是 MSQUIC 目前支持的拥塞控制算法进行介绍。

太多太快的分组(包含着 TCP 段以及 UDP 数据报等) 需要网络传输,超过网络 (具体来可能是部分节点、链路) 的处理能力,网络中的某个(某些)路由器队列溢出,开始丢弃分组。 从源端的角度来看:

  • 分组丢失,源端超时了
  • 在源端,收到某 TCP 段的多个冗余ACK
  • 延迟增加
  • 拥塞情况加速变坏
  • 不加控制网络将无法使用

CUBIC 拥塞控制思路¶

CUBIC 是一种拥塞控制协议。TCP CUBIC 版本目前已经作为默认的拥塞控制算法被应用在 linux/unix 系统中,微软在 Win10/Windows Server 2019 系统也对 CUBIC 做了支持。CUBIC 的提出得益于当今通信链路往往具有越来越高的带宽水平这一事实。在由高带宽链路组成的网络中,缓慢增加传输速率的拥塞控制算法可能最终会浪费链路的容量。CUBIC 改变了现有 TCP 标准中的线性拥塞窗口增长函数为三次函数,以提高 TCP 在快速和长距离网络上的可扩展性。它还通过使窗口增长独立于 RTT(往返时间)在具有不同 RTT(往返时间)的流量之间实现更公平的带宽分配,因此这些流量以相同的速率增加其拥塞窗口。在稳定状态下,当窗口远离饱和点时,CUBIC 会以更快的速率增加拥塞窗口的大小,在接近饱和点时缓慢增加窗口大小。这些特征使得 CUBIC 在带宽较大时变得极具扩展性,而延迟较高时也有很好的稳定性。为了实现这一点,提出根据三次函数建立增加和减少传输速率的方案。让我们看看下图: 

图一

算法步骤如下: - 在发生拥塞事件时,该瞬间的窗口大小将被记录为 Wmax 或最大窗口。 - Wmax 值将被设置为控制拥塞窗口增长的三次函数的拐点。 - 然后,将使用较小的窗口值重新启动传输,如果没有拥塞,该值将根据三次函数的凹形部分增加。 - 随着窗口接近 Wmax,增量将减慢。 - 一旦达到临界点,即 Wmax,窗口值将继续谨慎增加。 - 最后,如果网络仍然没有遇到任何拥塞,则窗口大小将根据函数的凸形部分继续增大。如我们所见,CUBIC 的策略是开始时快速增加,在上一次导致拥塞的窗口周围减小,然后继续以大增量增加。 如果你想了解更多 CUBIC 算法的技术细节,可以阅读下面的文章:CUBIC: a new TCP-friendly high-speed TCP variant

BBR 拥塞控制思路

不同于 CUBIC 等基于丢失的拥塞控制算法,BBR 是基于模型的拥塞控制算法,其行为方式是对传输流通过的网络路径的确切模型的表现。模型将通信分成应用受限、带宽受限等阶段。主要包括两个估计参数: - BtlBw:传输通道的瓶颈带宽,通路的容量,用来估算自滑动窗口的最大传发送速率样本。 - RTprop:该路径的往返传播延时,轻载时,各队列都没有排队情况下的往返传播传输延迟之和,用来估算自滑动窗口的最小往返延时样本。 经常测量 BtlBW 和 RTprop,用来计算 BDP(带宽延迟积,反映网络通信量和路由的变化),按照 BtlBW 控制主机注入速率,按照BDP控制 inflight 的数量。其中:

BDP = RTprop * BtlBW

从源端注入的等待被确认的 inflight 数据不超过 BDP。 因为 BtlBW 和 RTprop 不可同时测量 - inflight 小于 BDP 才能够测量 RTprop,轻载时的往返延迟 - inflight 大于 BDP,才能够测量 BtlBW 因此该算法基于网络的时间局部性,即从一小段时间来看,系统参数基本稳定,大概率能测准和控好 BtlBW 和 RTprop。

应用受限阶段,测量 RTprop: - 交互式应用:应用数据不多,本身就在该阶段 RTprop WR=10s 有更新,不用单独测量 RTprop 。 - 高突发情况:RTprop 近10s没有更新,2% 的时间(200 ms) 降低速率,形成条件测量 RTprop,适应路由变化。

带宽受限阶段,测量 BtlBW: - 连接建立后不断增加 inflight 量,连续三个 RTprop 交付速率不增加25%进入带宽受限状态。 - 测量交付速率,将近期最大的交付速率当作 BtlBW。在高带宽通信时,适应瓶颈链路带宽的变化。

按照 BtlBW 控速: - inflight 不超过BDP 前提下,且控制分组间隔,使得超过瓶颈链路带宽 BtlBW。 - 计算分组之间的发送间隔:

pacing_rate = pacing_gain * BtlBW

适应 BtlBW 变化: - 在带宽受限阶段 周期性地增速适应BtlBW的增加。一个 Cycle 8个节拍(RTprop), - 一个节拍 pacing_gain=1.25,增速(1.25*BDP),如 RTprop 没变大=>交付速率增加,BtlBW 按公式更换成更大的交付速率。如 RTprop 变大=>交付速率没变大,BtlBW 不更新 - 一个节拍RTprop,0.75倍 BDP,放空瓶颈 buffer 余下6个节拍原有速度,稳定 

图二

 整个的过程可以看作是下面的状态机模型

        |V
+--->Startup----+
|       |       |
|       V       |
|     Drain-----+
|       |       |
|       V       |
+--->ProbeBW----+
|    ^     |    |
|    |     |    |
|    +-----+    |
|               |
+----ProbeRT<---+

细节可参考 BBR: Congestion-Based Congestion Control

BBR VS CUBIC¶

2015年谷歌 B4 网络,从 CUBIC 迁移到 BBR BBR吞吐量是 CUBIC 的2-25倍,如果将接收端的缓冲区大小加大,BBR 是 CUBIC 吞吐的133倍。 

图三

 丢包率在0.001%到50%情况下,CUBIC 吞吐量下降是 BBR 的10倍以上,随机丢包率越高,BBR 吞吐优势越大,0.1% 丢包率,BBR 吞吐量是 CUBIC 的 100 倍。 

图四

 CUBIC 相对于 BBR 延迟的倍数。 

图五

 移动通信场景在缓存加大情况下 CUBIC 随着 Buffer 增大,延迟增大,而 BBR 随着 buffer 增 大几乎不增加。采用CUBIC连接超时概率大。 

图六

公平性:与基于丢失的拥塞控制算法的竞争 - 基于丢失的拥塞控制倾向于占满队列,让分组丢失 • 影响BBR的运行,尽管BBR与CUBIC共同运行不吃亏 - 本质上BtlBW降低,本质上靠着10RTT超时之前的持续注入,让队列丢失 - 让CUBIC超时,退缩,但整网效果受限。

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

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

相关文章

SVM支持向量机

1.基本概念 支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;是一种有监督学习方法&#xff0c;主要用于分类和回归分析。它的基本思想是在特征空间中找到一个超平面&#xff0c;能够将不同类别的样本分开&#xff0c;并且使得离这个超平面最近的样本…

Linux 链接 GitHub 出现 Connection timed out

问题 安装GIT并完成公钥验证&#xff1a;Linux 系统拉取 Github项目 [rootxxx devtools]# ssh -T gitgithub.com ssh: connect to host github.com port 22: Connection timed out解决方案 进入在存放公钥私钥id_rsa.pub文件里&#xff0c;新建/修改config文本 [rootxxx my…

Java 异常处理下篇:11 个异常处理最佳实践

文章目录 前言最佳实践早抛出&#xff0c;晚捕获原则只捕获实际可处理的异常不要忽略捕捉的异常抛出具体的检查性异常正确包装自定义异常中的异常记录或抛出异常&#xff0c;但不要同时执行finally 中永远不要抛出异常或返回值避免使用异常进行流程控制使用模板方法处理重复的 …

算法训练day24回溯算法理论基础77组合

今日学习链接 https://programmercarl.com/%E5%9B%9E%E6%BA%AF%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html#%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80 https://programmercarl.com/0077.%E7%BB%84%E5%90%88.html#%E5%89%AA%E6%9E%9D%E4%BC%98%E5%8C%96 回溯算…

sql注入,布尔盲注和时间盲注,无回显

布尔盲注 通过order by分组可以看到&#xff0c;如果正确会i显示you are in&#xff0c;错误则无任何提示&#xff0c;由此可以判断出&#xff0c;目前只显示对错&#xff0c;此外前端不会显示任何数据 也就是说&#xff0c;目前结果只有两种&#xff0c;在这种只有两种变量的…

Uniapp登录页面获取头像、昵称的最新方法的简单使用

前言 写小程序写到登录页面的时候&#xff0c;发现官方文档中原来的wx.getUserInfo和wx.getUserProfile不太能用了&#xff0c;学习了相对比较新的方法&#xff0c;这种方法的文档链接如下&#xff1a; https://developers.weixin.qq.com/miniprogram/dev/framework/open-abil…

交易策略的开发:关于市场到底能不能预测的哲学思考

文章目录 为什么要判断市场能否被预测三个方面来论述这个问题耗散结构理论什么是耗散结构 为什么要判断市场能否被预测 这个问题已经争论几十年了&#xff0c;不仅在股票市场&#xff0c;期货市场&#xff0c;外汇市场, 甚至整个金融市场。至今没有人给出一个科学的论断。 如果…

上位机是什么?与下位机是什么关系

在工业自动化领域中&#xff0c;上位机是一项关键而引人注目的技术。许多人对上位机的概念感到好奇&#xff0c;想要深入了解其在工业智能中的作用。那么&#xff0c;上位机究竟是什么呢&#xff1f; 首先&#xff0c;上位机是一种用于工业控制系统的软件应用&#xff0c;通常…

配置支持 OpenAPI 的 ASP.NET Core 应用

写在前面 Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。 本文记录如何配置基于Swagger 的 ASP.NET Core 应用程序的 OpenAPI 规范。 需要从NuGet 安装 Swashbuckle.AspNetCore 包 代码实现 var builder WebApplicati…

STM32G4单片机

单片机的基本结构 CPU就是中央处理器&#xff0c;是单片机的内核 时钟电路&#xff0c;时钟源是给整个电路提供时序 其他的外设、中断以及存储器都是通过系统总线与CPU进行连接 RAM相当于电脑的内存条&#xff0c;随机存储器&#xff0c;掉电会丢失 ROM相当于电脑的硬盘&am…

vmstat 监控虚拟内存,进程,CPU

文章目录 1. 命令格式&#xff1a;2. 命令功能&#xff1a;3. 命令参数&#xff1a;4. 使用实例&#xff1a;实例1&#xff1a;显示虚拟内存使用情况实例2&#xff1a;显示活跃和非活跃内存实例3&#xff1a;查看系统已经fork了多少次实例4&#xff1a;查看内存使用的详细信息实…

美籍华裔力学和数学家林家翘

林家翘&#xff08;1916年7月7日—2013年1月13日&#xff09;&#xff0c;出生于北京&#xff0c;男&#xff0c;原籍福建福州&#xff0c;力学和数学家&#xff0c;美国艺术与科学院院士、美国国家科学院院士、中国科学院外籍院士&#xff0c;麻省理工学院荣誉退休教授 [1]。 …

初始MySQL

一 SQL的基本概述 基本概述 ▶SQL全称: Structured Query Language&#xff0c;是结构化查询语言&#xff0c;用于访问和处理数据库的标准的计算机语言。SQL语言1974年由Boyce和Chamberlin提出&#xff0c;并首先在IBM公司研制的关系数据库系统SystemR上实现。 ▶美国国家标…

【Linux】Linux基本指令

目录 1.ls指令 2.cd指令 3.touch指令 4.mkdir指令 5.rmdir指令和rm指令 5.1rmdir指令 5.2rm指令 6.man指令 7.cp指令 8.mv指令 9.cat指令 10.more指令 && less指令 10.1more指令 10.2less指令 11.head指令 && tail指令 11.1head指令 11.2tai…

第23课 使用FFmpeg将rtmp流再转推到rtmp服务器

通过上节课的学习&#xff0c;我们已经可以正常播放本地rtmp流及mp4文件&#xff0c;这节课&#xff0c;我们将在上节课的基础上实现一个常用的转推功能&#xff1a;读取rtmp流或mp4文件并转推到rtmp服务器上实现直播转发功能。 一、FFmpeg API 转码推流的一般过程 1.引入ffm…

内存泄漏调试 ---- jemalloc的heap profiling

使用jemalloc时&#xff0c;可以通过profiling机制来发现并定位内存泄漏(memory leak)。本文翻译自原文并增加了一些例子。 1、安装 这里我们编译安装jemalloc.5.10&#xff0c;注意在configure的时候添加了–enable-prof选项&#xff0c;这样才能打开profiling机制。下文中通…

Django的request.session缓存的广发用法

前言&#xff1a; 相信同学们在学习PythonWeb开发的时候和我一样会遇到许多问题&#xff0c;今天我这边举几个例子涉及到session缓存的问题&#xff0c;由于当时并没有接触session缓存的技术内容&#xff0c;所以往往头大&#xff0c;一时间不知带如何解决&#xff0c;老师也会…

2401cmake,学习cmake2

步4:安装与测试 现在开始给项目添加安装规则和支持测试. 安装规则 安装规则非常简单:对MathFunctions,想安装库和头文件,对应用,想安装可执行文件和配置头. 所以在MathFunctions/CMakeLists.txt尾添加: install(TARGETS MathFunctions DESTINATION lib) install(FILES Mat…

服务网格(Service Mesh)流行工具

在这篇博客中&#xff0c;我们将介绍微服务的最佳服务网格工具列表&#xff0c;这些工具提供安全性、金丝雀部署、遥测、负载均衡等。 用于部署和操作微服务的服务网格工具的数量不断增加。在这篇文章中&#xff0c;我们将探讨您应该用来构建自己的服务网格架构的顶级服务网格…

【Eclipse平台】2 Eclipse Workbench工作台介绍

Eclipse Workbench工作台介绍 本文介绍Eclipse工作台Workbench。 当工作台启动时&#xff0c;首先看到的是一个对话框&#xff0c;该对话框允许我们选择工作区的位置。工作区是存储工作的目录。现在&#xff0c;只需单击“确定”即可选择默认位置。 选择工作区位置后&#x…