我有一个可以解压以太网帧的 Python 函数:
def ethernet_frame(data):
ipheader = struct.unpack('!6s6sH', data[0:14])
dest_mac = binascii.hexlify(ipheader[0])
src_mac = binascii.hexlify(ipheader[1])
proto = ""
protoType = ipheader[2]
nextProto = hex(protoType)
print(nextProto)
if(nextProto == '0x800'):
proto = 'IPV4'
elif(nextProto == '0x86dd'):
proto = 'IPV6'
print(nextProto)
return dest_mac, src_mac, proto, data[14:]
我预计 IPV4 会得到 0x800,IPV6 会得到 0x86dd。 但解压框架后我得到了 0xc0a8。 有人可以解释为什么我会得到这些意外的数据吗?以及如何修复它以获得正确的数据?
最佳答案
听起来您可能正在将 IP header 读取为以太网 header 。 0x0800
是以太网 header 的最后两个字节 - data[12:13]
。 IP header 前置地址长 12 个字节,接下来的两个字节 (ip_header[12:13]) 是 IP 源地址的前两个字节。 0xc0a8
十进制表示为 (192, 168)——在我看来,这就像内部 IP 地址 192.168.x.x 的前两个字节。
(IIRC),IP header 直接嵌入在图表的黄色数据段中的以太网 header 之后,因此,例如,如果您尝试在第一个以太网 header 之后读取第二个以太网 header ,则可能会发生这种情况。
(顺便说一句 - 您不需要将 protoType
转换为字符串来将其与十六进制值进行比较 - 您只需执行 if protoType == 0x0800
/elif protoType == 0x86dd
)。
关于Python - 通过解包以太网帧在期望 0x800 的类型上获取 0xc0a8 而不期望数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66818915/