广域网传输慢主因常是TCP窗口卡在64KB,需动态扩窗:先用ss -i和ping验证瓶颈,再调大rmem/wmem上限、缓冲区及启用window_scaling,配合BBR、统一MTU和tcp_timestamps优化。

广域网传输慢,常不是带宽不够,而是 TCP 窗口卡在 64KB 上动不了——这直接导致链路“空转”,再高的带宽也喂不饱。真正有效的解法,是让窗口能随网络能力动态撑开,而不是简单调大某个数字。
先确认是不是窗口真成了瓶颈
别急着改参数,先看证据:
- 用 ss -i 查活跃连接,如果 rcv_wnd 或 snd_wnd 长期停在 65535(即 64KB)附近,基本就是窗口被锁死了
- 用 ping -c 4 目标IP 测 RTT:若低于 0.5ms(如容器间直连),说明延迟极低,但窗口没放大,大概率是缩放没协商成功
- 算一下 BDP(带宽 × RTT):比如 1Gbps 链路 + 50ms RTT → BDP ≈ 6.25MB,窗口至少得接近这个值才不拖后腿
必须同步调的三组核心参数
窗口大小由缓冲区上限、连接级配置、缩放开关共同决定,缺一不可:
-
放开全局上限:编辑 /etc/sysctl.conf,加这两行(单位字节)
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216 -
设好每连接缓冲区间:同一文件中追加
net.ipv4.tcp_rmem = 4096 524288 16777216
net.ipv4.tcp_wmem = 4096 524288 16777216
中间值 512KB 是自动调优基准,最大值 16MB 才能覆盖典型广域网 BDP - 确保窗口缩放已启用:运行 sysctl net.ipv4.tcp_window_scaling,输出必须是 1;如果不是,加 net.ipv4.tcp_window_scaling = 1 到配置并 sysctl -p
验证缩放是否真正生效
开了参数 ≠ 真起作用,TCP 是双向协商协议:
- 用 tcpdump -i any 'tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn' -nn -vv 抓握手包
- 看到客户端 SYN 和服务端 SYN-ACK 都带 wscale 7(或类似数值),才表示两端都支持且成功协商
- 如果只有一端有 wscale,常见于客户端是老 Android、嵌入式设备或中间防火墙剥离了 TCP 选项
搭配 BBR 和统一 MTU 更稳
光放大窗口还不够,得有算法填满它,还得避免分片干扰:
- 启用 BBR 拥塞控制:echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf && sysctl -p,再执行 sysctl net.ipv4.tcp_congestion_control 确认输出为 bbr
- 宿主机与对端(包括容器网络插件)MTU 必须一致,推荐设为 1500(通用)或 9000(内网 jumbo frame),否则 PMTU 发现失败会触发分片重传
- 顺手打开时间戳:net.ipv4.tcp_timestamps = 1,对高 RTT 场景下稳定重传和防序列号绕回很有帮助


















