使用pcap_next_ex()可以很好地捕获,但是以太网头大小不同。在Ubuntu中为14,在FreeBSD中为4

问题描述 投票:1回答:1

我有一个正在运行的应用程序,需要在我的本地平台和Ubuntu 18.4上都正确执行,并重新编译后才能在FreeBSD平台上运行。

我在数据包上遇到问题,因为在FreeBSD平台上以太网报头短了10个字节

我通过从ICMP报头中查找数据包中始终存在于我的数据中的数据,从而适应了收到数据包后软件的差异。知道该数据的偏移量可以决定有关标头大小的决定。

一旦知道了以太网标头的大小,就将其剥离,剩下的在各设备之间是一致的。

但是,我有一个我无法理解的区别。谁能指出我的文档来描述4或14个字节之差的原因?

我浏览了网络以寻找解释,但没有发现任何理由可以证明两者之间的差异。甚至FreeBSD的“ Ethernet.h”也显示14个字节。

#define ETHER_HDR_LEN (ETHER_ADDR_LEN*2 + ETHER_TYPE_LEN) where that is (6*2)+2 equals 14
ubuntu freebsd packet libpcap
1个回答
0
投票

如果在环回接口(Linux上为lo,在FreeBSD上为lo0)上捕获,则不能保证数据包have以太网头。它们在Linux上运行,但在FreeBSD(以及NetBSD和OpenBSD以及DragonFly BSD和macOS)上具有不同的标头。该标头长4个字节。

一旦打开了捕获界面,您必须调用pcap_datalink()上的pcap_t;告诉您标题是什么。您必须NOT假定使用以太网标头。

请参阅this list of link-layer header types,以获取您可能会看到的链路层头类型的描述。 pcap_datalink()返回DLT_值,而不是LINKTYPE_值,因此将其结果与该页面的DLT_值进行比较。

© www.soinside.com 2019 - 2024. All rights reserved.