如何从CSV流量dump计算数据包大小并在Python中生成分布
从CSV流量dump计算数据包大小并生成Python分布
一、计算数据包大小的逻辑
CSV中的帧长度字段是核心依据,具体计算方式取决于你需要的是哪一层的数据包大小:
- 链路层总大小:直接使用CSV中的
帧长度值,这是抓包工具(如Wireshark)捕获的完整以太网帧字节数,包含14字节以太网头、IP/TCP/UDP数据、4字节CRC校验尾。 - IP层数据包大小:如果需要排除链路层开销,用
帧长度 - 18(14字节以太网头 + 4字节CRC);若抓包导出的帧长度不含CRC,仅减14字节即可。 - 传输层净荷大小:如果CSV中没有IP头长度字段,无法精确计算(IP头长度可变),只能基于IP层大小再减去20字节(IP头最小长度)估算。
注意:如果流量不是以太网链路(如PPP),链路层头部长度需对应调整(比如PPP是8字节)。
二、Python生成数据包大小分布的实现
依赖准备
先安装所需库:
pip install pandas matplotlib seaborn
完整代码示例(推荐用Pandas)
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # 1. 读取CSV流量文件 # 替换为你的CSV路径和实际帧长度列名(比如"frame_length") df = pd.read_csv("traffic_dump.csv") frame_len_col = "帧长度" # 2. 计算目标数据包大小(这里以链路层总大小为例) # 若需IP层大小,替换为 df["packet_size"] = df[frame_len_col] - 18 df["packet_size"] = df[frame_len_col].astype(int) # 3. 生成分布可视化 plt.figure(figsize=(10, 6)) # 直方图+密度曲线,bins可根据数据范围调整 sns.histplot(data=df, x="packet_size", kde=True, bins=50, edgecolor="black") plt.title("数据包大小分布") plt.xlabel("大小(字节)") plt.ylabel("数据包数量") plt.grid(axis="y", linestyle="--", alpha=0.7) # 保存图表或直接显示 plt.savefig("packet_size_dist.png") plt.show() # 输出统计指标(均值、中位数、分位数等) print("数据包大小统计:") print(df["packet_size"].describe())
轻量版(无Pandas,用原生CSV模块)
如果不想用Pandas,用Python标准库实现:
import csv import matplotlib.pyplot as plt packet_sizes = [] frame_len_col = "帧长度" # 读取CSV并提取有效帧长度 with open("traffic_dump.csv", "r", encoding="utf-8") as f: reader = csv.DictReader(f) for row in reader: try: # 转换为整数,跳过无效数据 size = int(row[frame_len_col]) packet_sizes.append(size) except (ValueError, KeyError): continue # 绘制直方图 plt.figure(figsize=(10, 6)) plt.hist(packet_sizes, bins=50, edgecolor="black", density=True) plt.title("数据包大小分布") plt.xlabel("大小(字节)") plt.ylabel("概率密度") plt.grid(axis="y", linestyle="--", alpha=0.7) plt.show()
内容的提问来源于stack exchange,提问作者Steamer
相关产品推荐
相关产品推荐

