在 Python 中处理大量网络数据包的最佳方法是什么?
What is the best way to process large amount of network packets in Python?
我正在研究恶意软件检测系统。为了制作受感染系统行为的模型,我需要处理来自 Pcap 文件的大量数据包,将它们分组到流中(具有相同 IP 的数据包、源端口和目标端口),然后从这些流中提取一些特征。
我正在使用 DPKT 来解析和读取数据包中的信息。我的问题是关于进行分组过程的最有效方法。我已经开始使用 PostgreSQL 数据库,查询是否存在包含包信息的流,并将其添加到流中或创建一个新流。但我认为这种方法效率很低,所以我要求其他替代方法,例如使用内存结构、改进数据库或任何其他方法。
如果数据适合内存,那么 pythons dict
数据结构似乎非常高效,尤其是速度方面。
解决问题的一种方法是使用 Counter
class ,它是 dict:
的子class
from collections import Counter
grouped = Counter()
with open('packets.txt') as f:
for line in f:
src_ip, src_port, dst_ip, dst_port = ... # extract the ip address
key = "{}--{}--{}--{}".format(src_ip, src_port, dst_ip, dest_port)
grouped[key] += 1
most_common_combinations = grouped.most_common()
我正在研究恶意软件检测系统。为了制作受感染系统行为的模型,我需要处理来自 Pcap 文件的大量数据包,将它们分组到流中(具有相同 IP 的数据包、源端口和目标端口),然后从这些流中提取一些特征。
我正在使用 DPKT 来解析和读取数据包中的信息。我的问题是关于进行分组过程的最有效方法。我已经开始使用 PostgreSQL 数据库,查询是否存在包含包信息的流,并将其添加到流中或创建一个新流。但我认为这种方法效率很低,所以我要求其他替代方法,例如使用内存结构、改进数据库或任何其他方法。
如果数据适合内存,那么 pythons dict
数据结构似乎非常高效,尤其是速度方面。
解决问题的一种方法是使用 Counter
class ,它是 dict:
from collections import Counter
grouped = Counter()
with open('packets.txt') as f:
for line in f:
src_ip, src_port, dst_ip, dst_port = ... # extract the ip address
key = "{}--{}--{}--{}".format(src_ip, src_port, dst_ip, dest_port)
grouped[key] += 1
most_common_combinations = grouped.most_common()