TCP BBR 的优化

前段时间,老板发了篇资料,下面是我学习的相关记录整理。

https://aws.amazon.com/cn/blogs/china/talking-about-network-optimization-from-the-flow-control-algorithm/

PS:ubuntu24默认使用的tcp控制算法。还是 cubic

sysctl net.ipv4.tcp_available_congestion_control
# net.ipv4.tcp_available_congestion_control = reno cubic
sysctl net.ipv4.tcp_congestion_control
# net.ipv4.tcp_congestion_control = cubic

代码地址:https://github.com/google/bbr

安装使用 BBR v3

https://github.com/google/bbr/blob/v3/README.md

Viewing the TCP BBR v3 sources

You can view the current sources here:
tcp_bbr.c

Obtaining kernel sources with TCP BBR v3

There are two main options for downloading the code:

  1. To create a new git repo starting from a Linux kernel with TCP BBR v3,
    you can run:
git clone -o google-bbr -b v3  https://github.com/google/bbr.git
cd bbr/
  1. To download the code into an existing git repo, you can use:
git remote add google-bbr https://github.com/google/bbr.git
git fetch google-bbr
git checkout google-bbr/v3

Note that if you already have a git repo that has imported the Linux source
tree, then the second option will be much faster and use much less space, since
it will only need to download the small deltas relative to the mainline Linux
source distribution.

Building and installing the kernel

To build a Linux kernel with TCP BBR v3 support, copy that kernel to a target
(Debian or Ubuntu) test machine (bare metal or GCE), and reboot that machine,
you can use the following script, included in the TCP BBR v3 distribution:

./gce-install.sh -m ${HOST}

Checking the kernel installation

Once the target test machine has finished rebooting, then ssh to the target
test machine and become root with sudo or equivalent. First check that the
machine booted the kernel you built above:

uname -a

You should see the branch name SHA1 hash, and build time stamp from the kernel
you built above.

Then check what congestion control modules are available with:

sysctl net.ipv4.tcp_available_congestion_control

You should see something like:

net.ipv4.tcp_available_congestion_control = reno bbr cubic dctcp

Install test dependencies

Next, copy the test scripts to the target test machine with:

scp -r gtests/net/tcp/bbr/nsperf/ ${HOST}:/tmp/

Before running the tests for the first time, as a one-time step you’ll need to
install the dependencies on the test machine, as root:

mv /tmp/nsperf /root/
cd /root/nsperf
./configure.sh

Running TCP BBR v3 tests and generating graphs

To run the tests, ssh to the target test machine and become root with sudo or
equivalent. Then run the tests and generate graphs with:

cd /root/nsperf
./run_tests.sh
./graph_tests.sh

This will run for hours, and place the graphs in the ./graphs/ directory.

You can run and graph a subset of the tests by specifying the test by name as
an environment variable. For example:

cd /root/nsperf
tests=random_loss ./run_tests.sh
tests=random_loss ./graph_tests.sh

WebRTC上改进的一些可能

BBR v3 与 WebRTC 的结合场景

WebRTC 的核心传输层通常使用 UDP(如音视频流通过 RTP 传输),但某些场景可能依赖 TCPQUIC(如数据通道通过 SCTP over QUIC)。BBR v3 的适用场景包括:

  • 基于 QUIC 的传输:QUIC 协议内置拥塞控制(如 BBR),可替代传统 TCP。
  • TURN/TCP 中继:当 WebRTC 通过 TURN 服务器使用 TCP 传输时,可启用 BBR v3。
  • 用户态拥塞控制:在应用层实现 BBR 逻辑(如通过自定义网络栈)。

TURN/TCP 中继

  • 对于基于 TCP 的传输(如 TURN 中继),设置拥塞控制算法为 BBR:
sysctl -w net.ipv4.tcp_congestion_control=bbr
# TURN 服务器配置(coturn)
listening-port=3478
relay-threads=8
lt-cred-mech
use-auth-secret
congestion-control=bbr
  • 对于 QUIC 传输,需使用支持 BBR 的 QUIC 实现(如 Google 的 quiche)。
  • QUIC 兼容性:需 QUIC 库明确支持 BBR(如 Cloudflare quiche 支持 BBRv1)。

用户态 BBR v3 使用与借鉴

  • 自定义传输协议:在 WebRTC 的数据通道(DataChannel)中,使用基于 UDP 的自定义协议,并在应用层实现 BBR v3 算法。
  • QUIC 集成:通过 QUIC 库(如 lsquic)启用 BBR,替代 WebRTC 默认的传输层。
  • 针对 WebRTC 的低延迟需求调整 BBR 参数(如减少探测带宽的频率)。
// 在 QUIC 连接中设置 BBR 拥塞控制
quic_conn_params params;
params.cc_algorithm = QUIC_CC_ALGORITHM_BBR_V3;
quic_connection_create(&params);// WebRTC 数据通道通过 QUIC 传输
webrtc::DataChannelParameters channel_params;
channel_params.protocol = "quic";
peer_connection->CreateDataChannel("bbr_channel", &channel_params);

背景知识

https://cloud.google.com/blog/products/networking/tcp-bbr-congestion-control-comes-to-gcp-your-internet-just-got-faster

BBR 的核心优化在于 将拥塞控制从被动响应丢包转变为主动建模网络路径,通过精准测量带宽和 RTT,实现高吞吐、低延迟、强鲁棒性的网络传输。BBRv2 进一步解决了公平性和稳定性问题,成为下一代互联网传输协议的重要候选方案。

TCP BBR(Bottleneck Bandwidth and Round-trip propagation time)是 Google 提出的一种基于网络拥塞模型的流量控制算法,旨在更高效地利用网络带宽并降低延迟。与传统的基于丢包的算法(如 CUBIC)不同,BBR 通过主动测量网络路径的带宽和传播时延(RTT),动态调整发送速率,优化网络性能。以下是 BBR 的核心优化点:

1. 基于带宽与时延的拥塞控制模型

  • 传统算法的缺陷:CUBIC 等算法通过检测丢包来判断网络拥塞,但丢包往往发生在网络缓冲区已满时(此时延迟已显著增加)。

  • BBR 的改进:

    • 主动测量带宽和 RTT:BBR 通过持续测量最大带宽(BtlBw)和最小 RTT(RTprop),计算网络路径的带宽时延积(BDP = BtlBw × RTprop),以此作为发送速率的理论上限。
    • 避免缓冲区填塞:通过控制发送速率不超过 BDP,减少数据包在中间路由器缓冲区(Buffer)中的堆积,从而降低排队延迟(避免 Bufferbloat)。

2. 状态机驱动的速率调整

BBR 通过以下四个状态机动态调整发送行为:

  • Startup:快速探测最大带宽(指数级增速),类似传统慢启动。
  • Drain:排空 Startup 阶段可能导致的缓冲区堆积,降低发送速率。
  • ProbeBW:周期性小幅增减速率(±25%),探测当前带宽是否变化。
  • ProbeRTT:周期性降低发送窗口,主动测量最小 RTT(避免过时的 RTT 估计)。

这种状态机机制使得 BBR 能更快适应网络变化,同时保持高吞吐量和低延迟。

3. 抗丢包能力强

  • 传统问题:CUBIC 在丢包时大幅降低发送速率,导致带宽利用率下降。

  • BBR 的优化:

    • 不依赖丢包作为拥塞信号,而是基于带宽和 RTT 的变化调整速率。
    • 即使发生丢包(如随机无线丢包),BBR 仅略微降低速率,避免过度保守。

4. 降低延迟与提高公平性

  • 减少排队延迟:通过控制发送速率不超过 BDP,避免缓冲区溢出,显著降低 RTT。
  • 公平性优化:BBRv2 进一步改进了与传统算法(如 CUBIC)的共存公平性,减少因抢占带宽导致的竞争失衡。

5. BBRv2 的改进

BBRv1 主要解决了高带宽利用率与低延迟的矛盾,而 BBRv2 在此基础上进一步优化:

  • 显式拥塞通知(ECN)支持:利用网络设备的 ECN 标记更早检测拥塞。
  • 抗突发流量干扰:在 ProbeRTT 阶段更平滑地调整速率,避免性能抖动。
  • 增强多流公平性:改进多条 BBR 流共享带宽时的公平性。

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

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

相关文章

什么是异步?

什么是异步? 异步是一个术语,用于描述不需要同时行动或协调就能独立运行的流程。这一概念在技术和计算领域尤为重要,它允许系统的不同部分按自己的节奏运行,而无需等待同步信号或事件。在区块链技术中,异步是指网络中…

SSM婚纱摄影网的设计

🍅点赞收藏关注 → 添加文档最下方联系方式咨询本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅 项目视频 SS…

石头剪刀布游戏

自己写的一个石头剪刀布游戏&#xff0c;如果有需要更改的地方请指出 #define _CRT_SECURE_NO_WARNINGS // scanf_s编写起来太过于麻烦&#xff0c;直接把这个警告关掉&#xff0c;便于编写。 #include <stdio.h> #include <stdlib.h> #include <time.h> //…

大数据系列之:Kerberos

大数据系列之&#xff1a;Kerberos 基本概念工作流程安全特性应用场景总结加密原理Kerberos认证流程更改您的密码授予账户访问权限票证管理Kerberos 票据属性使用 kinit 获取票据使用 klist 查看票据使用 kdestroy 销毁票据.k5identity 文件描述 Kerberos 是一种网络认证协议&a…

WPF 免费UI 控件HandyControl

示例效果和代码 直接可以用 Button 按钮 | HandyOrg 1.安装 , 输入 HandyControl 2.<!--配置HandyControl--> <!--配置HandyControl--> <ResourceDictionary Source"pack://application:,,,/HandyControl;component/Themes/SkinDefault.xaml"/> …

windows部署docker

1.下载docker 打开浏览器&#xff0c;访问 Docker Desktop 下载页面。 2.安装 Docker Desktop 运行安装程序&#xff1a; 双击下载的 Docker Desktop 安装包&#xff0c;启动安装程序。 选择安装选项&#xff1a; 按照屏幕上的指示进行操作。建议选择默认选项&#xff0c;包…

【Linux】远程登录时,使用图形界面报错:MoTTY X11 proxy: Unsupported authorisation protocol

1、问题描述 使用 MobaXterm 远程登录Ubuntu后,使用sudo权限运行图形界面程序报错: MoTTY X11 proxy: Unsupported authorisation protocol (gpartedbin:10518): Gtk-WARNING **: 22:01:34.377: cannot open display: localhost:10.02、查看SSH配置 修改 SSH 服务端配置,…

解决 Hugging Face SentenceTransformer 下载失败的完整指南:ProxyError、SSLError与手动下载方案

问题背景 在使用 Hugging Face 的 SentenceTransformer 加载预训练模型 all-MiniLM-L6-v2 时&#xff0c;遇到了以下错误&#xff1a; 代理连接失败&#xff08;ProxyError / SSLError: KRB5_S_TKT_NYV&#xff09;大文件下载中断&#xff08;unexpected EOF while reading&a…

MySQL——DQL的单表查询

1、查询表中所有的字段&#xff08;列&#xff09; 语法&#xff1a;select * from 表名; * 是通配符&#xff0c;用来表示所有的字段&#xff08;列&#xff09;。 select 表示查询哪些列。 from 表示从哪张表中查询。 2、查询表中指定的字段 语法&#xff1a;select 列…

开源RuoYi AI助手平台的未来趋势

近年来&#xff0c;人工智能技术的迅猛发展已经深刻地改变了我们的生活和工作方式。 无论是海外的GPT、Claude等国际知名AI助手&#xff0c;还是国内的DeepSeek、Kimi、Qwen等本土化解决方案&#xff0c;都为用户提供了前所未有的便利。然而&#xff0c;对于那些希望构建属于自…

[WUSTCTF2020]CV Maker1

进来是个华丽的界面&#xff0c;我们先跟随这个网页创造一个用户 发现了一个上传端口&#xff0c;尝试上传一个php文件并抓包 直接上传进不去&#xff0c;加个GIF89A uploads/d41d8cd98f00b204e9800998ecf8427e.php 传入 并且报告了 上传路径&#xff0c;然后使用蚁剑连接

Spring 中的 IOC

&#x1f331; 一、什么是 IOC&#xff1f; &#x1f4d6; 定义&#xff08;通俗理解&#xff09;&#xff1a; IOC&#xff08;Inversion of Control&#xff0c;控制反转&#xff09; 是一种设计思想&#xff1a;对象不再由你自己创建和管理&#xff0c;而是交给 Spring 容器…

Vue2-实现elementUI的select全选功能

文章目录 使用 Element UI 的全选功能自定义选项来模拟全选 在使用 Element UI 的 el-select组件时&#xff0c;实现“全选”功能&#xff0c;通常有两种方式&#xff1a;一种是使用内置的全选功能&#xff0c;另一种是通过自定义选项来模拟全选。 使用 Element UI 的全选功能…

小菜Go:Ubuntu下Go语言开发环境搭建

前置要求Ubuntu环境搭建 文章推荐 此处推荐一个比较好的文章&#xff0c;基本按部就班就欧克~ 安装虚拟机&#xff08;VMware&#xff09;保姆级教程&#xff08;附安装包&#xff09;_vmware虚拟机-CSDN博客 安装可能遇到的问题 虚拟机安装遇到的问题如&#xff1a;Exception…

安卓中app_process运行报错Aborted,怎么查看具体的报错日志

我在pc端生成了一个jar包&#xff0c;可以正常执行&#xff0c;但是导入到安卓的/data/local/tmp下面执行就会报错 执行命令如下&#xff1a; adb shell cd /data/local/tmp app_process -Djava.class.path/data/local/tmp/demo.jar /data/local/tmp com.example.demo.Hello然…

Python 面向对象 - 依赖倒置原则 (DIP)

1. 核心概念 依赖倒置原则(Dependency Inversion Principle, DIP) 是SOLID原则中的"D"&#xff0c;包含两个关键点&#xff1a; 高层模块不应依赖低层模块&#xff0c;二者都应依赖抽象抽象不应依赖细节&#xff0c;细节应依赖抽象 2. 使用场景 典型应用场景 系…

centos7 yum install docker 安装错误

1、错误信息&#xff1a; [rootlocalhost atguigu]# yum install docker 已加载插件&#xff1a;fastestmirror, langpacks Repository base is listed more than once in the configuration Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http:…

【Gorm】模型定义

intro package mainimport ("gorm.io/gorm""gorm.io/driver/sqlite" // GORM 使用该驱动来连接和操作 SQLite 数据库。 )type Product struct {gorm.Model // 嵌入GORM 内置的模型结构&#xff0c;包含 ID、CreatedAt、UpdatedAt、DeletedAt 四个字段Cod…

R语言从专家到小白

文章目录 下载安装R下载安装R StudioCRAN 下载安装R Index of /bin https://cran.r-project.org/ 下载安装R Studio https://posit.co/download/rstudio-desktop/ CRAN R综合档案网络。 CRAN 镜像是一个提供 R 语言软件和包的在线服务&#xff0c;用户可以从不同的地区选择…

Java的Selenium的特殊元素操作与定位之时间日期控件

分为两种情况: 控件没有限制手动输入&#xff0c;则直接调用sendKeys方法写入时间数据 //时间日期控件处理 chromeDriver.get ("https://www,fliggy,com/?ttidsem.000000736&hlreferidbaidu.082076&route sourceseo"); chromeDriver.findElement (By.xpat…