Python-通过解包以太网帧获得0xc0a8(类型为0x800),不需要数据
我有一个Python函数,用于解压以太网帧: 我希望IPV4得到0x800,IPV6得到0x86dd。 但在打开框架后,我得到了0xc0a8。Python-通过解包以太网帧获得0xc0a8(类型为0x800),不需要数据,python,networking,ethernet,packet,packet-capture,Python,Networking,Ethernet,Packet,Packet Capture,我有一个Python函数,用于解压以太网帧: 我希望IPV4得到0x800,IPV6得到0x86dd。 但在打开框架后,我得到了0xc0a8。 有人能解释为什么我会得到这些意想不到的数据吗?以及如何修复它以获得正确的数据?听起来您可能正在将IP报头作为以太网报头读取0x0800是以太网报头的最后两个字节--数据[12:13]。IP头前置地址的长度为12字节,接下来的两个字节(IP_头[12:13])是IP源地址的前两个字节0xc0a8是(192168)——在我看来,这就像内部IP地址的前两个字
有人能解释为什么我会得到这些意想不到的数据吗?以及如何修复它以获得正确的数据?听起来您可能正在将IP报头作为以太网报头读取
0x0800
是以太网报头的最后两个字节--数据[12:13]
。IP头前置地址的长度为12字节,接下来的两个字节(IP_头[12:13])是IP源地址的前两个字节<十进制的code>0xc0a8是(192168)——在我看来,这就像内部IP地址的前两个字节,192.168.x.x
(IIRC),IP报头直接嵌入在图表的黄色数据段中的以太网报头之后,因此,例如,如果您尝试读取第一个以太网报头之后的第二个以太网报头,则可能会发生这种情况
(顺便说一句——您不需要将
protoType
转换为字符串以将其与十六进制值进行比较——只要在protoType==0x0800/elif protoType==0x86dd
时执行)。1。请把包裹寄到我们的办公室。2.您是否考虑过为此使用库,例如scapy
?
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:]