TCP 拥塞控制算法详解与对比
TCP 拥塞控制算法决定了数据在网络中的传输速率与效率。对于搬瓦工 VPS 用户来说,选择合适的拥塞控制算法可以大幅提升网络传输性能,尤其是在中美跨境网络这种高延迟、高丢包率的环境下。本文将详细解析主流拥塞控制算法的原理,并指导你在搬瓦工 VPS 上完成配置。
一、拥塞控制基础概念
TCP 拥塞控制的核心目标是在最大化网络利用率的同时避免网络拥塞崩溃。每个 TCP 连接维护一个拥塞窗口(cwnd),控制同一时间可以发送的数据量。
拥塞控制的四个基本阶段:
- 慢启动(Slow Start):连接建立后,cwnd 从小值开始指数增长,快速探测可用带宽。
- 拥塞避免(Congestion Avoidance):cwnd 达到阈值后转为线性增长,减缓增速。
- 快速重传(Fast Retransmit):收到三个重复 ACK 时立即重传丢失的数据包。
- 快速恢复(Fast Recovery):快速重传后不回到慢启动,而是将 cwnd 减半继续传输。
查看当前可用和已启用的算法
# 查看当前使用的拥塞控制算法
sysctl net.ipv4.tcp_congestion_control
# 查看系统支持的所有拥塞控制算法
sysctl net.ipv4.tcp_available_congestion_control
# 查看已加载的拥塞控制模块
sysctl net.ipv4.tcp_allowed_congestion_control
二、主流拥塞控制算法详解
2.1 Reno
Reno 是最经典的 TCP 拥塞控制算法,也是许多后续算法的基础。它基于丢包检测来判断网络拥塞:收到三个重复 ACK 时将 cwnd 减半。Reno 的主要问题是在高带宽延迟积(BDP)网络中收敛速度过慢,且对随机丢包敏感。
2.2 CUBIC
CUBIC 是 Linux 默认的拥塞控制算法(内核 2.6.19 以后)。它使用三次函数来调整拥塞窗口大小,相比 Reno 的线性增长,CUBIC 在高 BDP 网络中能更快地恢复到最优窗口大小。
CUBIC 的特点:
- 窗口增长与 RTT 无关,对高延迟网络更友好。
- 在丢包事件后使用三次曲线快速恢复窗口。
- 仍然是基于丢包的算法,对随机丢包依然敏感。
2.3 BBR(Bottleneck Bandwidth and RTT)
BBR 是 Google 开发的基于测量的拥塞控制算法,从 Linux 4.9 开始加入内核。与传统基于丢包的算法不同,BBR 通过持续测量网络的瓶颈带宽和最小 RTT 来确定最优发送速率。
BBR 的核心优势:
- 不依赖丢包信号,在有随机丢包的网络中表现优异。
- 能够充分利用链路带宽,在跨境网络中效果显著。
- 减少缓冲区膨胀(Bufferbloat),降低延迟。
- BBRv3 进一步改进了与其他流的公平性。
2.4 Vegas
Vegas 是基于延迟变化的拥塞控制算法。它通过比较实际吞吐量和预期吞吐量来判断拥塞程度。Vegas 可以在拥塞发生之前主动降低发送速率,但在与基于丢包的算法(如 CUBIC)竞争时处于劣势。
2.5 Hybla
Hybla 专为高延迟的卫星链路设计,通过消除 RTT 对窗口增长速度的负面影响来提升性能。对于 RTT 较高的跨太平洋连接也有一定效果。
三、算法对比
不同算法在关键维度上的对比:
- 低延迟网络:CUBIC 和 BBR 表现接近,Reno 稍差。
- 高延迟网络:BBR 远优于 CUBIC,CUBIC 优于 Reno。
- 有丢包的网络:BBR 明显领先,因为它不将丢包视为拥塞信号。
- 公平性:CUBIC 公平性最好,BBRv1 存在抢占问题,BBRv3 有所改善。
- 延迟敏感场景:BBR 的延迟最低,Vegas 次之。
四、在搬瓦工 VPS 上启用 BBR
4.1 检查内核版本
uname -r
BBR 需要 Linux 4.9 以上内核。搬瓦工的 Ubuntu 20.04/22.04 和 Debian 11/12 默认内核均满足要求。
4.2 启用 BBR
# 加载 BBR 模块
modprobe tcp_bbr
# 验证模块已加载
lsmod | grep bbr
# 设置 BBR 为默认拥塞控制算法
cat > /etc/sysctl.d/99-bbr.conf <<EOF
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
EOF
# 立即生效
sysctl -p /etc/sysctl.d/99-bbr.conf
4.3 验证 BBR 是否生效
# 确认当前使用的算法
sysctl net.ipv4.tcp_congestion_control
# 确认队列调度算法
sysctl net.core.default_qdisc
# 查看 BBR 运行状态
ss -tin | grep bbr
五、BBR 与 fq 队列调度器
BBR 需要配合 fq(Fair Queuing)队列调度器使用才能发挥最佳效果。fq 为每个 TCP 流维护独立的队列,并根据 BBR 计算出的发送速率进行精确的包调度。
# 查看当前队列调度器
tc qdisc show dev eth0
# 手动设置 fq 调度器
tc qdisc replace dev eth0 root fq
# 设置 fq 的初始发送速率(可选)
tc qdisc replace dev eth0 root fq pacing maxrate 1gbit
六、测试与对比不同算法
可以通过 iperf3 测试不同算法的实际传输性能:
# 安装 iperf3
apt install iperf3 -y
# 服务端(在搬瓦工 VPS 上运行)
iperf3 -s
# 客户端测试(从本地连接到 VPS)
# 使用默认算法
iperf3 -c YOUR_VPS_IP -t 30
# 临时切换到 BBR 后再测试
sysctl -w net.ipv4.tcp_congestion_control=bbr
iperf3 -c YOUR_VPS_IP -t 30
# 临时切换到 CUBIC 后测试
sysctl -w net.ipv4.tcp_congestion_control=cubic
iperf3 -c YOUR_VPS_IP -t 30
七、BBRv3 编译安装
如果需要使用最新的 BBRv3,需要编译安装较新版本的内核:
# 安装编译依赖
apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev -y
# 下载内核源码(以 6.6 为例)
cd /usr/src
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.tar.xz
tar xf linux-6.6.tar.xz
cd linux-6.6
# 复制当前内核配置
cp /boot/config-$(uname -r) .config
make olddefconfig
# 确认 BBR 已启用
scripts/config --enable CONFIG_TCP_CONG_BBR
scripts/config --set-str CONFIG_DEFAULT_TCP_CONG bbr
# 编译安装(耗时较长)
make -j$(nproc)
make modules_install
make install
# 更新引导并重启
update-grub
reboot
注意:编译内核需要较大的磁盘空间和时间,建议在不低于 2GB 内存的搬瓦工方案上操作。
总结
对于搬瓦工 VPS 用户,BBR 是目前最推荐的拥塞控制算法,尤其是在中美跨境网络场景下。它不依赖丢包信号判断拥塞,能够更好地利用可用带宽。配合 内核调优 中的其他网络参数,可以获得最佳的网络传输体验。选购搬瓦工 VPS 请查看 全部方案,购买时使用优惠码 NODESEEK2026 可享受 6.77% 的折扣,通过 bwh81.net 访问官网。