You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scapy自定义HSR层失败求助:代码实现及报错排查

问题排查与解决方案

1. 层绑定缺少触发条件

你直接执行bind_layer(Ether, HSR)未指定匹配规则,Scapy无法判断何时将Ethernet帧的上层解析为HSR。HSR的标准EtherType为0x892F,必须绑定该条件才能触发正确解析:

# 先解绑可能存在的同类型绑定,避免冲突
unbind_layer(Ether, type=0x892F)
# 绑定Ether帧type字段为0x892F时解析为HSR层
bind_layer(Ether, HSR, type=0x892F)

2. 字段定义需匹配实际抓包结构

结合你提到的Wireshark显示,需确认HSR头部的位顺序与长度是否符合定义:

  • Scapy的BitField按字节高位到低位分配位段,你定义的前4个4bit字段会被打包为两个字节:第一个字节是path(4bit) + network_id(4bit),第二个字节是lane_id(4bit) + LSDU_size(4bit),需和Wireshark中实际位顺序完全一致,若不符需调整字段顺序或改用ReverseBitField。
  • 检查头部总长度:当前定义的HSR头部为6字节(44bit + 216bit),若Wireshark中显示为8字节,大概率遗漏了标准HSR头部的Reserved字段,需补充:BitField("reserved", 0, 8)。

3. 构造/解析时的验证方法

构造测试包并查看结构,确认字段打包是否符合预期:

test_pkt = Ether(type=0x892F)/HSR(path=1, network_id=2, lane_id=3, LSDU_size=100, sequence_number=1234, type=0x0800)/IP()
test_pkt.show()

若字段值与预期不符,需调整BitField的定义或顺序;若出现数据包长度不足的报错,需检查fields_desc总长度是否匹配实际抓包的HSR头部长度。

修正后的完整代码

from scapy.all import *

class HSR(Packet):
    name = "HSR"
    fields_desc = [
        BitField("path", 0, 4),
        BitField("network_id", 0, 4),
        BitField("lane_id", 0, 4),
        BitField("LSDU_size", 0, 4),
        ShortField("sequence_number", 0),
        ShortField("type", 0),
        # 若Wireshark显示有预留字段,解开下面注释
        # BitField("reserved", 0, 8)
    ]

unbind_layer(Ether, type=0x892F)
bind_layer(Ether, HSR, type=0x892F)

内容的提问来源于stack exchange,提问作者Donat Treszler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 15:07:02