拥塞控制在管什么
拥塞控制决定发送方在不确定网络容量时以多快发数据:靠 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 show | BBR 建议配合 fq 或 fq_codel |
| 丢包是否下降 | nstat -az 的重传计数对比 | 切换前后可比 |
BBR 不把丢包当作拥塞信号,因此在与其他算法混跑的链路上会抢占更多带宽;在共享出口上启用前应评估对其他业务的影响。
切换算法影响整机新建连接,生产环境建议先在测试机验证,并通过 sysctl 配置文件持久化,避免重启后语义漂移。