首页/系统/Linux 内核与性能调优速查/net.ipv4.tcp_window_scaling 窗口缩放
sysctl 内核参数72 条

net.ipv4.tcp_window_scaling 窗口缩放

允许窗口大于 64KiB 的 TCP 选项(缩放因子最高 2 的 14 次方);高延迟链路的吞吐高度依赖它,关闭等于给窗口设上限。

窗口缩放是什么

net.ipv4.tcp_window_scaling 控制是否启用 TCP 窗口缩放选项,默认开启。TCP 头部窗口字段只有 16 位,最大只能表示 65535 字节;窗口缩放把通告窗口按 2 的幂次放大,使接收方可以声明远大于 64KB 的窗口。它由双方在三次握手中交换缩放因子协商,任一侧不支持则该连接按 64KB 封顶。高带宽时延积链路(跨地域、卫星链路)上,窗口大小直接决定单连接能跑多快。

基本信息

参数net.ipv4.tcp_window_scaling
默认值1(开启)
协商时机三次握手时交换 wscale 值,只影响后续新建连接
上限关系窗口实际大小还受接收缓冲制约,与 tcp_rmem 上限相关
吞吐关系吞吐上限约等于窗口大小除以往返时延
观测方式ss -ti 显示连接的 wscale 值

典型使用场景

  • 跨地域传输跑不满带宽:确认双方 wscale 是否都生效,排除窗口封顶
  • 理解「越快越慢」现象:RTT 大而窗口小时,单连接吞吐被数学关系限制
  • 兼容性验证:老设备不支持该选项时,需要确认对性能的实际影响
  • 结合缓冲调优:窗口与接收缓冲要同步规划,只调其中一端无效
  • 压测结果解读:单连接吞吐上不去时,先确认是窗口限制还是链路拥塞

查看与验证

查看与验证
sysctl net.ipv4.tcp_window_scaling        # 读开关
ss -ti | grep -m5 wscale                  # 看连接的缩放因子(收发各一个值)
sysctl net.ipv4.tcp_rmem                  # 接收缓冲上限决定窗口天花板
# 吞吐上限 ≈ 窗口大小 / RTT;例如 6MB 窗口、100ms 时延约 480Mbps
sysctl net.ipv4.tcp_timestamps            # 同为握手协商的常见选项,可一并核对

现象与原因

现象可能原因验证方式
单连接吞吐上不去窗口小于链路 BDP用 ss -ti 看 wscale 与缓冲使用情况
wscale 一侧为零对端不支持或禁用该选项抓包看握手是否交换了该选项
窗口有余量但速度仍慢瓶颈在丢包或拥塞控制观察重传计数与拥塞窗口变化
短连接无改善选项只在大窗口场景起作用小请求场景瓶颈通常在延迟而非窗口
只有收发双方都声明缩放,连接才会真正使用大窗口;任一侧为零时窗口按 64KB 封顶。排查高延迟链路吞吐问题时,把双方的 wscale 都确认一遍是最快的排除步骤。
窗口大小并不等于实际传输量:它受接收缓冲上限与对端读取速度双重约束。窗口通告得大而应用读取慢时,数据仍然堆在接收侧缓冲里,最终表现为延迟增加而不是吞吐提升。

易错点

  • 只看一侧的 wscale:任一侧为零即窗口封顶,必须两端都确认
  • 把窗口调大当作万能提速手段:链路丢包与拥塞控制算法同样影响吞吐
  • 关闭该选项做兼容性验证后忘记恢复:高延迟链路性能会持续受限
  • 忽略接收缓冲上限:窗口最终受 tcp_rmem 上限约束,两者需同步规划
  • 期望对存量连接生效:缩放因子在握手时确定,验证必须新建连接

数据来源与参考

  • RFC 7323(TCP Extensions for High Performance)
  • Linux 内核 Documentation/networking/ip-sysctl.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌