2010-07-15 77 views
5

我捕获HTTP流量使用tcpdump和感兴趣的是TCP慢启动和如何窗口大小的增加:Wireshark的和tcpdump的-r:奇怪的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> 

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

回答

8

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

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

连接接收者已设定为6的wscale,所以其win值必须用64相乘因此win 133表示的8512个字节的窗口,以及表示win 178 11392个字节。

+0

首先,这是为什么呢?其次,有没有一种方法可以让'tcpdump'以Wireshark的方式查看转储文件时自动在输出中进行缩放? – 2010-07-16 14:14:10

+0

@Robert:这样做是因为原始的TCP/IP规范为窗口大小提供了一个16位的字段;当发现这个不足时,窗口缩放机制允许它代表更大的数字,而不必改变字段大小。它似乎没有在'tcpdump'中显示缩放窗口大小的方法 - 你可以随时提交一个补丁;)你可以总是使用'tshark'(Wireshark的基于文本的版本)。 – caf 2010-07-17 06:09:04

2

此外,如果该工具(Wireshark的或tcpdump的,不要紧)未看到SYN,它具有打印的标度值,它可以欺骗你