首页 > 解决方案 > 使用 pcap_next_ex() 可以很好地捕获,但以太网标头大小不同。14 个使用 Ubuntu,4 个使用 FreeBSD

问题描述

我有一个正在运行的应用程序,需要在我的本地平台上正确执行,运行 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

标签: ubuntufreebsdpacketlibpcap

解决方案


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

一旦你打开了一个捕获接口,你必须调用; 这告诉你标题是什么。你不能假设一个以太网头。pcap_datalink()pcap_t

有关您可能看到的链路层标头类型的描述,请参阅此链路层标头类型列表。pcap_datalink()返回 DLT_ 值,而不是 LINKTYPE_ 值,因此将其结果与该页面中的 DLT_ 值进行比较。


推荐阅读