我想使用Scapy计算来自PCAP文件的数据包的有效负载大小,下面是我找到一个执行此操作并计算出所有有效负载大小统计信息的函数,例如中位数/最小/最大等。
如何在我的PCAP文件上使用此功能,并且在使用此功能处理PCAP文件之前,我需要对我的PCAP文件做任何事情。
这可以写得更简单吗?
def calc_IP_payload_size_features(packet_list, filter_con):
global IP_len
global IP_len_list
global slice_length
IP_len_list = []
for i, (packet, dev_name) in enumerate(packet_list):
try:
IP_len.append(packet["IP"].len - packet["IP"].ihl)
except IndexError:
# IP_len.append(0)
pass
yield packet, dev_name
# print("IP_len", IP_len)
IP_len_list.append(IP_len)
IP_len = []
for i, (data) in enumerate(IP_len_list):
if len(data) == 0:
data.append(0)
data = data[:min(slice_length, len(data)-1)]
min_ip_len = min(data) # minimum IP packet size
max_ip_len = max(data) # maximum IP packet size
q1_ip_len = np.percentile(data, 25) # first quartile of IP packet size
median_ip_len = np.percentile(data, 50) # median of IP packet size
mean_ip_len = np.mean(data) # mean of IP packet size
q3_ip_len = np.percentile(data, 75) # third quartile of IP packet size
var_ip_len = np.var(data) # variance of IP packet size
iqr_ip_len = q3_ip_len - q1_ip_len # IQR of IP packet size
# print(i, "IP payload size features: ", min_ip_len, max_ip_len, q1_ip_len, median_ip_len, mean_ip_len, q3_ip_len, var_ip_len, iqr_ip_len)
feature_list[i].append(min_ip_len)
feature_list[i].append(max_ip_len)
feature_list[i].append(q1_ip_len)
feature_list[i].append(median_ip_len)
feature_list[i].append(mean_ip_len)
feature_list[i].append(q3_ip_len)
feature_list[i].append(var_ip_len)
feature_list[i].append(iqr_ip_len)
答案 0 :(得分:0)
您可以像这样用scapy读取pcap文件:
pcap_contents = rdpcap("/path/to/foo.pcap")
来源:https://scapy.readthedocs.io/en/latest/usage.html#reading-pcap-files
这将返回一个scapy.plist.PacketList
,您可以使用标准Python技术(例如,一个for
循环)对其进行迭代:
for packet in pcap_contents:
print(len(packet))
但是,您的循环似乎期望packet_list
包含(packet, dev_name)
的元组:
for i, (packet, dev_name) in enumerate(packet_list):
我的随机样本pcap文件当然不会产生这种数据,因此您可能需要首先将每个数据包与dev_name
匹配,以产生(packet, dev_name)
tuple
的列表s。这可以使用标准的Python方法来完成,例如for
循环,或者,如果您有dev_names
索引匹配的列表,则可以zip
列表:
packets = [IP()/TCP(), IP()/UDP()]
dev_names = ['foo', 'bar']
packet_list = zip(packets, dev_names)
filter_con
似乎没有被使用,所以我无法对此发表评论。