1

您好,我正在构建一个数据包分析工具。到目前为止,我的代码只是打开 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() 
4

0 回答 0