【问题标题】:pcap ethertype not consistent with ip versionpcap ethertype 与 ip 版本不一致
【发布时间】:2018-05-09 14:31:46
【问题描述】:

我正在使用 pcap 在我的路由器上捕获 ip(v4 和 v6)数据包。它工作得很好,但我注意到有时以太网帧 (LINKTYPE_ETHERNET) 的 ethertype 或 linux 熟捕获封装 (LINKTYPE_LINUX_SLL) 不能正确指示它们包含的 ip 数据包的版本。

我期待如果我得到一个 ethertype0x0800 (ETHERTYPE_IP) 的帧,那么它应该包含一个带有 version == 4 的 ipv4 数据包,如果我得到一个 ethertype0x86DD 的帧(ETHERTYPE_IPV6) 那么它应该包含一个带有version == 6的ipv6数据包。

以上大部分情况下都是正确的,但有时并非如此。我会得到一个其ethertypeETHERTYPE_IP 但不知何故包含一个ipv6 数据包的帧,或者我会得到一个其ethertypeETHERTYPE_IPV6 但它包含一个ipv4 数据包的帧。

我似乎听说过“ipv4 over ipv6”或“ipv6 over ipv4”,但我不知道它们是如何工作的,或者它们是否适用于我的问题,但我不确定是什么导致了这种不一致。

编辑
我认为我真正的问题是这种行为是否正常。如果是这样,我应该忽略 ethertype 字段,只需检查 ip 标头中的 version 字段以确定它是 ipv4 还是 ipv6。

【问题讨论】:

标签: c++ linux pcap libpcap


【解决方案1】:

根据我的(有限)理解,IPv4 和 IPv6 都可以出现在 IPv4 (0x800) 以太网类型 (ethtype) 之后。这与通过 IPv6 传输 IPv4 数据包有关。当 ethtype 为 0x800 且 IP 头为版本 6 时,IP 头中的地址为映射到 IPv6 的 IPv4 地址。

一个示例是 Linux UDP 接收代码,它检查 ethtype 0x800,然后使用 ipv6_addr_set_v4mapped 将源地址转换为 ipv4

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多