您好,我正在构建一个数据包分析工具。到目前为止,我的代码只是打开 pcap,解析它并关闭文件。我使用的代码改编自 dpkt 文档。我的 pcap 测试文件使用不同类型的流量(tcp、udp、igmp 和 http),我需要能够总结每个流量,理想情况下能够在出现新流量时自适应地识别流量类型。我需要包括每种类型的第一个和最后一个时间戳、平均数据包长度和数据包总数。抱歉,如果这是一个初学者问题,我真的很难使用 dpkt 文档,因为我对 python 还很陌生。目前我只是将输出设置为显示 src 和 dst IP、数据包长度和时间戳。帮助将不胜感激。
import dpkt
import datetime
import socket
import sys
import collections
def inet_string(inet):
try:
return socket.inet_ntop(socket.AF_INET, inet)
except ValueError:
return socket.inet_ntop(socket.AF_INET6, inet)
'''Function for printing the packet information'''
def print_packets(pcap):
for ts, buf in pcap:
# Print out the timestamp in UTC
print('Timestamp: ', str(datetime.datetime.utcfromtimestamp(ts)))
# Unpack the Ethernet frame
eth = dpkt.ethernet.Ethernet(buf)
# Make sure the Ethernet data contains an IP packet
if not isinstance(eth.data, dpkt.ip.IP):
print('Non IP Packet type not supported %s\n' % eth.data.__class__.__name__)
continue
# Unpack the IP packet
ip = eth.data
# Unpack TCP
tcp = ip.data
# Print out the info
print(f'{inet_string(ip.src)} -> {inet_string(ip.dst)} Packet Length: {ip.len}')
def main():
#Test Arguments
#sys.argv.append('packets1.pcap')
sys.argv.append('packets2.pcap')
with open(sys.argv[1], 'rb') as f:
pcap = dpkt.pcap.Reader(f)
print_packets(pcap)
if __name__ == '__main__':
main()