6

我正在使用 tcpdump 捕获 http 流量,并且对 TCP 慢启动以及窗口大小如何增加感兴趣:

$ sudo tcpdump -i eth1 -w wget++.tcpdump tcp and port 80

当我使用 Wireshark 查看转储文件时,窗口大小的进展看起来很正常,即 5840、5888、5888、8576、11264 等...

但是当我通过查看转储文件时

$ tcpdump -r wget++.tcpdump -tnN | less

我得到了似乎是无意义的窗口大小(为简洁起见省略了 IP 地址):

: S 1069713761:1069713761(0) win 5840 <mss 1460,sackOK,timestamp 24220583 0,nop,wscale 7>
: S 1198053215:1198053215(0) ack 1069713762 win 5672 <mss 1430,sackOK,timestamp 2485833728 24220583,nop,wscale 6>
: . ack 1 win 46 <nop,nop,timestamp 24220604 2485833728>
: . 1:1419(1418) ack 1 win 46 <nop,nop,timestamp 24220604 2485833728>
: P 1419:2002(583) ack 1 win 46 <nop,nop,timestamp 24220604 2485833728>
: . ack 1419 win 133 <nop,nop,timestamp 2485833824 24220604>
: . ack 2002 win 178 <nop,nop,timestamp 2485833830 24220604>

有没有办法在命令行上获得正常/绝对窗口大小?

4

2 回答 2

13

窗口大小是正确的 - 它们只是未缩放。

连接发起者已将wscale(窗口缩放因子)设置为 7,因此其后续win值必须乘以 128 才能获得以字节为单位的窗口大小。因此win 46表示一个 5888 字节的窗口。

连接接收方设置awscale为6,所以它的win值必须乘以64。这样win 133表示一个8512字节的窗口,win 178表示11392字节。

于 2010-07-16T07:18:52.060 回答
4

此外,如果工具(wireshark 或 tcpdump,没关系)没有看到 syn,它必须打印未缩放的值,这可能会欺骗你

于 2012-07-24T16:06:52.387 回答