开启TCP窗口缩放可突破64KB限制,需两端均启用并协商成功,同时调大内核缓冲区上限(如rmem_max/wmem_max≥4MB),否则缩放无效。

开启 TCP 窗口缩放(Window Scaling)是提升长距离、高带宽网络传输效率的关键一步——它解决的是 TCP 协议本身 64KB 窗口上限与现代网络 BDP(带宽时延积)严重不匹配的问题。RTT 超过几毫秒后,不启用缩放,窗口就卡死在 65535 字节,再快的链路也跑不满。
确认当前是否已启用
窗口缩放不是默认“开箱即用”在所有系统上,尤其老内核或某些容器镜像可能关闭:
- 运行 sysctl net.ipv4.tcp_window_scaling,返回 1 表示已启用;若为 0,需手动开启
- 检查容器内是否继承:进入容器执行相同命令,结果也应为 1(否则需单独配置或确认 CNI 是否透传)
- 注意:仅宿主机设了没用,两端(客户端和服务端)都必须支持且协商成功
启用并持久化设置
临时启用:sysctl -w net.ipv4.tcp_window_scaling=1
永久生效:向 /etc/sysctl.conf 追加一行:
然后执行 sysctl -p 加载。该参数无需重启,但新建立的连接才生效。
验证三次握手是否真正协商成功
启用参数 ≠ 实际生效。窗口缩放靠 SYN 和 SYN-ACK 中的 TCP Options 协商,中间设备(防火墙、NAT、负载均衡)可能剥离该选项:
- 用 tcpdump -i any 'tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn' -nn -vv 抓包
- 查看 Client SYN 包和 Server SYN-ACK 包里是否都有 wscale N(如 wscale 7)
- 若只有服务端回了 wscale,而客户端 SYN 没有,说明客户端未开启或被中间设备过滤
配套必须调整的缓冲区上限
窗口缩放只是“表达能力”,真实窗口大小还受限于内核缓冲区容量。如果 rmem_max / wmem_max 太小,即使协商了 wscale=7,系统也没空间撑开大窗口:
- 确保 net.core.rmem_max 和 net.core.wmem_max ≥ 4MB(如 4194304)或更高
- 同步设置 tcp_rmem 和 tcp_wmem 的最大值(第三字段)不低于同量级
- 例如:net.ipv4.tcp_rmem = 4096 262144 4194304


















