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.pswp.cn/bicheng/75925.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75925.shtml
英文地址,請注明出處:http://en.pswp.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…