商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > 基于Python实现网络流量监控的方法详解

基于Python实现网络流量监控的方法详解

  发布于2026-07-14 阅读(0)

扫一扫,手机访问

一、目的

网络流量监控这事儿,说白了就是搞清楚数据到底在怎么跑,跑得顺不顺。定期分析流量情况,能帮我们摸清网络使用模式、揪出潜伏的问题,然后把资源分配调优。这对于保障网络那种“稳如老狗”的状态,意义可不小。

二、监控指标

那么,具体要看哪些指标呢?

1.接收速率

单位时间内接收数据的速度,通常用 Mbps 或 KB/s 表示。

2.发送速率

顾名思义,单位时间内发送数据的速度,也用 Mbps 或 KB/s 表示。

3.吞吐量

网络传输数据的总量,单位是 Mbps 或 GB。

4.丢包率

传输过程中丢失数据包的比例,用百分比或千分比表示。

当然,如果对特定应用或服务有更精确的监控需求,也可以调整采集参数,比如检查特定端口的流量,来确认网络是否安全。

三、实验环境

整个实验跑在下面这套配置上:

操作系统:kali Linux z 6.5.0-kali3-amd64

语言版本:Python 3.11.8 (main, Feb 7 2024, 21:52:08) [GCC 13.2.0] on linux

基于Python实现网络流量监控的方法详解

四、功能实现

思路其实很直接:

1. 用到的库:用 psutil 获取网络流量和系统信息,用 time 计算时间间隔。

2. 设初始值:记录开始时间、初始接收字节数、发送字节数以及丢包数。

3. 进入监控循环:用 while True 开启无限循环。每次循环做这几件事:

  • 休眠:用 time.sleep(interval) 控制每次循环的间隔。
  • 获取当前网络流量:用 psutil.net_io_counters() 抓取当前收发计数器。
  • 算指标:计算时间间隔内的接收速率、发送速率、吞吐量和丢包率(100个包)。
  • 打印结果:把算出的指标打出来。
  • 更新初始值:为下次循环做好准备。

4. 主入口:通过 monitor_network_traffic() 确保脚本独立运行时才执行监控函数。

#安装pip
apt-get install python3-pip
pip install psutil   //安装第三方库
具体代码: 
   import psutil
   import time
def monitor_network_traffic(interval=1):
    start_time = time.time()
    start_io = psutil.net_io_counters()
    start_rx = start_io.bytes_recv
    start_tx = start_io.bytes_sent
    start_drop = start_io.dropin  # 接收端丢包数
    while True:
        time.sleep(interval)
        end_io = psutil.net_io_counters()
        end_rx = end_io.bytes_recv
        end_tx = end_io.bytes_sent
        end_drop = end_io.dropin
        duration = time.time() - start_time
        rx_speed = (end_rx - start_rx) / duration
        tx_speed = (end_tx - start_tx) / duration
        packet_loss = (end_drop - start_drop) / 100  # 丢包率(100包)
        print(f"每秒接收速率: {rx_speed:.2f} bytes/s")
        print(f"每秒发送速率: {tx_speed:.2f} bytes/s")
        print(f"吞吐量: {(rx_speed + tx_speed):.2f} bytes/s")
        print(f"丢包率(100包): {packet_loss:.2%}")
        start_rx = end_rx
        start_tx = end_tx
        start_drop = end_drop
monitor_network_traffic()

五、方法补充

网络流量监控在系统运维、安全分析和应用调试中都是个高频需求。Python 因为丰富的第三方库,能灵活地搞定从系统级统计到数据包深度分析的各种任务。下面介绍四种主流实现方法,各自有适用的场景。

1.使用 psutil 获取系统网络 I/O 统计

适用场景:实时监控本机网络流量总量(上传/下载速度、累计字节数),不需要解析数据包内容。

原理psutil 底层读取的是 /proc/net/dev(Linux)或 Windows 的性能计数器,返回每个网卡的累计收发字节数、包数等。

安装

pip install psutil

示例代码:实时显示所有网卡的流量速率

import psutil
import time
def get_net_io():
    net_io = psutil.net_io_counters(pernic=True)
    return net_io
def format_speed(bytes_per_sec):
    for unit in ['B', 'KB', 'MB', 'GB']:
        if bytes_per_sec < 1024:
            return f"{bytes_per_sec:.2f} {unit}/s"
        bytes_per_sec /= 1024
    return f"{bytes_per_sec:.2f} TB/s"
def monitor_bandwidth(interval=1):
    print("开始监控网络流量 (按 Ctrl+C 停止)...")
    prev = get_net_io()
    try:
        while True:
            time.sleep(interval)
            curr = get_net_io()
            for nic, curr_stats in curr.items():
                prev_stats = prev.get(nic)
                if not prev_stats:
                    continue
                sent_rate = (curr_stats.bytes_sent - prev_stats.bytes_sent) / interval
                recv_rate = (curr_stats.bytes_recv - prev_stats.bytes_recv) / interval
                print(f"{nic}: 上传 {format_speed(sent_rate)} | 下载 {format_speed(recv_rate)}")
            prev = curr
    except KeyboardInterrupt:
        print("\n监控结束")
if __name__ == "__main__":
    monitor_bandwidth()

关键点

  • psutil.net_io_counters(pernic=True) 返回一个字典,键是网卡名,值是 snetio 对象。
  • 算实时速率,就是拿当前值减上次值,再除以时间间隔。
  • 不需要管理员权限,非常轻量,很适合后台常驻监控。

2.使用 scapy 捕获并分析数据包

适用场景:需要解析数据包头部(比如 IP、TCP、HTTP)、做协议分析或自定义过滤。

原理scapy 在用户态工作,利用 pcapsocket 抓取链路层或网络层数据包,解析能力非常强大。

安装

pip install scapy

注意:Linux 下抓包通常需要 sudo 权限;Windows 则需要安装 Npcap 或 WinPcap。

示例代码:捕获并统计 HTTP 请求

from scapy.all import sniff, IP, TCP, Raw
def packet_callback(packet):
    if IP in packet and TCP in packet:
        tcp = packet[TCP]
        if tcp.dport in [80, 8080] or tcp.sport in [80, 8080]:
            if Raw in packet:
                payload = packet[Raw].load.decode('utf-8', errors='ignore')
                if payload.startswith('GET') or payload.startswith('POST'):
                    print(f"HTTP请求: {payload[:100]}...")
                    print(f"源IP: {packet[IP].src}:{tcp.sport} -> 目标IP: {packet[IP].dst}:{tcp.dport}")
sniff(filter="tcp port 80 or tcp port 8080", prn=packet_callback, count=100)

关键点

  • snifffilter 参数使用 BPF 语法,能精确控制抓包范围。
  • 回调函数可以解析 Raw 层内容,提取应用层数据。
  • 需要管理员/root 权限。

3.使用 pyshark 解析 PCAP 文件(离线分析)

适用场景:手里已有抓包文件(比如 Wireshark 保存的 .pcap),需要自动化分析或提取特征。

原理pyshark 是 Wireshark 的 Python 封装,通过 tshark 命令行解析 PCAP 文件,返回结构化的数据包对象。

安装

pip install pyshark

示例代码:统计 PCAP 文件中的 TCP 连接

import pyshark
def analyze_pcap(pcap_file):
    cap = pyshark.FileCapture(pcap_file, display_filter="tcp")
    connections = set()
    for packet in cap:
        try:
            src = packet.ip.src
            dst = packet.ip.dst
            sport = packet.tcp.srcport
            dport = packet.tcp.dstport
            connections.add((src, sport, dst, dport))
        except AttributeError:
            continue
    cap.close()
    print(f"共发现 {len(connections)} 个 TCP 连接")
    for conn in list(connections)[:10]:
        print(f"{conn[0]}:{conn[1]} -> {conn[2]}:{conn[3]}")
if __name__ == "__main__":
    analyze_pcap("capture.pcap")

关键点

  • FileCapture 支持离线文件分析,LiveCapture 可以用于实时捕获。
  • 可以设置 display_filter 用 Wireshark 过滤语法。
  • 系统需要安装 Wireshark(包含 tshark)。

4.使用 pydivert(Windows)进行流量拦截和修改

适用场景:在 Windows 上实现类似防火墙的实时拦截、重定向或修改数据包内容。

原理pydivert 封装了 Windows 的 WinDivert 驱动,可以捕获、过滤、修改和重新注入网络数据包。

安装

pip install pydivert

示例代码:记录所有访问 80 端口的流量并阻止

import pydivert
def block_http():
    with pydivert.WinDivert("tcp.DstPort == 80 or tcp.SrcPort == 80") as w:
        print("开始监控并阻止 HTTP 流量...")
        for packet in w:
            print(f"拦截数据包: {packet.src_addr}:{packet.src_port} -> {packet.dst_addr}:{packet.dst_port}")
if __name__ == "__main__":
    block_http()

关键点

  • 必须以管理员身份运行脚本。
  • WinDivert 驱动需预先安装(pydivert 安装时会提示或自动下载)。
  • 同时支持 x64 和 x86 系统。

六、总结

网络流量监控对维护网络稳定性、提升性能、优化资源分配,都是实打实的关键手段。定期做一下监控,再根据结果做相应的调优,网络才能跑得又快又稳。

本文转载于:https://www.jb51.net/python/362667xuk.htm 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注