tcpdump 不会捕获整个数据包

Dis*_*ame 7 networking grep internet tcpdump

我正在使用

sudo tcpdump -A -s0 -ien0 port 80 | grep schemas-microsoft >> ~/Downloads/convert.txt
Run Code Online (Sandbox Code Playgroud)

捕获通过 Internet 发送的 microsoft-schema xmls,何时tcpdump应该捕获:(例如)

<xml>
 <sample>h</sample>
 <samp2>j</sample>
</xml>
Run Code Online (Sandbox Code Playgroud)

它只捕获:

<xml>
<sample>h</sample
<sam
Run Code Online (Sandbox Code Playgroud)

并在文件中的某处随机停止。这可能是由于什么?

slm*_*slm 8

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

$ tcpdump -i <interface> -s 65535 -w <some-file>
Run Code Online (Sandbox Code Playgroud)

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

-s

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

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

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

在搜索如何执行此操作时,我注意到其他人建议使用与此类似的命令行:

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

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

参考