Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux IP标头在不同的机器上是否可以处于不同的偏移量?_Linux_Networking_Pcap_Libpcap - Fatal编程技术网

Linux IP标头在不同的机器上是否可以处于不同的偏移量?

Linux IP标头在不同的机器上是否可以处于不同的偏移量?,linux,networking,pcap,libpcap,Linux,Networking,Pcap,Libpcap,我正在用libpcap编写一个工具来分析TCP流量。我面临的问题是,在提供给我进行测试的pcap文件中,我看到IP头从偏移量0x10开始,因此在16个字节之后,而所有文档+实时捕获向我显示,它总是在0xE,就像文档中所说的那样 如何尝试获取ip和tcp标头: 结构iphdr*ip; 结构tcphdr*tcp; ip=struct iphdr*数据包+sizeofstruct ethhdr; tcp=struct tcphdr*packet+sizeofstruct ethhdr+sizeofst

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

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

结构iphdr*ip; 结构tcphdr*tcp; ip=struct iphdr*数据包+sizeofstruct ethhdr; tcp=struct tcphdr*packet+sizeofstruct ethhdr+sizeofstruct iphdr 一些wireshark图像:

现场捕获-

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

脱机转储文件-

转储文件ip头在16字节后启动

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


谢谢

罗恩·莫平是100%正确的。要提供更多详细信息,请执行以下操作:

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

指示pcap文件头中的一个字段是链路层头类型字段;正如手册页所说:

一个4字节的数字,给出捕获中数据包的链路层报头类型;请参阅pcap-linktype7以了解此字段中可能出现的LINKTYPE_uu值

如果已使用打开捕获文件,则在libpcap中,将返回链接层头类型

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

指示存在哪些链接层类型。给定的数值显示在文件的“链接层头类型”字段或-libpcap的“链接类型”字段中,可以读取一些pcapng文件,这些文件的所有接口描述块必须具有相同的链接类型,并将在pcap_数据链接调用中返回链接层类型

pcap_数据链路返回的值是链路层头类型列表中的DLT_值,因此以太网文件或以太网接口描述块的头中的值为1或LINKTYPE_Ethernet,该值将在pcap_数据链路返回的值中映射到DLT_EN10MB。在大多数情况下,LINKTYPE_uu值和相应的DLT_uu值在数字上是相同的,但在不同操作系统对同一DLT_uuuu类型具有不同数值的情况下,也有一些例外。第二个捕获在捕获文件中有LINKTYPE_LINUX_SLL,因此pcap_datalink将返回DLT_LINUX_SLL

链接层标题类型页面对链接层标题类型的描述应有助于您编写代码来解释该链接层标题类型的标题数据

此外,正如Ron Maupin所指出的,在Ethernet报头之后但在IP报头之前也可能有VLAN报头


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

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