我想我可能在窗口缩放 (RFC 1323) 方面遇到问题,希望有人能告诉我发生了什么事。
- 服务器: FreeBSD 9,apache22,提供一个 100MB 的静态 zip 文件。192.168.18.30
- 客户端: Mac OS X 10.6、Firefox 192.168.17.47
- 网络:它们之间只有一个开关——子网是 192.168.16/22(在这个测试中,我也有 dummynet 过滤模拟所有 IP 流量的 80ms ping 时间。我已经看到几乎相同的痕迹与“真实”设置,也有真实的互联网流量/延迟)
问题:
- 这看起来正常吗?
- 数据包 #2 是否指定了 65535 的窗口大小和 512 的比例?
- 数据包 #5 是否正在缩小窗口大小,以便它可以使用 512 比例并仍然保持总体计算窗口大小接近 64K?
- 为什么窗口比例这么高?
这是来自 wireshark 的前 6 个数据包。对于数据包 5 和 6,我包含了显示用于数据传输的窗口大小和比例因子的详细信息。
No. Time Source Destination Protocol Length Info
108 6.699922 192.168.17.47 192.168.18.30 TCP 78 49190 > http [SYN] Seq=0 Win=65535 Len=0 MSS=1460 WS=8 TSval=945617489 TSecr=0 SACK_PERM=1
115 6.781971 192.168.18.30 192.168.17.47 TCP 74 http > 49190 [SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1460 WS=512 SACK_PERM=1 TSval=2617517338 TSecr=945617489
116 6.782218 192.168.17.47 192.168.18.30 TCP 66 49190 > http [ACK] Seq=1 Ack=1 Win=524280 Len=0 TSval=945617490 TSecr=2617517338
117 6.782220 192.168.17.47 192.168.18.30 HTTP 490 GET /utils/speedtest/large.file.zip HTTP/1.1
118 6.867070 192.168.18.30 192.168.17.47 TCP 375 [TCP segment of a reassembled PDU]
细节:
Transmission Control Protocol, Src Port: http (80), Dst Port: 49190 (49190), Seq: 1, Ack: 425, Len: 309
Source port: http (80)
Destination port: 49190 (49190)
[Stream index: 4]
Sequence number: 1 (relative sequence number)
[Next sequence number: 310 (relative sequence number)]
Acknowledgement number: 425 (relative ack number)
Header length: 32 bytes
Flags: 0x018 (PSH, ACK)
Window size value: 130
[Calculated window size: 66560]
[Window size scaling factor: 512]
Checksum: 0xd182 [validation disabled]
Options: (12 bytes)
No-Operation (NOP)
No-Operation (NOP)
Timestamps: TSval 2617517423, TSecr 945617490
[SEQ/ACK analysis]
TCP segment data (309 bytes)
1.) 512 并不是真正的高窗口比例——它只是说将提供的窗口大小向左移动 9 位。将窗口大小设置为 130(否则是一个非常非常低的值),然后应用 512 的比例因子可以得到 66560 (130<<9)。
2.) 100M 可能是一个太小的文件。规模已经协商的事实表明一切正常。尝试使用更大的文件以更好地观察行为。如果不出意外,您将更好地了解实际吞吐量。
3.) 还要记住,特定客户端的行为实际上可以专门覆盖操作系统的行为 - 例如,Solaris 中内置的 FTP 客户端用于将窗口大小限制为 64K,而不管操作系统如何配置。
我从 sysadmin 团队那里得到消息,这个问题是由 VMWare 网络驱动程序的一些问题引起的,不尊重/很好地使用 sysctl 可调参数。在物理硬件上具有相同设置的吞吐量具有合理百分比的管道吞吐量,而不是我们在 VMware 中看到的 1/10 或更少。