【问题标题】:wireshark and tcpdump -r: strange tcp window sizeswireshark 和 tcpdump -r:奇怪的 tcp 窗口大小
【发布时间】:2011-03-16 08:05:35
【问题描述】:

我正在使用 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>

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

【问题讨论】:

    标签: linux tcp wireshark tcpdump


    【解决方案1】:

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

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

    连接接收方设置wscale为6,因此其win值必须乘以64。因此win 133表示8512字节的窗口,win 178表示11392字节。

    【讨论】:

    • 首先,为什么要这样做?其次,有没有办法让tcpdump 像 Wireshark 一样查看转储文件时自动在输出中进行缩放?
    • @Robert:之所以这样做是因为最初的 TCP/IP 规范为窗口大小提供了 16 位字段;当发现这还不够时,窗口缩放机制允许它表示更大的数字,而无需更改字段大小。似乎没有办法在 tcpdump 中显示缩放的窗口大小 - 您可以随时提交补丁;)您可以随时使用 tshark(Wireshark 的基于文本的版本)。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-05-24
      • 2023-04-02
      • 2014-05-23
      • 1970-01-01
      • 2015-12-11
      • 2019-07-26
      • 2013-01-01
      • 2013-09-19
      • 1970-01-01
      相关资源
      最近更新 更多