发布于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

思路其实很直接:
1. 用到的库:用 psutil 获取网络流量和系统信息,用 time 计算时间间隔。
2. 设初始值:记录开始时间、初始接收字节数、发送字节数以及丢包数。
3. 进入监控循环:用 while True 开启无限循环。每次循环做这几件事:
time.sleep(interval) 控制每次循环的间隔。psutil.net_io_counters() 抓取当前收发计数器。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 因为丰富的第三方库,能灵活地搞定从系统级统计到数据包深度分析的各种任务。下面介绍四种主流实现方法,各自有适用的场景。
适用场景:实时监控本机网络流量总量(上传/下载速度、累计字节数),不需要解析数据包内容。
原理: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 对象。适用场景:需要解析数据包头部(比如 IP、TCP、HTTP)、做协议分析或自定义过滤。
原理:scapy 在用户态工作,利用 pcap 或 socket 抓取链路层或网络层数据包,解析能力非常强大。
安装
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)
关键点
sniff 的 filter 参数使用 BPF 语法,能精确控制抓包范围。Raw 层内容,提取应用层数据。适用场景:手里已有抓包文件(比如 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 过滤语法。tshark)。适用场景:在 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()
关键点
pydivert 安装时会提示或自动下载)。网络流量监控对维护网络稳定性、提升性能、优化资源分配,都是实打实的关键手段。定期做一下监控,再根据结果做相应的调优,网络才能跑得又快又稳。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8