giftiaのblog

Tcp拥塞控制算法之bbr

· giftia

一. 环境

  1. vmware虚拟机
  2. iso镜像:ubuntu-22.04.5-live-server-amd64.iso
  3. 配置:2核4G

二. 默认算法

1. 查看当前的拥塞控制算法

$ sysctl net.ipv4.tcp_congestion_control
> net.ipv4.tcp_congestion_control = cubic

可见,默认的算法是cubic

2. cubic算法

主要是通过丢包来调整窗口的的大小,控制传输速率

a. 慢启动

每收到一个ack,拥塞窗口(cwnd)就指数增长

cwnd:1-2-4-8-16-32…

b. 拥塞避免

cubic的核心部分,使用三次函数来增长窗口(reno这里是线性增长)

W(t) = C × (t - K)³ + W_max

c. 快重传

收到三个重复ack,立即重传丢失的包,不等待超时

d. 快恢复

快重传后,ssthresh=cwnd*β(一般是0.7), cwnd=ssthresh,然后直接进入拥塞避免阶段(跳过慢启动)

三. 切换为bbr

1. 查看当前支持的拥塞控制算法

$ sysctl net.ipv4.tcp_available_congestion_control
> net.ipv4.tcp_available_congestion_control = reno cubic

发现并没有bbr,难道是不支持吗

查看一下内核版本

$ uname -r
> 5.15.0-119-generic

内核版本>4.9就支持bbr,所以需要我们手动加载bbr模块

$ sudo modprobe tcp_bbr

再次查看

$ sysctl net.ipv4.tcp_available_congestion_control
> net.ipv4.tcp_available_congestion_control = reno cubic bbr

2. 切换为bbr算法

我这里使用临时切换(重启后失效)

$ sudo sysctl -w net.core.default_qdisc=fq
$ sudo sysctl -w net.ipv4.tcp_congestion_control=bbr
> net.core.default_qdisc = fq
> net.ipv4.tcp_congestion_control = bbr

再检查一下是否切换

$ sysctl net.ipv4.tcp_congestion_control
> net.ipv4.tcp_congestion_control = bbr

四. bbr

bbr不同于传统的拥塞控制算法,它并不是通过丢包来判断是否需要改动窗口,而是会主动去测量网络状况

1. 两个指标

BtlBw (Bottleneck Bandwidth)- 瓶颈带宽

发送数据包 → 测量实际传输速率 → 记录最大值

RTprop (Round-trip propagation time)- 最小往返时延

发送数据包 → 测量往返时间 → 记录最小值

2. 计算最优发送速率

最优发送窗口 = BtlBw × RTprop

这就是带宽延迟积(BDP),是理论上的最佳值

3. 不同的四个阶段

img

4. 对比

通俗的说,以开车为示例

a. cubic

踩油门 → 撞墙(丢包) → 急刹车 → 再踩油门 → 又撞墙

b. bbr

看速度表和路况 → 保持在限速以下 → 偶尔试探一下能不能更快

五. 性能对比

两台虚拟机,分别是发起方和接受方(后面叫做服务器 客户端)

1. 服务端配置

1.1 安装iperf3

$ sudo apt update
$ sudo apt install -y iperf3

1.2 启动iperf3服务器(保持启动)

$ iperf3 -s
> 
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------

1.3 查看服务器ip

$ ip addr
> 192.168.226.130

2. 客户端配置

2.1 安装工具

$ sudo apt update
$ sudo apt install -y iperf3

2.2 测试连通性

$ ping 192.168.226.130 -c 4
> 
PING 192.168.226.130 (192.168.226.130) 56(84) bytes of data.
64 bytes from 192.168.226.130: icmp_seq=1 ttl=64 time=0.512 ms
64 bytes from 192.168.226.130: icmp_seq=2 ttl=64 time=0.295 ms
64 bytes from 192.168.226.130: icmp_seq=3 ttl=64 time=0.250 ms
64 bytes from 192.168.226.130: icmp_seq=4 ttl=64 time=0.317 ms

--- 192.168.226.130 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3074ms
rtt min/avg/max/mdev = 0.250/0.343/0.512/0.100 ms

3. 创建测试脚本

3.1 创建文件(vim可替换为自己熟悉的)

$ vim bbr_test.sh

3.2 粘贴脚本(ai写的,可根据需求灵活更改)

#!/bin/bash

# ========================================
# CUBIC vs BBR 性能对比测试脚本
# ========================================

# 配置参数
SERVER_IP="192.168.226.130"  # ⚠️ 修改为你的服务器IP
TEST_DURATION=30            # 每次测试持续时间(秒)
TEST_ROUNDS=3               # 每个算法测试次数

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 结果目录
RESULT_DIR="test_results_$(date +%Y%m%d_%H%M%S)"
mkdir -p "$RESULT_DIR"

echo -e "${GREEN}================================================${NC}"
echo -e "${GREEN}       CUBIC vs BBR 性能对比测试${NC}"
echo -e "${GREEN}================================================${NC}"
echo ""
echo "服务器地址: $SERVER_IP"
echo "测试时长: ${TEST_DURATION}秒"
echo "测试轮数: ${TEST_ROUNDS}次"
echo "结果目录: $RESULT_DIR"
echo ""

# 检查服务器连通性
echo -e "${YELLOW}检查服务器连通性...${NC}"
if ! ping -c 2 $SERVER_IP >/dev/null 2>&1; then
    echo -e "${RED}错误: 无法连接到服务器 $SERVER_IP${NC}"
    exit 1
fi
echo -e "${GREEN}✓ 服务器连通正常${NC}"
echo ""

# 检查BBR模块
echo -e "${YELLOW}检查BBR模块...${NC}"
if ! lsmod | grep -q tcp_bbr; then
    echo "加载BBR模块..."
    sudo modprobe tcp_bbr
fi
echo -e "${GREEN}✓ BBR模块已加载${NC}"
echo ""

# 函数:执行单次测试
run_single_test() {
    local algo=$1
    local round=$2
    local output_file="$RESULT_DIR/${algo}_round${round}.txt"
    
    echo -e "${BLUE}► [$algo] 第 $round 轮测试中...${NC}"
    
    # 切换算法
    sudo sysctl -w net.ipv4.tcp_congestion_control=$algo >/dev/null 2>&1
    sleep 1
    
    # 运行iperf3测试
    iperf3 -c $SERVER_IP -t $TEST_DURATION -C $algo > "$output_file" 2>&1
    
    # 提取关键数据
    local bandwidth=$(grep "receiver" "$output_file" | awk '{print $(NF-2), $(NF-1)}')
    local retrans=$(grep "sender" "$output_file" | awk '{print $(NF-1)}')
    local retrans=${retrans:-0}
    
    echo -e "  带宽: ${GREEN}$bandwidth${NC}"
    echo -e "  重传: ${YELLOW}${retrans}${NC}"
    echo ""
    
    # 保存到汇总文件
    echo "$algo,$round,$bandwidth,$retrans" >> "$RESULT_DIR/raw_data.csv"
    
    sleep 3
}

# 函数:测试指定算法
test_algorithm() {
    local algo=$1
    
    echo -e "${GREEN}========================================${NC}"
    echo -e "${GREEN}  测试算法: $algo${NC}"
    echo -e "${GREEN}========================================${NC}"
    echo ""
    
    for i in $(seq 1 $TEST_ROUNDS); do
        run_single_test $algo $i
    done
}

# 初始化CSV文件
echo "算法,轮次,带宽,单位,重传次数" > "$RESULT_DIR/raw_data.csv"

# 开始测试
echo -e "${YELLOW}开始测试...${NC}"
echo ""

# 测试CUBIC
test_algorithm "cubic"

# 测试BBR
test_algorithm "bbr"

# 生成测试报告
echo -e "${GREEN}================================================${NC}"
echo -e "${GREEN}            测试完成!${NC}"
echo -e "${GREEN}================================================${NC}"
echo ""

# 计算平均值
echo -e "${BLUE}正在生成报告...${NC}"

cat > "$RESULT_DIR/summary.txt" << EOF
===== CUBIC vs BBR 性能对比报告 =====
测试时间: $(date)
服务器: $SERVER_IP
测试时长: ${TEST_DURATION}秒/轮
测试轮数: ${TEST_ROUNDS}轮

----- CUBIC 测试结果 -----
EOF

grep "cubic" "$RESULT_DIR/raw_data.csv" | while IFS=',' read algo round bw unit retrans; do
    echo "  第${round}轮: ${bw} ${unit}, 重传: ${retrans}" >> "$RESULT_DIR/summary.txt"
done

cat >> "$RESULT_DIR/summary.txt" << EOF

----- BBR 测试结果 -----
EOF

grep "bbr" "$RESULT_DIR/raw_data.csv" | while IFS=',' read algo round bw unit retrans; do
    echo "  第${round}轮: ${bw} ${unit}, 重传: ${retrans}" >> "$RESULT_DIR/summary.txt"
done

echo "" >> "$RESULT_DIR/summary.txt"
echo "详细数据请查看: $RESULT_DIR/" >> "$RESULT_DIR/summary.txt"

# 显示报告
cat "$RESULT_DIR/summary.txt"

echo ""
echo -e "${GREEN}✓ 所有测试结果已保存到: $RESULT_DIR/${NC}"
echo ""
echo -e "${YELLOW}查看详细数据:${NC}"
echo "  cat $RESULT_DIR/summary.txt"
echo "  cat $RESULT_DIR/raw_data.csv"

3.3 添加执行权限

$ chmod +x bbr_test.sh

4. 执行第一轮测试

4.1 运行脚本

$ sh ./bbr_test.sh

4.2 测试输出

-e ================================================
-e        CUBIC vs BBR 性能对比测试
-e ================================================

服务器地址: 192.168.226.130
测试时长: 30秒
测试轮数: 3次
结果目录: test_results_20251031_090605

-e 检查服务器连通性...
-e ✓ 服务器连通正常

-e 检查BBR模块...
-e ✓ BBR模块已加载

-e 开始测试...

-e ========================================
-e   测试算法: cubic
-e ========================================

-e ► [cubic]1 轮测试中...
-e   带宽: 8.20 Gbits/sec
-e   重传: 559

-e ► [cubic]2 轮测试中...
-e   带宽: 7.48 Gbits/sec
-e   重传: 296

-e ► [cubic]3 轮测试中...
-e   带宽: 7.21 Gbits/sec
-e   重传: 294

-e ========================================
-e   测试算法: bbr
-e ========================================

-e ► [bbr]1 轮测试中...
-e   带宽: 3.51 Gbits/sec
-e   重传: 0

-e ► [bbr]2 轮测试中...
-e   带宽: 3.35 Gbits/sec
-e   重传: 0

-e ► [bbr]3 轮测试中...
-e   带宽: 3.31 Gbits/sec
-e   重传: 0

-e ================================================
-e             测试完成!
-e ================================================

-e 正在生成报告...
===== CUBIC vs BBR 性能对比报告 =====
测试时间: Fri Oct 31 09:09:31 AM UTC 2025
服务器: 192.168.226.130
测试时长: 30秒/轮
测试轮数: 3轮

----- CUBIC 测试结果 -----
  第1轮: 8.20 Gbits/sec 559, 重传: 
  第2轮: 7.48 Gbits/sec 296, 重传: 
  第3轮: 7.21 Gbits/sec 294, 重传: 

----- BBR 测试结果 -----
  第1轮: 3.51 Gbits/sec 0, 重传: 
  第2轮: 3.35 Gbits/sec 0, 重传: 
  第3轮: 3.31 Gbits/sec 0, 重传: 

详细数据请查看: test_results_20251031_090605/

-e ✓ 所有测试结果已保存到: test_results_20251031_090605/

-e 查看详细数据:
  cat test_results_20251031_090605/summary.txt
  cat test_results_20251031_090605/raw_data.csv

4.3 结果分析

这里我测试了多次,就不粘贴上来了(后续结果都是如此)

除了个别测试,差别都不大,可见cubic的带宽明显优于bbr,但是bbr不会丢包且较稳定

第一轮可以算cubic胜利,但是注意现在是内网环境,并启没有配置延迟和丢包率

接下来我们继续测试

5. 第二轮测试(高延迟)

5.1 服务端配置:150ms + 0.5%丢包

$ sudo tc qdisc add dev ens33 root netem delay 150ms loss 0.5%

5.2 验证是否生效

$ sudo tc qdisc show dev ens33
> qdisc netem 8001: root refcnt 2 limit 1000 delay 150ms loss 0.5%

5.3 启动服务端监听

$ iperf3 -s

5.4 客户端运行测试脚本

$ sh ./bbr_test.sh

5.5 结果输出(这里的重传次数不对,一开始脚本写错了,请自己再测试一下)

-e ================================================
-e        CUBIC vs BBR 性能对比测试
-e ================================================

服务器地址: 192.168.226.130
测试时长: 30秒
测试轮数: 3次
结果目录: test_results_20251031_070346

-e 检查服务器连通性...
-e ✓ 服务器连通正常

-e 检查BBR模块...
-e ✓ BBR模块已加载

-e 开始测试...

-e ========================================
-e   测试算法: cubic
-e ========================================

-e ► [cubic] 第 1 轮测试中...
-e   带宽: 150 Mbits/sec
-e   重传: 0

-e ► [cubic] 第 2 轮测试中...
-e   带宽: 151 Mbits/sec
-e   重传: 0

-e ► [cubic] 第 3 轮测试中...
-e   带宽: 151 Mbits/sec
-e   重传: 0

-e ========================================
-e   测试算法: bbr
-e ========================================

-e ► [bbr] 第 1 轮测试中...
-e   带宽: 151 Mbits/sec
-e   重传: 0

-e ► [bbr] 第 2 轮测试中...
-e   带宽: 151 Mbits/sec
-e   重传: 0

-e ► [bbr] 第 3 轮测试中...
-e   带宽: 149 Mbits/sec
-e   重传: 0

-e ================================================
-e             测试完成!
-e ================================================

-e 正在生成报告...
===== CUBIC vs BBR 性能对比报告 =====
测试时间: Fri Oct 31 07:07:22 AM UTC 2025
服务器: 192.168.226.130
测试时长: 30秒/轮
测试轮数: 3轮

----- CUBIC 测试结果 -----
  第1轮: 150 Mbits/sec , 重传: 
  第2轮: 151 Mbits/sec , 重传: 
  第3轮: 151 Mbits/sec , 重传: 

----- BBR 测试结果 -----
  第1轮: 151 Mbits/sec , 重传: 
  第2轮: 151 Mbits/sec , 重传: 
  第3轮: 149 Mbits/sec , 重传: 

详细数据请查看: test_results_20251031_070346/

-e ✓ 所有测试结果已保存到: test_results_20251031_070346/

-e 查看详细数据:
  cat test_results_20251031_070346/summary.txt
  cat test_results_20251031_070346/raw_data.csv

5.6 结果分析

cubic和bbr都稳定在150左右的带宽,这是一个奇怪的数据,首先想到的就是带宽达到了一个上限,所以我们需要找到原因并调整上限

5.7 查找原因

检查虚拟机带宽上限(不是这个原因)

$ ethtool ens33 | grep -i speed
> Speed: 1000Mb/s

检查tcp缓冲区配置(原因就在这里)

echo "当前配置:"
echo "  rmem_max: $(sysctl -n net.core.rmem_max | numfmt --to=iec)"
echo "  wmem_max: $(sysctl -n net.core.wmem_max | numfmt --to=iec)"
echo ""
sysctl net.ipv4.tcp_rmem
sysctl net.ipv4.tcp_wmem
echo ""
echo "150ms延迟下达到1Gbps需要:"
echo "  BDP = 1 Gbps × 0.3s = 37.5 MB"
echo ""
if [ $(sysctl -n net.core.rmem_max) -lt 37500000 ]; then
    echo "⚠️  缓冲区不足!这就是被限制在150Mbps的原因"
else
    echo "✓ 缓冲区足够"
fi

问题分析

当前TCP缓冲区上限:
  rmem_max: 208 KB  (接收)
  wmem_max: 208 KB  (发送)
  tcp_rmem最大: 6 MB
  tcp_wmem最大: 4 MB

实际限制:
  rmem_max和wmem_max是硬上限!
  即使tcp_rmem设置了6MB,也会被208KB限制住
  
在150ms延迟下:
  需要: 37.5 MB
  实际: 6 MB (被208KB限制后可能更小)
  理论带宽 = 6 MB / 0.3s ≈ 20 MB/s = 160 Mbps
  
这就是150 Mbps瓶颈

5.8 优化两台虚拟机的tcp缓存区上限

# ============================================
# TCP缓冲区优化(临时生效)
# ============================================

echo "优化TCP缓冲区..."

# 1. 增大缓冲区硬上限到64MB
sudo sysctl -w net.core.rmem_max=67108864
sudo sysctl -w net.core.wmem_max=67108864

# 2. 增大TCP缓冲区到64MB
sudo sysctl -w net.ipv4.tcp_rmem="4096 131072 67108864"
sudo sysctl -w net.ipv4.tcp_wmem="4096 65536 67108864"

# 3. 确保窗口缩放启用
sudo sysctl -w net.ipv4.tcp_window_scaling=1

# 4. 验证配置
echo ""
echo "=== 优化后的配置 ==="
echo "接收缓冲最大值: $(sysctl -n net.core.rmem_max | numfmt --to=iec)"
echo "发送缓冲最大值: $(sysctl -n net.core.wmem_max | numfmt --to=iec)"
sysctl net.ipv4.tcp_rmem
sysctl net.ipv4.tcp_wmem
echo ""
echo "✓ 优化完成!现在缓冲区支持高延迟下的高速传输"

5.9 重启服务端iperf3

$ killall iperf3
$ iperf3 -s

5.9 客户端再次运行测试脚本

$ sh ./bbr_test.sh

5.10 结果输出

-e ================================================
-e        CUBIC vs BBR 性能对比测试
-e ================================================

服务器地址: 192.168.226.130
测试时长: 30秒
测试轮数: 3次
结果目录: test_results_20251031_091141

-e 检查服务器连通性...
-e ✓ 服务器连通正常

-e 检查BBR模块...
-e ✓ BBR模块已加载

-e 开始测试...

-e ========================================
-e   测试算法: cubic
-e ========================================

-e ► [cubic] 第 1 轮测试中...
-e   带宽: 563 Mbits/sec
-e   重传: 14632

-e ► [cubic] 第 2 轮测试中...
-e   带宽: 333 Mbits/sec
-e   重传: 1090

-e ► [cubic] 第 3 轮测试中...
-e   带宽: 374 Mbits/sec
-e   重传: 2544

-e ========================================
-e   测试算法: bbr
-e ========================================

-e ► [bbr] 第 1 轮测试中...
-e   带宽: 866 Mbits/sec
-e   重传: 0

-e ► [bbr] 第 2 轮测试中...
-e   带宽: 737 Mbits/sec
-e   重传: 0

-e ► [bbr] 第 3 轮测试中...
-e   带宽: 758 Mbits/sec
-e   重传: 0

-e ================================================
-e             测试完成!
-e ================================================

-e 正在生成报告...
===== CUBIC vs BBR 性能对比报告 =====
测试时间: Fri Oct 31 09:15:16 AM UTC 2025
服务器: 192.168.226.130
测试时长: 30秒/轮
测试轮数: 3轮

----- CUBIC 测试结果 -----
  第1轮: 563 Mbits/sec 14632, 重传: 
  第2轮: 333 Mbits/sec 1090, 重传: 
  第3轮: 374 Mbits/sec 2544, 重传: 

----- BBR 测试结果 -----
  第1轮: 866 Mbits/sec 0, 重传: 
  第2轮: 737 Mbits/sec 0, 重传: 
  第3轮: 758 Mbits/sec 0, 重传: 

详细数据请查看: test_results_20251031_091141/

-e ✓ 所有测试结果已保存到: test_results_20251031_091141/

-e 查看详细数据:
  cat test_results_20251031_091141/summary.txt
  cat test_results_20251031_091141/raw_data.csv

5.11 结果分析

现在结果就很明显了,高延迟下bbr完胜

在高延迟网络下,bbr不仅稳定无丢包,而且带宽也接近cubic的两倍

6. 第三轮测试(高丢包)

6.1 服务端配置:50ms延迟 + 20ms抖动 + 3%丢包

$ sudo tc qdisc del dev ens33 root # 先删除现有规则
$ sudo tc qdisc add dev ens33 root netem delay 50ms 20ms loss 3%

6.2 验证是否生效

$ sudo tc qdisc show dev ens33
> qdisc netem 8002: root refcnt 2 limit 1000 delay 50ms  20ms loss 3%

6.3 启动服务端监听

$ iperf3 -s

6.4 客户端运行测试脚本

$ sh ./bbr_test.sh

6.5 结果输出

-e ================================================
-e        CUBIC vs BBR 性能对比测试
-e ================================================

服务器地址: 192.168.226.130
测试时长: 30秒
测试轮数: 3次
结果目录: test_results_20251031_094524

-e 检查服务器连通性...
-e ✓ 服务器连通正常

-e 检查BBR模块...
-e ✓ BBR模块已加载

-e 开始测试...

-e ========================================
-e   测试算法: cubic
-e ========================================

-e ► [cubic] 第 1 轮测试中...
-e   带宽: 1.16 Gbits/sec
-e   重传: 5196

-e ► [cubic] 第 2 轮测试中...
-e   带宽: 1.23 Gbits/sec
-e   重传: 21015

-e ► [cubic] 第 3 轮测试中...
-e   带宽: 1.45 Gbits/sec
-e   重传: 4591

-e ========================================
-e   测试算法: bbr
-e ========================================

-e ► [bbr] 第 1 轮测试中...
-e   带宽: 342 Mbits/sec
-e   重传: 0

-e ► [bbr] 第 2 轮测试中...
-e   带宽: 240 Mbits/sec
-e   重传: 0

-e ► [bbr] 第 3 轮测试中...
-e   带宽: 354 Mbits/sec
-e   重传: 0

-e ================================================
-e             测试完成!
-e ================================================

-e 正在生成报告...
===== CUBIC vs BBR 性能对比报告 =====
测试时间: Fri Oct 31 09:48:53 AM UTC 2025
服务器: 192.168.226.130
测试时长: 30秒/轮
测试轮数: 3轮

----- CUBIC 测试结果 -----
  第1轮: 1.16 Gbits/sec 5196, 重传: 
  第2轮: 1.23 Gbits/sec 21015, 重传: 
  第3轮: 1.45 Gbits/sec 4591, 重传: 

----- BBR 测试结果 -----
  第1轮: 342 Mbits/sec 0, 重传: 
  第2轮: 240 Mbits/sec 0, 重传: 
  第3轮: 354 Mbits/sec 0, 重传: 

详细数据请查看: test_results_20251031_094524/

-e ✓ 所有测试结果已保存到: test_results_20251031_094524/

-e 查看详细数据:
  cat test_results_20251031_094524/summary.txt
  cat test_results_20251031_094524/raw_data.csv

6.7 结果分析

bbr虽然没有重传,但是带宽却比cubic低很多

是不是感觉又有点奇怪,再来找找原因

了解bbr原理便能分析出原因:20ms抖动对bbr影响大,去掉20ms抖动试试

6.8 服务器重新配置并启动:50ms延迟 + 3%丢包

$ sudo tc qdisc del dev ens33 root
$ sudo tc qdisc add dev ens33 root netem delay 50ms loss 3%
$ iperf3 -s

6.9 客户端运行测试脚本

$ sh ./bbr_test.sh

6.10 脚本输出

-e ================================================
-e        CUBIC vs BBR 性能对比测试
-e ================================================

服务器地址: 192.168.226.130
测试时长: 30秒
测试轮数: 3次
结果目录: test_results_20251031_100113

-e 检查服务器连通性...
-e ✓ 服务器连通正常

-e 检查BBR模块...
-e ✓ BBR模块已加载

-e 开始测试...

-e ========================================
-e   测试算法: cubic
-e ========================================

-e ► [cubic] 第 1 轮测试中...
-e   带宽: 1.04 Gbits/sec
-e   重传: 1877

-e ► [cubic] 第 2 轮测试中...
-e   带宽: 1.05 Gbits/sec
-e   重传: 2788

-e ► [cubic] 第 3 轮测试中...
-e   带宽: 1.71 Gbits/sec
-e   重传: 6424

-e ========================================
-e   测试算法: bbr
-e ========================================

-e ► [bbr] 第 1 轮测试中...
-e   带宽: 893 Mbits/sec
-e   重传: 1172

-e ► [bbr] 第 2 轮测试中...
-e   带宽: 948 Mbits/sec
-e   重传: 0

-e ► [bbr] 第 3 轮测试中...
-e   带宽: 867 Mbits/sec
-e   重传: 0

-e ================================================
-e             测试完成!
-e ================================================

-e 正在生成报告...
===== CUBIC vs BBR 性能对比报告 =====
测试时间: Fri Oct 31 10:04:42 AM UTC 2025
服务器: 192.168.226.130
测试时长: 30秒/轮
测试轮数: 3轮

----- CUBIC 测试结果 -----
  第1轮: 1.04 Gbits/sec 1877, 重传: 
  第2轮: 1.05 Gbits/sec 2788, 重传: 
  第3轮: 1.71 Gbits/sec 6424, 重传: 

----- BBR 测试结果 -----
  第1轮: 893 Mbits/sec 1172, 重传: 
  第2轮: 948 Mbits/sec 0, 重传: 
  第3轮: 867 Mbits/sec 0, 重传: 

详细数据请查看: test_results_20251031_100113/

-e ✓ 所有测试结果已保存到: test_results_20251031_100113/

-e 查看详细数据:
  cat test_results_20251031_100113/summary.txt
  cat test_results_20251031_100113/raw_data.csv

6.11 结果分析

去掉抖动后bbr带宽翻倍并启非常稳定,丢包也很少

但是cubic带宽略胜一筹,所以说cubic比较激进

记住一句话:延迟抖动是BBR的克星!

7. 第四轮测试(高延迟+高丢包+带宽限制)

7.1 服务端配置:100ms延迟 + 5%丢包 + 限制带宽到100Mbps

$ sudo tc qdisc del dev ens33 root
$ sudo tc qdisc add dev ens33 root netem delay 100ms loss 5% rate 100mbit

7.2 验证是否生效

$ sudo tc qdisc show dev ens33
> qdisc netem 8006: root refcnt 2 limit 1000 delay 100ms loss 5% rate 100Mbit

7.3 启动服务端监听

$ iperf3 -s

7.4 客户端运行测试脚本

$ sh ./bbr_test.sh

7.5 结果输出

-e ================================================
-e        CUBIC vs BBR 性能对比测试
-e ================================================

服务器地址: 192.168.226.130
测试时长: 30秒
测试轮数: 3次
结果目录: test_results_20251031_101021

-e 检查服务器连通性...
-e ✓ 服务器连通正常

-e 检查BBR模块...
-e ✓ BBR模块已加载

-e 开始测试...

-e ========================================
-e   测试算法: cubic
-e ========================================

-e ► [cubic] 第 1 轮测试中...
-e   带宽: 731 Mbits/sec
-e   重传: 27864

-e ► [cubic] 第 2 轮测试中...
-e   带宽: 518 Mbits/sec
-e   重传: 9024

-e ► [cubic] 第 3 轮测试中...
-e   带宽: 461 Mbits/sec
-e   重传: 693

-e ========================================
-e   测试算法: bbr
-e ========================================

-e ► [bbr] 第 1 轮测试中...
-e   带宽: 681 Mbits/sec
-e   重传: 1

-e ► [bbr] 第 2 轮测试中...
-e   带宽: 643 Mbits/sec
-e   重传: 0

-e ► [bbr] 第 3 轮测试中...
-e   带宽: 649 Mbits/sec
-e   重传: 0

-e ================================================
-e             测试完成!
-e ================================================

-e 正在生成报告...
===== CUBIC vs BBR 性能对比报告 =====
测试时间: Fri Oct 31 10:13:56 AM UTC 2025
服务器: 192.168.226.130
测试时长: 30秒/轮
测试轮数: 3轮

----- CUBIC 测试结果 -----
  第1轮: 731 Mbits/sec 27864, 重传: 
  第2轮: 518 Mbits/sec 9024, 重传: 
  第3轮: 461 Mbits/sec 693, 重传: 

----- BBR 测试结果 -----
  第1轮: 681 Mbits/sec 1, 重传: 
  第2轮: 643 Mbits/sec 0, 重传: 
  第3轮: 649 Mbits/sec 0, 重传: 

详细数据请查看: test_results_20251031_101021/

-e ✓ 所有测试结果已保存到: test_results_20251031_101021/

-e 查看详细数据:
  cat test_results_20251031_101021/summary.txt
  cat test_results_20251031_101021/raw_data.csv

7.6 分析结果

完美体现了bbr的优势,稳定性十分惊人,丢包基本对bbr没有影响

8. 第五轮测试(丢包率渐增的对比)(这里就不详细写,相信大家已经熟悉测试流程了)

8.1 服务端配置:丢包3% 5% 7% 10% 15%…

$ sudo tc qdisc del dev ens33 root
$ sudo tc qdisc add dev ens33 root netem loss 3% # 5% 7% 10% 15%...

8.2 启动服务端监听

$ iperf3 -s

8.3 客户端运行测试脚本

$ sh ./bbr_test.sh

8.4 结果输出

%3:
----- CUBIC 测试结果 -----
  第1轮: 7.48 Gbits/sec 589, 重传: 
  第2轮: 7.48 Gbits/sec 388, 重传: 
  第3轮: 7.40 Gbits/sec 354, 重传: 

----- BBR 测试结果 -----
  第1轮: 3.40 Gbits/sec 0, 重传: 
  第2轮: 3.62 Gbits/sec 1, 重传: 
  第3轮: 3.04 Gbits/sec 0, 重传: 

%5:
----- CUBIC 测试结果 -----
  第1轮: 7.58 Gbits/sec 403, 重传: 
  第2轮: 7.52 Gbits/sec 391, 重传: 
  第3轮: 7.56 Gbits/sec 432, 重传: 

----- BBR 测试结果 -----
  第1轮: 3.38 Gbits/sec 0, 重传: 
  第2轮: 3.47 Gbits/sec 0, 重传: 
  第3轮: 3.47 Gbits/sec 1, 重传: 

%7:
----- CUBIC 测试结果 -----
  第1轮: 7.24 Gbits/sec 506, 重传: 
  第2轮: 7.78 Gbits/sec 350, 重传: 
  第3轮: 7.55 Gbits/sec 501, 重传: 

----- BBR 测试结果 -----
  第1轮: 3.02 Gbits/sec 0, 重传: 
  第2轮: 3.08 Gbits/sec 1, 重传: 
  第3轮: 3.12 Gbits/sec 1, 重传:

%10:
----- CUBIC 测试结果 -----
  第1轮: 7.47 Gbits/sec 441, 重传: 
  第2轮: 7.78 Gbits/sec 523, 重传: 
  第3轮: 7.42 Gbits/sec 446, 重传: 

----- BBR 测试结果 -----
  第1轮: 2.90 Gbits/sec 1, 重传: 
  第2轮: 2.62 Gbits/sec 2, 重传: 
  第3轮: 2.60 Gbits/sec 3, 重传: 

%15:
----- CUBIC 测试结果 -----
  第1轮: 7.46 Gbits/sec 361, 重传: 
  第2轮: 7.50 Gbits/sec 420, 重传: 
  第3轮: 7.86 Gbits/sec 414, 重传: 

----- BBR 测试结果 -----
  第1轮: 2.65 Gbits/sec 3, 重传: 
  第2轮: 2.54 Gbits/sec 5, 重传: 
  第3轮: 2.64 Gbits/sec 0, 重传:

8.5 分析结果

低延迟环境下,丢包率不是关键因素

CUBIC保持2倍以上优势,且随丢包率增加优势扩大

9. 第六轮测试(延迟渐增的对比)

9.1 服务端配置:延迟50ms 100ms 150ms 200ms 300ms…

$ sudo tc qdisc del dev ens33 root
$ sudo tc qdisc add dev ens33 root netem delay 50ms

9.2 启动服务端监听

$ iperf3 -s

9.3 客户端运行测试脚本

$ sh ./bbr_test.sh

9.4 结果输出

50ms 
----- CUBIC 测试结果 -----
  第1轮: 1.10 Gbits/sec 50, 重传: 
  第2轮: 823 Mbits/sec 3178, 重传: 
  第3轮: 893 Mbits/sec 1466, 重传: 

----- BBR 测试结果 -----
  第1轮: 589 Mbits/sec 0, 重传: 
  第2轮: 805 Mbits/sec 0, 重传: 
  第3轮: 676 Mbits/sec 0, 重传:

100ms 
----- CUBIC 测试结果 -----
  第1轮: 785 Mbits/sec 3490, 重传: 
  第2轮: 799 Mbits/sec 2170, 重传: 
  第3轮: 490 Mbits/sec 1238, 重传: 

----- BBR 测试结果 -----
  第1轮: 684 Mbits/sec 0, 重传: 
  第2轮: 817 Mbits/sec 0, 重传: 
  第3轮: 738 Mbits/sec 0, 重传:

150ms 
----- CUBIC 测试结果 -----
  第1轮: 469 Mbits/sec 2650, 重传: 
  第2轮: 690 Mbits/sec 8, 重传: 
  第3轮: 417 Mbits/sec 758, 重传: 

----- BBR 测试结果 -----
  第1轮: 575 Mbits/sec 0, 重传: 
  第2轮: 586 Mbits/sec 0, 重传: 
  第3轮: 528 Mbits/sec 0, 重传:

200ms 
----- CUBIC 测试结果 -----
  第1轮: 274 Mbits/sec 3070, 重传: 
  第2轮: 358 Mbits/sec 1752, 重传: 
  第3轮: 396 Mbits/sec 16993, 重传: 

----- BBR 测试结果 -----
  第1轮: 872 Mbits/sec 0, 重传: 
  第2轮: 863 Mbits/sec 0, 重传: 
  第3轮: 849 Mbits/sec 0, 重传:

300ms
----- CUBIC 测试结果 -----
  第1轮: 336 Mbits/sec 7019, 重传: 
  第2轮: 362 Mbits/sec 729, 重传: 
  第3轮: 166 Mbits/sec 5207, 重传: 

----- BBR 测试结果 -----
  第1轮: 608 Mbits/sec 0, 重传: 
  第2轮: 656 Mbits/sec 0, 重传: 
  第3轮: 597 Mbits/sec 0, 重传:

9.5 分析结果

延迟是决定性因素

- ≤80ms: CUBIC胜

- >80ms: BBR完胜

- ≥200ms: BBR优势达到2.5倍,CUBIC接近崩溃

10. 第七轮测试(互联网延迟下丢包率渐增的对比)

10.1 服务端配置:丢包3% 7% 15%… 延迟 50ms

$ sudo tc qdisc del dev ens33 root
$ sudo tc qdisc add dev ens33 root netem loss 3% delay 50ms

10.2 启动服务端监听

$ iperf3 -s

10.3 客户端运行测试脚本

$ sh ./bbr_test.sh

10.4 结果输出

%3
----- CUBIC 测试结果 -----
  第1轮: 1.28 Gbits/sec 2131, 重传: 
  第2轮: 1.03 Gbits/sec 1148, 重传: 
  第3轮: 990 Mbits/sec 2791, 重传: 

----- BBR 测试结果 -----
  第1轮: 826 Mbits/sec 0, 重传: 
  第2轮: 917 Mbits/sec 0, 重传: 
  第3轮: 830 Mbits/sec 0, 重传:

%7
----- CUBIC 测试结果 -----
  第1轮: 883 Mbits/sec 5279, 重传: 
  第2轮: 1.23 Gbits/sec 1297, 重传: 
  第3轮: 1.12 Gbits/sec 1780, 重传: 

----- BBR 测试结果 -----
  第1轮: 848 Mbits/sec 0, 重传: 
  第2轮: 817 Mbits/sec 0, 重传: 
  第3轮: 859 Mbits/sec 2082, 重传: 

%15
----- CUBIC 测试结果 -----
  第1轮: 821 Mbits/sec 1674, 重传: 
  第2轮: 734 Mbits/sec 2454, 重传: 
  第3轮: 708 Mbits/sec 1567, 重传: 

----- BBR 测试结果 -----
  第1轮: 781 Mbits/sec 0, 重传: 
  第2轮: 827 Mbits/sec 0, 重传: 
  第3轮: 818 Mbits/sec 1, 重传:

10.5 分析结果

50ms延迟环境下,15%是CUBIC的崩溃点

- ≤7%丢包: CUBIC快28%,但不稳定

- 15%丢包: BBR逆转,快7%且极稳定

- 实际应用: BBR体验更好(稳定+低重传)

六. 总结

  1. cubic
优势:
✓ 低延迟环境性能优异(可达8 Gbps+)
✓ 激进策略,充分利用带宽
✓ 实现简单,计算开销小
✓ 在理想网络中是王者

劣势:
✗ 高延迟环境性能急剧下降(可低至<300 Mbps)
✗ 依赖丢包信号,反应滞后
✗ 稳定性差,波动大(±15-35%)
✗ 高延迟+高丢包时接近崩溃

适用场景:
- 数据中心内部通信(<5ms)
- 局域网文件传输
- 同城CDN节点
  1. bbr
优势:
✓ 高延迟环境性能卓越(200ms下仍可达800+ Mbps)
✓ 极致稳定性(波动±1-5%)
✓ 重传极少(通常为0)
✓ 主动测量,不依赖丢包
✓ 在复杂网络中是王者

劣势:
✗ 低延迟环境自我限制(约3-4 Gbps)
✗ 对RTT抖动敏感(±20ms会导致性能腰斩)
✗ 实现复杂度高
✗ 在局域网中"浪费"性能

适用场景:
- 跨国网络通信(>100ms)
- 移动/卫星网络
- 视频会议/直播
- 需要稳定性的应用

ps

本文主要记录自己对bbr的探索和测试,对于cubic和bbr的原理讲解非常皮毛,希望大家自己找文章详细了解