【发布时间】:2018-05-09 14:31:46
【问题描述】:
我正在使用 pcap 在我的路由器上捕获 ip(v4 和 v6)数据包。它工作得很好,但我注意到有时以太网帧 (LINKTYPE_ETHERNET) 的 ethertype 或 linux 熟捕获封装 (LINKTYPE_LINUX_SLL) 不能正确指示它们包含的 ip 数据包的版本。
我期待如果我得到一个 ethertype 是 0x0800 (ETHERTYPE_IP) 的帧,那么它应该包含一个带有 version == 4 的 ipv4 数据包,如果我得到一个 ethertype 是 0x86DD 的帧(ETHERTYPE_IPV6) 那么它应该包含一个带有version == 6的ipv6数据包。
以上大部分情况下都是正确的,但有时并非如此。我会得到一个其ethertype 是ETHERTYPE_IP 但不知何故包含一个ipv6 数据包的帧,或者我会得到一个其ethertype 是ETHERTYPE_IPV6 但它包含一个ipv4 数据包的帧。
我似乎听说过“ipv4 over ipv6”或“ipv6 over ipv4”,但我不知道它们是如何工作的,或者它们是否适用于我的问题,但我不确定是什么导致了这种不一致。
编辑
我认为我真正的问题是这种行为是否正常。如果是这样,我应该忽略 ethertype 字段,只需检查 ip 标头中的 version 字段以确定它是 ipv4 还是 ipv6。
【问题讨论】:
-
C++ 与此有何关系?
-
StackOverflow 旨在帮助人们修复现有的编程代码。请阅读stackoverflow.com/help/on-topic、stackoverflow.com/help/how-to-ask、stackoverflow.com/help/dont-ask、stackoverflow.com/help/mcve 并在此处发布更多问题之前使用tour。祝你好运。
-
@JakeFreeman 我猜它是用 c++ 编码的。我不知道 pcap 库是否对其他语言执行相同的操作。
-
@shellter 我想我的根本问题是我应该完全忽略
ethertype并检查ip 标头中的版本字段。