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对比示例

DataFrame数据
| Layer | Field | Value |
|---|---|---|
| Ethernet | dst | 01:23:00:00:00:01 |
| Ethernet | src | 32:cb:cd:7b:5a:47 |
| Ethernet | type | 35020 |
| LLDPDUChassisID | _type | 1 |
| LLDPDUChassisID | _length | 7 |
| LLDPDUChassisID | subtype | 4 |
| LLDPDUChassisID | family | None |
| LLDPDUChassisID | id | 00:00:00:00:00:01 |
| LLDPDUPortID | _type | 2 |
| LLDPDUPortID | _length | 2 |
| LLDPDUPortID | subtype | 7 |
| LLDPDUPortID | family | None |
| LLDPDUPortID | id | 1 |
| LLDPDUTimeToLive | _type | 3 |
| LLDPDUTimeToLive | _length | 2 |
| LLDPDUTimeToLive | ttl | 4919 |
| LLDPDUSystemName | _type | 5 |
| LLDPDUSystemName | _length | 10 |
| LLDPDUSystemName | system_name | openflow:1 |
| LLDPDUGenericOrganisationSpecific | _type | 127 |
| LLDPDUGenericOrganisationSpecific | _length | 16 |
| LLDPDUGenericOrganisationSpecific | org_code | 9953 |
| LLDPDUGenericOrganisationSpecific | subtype | 0 |
| LLDPDUGenericOrganisationSpecific | data | openflow:1:1 |
| LLDPDUGenericOrganisationSpecific | _type | 127 |
| LLDPDUGenericOrganisationSpecific | _length | 20 |
| LLDPDUGenericOrganisationSpecific | org_code | 9953 |
| LLDPDUGenericOrganisationSpecific | subtype | 1 |
| LLDPDUGenericOrganisationSpecific | data | b'`\xafE\x16\t\xa0#5\x02\x7f\xd5\p\xf7\x11A' | |
| LLDPDUEndOfLLDPDU | _type | 0 |
| LLDPDUEndOfLLDPDU | _length | 0 |
相关代码
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
相关产品推荐
相关产品推荐

