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

Scapy中LLDP模块构造的数据包字节数异常问题求助

LLDP数据包构造时自定义字段字节数翻倍问题

我使用scapy.contrib.lldp库构造LLDP数据包,包含以下字段:

  • Chassis ID(l1)
  • Port ID(l2)
  • Time to live(l3)
  • System name(l4)
  • Generic Organisation Specific - 自定义数据1(l5)
  • Generic Organisation Specific - 自定义数据2(l6)
  • End of LLDP(l7)

所有字段的参数来自导入为DataFrame的CSV文件,通过库中对应的类构造每个字段。目前遇到的问题是:构造完成的数据包中,l6字段的字节数是预期值的两倍,即使设置固定值也无法解决这个问题。

Wireshark对比示例

Wireshark正常与畸形LLDP数据包对比

DataFrame数据

LayerFieldValue
Ethernetdst01:23:00:00:00:01
Ethernetsrc32:cb:cd:7b:5a:47
Ethernettype35020
LLDPDUChassisID_type1
LLDPDUChassisID_length7
LLDPDUChassisIDsubtype4
LLDPDUChassisIDfamilyNone
LLDPDUChassisIDid00:00:00:00:00:01
LLDPDUPortID_type2
LLDPDUPortID_length2
LLDPDUPortIDsubtype7
LLDPDUPortIDfamilyNone
LLDPDUPortIDid1
LLDPDUTimeToLive_type3
LLDPDUTimeToLive_length2
LLDPDUTimeToLivettl4919
LLDPDUSystemName_type5
LLDPDUSystemName_length10
LLDPDUSystemNamesystem_nameopenflow:1
LLDPDUGenericOrganisationSpecific_type127
LLDPDUGenericOrganisationSpecific_length16
LLDPDUGenericOrganisationSpecificorg_code9953
LLDPDUGenericOrganisationSpecificsubtype0
LLDPDUGenericOrganisationSpecificdataopenflow:1:1
LLDPDUGenericOrganisationSpecific_type127
LLDPDUGenericOrganisationSpecific_length20
LLDPDUGenericOrganisationSpecificorg_code9953
LLDPDUGenericOrganisationSpecificsubtype1
LLDPDUGenericOrganisationSpecificdatab'`\xafE\x16\t\xa0#5\x02\x7f\xd5\p\xf7\x11A' |
LLDPDUEndOfLLDPDU_type0
LLDPDUEndOfLLDPDU_length0

相关代码

def getlldppack(host_2,ifa):
    lim = 1
    log = "/root/log.log"
    file = "/root/dic_"+str(host_2)+"_"+str(lim)+".csv"
    while lim<5:
        try:
            lldp1 = pd.read_csv(file)
        except:
            with open(log,'a') as lf:
                lf.write("error when reading the packet "+file+" for count "+str(lim)+"\n")
            time.sleep(8)
        else:
            lldp1 = lldp1.iloc[: , 1:]
            e1=lldp1.loc[(lldp1['Layer']=='Ethernet')&(lldp1['Field']=='dst')].iloc[0,2]
            e2=lldp1.loc[(lldp1['Layer']=='Ethernet')&(lldp1['Field']=='src')].iloc[0,2]
            e3=int(lldp1.loc[(lldp1['Layer']=='Ethernet')&(lldp1['Field']=='type')].iloc[0,2])
            e = Ether(dst=e1, src=e2, type=e3)
            a1=int(lldp1.loc[(lldp1['Layer']=='LLDPDUChassisID')&(lldp1['Field']=='_type')].iloc[0,2])
            a2=int(lldp1.loc[(lldp1['Layer']=='LLDPDUChassisID')&(lldp1['Field']=='_length')].iloc[0,2])
            a3=int(lldp1.loc[(lldp1['Layer']=='LLDPDUChassisID')&(lldp1['Field']=='subtype')].iloc[0,2])
            a4=lldp1.loc[(lldp1['Layer']=='LLDPDUChassisID')&(lldp1['Field']=='family')].iloc[0,2]
            a5=lldp1.loc[(lldp1['Layer']=='LLDPDUChassisID')&(lldp1['Field']=='id')].iloc[0,2]
            b1=int(lldp1.loc[(lldp1['Layer']=='LLDPDUPortID')&(lldp1['Field']=='_type')].iloc[0,2])
            b2=int(lldp1.loc[(lldp1['Layer']=='LLDPDUPortID')&(lldp1['Field']=='_length')].iloc[0,2])
            b3=int(lldp1.loc[(lldp1['Layer']=='LLDPDUPortID')&(lldp1['Field']=='subtype')].iloc[0,2])
            b4=lldp1.loc[(lldp1['Layer']=='LLDPDUPortID')&(lldp1['Field']=='family')].iloc[0,2]
            b5=int(lldp1.loc[(lldp1['Layer']=='LLDPDUPortID')&(lldp1['Field']=='id')].iloc[0,2])
            c1=int(lldp1.loc[(lldp1['Layer']=='LLDPDUTimeToLive')&(lldp1['Field']=='_type')].iloc[0,2])
            c2=int(lldp1.loc[(lldp1['Layer']=='LLDPDUTimeToLive')&(lldp1['Field']=='_length')].iloc[0,2])
            c3=int(lldp1.loc[(lldp1['Layer']=='LLDPDUTimeToLive')&(lldp1['Field']=='ttl')].iloc[0,2])
            d1=int(lldp1.loc[(lldp1['Layer']=='LLDPDUSystemName')&(lldp1['Field']=='_type')].iloc[0,2])
            d2=int(lldp1.loc[(lldp1['Layer']=='LLDPDUSystemName')&(lldp1['Field']=='_length')].iloc[0,2])
            d3=lldp1.loc[(lldp1['Layer']=='LLDPDUSystemName')&(lldp1['Field']=='system_name')].iloc[0,2])
            e1=int(lldp1.loc[(lldp1['Layer']=='LLDPDUGenericOrganisationSpecific')&(lldp1['Field']=='_type')].iloc[0,2])
            e2=int(lldp1.loc[(lldp1['Layer']=='LLDPDUGenericOrganisationSpecific')&(lldp1['Field']=='_length')].iloc[0,2])
            e3=int(lldp1.loc[(lldp1['Layer']=='LLDPDUGenericOrganisationSpecific')&(lldp1['Field']=='org_code')].iloc[0,2])
            e4=int(lldp1.loc[(lldp1['Layer']=='LLDPDUGenericOrganisationSpecific')&(lldp1['Field']=='subtype')].iloc[0,2])
            e5=lldp1.loc[(lldp1['Layer']=='LLDPDUGenericOrganisationSpecific')&(lldp1['Field']=='data')].iloc[0,2])
            f1=int(lldp1.loc[(lldp1['Layer']=='LLDPDUGenericOrganisationSpecific')&(lldp1['Field']=='_type')].iloc[1,2])
            f2=int(lldp1.loc[(lldp1['Layer']=='LLDPDUGenericOrganisationSpecific')&(lldp1['Field']=='_length')].iloc[1,2])
            f3=int(lldp1.loc[(lldp1['Layer']=='LLDPDUGenericOrganisationSpecific')&(lldp1['Field']=='org_code')].iloc[1,2])
            f4=int(lldp1.loc[(lldp1['Layer']=='LLDPDUGenericOrganisationSpecific')&(lldp1['Field']=='subtype')].iloc[1,2])
            f5=lldp1.loc[(lldp1['Layer']=='LLDPDUGenericOrganisationSpecific')&(lldp1['Field']=='data')].iloc[1,2])
            g1=int(lldp1.loc[(lldp1['Layer']=='LLDPDUEndOfLLDPDU')&(lldp1['Field']=='_type')].iloc[0,2])
            g2=int(lldp1.loc[(lldp1['Layer']=='LLDPDUEndOfLLDPDU')&(lldp1['Field']=='_length')].iloc[0,2])
           
           
            l1 = LLDPDUChassisID(_type=a1,_length=a2,subtype=a3,family=a4,id=a5)
            l2 = LLDPDUPortID(_type=b1,_length=b2,subtype=b3,family=b4,id=str(b5))
            l3 = LLDPDUTimeToLive(_type=c1,_length=c2,ttl=c3)
            auxo=d3
            l4 = LLDPDUSystemName(_type=d1,_length=d2,system_name=auxo)
            auxo=e5
            l5 = LLDPDUGenericOrganisationSpecific(_type=e1,_length=e2,org_code=e3,subtype=e4,data=auxo)
            auxa=f5[2:-1]
            l6 = LLDPDUGenericOrganisationSpecific(_type=f1,_length=f2,org_code=f3,subtype=f4,data=auxa)
            l7 = LLDPDUEndOfLLDPDU(_type=0,_length=0)
            lldpu_layer = LLDPDU()
            lldpu_layer = l1/l2/l3/l4/l5/l6/l7
            
            pack = e/lldpu_layer
            
            flag = False
            sendp(pack,count=1, iface=ifa)
            flag = True
            lim = lim +1

            with open(log,'a') as lf:
                lf.write('read packet '+file+"\n")

我已经尝试修改数据类型、固定LLDPDUGenericOrganisationSpecific的data参数值,但都无法解决问题。目标是构造出与原始数据包完全一致、长度正确的LLDP数据包。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 07:40:38