我有一个正在运行的应用程序,需要在我的本地平台和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
如果在环回接口(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_值进行比较。