计算机网络课程设计:网络协议嗅探与可视化系统

一、 课程设计背景与目标

《计算机网络》是一门理论性极强且概念繁多的课程,尤其是 OSI 七层模型和 TCP/IP 协议栈,仅靠阅读教材很难产生直观的理解。为了将抽象的理论具象化,在期末课程设计中,我利用 Python 全栈技术开发了一套“网络协议嗅探与可视化分析系统”。

该系统的主要目标是:实时捕获本机网卡的数据包,对二进制网络帧进行逐层解码,提取各层协议的关键字段,并最终通过 Web 前端进行直观的图表展示。


二、 系统架构设计

系统采用前后端分离的 B/S(浏览器/服务器)架构,主要包含三个核心模块:

  1. 底层嗅探模块:负责监听网卡流量并捕获原始数据包。
  2. 数据处理与 API 服务:解析数据包,统计流量信息,并基于 Flask 框架提供 RESTful API 接口。
  3. 前端大屏展示:基于 HTML/JS 和 ECharts 图表库,动态渲染网络状态。

三、 核心技术实现

3.1 网络数据包捕获与逐层解包 (DPI)

这是整个系统中最硬核的底层模块。我主要使用了 Python 的 scapy 库(或原生 socket 模块结合混杂模式)来实现。

捕获到二进制数据帧后,程序会按照 TCP/IP 协议栈的规范,一层一层地剥离报文头:

  • 链路层 (Ethernet):解析以太网帧头,提取出源 MAC 地址和目的 MAC 地址,并根据类型字段(Type)判断上层协议(如 IPv4 或 ARP)。
  • 网络层 (IP):对于 IPv4 报文,解析 IP 头,提取出源 IP、目的 IP、数据包总长度(Total Length)以及生存时间(TTL)。通过协议字段(Protocol)识别传输层使用的是 TCP、UDP 还是 ICMP。
  • 传输层 (TCP/UDP):深入解析 TCP 报文,提取源端口、目的端口,并重点识别标志位(Flags,如 SYN, ACK, FIN),以此来判断当前的 TCP 连接状态(如是否正在进行三次握手或四次挥手)。
  • 应用层:针对常见的 80 端口(HTTP)或 53 端口(DNS),程序会进一步提取应用层负载(Payload)中的关键信息。

3.2 后端实时流量统计

为了给前端提供有意义的监控数据,后端不仅要解析单个数据包,还需要进行实时的聚合计算。

  • 协议占比统计:系统在内存中维护了一个计数器,实时累加不同协议(TCP, UDP, ICMP, HTTP 等)的包数量和字节数。
  • 带宽计算:通过记录单位时间(如每秒)内捕获到的总字节数,计算出当前的实时网络带宽(上行/下行速率)。

3.3 前端可视化大屏呈现

后端的 Flask 服务通过 API 将统计好的 JSON 数据暴露给前端。在前端页面(visualizer.py 驱动的模板)中,我使用了 ECharts 库来进行数据渲染。

  • 动态图表:使用饼图展示实时协议流量占比;使用折线图展示随时间变化的网络带宽波动情况。前端通过定时器(setInterval)每秒轮询一次后端接口,实现图表的动态刷新。
  • 网络拓扑图:利用 ECharts 的关系图(Graph)组件,将捕获到的源 IP 和目的 IP 作为节点,将它们之间的通信作为连线,绘制出当前主机与外部网络交互的简易拓扑结构。

四、 课设总结与收获

通过这次课程设计,我将《计算机网络》课本上枯燥的协议白皮书变成了可运行的代码。

当我的程序成功截获本机发出的一次 HTTP 请求,并在控制台清晰地打印出从 MAC 层、IP 层、TCP 层到最终 HTTP 负载的详细字段时,我对网络协议分层封装与解封装的机制有了极其深刻的理解。同时,这个项目也极大地锻炼了我将底层系统编程与现代 Web 全栈开发相结合的工程能力。