如何基于UGR16数据集绘制网络流量连接可视化并识别异常
可视化类型名称
你提到的该类网络流量可视化正式名称为时序流连接散点图(业内也常称为NetFlow交互瀑布图),核心逻辑是将单条网络流作为最小可视化单元,通常横轴映射流的发生时间,纵轴映射源/目的IP、端口或流量大小,通过颜色区分流量协议、标签,可直观呈现流量时间分布规律、突发现象。
基于UGR16数据集的绘制方法
你现有代码已经完成了数据集下载、字段重命名,可按以下步骤补充实现适配异常分析的该类可视化:
- 首先将时间列转为pandas可识别的datetime格式,方便后续按时间窗口做聚合计算
- 确定维度映射规则:异常分析场景下,通常横轴取时间,纵轴取目的端口/流量字节数,颜色映射流量标签区分正常/异常
- 可按观测窗口(如你提到的5分钟)先做聚合统计绘制流量整体时序图,再绘制单流级别的散点图定位异常特征
补充实现代码
接在你现有代码之后运行即可:
import matplotlib.dates as mdates # 时间字段格式转换 df['Date_time'] = pd.to_datetime(df['Date_time'], format='%Y-%m-%d %H:%M:%S') df = df.set_index('Date_time') # 1. 绘制5分钟窗口聚合的流量突发检测图 window_stats = df.resample('5T').agg( total_mb = ('Bytes', lambda x: sum(x)/1024/1024), abnormal_ratio = ('Label', lambda x: sum(x != 'normal')/len(x)) ).reset_index() fig, ax = plt.subplots(figsize=(16,7)) ax.plot(window_stats['Date_time'], window_stats['total_mb'], c='grey', label='总流量(MB)') # 标注异常突发窗口(异常占比超30%判定为突发) abnormal_points = window_stats[window_stats['abnormal_ratio'] > 0.3] ax.scatter(abnormal_points['Date_time'], abnormal_points['total_mb'], c='red', s=120, label='异常流量突发') ax.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d %H:%M')) plt.xticks(rotation=45) plt.xlabel('时间') plt.ylabel('流量大小') plt.legend() plt.tight_layout() plt.show() # 2. 绘制单流级别的时序连接散点图,和论文示例一致 fig, ax = plt.subplots(figsize=(20,10)) normal = df[df['Label'] == 'normal'] abnormal = df[df['Label'] != 'normal'] ax.scatter(normal.index, normal['Destination_Port'], c='blue', s=2, alpha=0.3, label='正常流量') ax.scatter(abnormal.index, abnormal['Destination_Port'], c='red', s=4, alpha=0.7, label='异常流量') ax.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d %H:%M')) plt.xticks(rotation=45) plt.xlabel('时间') plt.ylabel('目的端口') plt.legend() plt.tight_layout() plt.show()
8月1日5分钟窗口异常详情
你提到的两次突发对应的标签和特征如下:
- 第2次流量突发:对应SSH暴力破解扫描,特征为短时间内大量源IP向目标网段的22端口发起短连接,单流包数少、持续时间短,数据集对应标签为
scan_ssh - 第5次流量突发:对应UDP洪范DDoS攻击,特征为大量随机源IP向目标地址发送小字节UDP包,带宽占用短时间内陡增,数据集对应标签为
dos_udp
内容的提问来源于stack exchange,提问作者Mario
相关产品推荐
相关产品推荐

