首页/网络/协议速查/窗口缩放(wscale)
TCP 与 UDP54 条

窗口缩放(wscale)

TCP 头部窗口只有 16bit(64KB 上限),高带宽时延积场景不够用;wscale 选项把窗口乘以 2^n(最大 ×2^14),是长肥管道吞吐的关键。

协议速查网络更新于 2026-10-13

窗口缩放解决什么

TCP 头部的窗口字段只有 16 位,接收方最多只能声明 65535 字节的接收窗口(RFC 7323 §2.2)。在高带宽时延积的链路上,这个上限会让发送方在收到确认前就无数据可发,吞吐被硬性钳住。窗口缩放选项允许双方在建连时协商一个因子,把窗口值乘以 2 的 n 次方(最大 14),窗口上限随之抬到约 1 吉字节。

只在握手时协商

缩放因子只在三次握手期间交换,连接建立之后无法再改。两端各自声明自己接收方向的因子,彼此独立。这意味着只调一端的内核参数,对另一个方向的吞吐没有任何帮助。

基本信息

字段上限16 位窗口字段即 65535 字节
缩放范围因子 0 到 14,最大把窗口放大 16384 倍
协商时机仅在 SYN 与 SYN-ACK 中,建连后固定
内核参数net.ipv4.tcp_window_scaling(默认开启)

典型使用场景

  • 跨地域专线或国际线路跑不满带宽:先看接收窗口是否被钳住
  • 云上 NAT 与网关设备排查:部分设备会剥掉或改写缩放选项
  • 容器与虚拟网络调试:确认协商值是否符合预期
  • 大文件传输、备份与镜像分发的吞吐调优

查看协商值

查看协商值
ss -ti | grep -i -E 'wscale|rtt'                                     # 已建立连接的协商值与往返时延
tcpdump -nn -v 'tcp[tcpflags] & tcp-syn != 0' -c 2 | grep -i wscale   # 抓 SYN 包看协商过程
sysctl net.ipv4.tcp_window_scaling                                   # 确认本机是否启用

相关量怎么用

项含义怎么用
BDP带宽乘以往返时延100 毫秒与 1Gbps 约需 12.5MB 窗口
wscale协商出的缩放因子窗口上限约为 65535 乘以 2 的因子次方
rwnd接收方通告的可接收字节数长期贴着上限说明窗口受限
cwnd发送方拥塞窗口判断吞吐受限时要与 rwnd 一起看
云上跨地域专线跑不满带宽时,先确认 rwnd 是否被窗口上限钳住:这比盲目调大 socket 缓冲更快定位问题。
部分老中间设备会剥掉或破坏窗口缩放选项,两端协商不出缩放。抓包对比两端看到的 SYN 选项即可确认,这类问题常表现为「莫名其妙只有几十兆带宽」。

易错点

  • wscale 只放大接收窗口上限,发送侧仍受拥塞窗口与本地缓冲限制:单改一边无效
  • 中间设备剥离缩放选项:长肥管道吞吐骤降,且现象随路径变化而漂移
  • 关掉 tcp_window_scaling 却调大 socket 缓冲:缓冲再大也无法通告出去
  • 接收缓冲上限设置得比缩放后的窗口小:实际窗口仍被内核缓冲钳住
  • 在没有丢包的小文件传输上套用大窗口结论:瓶颈根本不在窗口

数据来源与参考

  • RFC 7323 §2.2(窗口缩放)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌