首页/网络/协议速查/拥塞控制算法对比与切换
TCP 与 UDP54 条

拥塞控制算法对比与切换

Linux 可选多种算法:CUBIC 默认适合大带宽网络,Reno 经典,BBR 基于带宽时延建模适合高丢包链路,切换用 sysctl 一行命令。

协议速查网络更新于 2026-10-13

拥塞控制在管什么

拥塞控制决定发送方在不确定网络容量时以多快发数据:靠 ACK 确认速率试探可用带宽,靠丢包或时延信号判断是否过载。算法选择直接影响跨境链路、高丢包链路的吞吐表现,Linux 上可通过 sysctl 按整机切换。

基本信息

适用平台Linux 内核 4.9 以上(BBR 需 tcp_bbr 模块)
查看命令sysctl net.ipv4.tcp_congestion_control
切换范围影响切换后新建的连接,已有连接保持原算法
持久化写入 /etc/sysctl.d/ 下的配置文件

算法对比

算法核心机制适用场景
CUBIC三次函数增长窗口,丢包即减通用互联网服务,Linux 默认
Reno经典 AIMD,加减线性教学与兼容对照
BBR建模瓶颈带宽与最小 RTT,不靠丢包降速跨境、高丢包、长肥管道
DCTCP依赖 ECN 标记逐跳反馈数据中心内网,需交换机配合
Vegas用 RTT 变化提前减速低延迟局域网,公网适配差

查看与切换

查看与切换
sysctl net.ipv4.tcp_available_congestion_control    # 内核支持哪些
sysctl net.ipv4.tcp_congestion_control              # 当前使用哪个
modprobe tcp_bbr                                    # 载入 BBR 模块
sysctl -w net.ipv4.tcp_congestion_control=bbr       # 临时切换
ss -ti | grep -i -E 'bbr|cubic'                     # 在已建立连接上确认
printf 'net.ipv4.tcp_congestion_control = bbr\n' > /etc/sysctl.d/99-bbr.conf

典型使用场景

  • 跨境专线或海外节点吞吐上不去,评估从 CUBIC 切到 BBR
  • 大文件下载服务在轻微丢包下吞吐骤降,需要不依赖丢包的算法
  • 数据中心内网希望用 ECN 做低延迟拥塞反馈
  • 压测对比不同算法在同一链路上的吞吐与延迟曲线
  • 排查「同一机房两台机器速度差异明显」时确认内核版本与算法是否一致

切换后需确认的点

检查项怎么看期望结果
是否生效ss -ti 输出的 algo 字段显示目标算法名
模块是否可加载lsmod | grep tcp_bbr有对应模块条目
队列规则tc qdisc showBBR 建议配合 fq 或 fq_codel
丢包是否下降nstat -az 的重传计数对比切换前后可比
BBR 不把丢包当作拥塞信号,因此在与其他算法混跑的链路上会抢占更多带宽;在共享出口上启用前应评估对其他业务的影响。
切换算法影响整机新建连接,生产环境建议先在测试机验证,并通过 sysctl 配置文件持久化,避免重启后语义漂移。

易错点

  • 只切算法不换队列规则,发送队列仍是 pfifo_fast,BBR 的 pacing 效果大打折扣
  • 在共享出口网关上单方面启用 BBR,抢占式发送会挤压同链路其他业务,引发新的投诉
  • BBR 版本偏旧时在高丢包下的公平性较差,升级内核前不要照搬老参数
  • 把 sysctl -w 当成永久配置,机器重启后恢复 CUBIC,问题「时好时坏」难以复现
  • 不同内核版本的可用算法集合不同,脚本里硬编码 BBR 会在老内核上直接失败

数据来源与参考

  • RFC 9438(CUBIC)
  • RFC 5681
  • BBR 论文(ACM Queue 2016)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌