tcpdump 不会捕获整个数据包

tcpdump 不会捕获整个数据包

我在用着

sudo tcpdump -A -s0 -ien0 port 80 | grep schemas-microsoft >> ~/Downloads/convert.txt

要捕获通过互联网发送的 microsoft-schema xml,何时tcpdump应该捕获:(例如)

<xml>
 <sample>h</sample>
 <samp2>j</sample>
</xml>

它只捕获:

<xml>
<sample>h</sample
<sam

并在文件中的某个位置随机停止。这可能是因为什么?

答案1

Wireshark 文档的指南建议使用以下命令捕获数据包的全部内容:

$ tcpdump -i <interface> -s 65535 -w <some-file>

查看手册页tcpdump中的指南表明-s0应该是等效的:

-s

Snarf snaplen 每个数据包中的数据字节,而不是默认的 65535 字节。由于有限快照而被截断的数据包在输出中用“[|proto]”指示,其中 proto 是发生截断的协议级别的名称。请注意,拍摄较大的快照不仅会增加处理数据包所需的时间,而且会有效地减少数据包缓冲量。这可能会导致数据包丢失。您应该将 snaplen 限制为能够捕获您感兴趣的协议信息的最小数字。将 snaplen 设置为 0 将其设置为默认值 65535,以便向后兼容最新旧版本的 tcpdump。

我怀疑您可能会由于该指南中间的句子而丢失一些数据,主要是:

请注意,拍摄较大的快照不仅会增加处理数据包所需的时间,而且会有效地减少数据包缓冲量。这可能会导致数据包丢失。您应该将 snaplen 限制为能够捕获您感兴趣的协议信息的最小数量。

搜索如何做到这一点我注意到其他人建议与此类似的命令行:

$ tcpdump -nnXSs 0 'port 80'
  • “-nn”使其不查找 DNS 中的主机名和服务名称(在/etc/services)中,以分别获得更快和更清晰的输出。
  • “-X”使其以十六进制和ascii 格式打印每个数据包;这确实是跟踪标头等有用的位
  • “-S”打印绝对的而不是相对的 TCP 序列号 - 如果我没记错的话,这样你就可以比较多个用户同时执行此操作的 tcpdump 输出
  • “-s 0”默认情况下tcpdump只会捕获每个数据包的开头,这里使用0将使其捕获完整的数据包。

我建议添加-nn看看是否可以提高性能,从而减少缓冲的数据,并希望保护更多的数据不被删除。其他开关可能会有所帮助,但我不清楚它们对您的情况有何帮助(如果有的话)。

参考

相关内容