【问题标题】:Can IP header be at different offset across different machines?IP标头可以在不同机器上具有不同的偏移量吗?
【发布时间】:2019-08-30 17:22:47
【问题描述】:

我正在用 libpcap 编写一个工具来分析 TCP 流量。我面临的问题是,在提供给我进行测试的 pcap 文件中,我看到 IP 标头从偏移量 0x10 开始(因此在 16 个字节之后),而所有文档 + 实时捕获显示它始终位于 0xE (如文档声明)。

我如何尝试获取 ip 和 tcp 标头:

struct iphdr *ip;
struct tcphdr *tcp;
ip = (struct iphdr *)(packet + sizeof(struct ethhdr));
tcp = (struct tcphdr *)(packet + sizeof(struct ethhdr) + sizeof(struct iphdr)

一些wireshark图片:

实时捕捉 -

你可以看到它在 14 个字节后开始,就像它应该的那样

离线转储文件 -

转储文件 ip 标头在 16 个字节后开始

解析 IP 和 TCP 标头的正确方法是什么?

谢谢

【问题讨论】:

  • 这完全取决于数据链路协议。不同的数据链路协议具有不同的帧头大小,即使使用相同的数据链路协议,您也可以有不同的帧大小。例如,以太网标头通常是 14 个八位字节,但使用 802.1Q 标记时,它是 18 个八位字节。此外,Wi-Fi 帧标头与以太网标头不同,其他数据链路协议的标头也大不相同。
  • 可能是更适合Network Engineering Stack Exchange的问题。

标签: linux networking pcap libpcap


【解决方案1】:

Ron Maupin 是 100% 正确的。提供更多细节:

我面临的问题是在提供给我进行测试的 pcap 文件中

The pcap-savefile(5) man page表示pcap文件头中的字段之一是“Link-layer header type”字段;正如手册页所说:

一个 4 字节的数字,给出捕获中数据包的链路层标头类型;请参阅 pcap-linktype(7) 了解可以出现在此字段中的 LINKTYPE_ 值。

如果你用pcap_open_offline() or one of the variants thereof打开了一个捕获文件,libpcap中的the pcap_datalink() routine会返回链接层头类型。

链路层标头类型是解释数据包内容的要求。例如,对于 IP 数据包,IP 标头位于任何元数据标头和链路层标头之后,并且并非所有元数据标头(如果存在)和所有链路层标头都具有相同的长度,因此您必须 知道存在什么链路层报头,以便知道 IP 报头从哪里开始——或者,事实上,甚至可以确定数据包是否是 IP 数据包!例如,对于以太网数据包,您必须查看以太网类型/长度字段以查看它是 0x0800(对于 IPv4)还是 0x86dd(对于 IPv6)。

The tcpdump.org list of link-layer header types 表示存在哪些链路层类型。给出的数值是出现在文件的“Link-layer header type”字段中(或an Interface Description Block in a pcapng file的LinkType字段中的数值——libpcap可以读取一些pcapng文件,所有的接口描述块必须有相同的 LinkType,并将在 pcap_datalink() 调用中返回链路层类型)。

pcap_datalink() 返回的值是链路层头类型列表中的 DLT_ 值,因此以太网文件(或以太网接口描述块)在头中的值为 1 或 LINKTYPE_ETHERNET,这将在pcap_datalink() 返回的值中映射到 DLT_EN10MB。 (在大多数情况下,LINKTYPE_ 值和对应的 DLT_ 值在数值上是相同的,但也有一些例外情况,即不同的操作系统对于相同的 DLT_ 类型具有不同的数值。)第二次捕获在捕获文件中有 LINKTYPE_LINUX_SLL,所以pcap_datalink() 会返回 DLT_LINUX_SLL。

链接层标头类型页面对链接层标头类型的描述应该可以帮助您编写代码来解释该链接层标头类型的标头数据。

此外,正如 Ron Maupin 所指出的,在以太网标头之后但在 IP 标头之前也可能有 VLAN 标头。

(而且,由于这是由编写程序来读取捕获文件的人提出的问题,而不是由设计或维护网络的人提出的问题,因此它似乎比网络工程更适合 Stack Overflow。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 2016-01-14
    相关资源
    最近更新 更多