Python - 通过解包以太网帧在期望 0x800 的类型上获取 0xc0a8 而不期望数据

标签 python networking ethernet packet packet-capture

我有一个可以解压以太网帧的 Python 函数:

ethernet frame

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/

相关文章:

visual-studio - NDIS 和微型端口驱动程序

python - 在 PySpark 中以编程方式设置驱动程序的内存大小

python - 如何使用嵌套字典列表展平 Pandas 数据框中的列

python - 在python中创建一个跨特定范围集的for循环函数

python - 有什么方法可以延迟计算 function.func_name 吗?

java - 如何将DatagramPacket发送到多个IP地址?

sql-server - MSOLEDBSQL 或 MSOLEDBSQL19 连接到 Azure 数据库时出现超时错误 - 工作正常 "from my machine"

java - 如何修改Java集成测试的网络连接?

networking - 以太网和 OSI 模型

linux - 来自 NIC 的以太网帧