我有一个硬件设备,它承载两个独立的 TCP 模块。一个用于接收来自其他机器的命令,另一个是 TCP 流服务器,它根据收到的命令发送数据。(这不是我的硬件。我无法打开或更改它。我知道这个设计有点愚蠢。)
问题是,当我尝试tcpdump
监听 TCP 流时,没有捕获到任何数据包。
我使用sudo tcpdump -i eth0 -n port 9101
命令。它简单地列出了:
0 packets captured;
0 packets received by filter;
0 packets dropped by kernel.
但是当我使用 netcat 时nc -v <ip address> 9101
,我会实时获得完整的流。问题是我想要将流捕获到二进制格式的文件中。这就是我使用 tcpdump 的原因。
知道如何解决这个问题吗?
与 UDP 流不同,TCP 严格面向连接 – 数据不能未经请求就发送,而需要成为活动连接的一部分,例如您
nc
创建的连接。一旦您关闭 nc,操作系统就会关闭其 TCP 连接,源将停止发送数据;也就是说,当您在关闭 nc 后尝试进行捕获时,没有TCP 流。这意味着,即使您想要获得 .pcap 格式的数据,您仍然必须始终运行 netcat 或其他 TCP 客户端程序。
(但由于 TCP 不保留数据包边界,并且基于 TCP 的协议不能依赖它们,即它是一个单一的连续流,将数据捕获为 .pcap 和仅让 nc 将其输出写入文件之间应该没有任何实际区别 - 这通常会更容易。)