Python 从数据包ISO/OSI层筛选PCAP文件

Python 从数据包ISO/OSI层筛选PCAP文件,python,pcap,scapy,application-layer,Python,Pcap,Scapy,Application Layer,我需要将一个PCAP文件拆分为两个不同的文件:第一个文件应包括(且仅限于)指向ISO/OSI模型应用层的所有数据包,而第二个文件包括所有其他数据包 我正在使用Scapy应用过滤器: pkts = PcapReader(infile) applayerpkts = (pkt for pkt in pkts if pkt.haslayer(Raw)) lowlayerspkts = (pkt for pkt in pkts if not pkt.haslayer(Raw)) wrpcap(appla

我需要将一个PCAP文件拆分为两个不同的文件:第一个文件应包括(且仅限于)指向ISO/OSI模型应用层的所有数据包,而第二个文件包括所有其他数据包

我正在使用Scapy应用过滤器:

pkts = PcapReader(infile)
applayerpkts = (pkt for pkt in pkts if pkt.haslayer(Raw))
lowlayerspkts = (pkt for pkt in pkts if not pkt.haslayer(Raw))
wrpcap(applayerfilename, applayerpkts)
wrpcap(lowlayersfilename, lowlayerspkts)
使用
pkt.haslayer(Raw)
方法,因为该层应该只包含在指向应用层的数据包中

有什么问题吗?我注意到,
applayerfilename
+
lowlayerfilename
(文件大小)的总和与
infle
的文件大小不同(更低)

由于
infle
被解析了两次,因此报告的方法在计算上也很昂贵(我得到了一个约1.5GB的PCAP列表)

我更喜欢应用不同的过滤器,一次解析输入PCAP。 我可以使用
PcapReader
类手动解析PCAP,但是我不知道如何生成一个PCAP来传递给
wrpcap(…)
方法

编辑: 我也尝试过这个解决方案:

pkts = PcapReader(infile)
app_pkts = []
low_pkts = []
for p in pkts:
    if p.haslayer(Raw):
        app_pkts.append(p)
    else:
        low_pkts.append(p)
wrpcap(applayerfilename, app_pkts)
wrpcap(lowlayersfilename, low_pkts)
但它不工作,因为它消耗了太多的内存,因为我的输入PCAP的大小

是否存在类似于
wrpcap(…)
函数的
append\u-to\u-pcap(filename,packet)
函数不作为append使用?

我(至少表面上)是这样解决的:

pkts = PcapReader(infile)

app_writer = PcapWriter(applayerfilename, append=True)
low_writer = PcapWriter(lowlayersfilename, append=True)
for p in pkts:
    if p.haslayer(Raw):
        app_writer.write(p)
    else:
        low_writer.write(p)
app_writer.close()
low_writer.close()