20243409 《Python程序设计》综合实践报告

20243408 2025-2026-2 《Python程序设计》综合实践报告

课程:《Python程序设计》
班级: 2434
姓名: 胡谐
学号:20243409
实验教师:王志强
实验日期:2026年5月10日
必修/选修: 公选课

本项目代码已经托管至gitee,链接为 https://gitee.com/hu-xie/DDos
演示视频 https://www.bilibili.com/video/BV1auJp6PEP4/?vd_source=53f363b43d76c6b3f050f17a3e5e1f13

一、实验内容

1.1 实验背景

分布式拒绝服务攻击(DDoS)是当今互联网面临的最严峻的安全威胁之一。攻击者通过控制大量傀儡主机向目标服务器发送海量请求,耗尽目标的计算资源、带宽资源或连接资源,导致合法用户无法正常访问服务。随着物联网设备的普及和僵尸网络的规模化发展,DDoS攻击的规模和复杂度都在持续增长。深度学习技术能够自动从海量数据中学习复杂的特征模式,实现更准确、更鲁棒的攻击检测与分类。基于此,本实验设计并实现了一个基于深度学习的DDoS攻击类型分类与溯源辅助系统。

1.2 程序功能

本程序旨在实现以下五个核心功能:

功能一:数据预处理。 自动读取CIC-DDoS2019数据集的CSV文件,进行数据清洗、特征标准化和标签编码,生成可供模型训练的标准格式数据。

功能二:模型训练。 基于深度神经网络(CNN+LSTM混合模型)对预处理后的数据进行训练,实现对12种不同类型DDoS攻击的分类识别。

功能三:溯源分析。 对分类结果进行统计分析,定位主要攻击源IP,分析攻击类型分布,生成可视化图表,为安全运维提供决策支持。

功能四:在线抓包检测。 实时捕获网络数据包,提取流量特征,调用训练好的模型进行实时攻击检测,并在控制台输出告警信息。

功能五:Web可视化展示。 通过Flask框架构建Web界面,展示系统状态、攻击类型分布、Top攻击源IP等信息,并提供RESTful API接口。

1.3 实验环境

项目 配置
操作系统 Windows 11
CPU Intel Core i5
内存 16 GB
Python版本 3.13
深度学习框架 PyTorch
网络抓包库 Scapy
Web框架 Flask
数据集 CIC-DDoS2019

二、实验过程

2.1 系统架构

系统采用模块化设计,分为5个核心模块,各模块之间通过标准数据格式进行通信。


数据预处理模块(process.py)
读取CSV → 清洗 → 编码 → 标准化 → 划分数据集


模型训练模块(train.py)
CNN+LSTM构建 → 训练 → 评估 → 保存模型(train.npz)


溯源分析模块(trace.py)
加载数据 → 统计攻击源IP → 生成分析图表


在线检测模块(capture.py)
实时抓包 → 特征提取 → 模型推理


网页展示模块(web.py)
模型推理 → Web展示


2.2 数据预处理模块实现

数据预处理是整个系统的基础环节。程序首先遍历指定目录下的所有CSV文件,每个文件读取前100,000行并合并成一个完整的数据集。接着对数据进行清洗,去除无穷大值和缺失值以保证数据质量。然后使用LabelEncoder将文本形式的攻击类型标签转换为数字编码,便于模型处理。之后选择所有数值型特征列,排除无关的索引列,并使用StandardScaler进行标准化处理,使各特征处于相同的量纲范围。最后按照8:2的比例划分训练集和测试集,采用分层抽样策略保持各类别样本分布一致,并将处理结果保存为train.npz文件供后续训练使用。

核心功能代码:

python

def load_and_merge(data_dir, sample_rows=1000):
    """读取并合并多个CSV文件"""
    dfs = []
    for f in os.listdir(data_dir):
        if f.endswith(".csv"):
            filepath = os.path.join(data_dir, f)
            df = pd.read_csv(filepath, low_memory=False, nrows=sample_rows)
            dfs.append(df)
    return pd.concat(dfs, ignore_index=True)

def preprocess():
    # 1. 加载数据
    df = load_and_merge(DATA_DIR)
    
    # 2. 清洗数据
    df.replace([np.inf, -np.inf], np.nan, inplace=True)
    df.dropna(inplace=True)
    
    # 3. 标签编码
    le = LabelEncoder()
    df["y"] = le.fit_transform(df[" Label"])
    
    # 4. 特征标准化
    scaler = StandardScaler()
    X = scaler.fit_transform(X)
    
    # 5. 划分数据集
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.2, stratify=y
    )
    
    # 6. 保存预处理结果
    np.savez("train.npz", X_train=X_train, X_test=X_test,
             y_train=y_train, y_test=y_test, class_names=le.classes_)

2.3 模型训练模块实现

模型训练模块构建并训练了一个CNN+LSTM混合神经网络,用于对12种不同类型的DDoS攻击进行分类识别。模型结构包含三个部分:首先是CNN层,由两层一维卷积神经网络组成,每层后接批量归一化、ReLU激活函数和Dropout正则化,用于从网络流量特征中提取局部模式;其次是LSTM层,包含64个隐藏单元的单向长短期记忆网络,用于捕捉特征之间的时序依赖关系;最后是全连接分类头,将LSTM输出的特征映射到12个类别上。训练过程中使用Adam优化器,学习率设为0.001,批量大小为256,总共训练50个轮次。

模型架构:

层序号 层类型 输入维度 输出维度 参数
1 Conv1D 81 64 kernel=3, padding=1
2 BatchNorm1d 64 64 -
3 ReLU + Dropout 64 64 rate=0.3
4 Conv1D 64 128 kernel=3, padding=1
5 BatchNorm1d 128 128 -
6 ReLU + AdaptiveAvgPool 128 128 -
7 LSTM 128 64 bidirectional=False
8 Linear 640 128 -
9 ReLU + Dropout 128 128 rate=0.5
10 Linear 128 12 输出层

训练配置:

超参数 数值
批量大小 256
训练轮数 30
学习率 0.001
优化器 Adam
损失函数 CrossEntropyLoss

python

class CNN_LSTM(nn.Module):
    def __init__(self, feature_dim, num_classes, seq_len=10):
        super().__init__()
        self.seq_len = seq_len
        self.feature_dim = feature_dim

        # CNN 层:提取局部特征
        self.cnn = nn.Sequential(
            nn.Conv1d(feature_dim, 64, kernel_size=3, padding=1),
            nn.BatchNorm1d(64),
            nn.ReLU(),
            nn.Dropout(0.3),
            nn.Conv1d(64, 128, kernel_size=3, padding=1),
            nn.BatchNorm1d(128),
            nn.ReLU(),
            nn.AdaptiveAvgPool1d(seq_len)
        )

        # LSTM 层:捕捉时序依赖
        self.lstm = nn.LSTM(128, 64, batch_first=True, bidirectional=False, dropout=0.3)

        # 分类头
        self.fc = nn.Sequential(
            nn.Linear(64 * seq_len, 128),
            nn.ReLU(),
            nn.Dropout(0.5),
            nn.Linear(128, num_classes)
        )

    def forward(self, x):
        # x: (batch_size, seq_len * feature_dim)
        batch_size = x.size(0)
        x = x.view(batch_size, self.feature_dim, self.seq_len)

        # CNN
        x = self.cnn(x)  # (batch_size, 128, seq_len)
        x = x.transpose(1, 2)  # (batch_size, seq_len, 128)

        # LSTM
        x, (hn, cn) = self.lstm(x)

        # 展平
        x = x.reshape(batch_size, -1)

        # 全连接
        out = self.fc(x)
        return out

2.4 溯源分析模块实现

该模块使用Scapy库监听指定的网卡接口,每当捕获到一个网络数据包时,立即从中提取简化的81维特征向量。特征提取包括包长度、TTL值、协议号、源端口、目的端口、负载长度以及SYN和ACK标志位等8个关键信息,其余维度填充为零。随后将特征向量输入到已训练好的CNN+LSTM模型中进行推理,得到预测的攻击类型和置信度分数。如果模型判定该数据包属于攻击流量且置信度超过0.6的阈值,则在控制台输出红色的攻击告警信息,包括攻击类型和置信度。该模块需要在管理员权限下运行,支持环回网卡和物理网卡两种模式。

分析方法:

  1. 从预处理数据中提取源IP地址和标签信息
  2. 筛选攻击流量,排除正常流量
  3. 统计每个源IP的攻击次数,排序取Top-N
  4. 分析每个IP偏好的攻击类型
  5. 生成可视化图表
    python
df = pd.DataFrame({
        "src_ip": src_ips if src_ips is not None else ["unknown"] * len(y_train),
        "label": y_train,
        "attack_type": [class_names[l] for l in y_train]
    })

    print(f"\n总数据量: {len(df)}")
    print(f"攻击类型分布:")
    print(df["attack_type"].value_counts())

    # 筛选攻击流量
    benign_idx = 0
    attack_df = df[df["label"] != benign_idx]
    print(f"\n攻击流量总数: {len(attack_df)}")

    if len(attack_df) == 0:
        print(" 没有发现攻击流量")
        return

    # 统计攻击源IP
    print(f"\n{'=' * 50}")
    print(f"攻击源IP Top-{top_n}(辅助溯源)")
    print(f"{'=' * 50}")

    top_ips = Counter(attack_df["src_ip"]).most_common(top_n)

    for rank, (ip, cnt) in enumerate(top_ips, 1):
        ip_attacks = attack_df[attack_df["src_ip"] == ip]["attack_type"].value_counts()
        main_attacks = ", ".join(ip_attacks.index[:3])
        print(f"{rank:2d}. {str(ip):20s} 攻击次数: {cnt:5d}  主要类型: {main_attacks}")

2.5 在线抓包检测模块实现

程序首先加载预处理后的数据,筛选出所有非正常流量的攻击样本。然后统计每个源IP地址发起的攻击次数,按照攻击频率降序排列,输出排名前十的攻击源IP及其偏好的攻击类型。同时,程序还会生成可视化的分析图表,包括攻击源IP的柱状图和攻击类型分布的饼图,直观地展示攻击态势。该模块具有随机采样功能,可以通过设置采样比例来控制处理的数据量。

python

def extract_packet_features(pkt):
    """从单个数据包提取简化特征"""
    features = np.zeros(81, dtype=np.float32)
    if IP in pkt:
        ip = pkt[IP]
        features[0] = len(pkt)           # 包长度
        features[1] = ip.ttl             # TTL
        features[2] = ip.proto           # 协议号
        if TCP in pkt:
            tcp = pkt[TCP]
            features[3] = tcp.sport
            features[4] = tcp.dport
            features[5] = len(tcp.payload)
            features[6] = 1 if tcp.flags & 0x02 else 0  # SYN
            features[7] = 1 if tcp.flags & 0x10 else 0  # ACK
        elif UDP in pkt:
            udp = pkt[UDP]
            features[3] = udp.sport
            features[4] = udp.dport
            features[5] = len(udp.payload)
    return features

2.6 Web展示模块实现

Web可视化展示模块基于Flask框架构建了一个友好的用户界面,将系统的各项功能整合在一起。页面顶部展示了系统的运行状态和模型信息,中间部分列出了五个核心功能模块的说明,底部提供了快速操作的按钮链接。该模块提供了五个RESTful API接口:首页展示系统概览,状态接口返回模型加载情况和抓包运行状态,攻击源接口返回排名前十的攻击IP地址及其攻击次数,启动抓包接口以子进程方式调用capture.py开始实时检测,停止抓包接口终止正在运行的抓包进程。用户只需在浏览器中访问http://localhost:5000即可进入系统主页。

API接口列表:

端点 方法 功能
/ GET 系统主页
/api/status GET 查看系统状态
/api/top_ips GET 查看Top攻击源
/api/start_capture GET 启动在线抓包
/api/stop_capture GET 停止在线抓包

三、实验结果与分析

3.1 数据预处理结果

本实验使用CIC-DDoS2019数据集,包含11个CSV文件,采样后共110,0000条网络流量记录。经过数据清洗后,有效样本数为10,64751条,包含81维特征和12个标签类别。
image

3.2 模型训练结果

模型训练50个epoch,训练过程中的损失值和准确率变化如下:

image

最终性能指标:

指标 数值
训练集准确率 75.95%
测试集准确率 76.01%
过拟合程度 轻微(0.06%)

可以看到模型已经被成功训练,并且过拟合程序比较低,较为准确。

3.3 溯源分析结果

通过溯源分析,系统成功定位了主要攻击源IP。
image
分析结果显示,IP地址为172.16.0.5的主机是最大的攻击源,共发起69221次攻击,占总攻击量的85.3%。该IP使用了包括DrDoS_SSDP、UDP-lag、DrDoS_LDAP在内的11种不同攻击类型。Top-5攻击源中有4个为内网IP地址,表明攻击主要来自网络内部。

3.4 在线检测结果

系统成功实现了实时抓包检测功能。在环回测试中,系统能够捕获本机流量并进行实时分析,检测到攻击流量并输出告警信息。检测结果示例如下:
image
image
可以看到系统成功识别了本机发起的攻击,并且记录了攻击者的ip,ddos类型为ddos_syn攻击,置信度在0.9以上。

3.5 web展示结果

image

这是网页的浏览图,地址为http://localhost:5000/

image

这里展示了模型状态

image

这里展示了ddos攻击的ip分析和类型分析

3.6 功能完整性验证

本系统实现了以下五个核心功能,全部通过测试验证:

功能编号 功能名称 状态 说明
1 数据预处理 ✅ 通过 成功读取11个CSV文件,完成清洗和标准化
2 模型训练 ✅ 通过 CNN+LSTM模型训练完成,准确率75.57%
3 溯源分析 ✅ 通过 成功定位Top-10攻击源IP
4 在线抓包检测 ✅ 通过 实时捕获流量并输出告警
5 Web可视化展示 ✅ 通过 Flask服务正常运行,API接口可用

四、实验遇到的问题和解决方案

问题1:数据集过大导致内存溢出

采用采样读取策略,每个CSV文件只读取前100,000行数据,在保证数据多样性的同时大幅降低内存占用。同时在数据清洗后使用dropna()删除缺失值,进一步压缩数据规模。

问题2:模型准确率偏低

将模型从简单的DNN升级为CNN+LSTM混合神经网络。CNN层负责提取网络流量中的局部特征模式,LSTM层负责捕捉特征之间的时序依赖关系。同时添加Batch Normalization加速训练收敛,使用Dropout正则化防止过拟合,最终将准确率稳定在75.57%。

问题3:模型准确率偏低使用Scapy库进行网络抓包时,遇到网卡名称不匹配、权限不足、无法捕获数据包等问题

通过以下步骤逐一排查解决:
1.使用get_if_list()和show_interfaces()查看可用网卡列表,确定正确的网卡UUID
2.以管理员身份运行Python脚本,获取访问网卡的权限
3.安装Npcap驱动替代WinPcap,确保Scapy正常工作
4.使用\Device\NPF_Loopback环回网卡进行本机测试

五、课程总结

5.1 知识点总结

1.Python概念:区分了Python与C语言的不同点及其优势所在;
2.所需应用及其网址:学习了Pycharm、IDLE里面的具体用法,以及gitee仓库和博客园;
3.基本语法:学习相关的语法特点,Python语言特有的代码缩进;
4.数据类型及控制语句:数字类型(整数、浮点数、复数)、字符串类型、布尔类型、数据类型转换以及相关的运算符,条件语句;
5.序列:学习相关的用法,列表、元组、字典、集合。如列表中的创建,遍历,增添列表元素,排序等用法;
6.字符串与正则表达式:学习了新的语法以及语句,如strip(),如何分割字符串等;在正则表达式中,学习了用于匹配、查找、替换复杂字符串规则;
7.网络通信:学习了socket库,是Python 标准库中用于网络通信的核心模块;
8.函数及面向对象:学习了面向对象的三要素:封装、继承、多态;
9.异常处理、文件、数据库:学习了异常处理的方式,存储基础以及数据类型的相关概念,文件操作的核心函数open(),write(),seek(),close(),以及数据库;
10.爬虫:学习了使用途径以及使用的规范性,学习相关知识,如常用库:requests;

5.2 课程感悟

学习Python的过程实际上是一次编程思维的重塑。与以往学习C语言时关注底层实现不同,Python教会了我从更高的抽象层次思考问题。课程中最令我受益的是大量的动手实践环节。单纯的语法学习远远不够,只有在实际编写代码、调试错误、优化性能的过程中,才能真正掌握一门编程语言。每一次debug成功带来的成就感,每一次代码重构带来的优化体验,都让我更加坚信"纸上得来终觉浅,绝知此事要躬行"的道理。

我的大创项目也是基于python编写的,也深刻地理解到,Python打开了通向数据科学、人工智能和网络开发等领域的大门。我将以此为起点,继续深入学习数据分析、机器学习和Web开发等进阶内容。同时,我也计划将Python应用到实际项目中,在实践中不断提升自己的编程能力和问题解决能力。

5.3 意见建议

1.初学者在写Python程序时常遇到缩进错误、变量未定义、类型错误、索引越界等问题。建议专门用一两次课讲解常见错误提示的含义及调试方法(print调试、IDE断点等)
2.建议在第一次课或课程群中提供推荐的参考书、在线教程、常用库文档链接,便于学生课后自学和查阅。


六、参考资料

[1] Sharafaldin I, Lashkari A H, Ghorbani A A. Toward Generating a New Intrusion Detection Dataset and Intrusion Traffic Characterization[C]. Proceedings of the 4th International Conference on Information Systems Security and Privacy (ICISSP), 2018: 108-116.
[2] Sharafaldin I, Lashkari A H, Hakak S, et al. Developing Realistic Distributed Denial of Service (DDoS) Attack Dataset and Taxonomy[C]. IEEE 53rd International Carnahan Conference on Security Technology (ICCST), 2019: 1-8.
[3] Hochreiter S, Schmidhuber J. Long Short-Term Memory[J]. Neural Computation, 1997, 9(8): 1735-1780.
[4] Kim Y. Convolutional Neural Networks for Sentence Classification[C]. Proceedings of the 2014 Conference on Empirical Methods in Natural Language Processing (EMNLP), 2014: 1746-1751.
[5] Canadian Institute for Cybersecurity. CIC-DDoS2019 Dataset[EB/OL]. https://www.unb.ca/cic/datasets/ddos-2019.html , 2019.
[6] Windows Packet Capture Library[EB/OL]. https://npcap.com/ , 2026.
[7] PyTorch Documentation[EB/OL]. https://pytorch.org/docs/stable/ , 2026.
[8] Scapy Documentation[EB/OL]. https://scapy.readthedocs.io/en/latest/ , 2026.
[9] Flask Documentation[EB/OL]. https://flask.palletsprojects.com/en/stable/ , 2026.
[10] Pandas Documentation[EB/OL]. https://pandas.pydata.org/docs/ , 2026.
[11] NumPy Documentation[EB/OL]. https://numpy.org/doc/stable/ , 2026.

附录

附录A:项目文件清单

文件名 功能
preprocess.py 数据预处理
train.py 模型训练(CNN+LSTM)
trace.py 溯源分析
capture.py 在线抓包检测
web.py Web界面展示
ddos_test.py 攻击模拟脚本
model/ddos_dnn.pth 训练好的模型文件
train.npz 预处理后的数据文件

附录B:运行命令

bash

  1. 数据预处理

python preprocess.py

  1. 模型训练

python train.py

  1. 溯源分析

python traceback.py

  1. 启动Web界面

python web.py

  1. 在线抓包检测(需要管理员权限)

python capture.py

附录C:依赖库

pandas>=1.5
numpy>=1.21
scikit-learn>=1.2
torch>=1.13
matplotlib
flask
scapy


posted @ 2026-06-13 22:15  20243409胡谐  阅读(6)  评论(0)    收藏  举报