最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Python實(shí)現(xiàn)網(wǎng)絡(luò)流量監(jiān)控的方法詳解

 更新時(shí)間:2026年04月23日 08:59:13   作者:zkic1  
本文主要介紹了一種使用Python和psutil庫在KaliLinux環(huán)境下監(jiān)控網(wǎng)絡(luò)流量的方法,包括接收速率、發(fā)送速率、吞吐量和丟包率的計(jì)算,旨在提升網(wǎng)絡(luò)性能和穩(wěn)定性,通過實(shí)時(shí)監(jiān)控并根據(jù)結(jié)果進(jìn)行調(diào)整,確保網(wǎng)絡(luò)高效運(yùn)行,希望對(duì)大家有所幫助

一、目的

分析最近一段時(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)文章

最新評(píng)論

赤峰市| 巴彦淖尔市| 鄂温| 无锡市| 固镇县| 收藏| 湘阴县| 宁乡县| 辽源市| 丰顺县| 宁强县| 青浦区| 江阴市| 绩溪县| 舞钢市| 平和县| 漯河市| 阳西县| 桃源县| 肥东县| 大同市| 镇巴县| 贞丰县| 九寨沟县| 邯郸县| 南部县| 江口县| 永靖县| 临西县| 浦县| 宜春市| 呼伦贝尔市| 锦屏县| 德保县| 普陀区| 同德县| 惠东县| 社会| 金华市| 喀喇| 喀喇沁旗|