使用python来统计网卡数据流量

先使用工具tcpdump或是wireshark抓取pcap文件保存下来,再使用python来分析

from scapy.all import rdpcap, IP, TCP, UDP
from collections import defaultdict
import argparse
import sys
#按目的IP地址统计流量
def analyze_pcap_by_dst_ip(pcap_file, verbose=False):
    """
    按目的IP统计PCAP文件流量
    :param pcap_file: PCAP文件路径
    :param verbose: 是否显示解析进度
    :return: (总流量字典, 协议流量字典)
    """
    dst_traffic = defaultdict(int)          # 目的IP总流量 {ip: bytes}
    proto_traffic = defaultdict(int)         # 按协议统计流量 {协议: bytes}
    
    try:
        packets = rdpcap(pcap_file)          # 读取PCAP文件
        total_packets = len(packets)
        
        for i, packet in enumerate(packets):
            if verbose and i % 1000 == 0:    # 每1000个包显示进度
                print(f"解析进度: {i}/{total_packets} 数据包...")
                
            if IP in packet:
                dst_ip = packet[IP].dst
                packet_size = len(packet)     # 获取数据包字节数
                
                # 统计目的IP流量
                dst_traffic[dst_ip] += packet_size
                
                # 按协议统计 (TCP/UDP/其他)
                if TCP in packet:
                    proto_traffic["TCP"] += packet_size
                elif UDP in packet:
                    proto_traffic["UDP"] += packet_size
                else:
                    proto_traffic["Other"] += packet_size
                    
    except Exception as e:
        print(f"解析失败: {str(e)}", file=sys.stderr)
        sys.exit(1)
        
    return dst_traffic, proto_traffic

def export_results(dst_traffic, proto_traffic, output_file=None):
    """
    输出统计结果(控制台或文件)
    :param dst_traffic: 目的IP流量字典
    :param proto_traffic: 协议流量字典
    :param output_file: 输出文件路径(可选)
    """
    # 按流量从大到小排序
    sorted_traffic = sorted(dst_traffic.items(), key=lambda x: x[1], reverse=True)
    
    result = []
    result.append("============ 目的IP流量统计 ============")
    result.append(f"{'目的IP':<20} {'流量(bytes)':>15}")
    result.append("-" * 40)
    for ip, traffic in sorted_traffic:
        result.append(f"{ip:<20} {traffic:>15}")
    
    result.append("\n============== 协议流量统计 =============")
    for proto, traffic in proto_traffic.items():
        result.append(f"{proto + ':':<10} {traffic:>15} bytes")
    
    # 输出到控制台或文件
    output = "\n".join(result)
    if output_file:
        with open(output_file, 'w') as f:
            f.write(output)
        print(f"结果已导出至: {output_file}")
    else:
        print(output)

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="PCAP流量分析 - 按目的IP统计")
    parser.add_argument("pcap_file", help="PCAP文件路径")
    parser.add_argument("--output", "-o", help="结果输出文件(可选)")
    parser.add_argument("--verbose", "-v", action="store_true", help="显示详细解析进度")
    args = parser.parse_args()
    
    dst_traffic, proto_traffic = analyze_pcap_by_dst_ip(args.pcap_file, args.verbose)
    export_results(dst_traffic, proto_traffic, args.output)

运行结果

### 如何使用 Python 和 psutil 库监控网络流量 为了实现对网络流量的监控,可以利用 `psutil` 提供的功能。具体来说,可以通过调用 `psutil.net_io_counters()` 方法获取当前系统的网络接口流量统计数据[^1]。 以下是完整的实现方法以及示例代码: #### 示例代码 以下代码展示了如何定期监控网络接口的发送和接收字节数量,并计算每秒的流量变化。 ```python import psutil import time def get_network_stats(): """ 获取当前网络接口的流量统计 """ net_io = psutil.net_io_counters() return net_io.bytes_sent, net_io.bytes_recv def calculate_traffic(start_bytes_sent, start_bytes_recv): """ 计算两次采样之间的流量差值 """ current_bytes_sent, current_bytes_recv = get_network_stats() sent_diff = current_bytes_sent - start_bytes_sent recv_diff = current_bytes_recv - start_bytes_recv return sent_diff, recv_diff def monitor_network(interval=1): """ 实时监控网络流量 """ print("开始监控网络流量...") bytes_sent, bytes_recv = get_network_stats() try: while True: time.sleep(interval) sent_diff, recv_diff = calculate_traffic(bytes_sent, bytes_recv) bytes_sent, bytes_recv = get_network_stats() # 更新初始值 print(f"发送速率: {sent_diff / interval:.2f} B/s | 接收速率: {recv_diff / interval:.2f} B/s") except KeyboardInterrupt: print("监控已停止") if __name__ == "__main__": monitor_network(2) # 每隔两秒刷新一次数据 ``` 上述代码实现了以下几个功能: - 使用 `psutil.net_io_counters()` 获取当前网络接口的总发送和接收字节数。 - 定义了一个函数 `calculate_traffic` 来计算两个时间点之间发送和接收的数据差异。 - 主循环中每隔指定的时间间隔打印出单位时间内发送和接收的平均速率。 #### 功能扩展 如果需要更复杂的监控场景,还可以结合其他 `psutil` 函数进一步增强功能。例如: - **监控特定网卡**:通过 `psutil.net_io_counters(pernic=True)` 可以分别获取各个网卡的流量统计[^4]。 - **记录历史数据**:将每次采集到的流量数据保存至文件或数据库以便后续分析。 - **触发警报机制**:当检测到异常高的流量时发出警告通知。 #### 注意事项 运行此脚本可能需要管理员权限才能访问某些敏感信息。此外,在实际部署过程中可以根据需求调整采样的频率以平衡精度与性能消耗。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值