基于Python實(shí)現(xiàn)網(wǎng)絡(luò)流量監(jiān)控的方法詳解
一、目的
分析最近一段時(shí)間內(nèi)的網(wǎng)絡(luò)流量情況,以便更好地理解網(wǎng)絡(luò)使用情況、識(shí)別潛在問題并提出改進(jìn)建議。網(wǎng)絡(luò)流量監(jiān)控對(duì)于保障網(wǎng)絡(luò)穩(wěn)定性、優(yōu)化資源分配和提高性能具有重要意義。
二、監(jiān)控指標(biāo)
1.接收速率
接收速率是指單位時(shí)間內(nèi)接收數(shù)據(jù)的速度,通常以 Mbps(兆位每秒)或 KB/s(千字節(jié)每秒)表示。
2.發(fā)送速率
發(fā)送速率是指單位時(shí)間內(nèi)發(fā)送數(shù)據(jù)的速度,通常以 Mbps(兆位每秒)或 KB/s(千字節(jié)每秒)表示。
3.吞吐量
吞吐量是指網(wǎng)絡(luò)傳輸數(shù)據(jù)的總量,通常以 Mbps(兆位每秒)或 GB(千兆字節(jié))為單位。
4.丟包率
丟包率是指在傳輸過程中丟失的數(shù)據(jù)包的比例,通常以百分比或千分比表示。
當(dāng)然也根據(jù)自己的需求獲取更加精準(zhǔn)的數(shù)據(jù),以便更好知道自己電腦的網(wǎng)絡(luò)是否安全。
三、實(shí)驗(yàn)環(huán)境
操作系統(tǒng):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

四、功能實(shí)現(xiàn)
具體的思路如下:
1. 必要用到的庫:我們使用psutil庫來獲取網(wǎng)絡(luò)流量和系統(tǒng)信息,使用imet庫來計(jì)算時(shí)間間隔。
2. 設(shè)置初始值:記錄開始時(shí)間、初始接收字節(jié)數(shù)、初始發(fā)送字節(jié)數(shù)以及初始丟包數(shù)。
3. 進(jìn)入監(jiān)控循環(huán):使用`while True`進(jìn)入一個(gè)無限循環(huán),每次循環(huán)都會(huì)執(zhí)行以下步驟:
- 休眠一段時(shí)間:使用`time.sleep(interval)`來控制每次循環(huán)之間的時(shí)間間隔。
- 獲取當(dāng)前的網(wǎng)絡(luò)流量情況:使用`psutil.net_io_counters()`來獲取當(dāng)前的網(wǎng)絡(luò)輸入輸出計(jì)數(shù)器。
- 計(jì)算流量指標(biāo):計(jì)算從開始時(shí)間到當(dāng)前時(shí)間的時(shí)間間隔,然后根據(jù)時(shí)間間隔計(jì)算接收速率、發(fā)送速率和吞吐量。同時(shí),計(jì)算丟包率(100個(gè)包)。
- 打印監(jiān)控指標(biāo):使用`print`函數(shù)打印出接收速率、發(fā)送速率、吞吐量和丟包率。
- 更新初始值:將當(dāng)前的接收字節(jié)數(shù)、發(fā)送字節(jié)數(shù)和丟包數(shù)更新為下一次循環(huán)的初始值。
4. 主程序入口:使用monitor_network_traffic()來確保腳本在直接運(yùn)行時(shí)才執(zhí)行監(jiān)控函數(shù)。
#安裝pip pip是安裝python的第三方庫
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 # 接收端的丟包數(shù)
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 # 接收端的丟包數(shù)
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"每秒發(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()五、方法補(bǔ)充
網(wǎng)絡(luò)流量監(jiān)控是系統(tǒng)運(yùn)維、安全分析和應(yīng)用調(diào)試的重要手段。Python 憑借豐富的第三方庫,可以靈活實(shí)現(xiàn)從系統(tǒng)級(jí)統(tǒng)計(jì)到數(shù)據(jù)包級(jí)別的深度分析。本文將介紹四種主流的實(shí)現(xiàn)方法,并給出完整的代碼示例和適用場(chǎng)景。
1.使用 psutil 獲取系統(tǒng)網(wǎng)絡(luò) I/O 統(tǒng)計(jì)
適用場(chǎng)景:實(shí)時(shí)監(jiān)控本機(jī)網(wǎng)絡(luò)流量總量(上傳/下載速度、累計(jì)字節(jié)數(shù)),無需解析數(shù)據(jù)包內(nèi)容。
原理:psutil 讀取 /proc/net/dev(Linux)或性能計(jì)數(shù)器(Windows),返回每個(gè)網(wǎng)卡的累計(jì)收發(fā)字節(jié)數(shù)、包數(shù)等。
安裝
pip install psutil
示例代碼:實(shí)時(shí)顯示所有網(wǎng)卡的流量速率
import psutil
import time
def get_net_io():
"""獲取網(wǎng)絡(luò)I/O統(tǒng)計(jì)"""
net_io = psutil.net_io_counters(pernic=True)
return net_io
def format_speed(bytes_per_sec):
"""將字節(jié)/秒格式化為可讀單位"""
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):
"""監(jiān)控各網(wǎng)卡的實(shí)時(shí)帶寬"""
print("開始監(jiān)控網(wǎng)絡(luò)流量 (按 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監(jiān)控結(jié)束")
if __name__ == "__main__":
monitor_bandwidth()關(guān)鍵點(diǎn)
psutil.net_io_counters(pernic=True)返回字典,鍵為網(wǎng)卡名,值為snetio對(duì)象。- 計(jì)算差值除以時(shí)間間隔即得實(shí)時(shí)速率。
- 無需管理員權(quán)限,輕量級(jí),適合后臺(tái)常駐監(jiān)控。
2.使用 scapy 捕獲并分析數(shù)據(jù)包
適用場(chǎng)景:需要解析數(shù)據(jù)包頭部(如 IP、TCP、HTTP)、進(jìn)行協(xié)議分析或自定義過濾。
原理:scapy 可以工作在用戶態(tài),利用 pcap 或 socket 抓取鏈路層或網(wǎng)絡(luò)層數(shù)據(jù)包,并提供強(qiáng)大的協(xié)議解析能力。
安裝
pip install scapy
注意:在 Linux 下抓包可能需要 sudo 權(quán)限;Windows 需要安裝 Npcap 或 WinPcap。
示例代碼:捕獲并統(tǒng)計(jì) HTTP 請(qǐng)求
from scapy.all import sniff, IP, TCP, Raw
def packet_callback(packet):
"""回調(diào)函數(shù),處理每個(gè)捕獲的數(shù)據(jù)包"""
if IP in packet and TCP in packet:
tcp = packet[TCP]
# 檢查是否是 HTTP 請(qǐng)求(端口 80 或 8080)
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')
# 簡(jiǎn)單判斷是否為 HTTP 請(qǐng)求行
if payload.startswith('GET') or payload.startswith('POST'):
print(f"HTTP請(qǐng)求: {payload[:100]}...")
print(f"源IP: {packet[IP].src}:{tcp.sport} -> 目標(biāo)IP: {packet[IP].dst}:{tcp.dport}")
# 開始抓包(捕獲 100 個(gè)數(shù)據(jù)包,過濾 HTTP 流量)
sniff(filter="tcp port 80 or tcp port 8080", prn=packet_callback, count=100)關(guān)鍵點(diǎn)
sniff函數(shù)的filter參數(shù)使用 Berkeley Packet Filter (BPF) 語法,可以精確控制抓包范圍,避免過多無關(guān)數(shù)據(jù)。- 回調(diào)函數(shù)中對(duì)
Raw層的內(nèi)容進(jìn)行解析,可提取應(yīng)用層數(shù)據(jù)。 - 需要管理員/root 權(quán)限。
3.使用 pyshark 解析 PCAP 文件(離線分析)
適用場(chǎng)景:已有抓包文件(如 Wireshark 保存的 .pcap),需要自動(dòng)化分析或提取特征。
原理:pyshark 是 Wireshark 的 Python 封裝,利用 tshark 命令行解析 PCAP 文件,返回結(jié)構(gòu)化的數(shù)據(jù)包對(duì)象。
安裝
pip install pyshark
示例代碼:統(tǒng)計(jì) 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"共發(fā)現(xiàn) {len(connections)} 個(gè) TCP 連接")
for conn in list(connections)[:10]:
print(f"{conn[0]}:{conn[1]} -> {conn[2]}:{conn[3]}")
if __name__ == "__main__":
analyze_pcap("capture.pcap")關(guān)鍵點(diǎn)
FileCapture支持實(shí)時(shí)捕獲(使用LiveCapture)和離線文件。- 可以設(shè)置
display_filter為 Wireshark 過濾語法,如"tcp.port == 443"。 - 需要系統(tǒng)安裝 Wireshark(包含
tshark)。
4.使用 pydivert(Windows)進(jìn)行流量攔截和修改
適用場(chǎng)景:在 Windows 上實(shí)現(xiàn)類似防火墻的實(shí)時(shí)攔截、重定向或修改數(shù)據(jù)包內(nèi)容。
原理:pydivert 封裝了 Windows 的 WinDivert 驅(qū)動(dòng),可以捕獲、過濾、修改和重新注入網(wǎng)絡(luò)數(shù)據(jù)包。
安裝
pip install pydivert
示例代碼:記錄所有訪問 80 端口的流量并阻止
import pydivert
def block_http():
with pydivert.WinDivert("tcp.DstPort == 80 or tcp.SrcPort == 80") as w:
print("開始監(jiān)控并阻止 HTTP 流量...")
for packet in w:
print(f"攔截?cái)?shù)據(jù)包: {packet.src_addr}:{packet.src_port} -> {packet.dst_addr}:{packet.dst_port}")
# 直接丟棄數(shù)據(jù)包(不調(diào)用 packet.send())
# 若想放行,則調(diào)用 w.send(packet)
# 循環(huán)持續(xù)直到進(jìn)程終止
if __name__ == "__main__":
block_http()關(guān)鍵點(diǎn)
- 必須以管理員身份運(yùn)行腳本。
- WinDivert 驅(qū)動(dòng)需預(yù)先安裝(
pydivert安裝時(shí)會(huì)提示或自動(dòng)下載)。 - 支持 x64 和 x86 系統(tǒng)。
六、總結(jié)
網(wǎng)絡(luò)流量監(jiān)控對(duì)于維護(hù)網(wǎng)絡(luò)穩(wěn)定性、提高性能和優(yōu)化資源分配具有重要意義。定期進(jìn)行網(wǎng)絡(luò)流量監(jiān)控,并根據(jù)監(jiān)控結(jié)果進(jìn)行相應(yīng)的優(yōu)化和調(diào)整,以確保網(wǎng)絡(luò)的高效運(yùn)行
到此這篇關(guān)于基于Python實(shí)現(xiàn)網(wǎng)絡(luò)流量監(jiān)控的方法詳解的文章就介紹到這了,更多相關(guān)Python網(wǎng)絡(luò)流量監(jiān)控內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python flask sqlalchemy連接數(shù)據(jù)庫流程介紹
這篇文章主要介紹了python flask sqlalchemy連接數(shù)據(jù)庫流程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-09-09
Python?ChineseCalendar包主要類和方法詳解
ChineseCalendar?是一個(gè)?Python?包,用于獲取中國(guó)傳統(tǒng)日歷信息。這個(gè)包提供了中國(guó)農(nóng)歷、二十四節(jié)氣、傳統(tǒng)節(jié)日、黃歷等信息,這篇文章主要介紹了Python?ChineseCalendar包簡(jiǎn)介,需要的朋友可以參考下2023-03-03
jupyter notebook中新建cell的方法與快捷鍵操作
這篇文章主要介紹了jupyter notebook中新建cell的方法與快捷鍵操作,具有很好的參考價(jià)值,希望對(duì)有所幫助。一起跟隨小編過來看看吧2020-04-04
回歸預(yù)測(cè)分析python數(shù)據(jù)化運(yùn)營(yíng)線性回歸總結(jié)
本文主要介紹了python數(shù)據(jù)化運(yùn)營(yíng)中的線性回歸一般應(yīng)用場(chǎng)景,常用方法,回歸實(shí)現(xiàn),回歸評(píng)估指標(biāo),效果可視化等,并采用了回歸預(yù)測(cè)分析的數(shù)據(jù)預(yù)測(cè)方法2021-08-08
對(duì)pandas中iloc,loc取數(shù)據(jù)差別及按條件取值的方法詳解
今天小編就為大家分享一篇對(duì)pandas中iloc,loc取數(shù)據(jù)差別及按條件取值的方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-11-11
使用Python?matplotlib繪制簡(jiǎn)單的柱形圖、折線圖和直線圖
Matplotlib是Python的繪圖庫, 它可與NumPy一起使用,提供了一種有效的MatLab開源替代方案,下面這篇文章主要給大家介紹了關(guān)于使用Python?matplotlib繪制簡(jiǎn)單的柱形圖、折線圖和直線圖的相關(guān)資料,需要的朋友可以參考下2022-08-08
Python游戲開發(fā)之魔塔小游戲的實(shí)現(xiàn)
魔塔小游戲作為一款角色扮演RPG小游戲,一直深受大家的喜愛。本文將利用Python的cpgames模塊制作這一經(jīng)典小游戲,感興趣的可以跟隨小編一起動(dòng)手試一試2022-02-02
Python3.7基于hashlib和Crypto實(shí)現(xiàn)加簽驗(yàn)簽功能(實(shí)例代碼)
這篇文章主要介紹了Python3.7基于hashlib和Crypto實(shí)現(xiàn)加簽驗(yàn)簽功能,環(huán)境是基于python3.7,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12

