【发布时间】:2012-09-08 19:13:18
【问题描述】:
我很可能在这里遗漏了一些东西,但PCAP specification 没有显示捕获的数据包的发件人IP地址和PORT。
有没有办法让我知道 PCAP 文件中的数据包是谁发送的?
【问题讨论】:
标签: sockets networking tcp udp pcap
我很可能在这里遗漏了一些东西,但PCAP specification 没有显示捕获的数据包的发件人IP地址和PORT。
有没有办法让我知道 PCAP 文件中的数据包是谁发送的?
【问题讨论】:
标签: sockets networking tcp udp pcap
我能够使用以下 Github 示例获取源端点和目标端点的 IP 地址和端口号:
https://github.com/arisath/Pcap-dissection/blob/master/PcapDissector.java
【讨论】:
根据 EJP 所说,您必须自己解析数据包数据。有关文件头中network 字段的值列表以及数据包数据开头的头的相应格式,请参见the tcpdump.org link-layer header type page。
您需要查看这些标头以确定数据包是否为 IP 数据包;如果是,那么您需要解析 IPv4 或 IPv6 标头(取决于标头是否表明它是 IPv4 或 IPv6 数据包,或者,取决于标头中的“版本”字段是 4 还是 6 - “ version”字段出现在 IPv4 和 IPv6 标头中的相同位置;对于LINKTYPE_RAW,您必须查看“version”字段,因为 IPv4 或 IPv6 标头前面没有标头)才能找到源IP地址。 IPv4头的形式见RFC 791;有关 IPv6 标头的形式,请参见 RFC 2460。
如果需要端口号,则必须检查 IPv4 标头的“协议”字段,或检查 IPv6 标头的“下一个标头”字段和处理扩展标头,以确定在 IP 之上承载什么协议。有关该字段的值,请参见IANA Protocol Numbers registry; TCP是6,UDP是17。如果协议是TCP,TCP头的格式见RFC 793;如果协议是UDP,UDP头的格式见RFC 768。
或者您可能想要使用现有的数据包解析库,例如用于 C 或 C++ 的 libtrace 或用于其他语言的其他库(我认为它们可能存在于 Perl、Python、C# 和 Java 中),因为这可能会让你避免做很多上述事情。
(就此而言,您不需要查看 pcap 格式规范;您应该使用 libpcap/WinPcap 来读取 pcap 文件,因为这也意味着您的程序可能能够读取一些 pcap-ng文件,如果它使用的是足够新的 libpcap 版本。)
【讨论】:
数据包来源在 IP 数据包本身。所以它也不需要在 PCap 标头中。
【讨论】: