TCP Window Scale

TCP Window Scale

Content #

在TCP刚被发明的时候,全世界的网络带宽都很小,所以最大接收窗口被定义成 65535 字节。随着硬件的革命性进步,65535 字节已经成为性能瓶颈了,怎么样才能扩展呢?TCP 头中只给接收窗口值留了 16 bit,肯定是无法突破 65535 (2^16−1)的。

1992年的RFC 1323中提出了一个解决方案,就是在三次握手时,把自己的Window Scale信息告知对方。由于Window Scale放在TCP头之外的Options中,所以不需要修改 TCP 头的设计。Window Scale 的作用是向对方声明一个 Shift count,我们把它作为2的指数,再乘以TCP头中定义的接收窗口,就得到真正的TCP接收窗口了。

例如,10.32.106.159告诉10.32.106.103说它的Shift count是5。2^5等于32,这就意味着以后10.32.106.159声明的接收窗口要乘以32才是真正的接收窗口值。

10.32.106.159声明它的接收窗口为“Window size value: 183”,183乘以32得到5856,所以Wireshark就显示出“Win=5856”了。要注意Wireshark是根据 Shift count计算出这个结果的,如果抓包时没有抓到三次握手,Wireshark就不知道该如何计算,所以我们有时候会很莫名地看到一些极小的接收窗口值。还有些时候是防火墙识别不了Window Scale,因此对方无法获得Shift count,最终导致严重的性能问题。

From #