窗口缩放解决什么
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 选项即可确认,这类问题常表现为「莫名其妙只有几十兆带宽」。