QUIC with CUBIC or BBR

news2025/4/17 18:17:56

拥塞控制¶

拥塞控制算法是 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.coloradmin.cn/o/1432312.html

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

相关文章

[AIGC] 21世纪Java与Go的相爱相杀

在21世纪的软件开发领域中&#xff0c;Java和Go这两门编程语言可谓是相爱相杀的存在。它们各自拥有着强大的特点和独特的优势&#xff0c;同时也存在着一些明显的竞争和冲突。让我们来看看这两门语言的故事&#xff0c;以及它们之间的深远意义。 文章目录 Java的魅力Go的魅力相…

以小猪o2o生活通v17.1为例简要分析SWOOLE加密破解,swoole_loader加密破解swoole加密逆向后的代码修复流程(个人见解高手掠过)

现在用Php加密五花八门除了组件就是混淆&#xff0c;在组件里面响当当的还属swoole&#xff0c;SWOOLEC是不错的国产加密&#xff0c;值得推荐官方宣称是永远无法破解的加密算法&#xff0c;针对swoole compiler的代码修复我谈谈我的看法&#xff0c;以小猪o2o生活通&#xff0…

一、Redis之NoSQL

1.1 什么是NoSQL NoSQL&#xff08;Not Only SQL&#xff09;即不仅仅是SQL&#xff0c;泛指非关系型的数据库&#xff0c;它可以作为关系型数据库的良好补充。随着互联网web2.0网站的兴起&#xff0c;非关系型的数据库现在成了一个极其热门的新领域&#xff0c;非关系数据库产…

Scrapy:Python中强大的网络爬虫框架

Scrapy&#xff1a;Python中强大的网络爬虫框架 在当今信息爆炸的时代&#xff0c;从互联网上获取数据已经成为许多应用程序的核心需求。Scrapy是一款基于Python的强大网络爬虫框架&#xff0c;它提供了一种灵活且高效的方式来提取、处理和存储互联网上的数据。本文将介绍Scrap…

fastjson 导致的OOM

fastjson 导致的OOM 示例代码 public static void main(String[] args) throws Exception {try {List<Integer> list JSONObject.parseArray("[2023,2024", Integer.class);}catch (Exception e){System.err.println("error");}System.out.println…

Linux 驱动开发基础知识——设备树的语法驱动开发基础知识(九)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;Vir2021GKBS &#x1f43c;本文由…

Vue3_基础使用_1

这节主要介绍&#xff1a; vue2与vue3的区别&#xff0c;创建响应式的数据&#xff0c;setup语法糖的使用&#xff0c;watch监听&#xff0c;及vue3创建项目。 vue2的选项式与vue3的组合式区别&#xff1a; 选项式&#xff1a;vue2中数据与方法计算属性等等&#xff0c;针对…

《Python 网络爬虫简易速速上手小册》第4章:Python 网络爬虫数据抓取技术(2024 最新版)

文章目录 4.1 解析 HTML 与 CSS4.1.1 重点基础知识讲解4.1.2 重点案例&#xff1a;使用 BeautifulSoup 解析博客文章4.1.3 拓展案例 1&#xff1a;使用 lxml 和 XPath 解析产品信息4.1.4 拓展案例 2&#xff1a;动态加载内容的抓取挑战 4.2 动态内容抓取技术4.2.1 重点基础知识…

时间序列预测——GRU模型

时间序列预测——GRU模型 在深度学习领域&#xff0c;循环神经网络&#xff08;RNN&#xff09;是处理时间序列数据的一种常见选择。上期已介绍了LSTM的单步和多步预测。本文将深入介绍一种LSTM变体——门控循环单元&#xff08;GRU&#xff09;模型&#xff0c;包括其理论基础…

ArcGIS Pro 按照字段进行融合或拆分

ArcGIS Pro 按字段融合 在ArcGIS Pro中&#xff0c;通过使用“融合”工具可以轻松地合并具有相同字段的图层。 步骤一&#xff1a;打开ArcGIS Pro 启动ArcGIS Pro应用程序&#xff0c;确保您已经登录并打开您的项目。 步骤二&#xff1a;添加图层 将包含相同字段的图层添加到…

【C++】C++入门 — 类和对象初步介绍

类和对象 1 类的作用域2 类的实例化3 类对象模型4 this指针介绍&#xff1a;特性&#xff1a; Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;下一篇文章见&#xff01;&#xff01;&#xff01; 1 类的作用域 类定义了一个新的作用域&#xff0c;类的…

项目安全问题及解决方法-----xss处理

XSS 问题的根源在于&#xff0c;原本是让用户传入或输入正常数据的地方&#xff0c;被黑客替换为了 JavaScript 脚本&#xff0c;页面没有经过转义直接显示了这个数据&#xff0c;然后脚本就被 执行了。更严重的是&#xff0c;脚本没有经过转义就保存到了数据库中&#xff0c;随…

Redis之基础篇

Redis简介 Redis是一种基于键值对&#xff08;Key-Value&#xff09;的NoSQL数据库&#xff0c;它支持string&#xff08;字符串&#xff09;、hash&#xff08;哈希&#xff09;、list&#xff08;列表&#xff09;、set&#xff08;集合&#xff09;、zset&#xff08;有序集…

matplotlib-中文乱码问题解决方案

前言 本文主要解决matplotlib在画图时&#xff0c;出现的中文乱码问题&#xff0c;具体问题示意如下&#xff1a; 下面将针对这个问题直接给出具体的解决步骤。 具体步骤 1、首先去网上下载并安装SimHei字体&#xff0c;其它字体也行&#xff0c;如下 并将它安装在此目录下…

面试150 位1的个数 位运算

Problem: 191. 位1的个数 文章目录 思路复杂度Code 思路 &#x1f468;‍&#x1f3eb; 参考 复杂度 Code public class Solution {// you need to treat n as an unsigned valuepublic int hammingWeight(int n){int res 0;while (n ! 0){res 1;n & n - 1;// 把最后…

海康IPC摄像机接入国标平台,发现一直不在线(离线)的处理方式

目 录 一、问题 二、问题分析 &#xff08;一&#xff09;常见设备离线问题的原因 &#xff08;二&#xff09;原因分析 三、问题查处 &#xff08;一&#xff09;设备端排查故障&#xff08;设备端自查&#xff09; 1、检查GB28181参数配置是否有误 2、…

【算法与数据结构】739、LeetCode每日温度

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;   程序如下&#xff1a; 复杂度分析&#xff1a; 时间复杂度&#xff1a; O ( ) O() O()。空间复…

【2月比赛合集】28场可报名的数据挖掘大奖赛,任君挑选!

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 以下信息仅供参考&#xff0c;以比赛官网为准 目录 Kaggle&#xff08;2场比赛&#xff09;阿里天池&#xff08;…

Elasticsearch:集群故障排除和优化综合指南

Elasticsearch 是一个强大的搜索和分析引擎&#xff0c;是许多数据驱动应用程序和服务的核心。 它实时处理、分析和存储大量数据的能力使其成为当今快节奏的数字世界中不可或缺的工具。 然而&#xff0c;与任何复杂的系统一样&#xff0c;Elasticsearch 可能会遇到影响其性能和…

【Vue项目中使用videojs播放本地mp4的项目】

目录 以下是一个使用video.js播放本地mp4文件的Vue项目代码示例&#xff1a;1. 首先&#xff0c;在终端中使用以下命令安装video.js和video.js插件&#xff1a;2. 在Vue组件中&#xff0c;引入video.js和videojs-youtube插件&#xff1a;3. 配置video-js.css文件&#xff0c;可…