搜索 K
Appearance
本文归属于「AirPick · 慢速排障」系列,配套阅读:跨境链路丢包与 RTT 抖动排查手册、IEPL 与 IPLC 到底差在哪。
如果你遇到的是「测速几十上百兆,但 Steam 下游戏、GitHub clone、单线程 curl 下载卡在 3~10 MB/s」这种情况,大概率不是机场超售,而是你的系统协议栈在跨境高 RTT 链路上被自我限速了。
结论按优先级排序:
tcp_rmem/tcp_wmem,在 150ms RTT、1% 丢包的典型中日/中美线路上,单线程吞吐通常能从 8~15 Mbps 提升到 80~200 Mbps。 这是本文最核心的收益点。BDP = 带宽 × RTT 算,再留 2~3 倍余量。TCP 单条连接能跑多快,由**带宽时延积(BDP, Bandwidth-Delay Product)**决定:
理论单连接吞吐 = 接收窗口 / RTT拿一条典型的中美跨境线路举例:RTT 180ms,你想跑满 100 Mbps,需要多少在途数据?
BDP = 100 Mbps × 0.18 s = 18 Mbit = 2.25 MB也就是说,接收窗口至少要 2.25 MB 才可能跑满。而 Linux 默认 net.ipv4.tcp_rmem 的 max 值在很多发行版上是 6 MB(较新内核)甚至 4 MB(老内核、容器环境、OpenWrt 常常更小),一旦自动调优没跟上,窗口就锁死在几百 KB,单线程直接腰斩。
多线程为什么快? 因为 N 条连接各自持有一份窗口,等效把总窗口乘了 N。这也解释了为什么很多人「测速很猛、下载很慢」——测速工具默认多线程。
CUBIC 是丢包驱动的拥塞控制算法。它的逻辑是:只要丢包,就说明网络拥塞,窗口乘 0.7 后退。
问题在于,跨境链路丢包的成因非常复杂:国际出口拥塞、运营商互联瓶颈、中间设备 policy、GFW 的主动干扰、甚至某些 QoS 策略。这些丢包并不代表链路带宽被打满了,但 CUBIC 无法区分,一律按拥塞处理。一条 1% 丢包的线路,CUBIC 的稳态窗口会被压到理论值的 1/3 甚至更低。
BBR(Bottleneck Bandwidth and Round-trip propagation time)由 Google 在 2016 年提出,是模型驱动的:
inflight 是否超过 BtlBw × RTprop 来判断是否该收敛;这正是跨境场景最需要的:丢包不再等价于降速。
版本差异很关键:
bbr2_loss_thresh)和 ECN 支持,收敛更稳;如果你用的是 Debian 12 / Ubuntu 22.04 以上内核(5.15+),默认就是 v1 或 v2;想上 v3 需要 6.x 内核或自行编译模块。对绝大多数用户,v1 相比 CUBIC 已经是质变,v3 是锦上添花。
这里必须点破一个常见误区:本地栈调优和机场节点质量是相乘而非相加。
所以正确顺序永远是:先选链路,再调栈。链路选型可参考场景化选型指南。
下表是 2026 年主流环境下的量化对照,数据来自 AirPick 实验室在 150ms RTT / 0.8% 丢包模拟链路上的实测(单位 Mbps,单线程 iperf3)。
| 维度 | 默认 Linux(CUBIC) | CUBIC + 窗口调优 | BBR v1 + 窗口调优 | BBR v3 + 窗口调优 | Windows 11 默认 | Windows + 注册表调优 |
|---|---|---|---|---|---|---|
| 单线程吞吐(150ms / 0.8% 丢包) | 8~14 | 22~35 | 95~140 | 110~165 | 10~18 | 26~42 |
| 单线程吞吐(150ms / 0% 丢包) | 45~70 | 120~180 | 180~260 | 200~290 | 60~90 | 130~190 |
| 首字节时间 TTBF 变化 | 基线 | 持平 | 基本持平 | 基本持平 | 基线 | 持平 |
| 抖动(p95 RTT 抬升) | 低 | 中 | 中低 | 低 | 低 | 中 |
| 多连接公平性 | 好 | 好 | 一般(v1) | 好 | 好 | 好 |
| 高丢包抗性(3%) | 极差 | 差 | 好 | 好 | 极差 | 差 |
| 配置复杂度 | — | 低 | 中 | 中高 | — | 中 |
| 需重启服务 | 否 | 否 | 否 | 视内核 | 否 | 需重启 |
| 适用场景 | 局域网 | 家宽内网 | 跨境/长途 | 跨境骨干 | 日常 | 游戏+下载 |
| 推荐指数 | ★★ | ★★★ | ★★★★ | ★★★★★ | ★★ | ★★★ |
注:表中「窗口调优」指 tcp_rmem 上限提升至 64 MB 并启用 tcp_moderate_rcvbuf。
sysctl net.ipv4.tcp_congestion_control
sysctl net.ipv4.tcp_available_congestion_control
uname -r
lsmod | grep bbr如果 tcp_available_congestion_control 里没有 bbr,说明内核模块未加载或内核过老(4.9 以下无 BBR)。
创建 /etc/sysctl.d/99-airpick-bbr.conf:
# 拥塞控制
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
# 接收窗口:最小 4KB / 默认 128KB / 最大 64MB
net.ipv4.tcp_rmem = 4096 131072 67108864
# 发送窗口
net.ipv4.tcp_wmem = 4096 131072 67108864
# 启用窗口自动调优(关键,别关)
net.ipv4.tcp_moderate_rcvbuf = 1
# 全局 socket 缓冲区上限,必须 ≥ tcp_rmem 最大值
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
net.core.rmem_default = 262144
net.core.wmem_default = 262144
# 队列长度,fq 需要
net.core.default_qdisc = fq
net.core.netdev_max_backlog = 16384
# 时间戳与窗口缩放(高 RTT 场景必需)
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_slow_start_after_idle = 0
# 连接复用,降低握手开销
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_mtu_probing = 1应用:
sudo sysctl -p /etc/sysctl.d/99-airpick-bbr.conf坑一:net.core.rmem_max 小于 tcp_rmem 最大值。 这时候 tcp_rmem 的 max 会被内核静默截断,配置看起来生效了,实际没生效。务必两个值对齐。
坑二:qdisc 没切成 fq。 BBR 强依赖 pacing,fq 是标准搭配。如果用了 pfifo_fast 或某些 OpenWrt 上的 cake,BBR 的 pacing 会被削弱。检查方式:
tc qdisc show dev eth0坑三:容器/云主机内核被宿主限制。 很多 VPS 的 sysctl 写在宿主机 namespace 里,容器内改不动。用 sysctl -w 手动试,若报 permission denied 就说明被锁,只能换机器。
调优后不要只看测速软件,用这两个命令做单线程真实验证:
# 单线程下载,观察稳定吞吐
curl -o /dev/null --limit-rate 0 -w "speed_download: %{speed_download} B/s\n" https://your-node/1GB.bin
# 对比拥塞控制算法切换前后的差异
sysctl -w net.ipv4.tcp_congestion_control=cubic && curl ...
sysctl -w net.ipv4.tcp_congestion_control=bbr && curl ...如果两者差距不到 20%,说明链路上限已经到顶,瓶颈在节点侧而非本地栈。
Windows 的 TCP 栈是闭源的,没有 BBR。Windows 10/11 使用 CTCP + 自研的自动调优,实测在跨境高 RTT 场景下不如 Linux BBR。
可优化的部分:
# 查看当前全局参数
netsh int tcp show global
# 启用接收端缩放与 RSS
netsh int tcp set global rss=enabled
netsh int tcp set global autotuninglevel=normal
netsh int tcp set global ecncapability=enabled
netsh int tcp set global timestamps=disabled
# 网卡层:关闭节能以太网、中断节流
Get-NetAdapterAdvancedProperty -Name "以太网"
# 手工在设备管理器关闭 Energy Efficient Ethernet / Interrupt Moderationautotuninglevel 建议保持 normal,设成 experimental 在部分国产网卡驱动上会导致吞吐暴跌。
真正想让 Windows 吃到 BBR 红利,正确姿势是:
这样 Windows 本机只需要保证网卡和 RSS 正常,性能瓶颈交给软路由解决。具体组网方式见软路由旁路由组网教程。
macOS 从 Ventura 起也内置了类似 BBR 的机制(部分版本可见 net.inet.tcp.use_newreno),但没有可切换的 BBR。可调项集中在:
sudo sysctl -w net.inet.tcp.sendspace=262144
sudo sysctl -w net.inet.tcp.recvspace=262144
sudo sysctl -w net.inet.tcp.autosndbufinc=1收益有限,建议同 Windows 走软路由方案。
调优无效时,别猜,用命令定位。以下命令按「从外到内」顺序执行。
mtr -rwzc 200 -T -P 443 your-node.example.com判定表:
| 现象 | 结论 | 处置 |
|---|---|---|
| 中间跳丢包但末跳为 0 | 中间设备限速 ICMP,正常现象 | 忽略 |
| 末跳丢包 1%~3% 且持续 | 链路上游拥塞 | 换节点或走 IEPL |
| 末跳丢包在晚高峰飙升 | 国际出口高峰拥塞 | 换高防/专线节点 |
| 全程 0 丢包但速度仍慢 | 本地窗口或节点限速 | 继续下面步骤 |
tcping -p 443 -c 20 your-node.example.com关注 p95 与 p99,如果 p95 超过均值 2 倍,说明链路抖动大,BBR 的 pacing 优势会打折。
curl -o /dev/null -s -w "\
dns: %{time_namelookup}\n\
tcp: %{time_connect}\n\
tls: %{time_appconnect}\n\
ttfb: %{time_starttransfer}\n\
total: %{time_total}\n\
size: %{size_download}\n\
speed: %{speed_download}\n" \
https://your-node/100MB.bin判定逻辑:
tls - tcp 大:证书链验证慢或 TLS Reality 握手被拖慢,与 TCP 调优无关;ttfb - tls 大:服务端响应慢,节点侧问题;total - ttfb 阶段速率低:这才是 TCP 窗口/拥塞控制的问题,继续调优。ss -tinm state established '( dport = :443 )'关注字段:
skmem 的 rb / tb:实际分配的收发缓冲,若远小于 tcp_rmem 上限,说明自动调优被卡;cwnd:拥塞窗口,除以 RTT 就是当前实时速率;rtt / retrans:重传比例,超过 1% 就是链路质量问题。速度慢
├─ mtr 末跳丢包 > 1% → 链路问题,换节点
├─ mtr 无丢包
│ ├─ curl 各阶段 tls/ttfb 占比大 → 应用层问题
│ └─ curl 传输阶段速率低
│ ├─ ss 显示 cwnd 长期低位 → 拥塞控制算法问题 → 上 BBR
│ └─ ss 显示 skmem rb 远小于上限 → 窗口问题 → 调 rmem
└─ 全部正常但依旧慢 → 节��端限速,换服务商| 宣传话术 | 真实情况 | 验证方法 | 风险等级 |
|---|---|---|---|
| 「单线程 500Mbps 不限速」 | 未标注带宽基线与 RTT 条件 | 要求提供 iperf3 单线程截图与测试时间 | 中 |
| 「全节点 BBR 加速」 | BBR 只是内核参数,不代表链路质量 | 问清是否 IEPL/IPLC,mtr 实测丢包 | 中 |
| 「调优脚本一键提速 10 倍」 | 部分脚本塞入挖矿或后门 | 脚本全量审计,拒绝 curl | bash | 高 |
| 「Windows 也能开 BBR」 | Windows 内核无 BBR 实现 | 查 netsh int tcp show global 无该选项 | 高 |
| 「无限流量不限速」 | 通常有 Fair Use 阈值 | 查看 TOS 中的 FUP 条款 | 中 |
| 「解锁 Netflix 全区」 | 可能仅解锁自制剧 | 用 流媒体检测脚本 实测 | 中 |
| 「终身套餐」 | 跑路高危模型 | 参考防跑路预警清单 | 极高 |
核心原则:任何声称「改几个参数就能翻 10 倍」的方案,都要先问清楚基线条件。 真实提升一定伴随 RTT、丢包率、并发数这些前提。
Q1:开了 BBR,测速没变化? 大概率是节点侧没开,或链路本身丢包为 0(此时 CUBIC 已经能跑满)。用 mtr 确认丢包,用 ss 确认 cwnd 是否受限。参考测速正常但下载慢的排查流程。
Q2:窗口调到 64MB 后游戏延迟变高了? 典型的 bufferbloat。窗口过大导致本机排队加剧。建议游戏设备单独走一条低窗口策略,或使用 cake qdisc 做流控。参考游戏加速场景选型。
Q3:OpenWrt 上开 BBR 提示不支持? OpenWrt 官方镜像默认不编译 BBR 模块。需要换用自编译固件或 iStoreOS 内核包。kmod-tcp-bbr 是关键包名。
Q4:VPS 上 sysctl 改了但重启失效? 配置没写进 /etc/sysctl.d/,或者被 cloud-init、systemd-networkd 覆盖。用 systemd-sysctl --cat-config 查看最终生效顺序。
Q5:BBR 和 TCP Fast Open 冲突吗? 不冲突,但 TFO 在部分运营商的中间设备上会被丢包。如果开启后反而变慢,先关 TFO 验证。
Q6:IPv6 下需要单独调优吗? 需要。net.ipv6.tcp_rmem 是独立参数,IPv6 头部更大,MTU 更小,tcp_mtu_probing 更关键。
Q7:本地全调好了,还是只有 10MB/s? 那基本可以断定是节点端限速或超售。参考识别超售与虚假带宽承诺进行验证,必要时更换服务商。
| 主题 | 站内路径 |
|---|---|
| 跨境链路技术原理与 IEPL/IPLC 对比 | /tech/iepl-iplc-difference/ |
| 慢速问题总排障入口 | /help/faq/slow/ |
| 丢包与 RTT 抖动深入排查 | /help/faq/packet-loss/ |
| 光速云 2026 深度评测与实验室数据 | /reviews/guangsucloud/ |
| Windows 客户端完整配置教程 | /tutorial/windows-clash-setup/ |
| 软路由旁路由组网实战 | /tutorial/bypass-router-setup/ |
| 4K 流媒体场景选型 | /scenario/streaming-4k/ |
| 游戏加速场景选型 | /scenario/game-acceleration/ |
| 服务商跑路风险预警清单 | /help/faq/vendor-risk-warning/ |
| 超售识别与带宽验证方法 | /help/faq/oversell-detection/ |
| Netflix 解锁真伪检测 | /help/faq/netflix-unlock-check/ |
| 全套服务商评测与推荐榜 | /reviews/ |
写在最后:TCP 调优是「把本地那一段的水管拧到最大」,但水管另一头的水源在节点手里。花 20 分钟调好 BBR 和窗口,能解决大部分单线程慢的问题;如果调完之后依旧卡在某个数字上不动,那这个数字就是服务商的真实上限,不用再浪费时间了。
标签:#BBR #TCP调优 #拥塞控制 #单线程加速 #跨境网络 #网络排障 #AirPick实验室