Wireshark抓包实验
这篇计网课的一个大实验,我把实验报告附在后面以供参考(助教的博士学长很耐心地检查了一遍,应该是没啥大问题的)
实验概述
本次实验旨在通过 Wireshark 抓包工具,深入理解计算机网络中传输层(TCP)和应用层(HTTP)的通信机制。实验分为两个主要部分:
- TCP 协议分析:通过 Python 编写简单的 Client-Server 程序,在本地回环和局域网环境下观察 TCP 的连接建立(三次握手)、数据传输、连接断开以及拥塞控制机制。
- HTTP 协议分析:通过 Flask 搭建简易服务器,分析 HTTP 请求/响应报文格式、长连接与短连接、以及包含嵌入对象的页面加载过程。
第一部分:TCP 协议抓包分析
1. 实验准备与环境
- 操作系统:Windows 10/11, Ubuntu 22.04 或 macOS(注意芯片版本)。
- 软件依赖:Wireshark, Python 解释器。
2. 实验内容与步骤
任务一:捕获本地回环的 TCP 数据包
- 安装软件:确保已安装 Wireshark 和 Python。
- 编写测试程序:在
code/task1文件夹下创建以下 Python 脚本(需手动输入文件名及代码):- 服务端 (
server.py):负责接收文件。 - 客户端 (
client.py):负责通过 TCP 发送文件。 - 注:代码逻辑需实现监听指定端口(如 12346)并进行文件流传输。
- 服务端 (
- 开始抓包:打开 Wireshark,选择 本地回环网卡 (Loopback)。
- 运行程序:
1
2
3
4# 启动服务端
python server.py
# 启动客户端(输入文件名并发送)
python client.py - 过滤数据:在 Wireshark 过滤器输入
tcp.port == 12346,观察连接建立、数据分块传输及断开过程。
任务二:捕获局域网内的 TCP 数据包
- 网络配置:
- 查看本机 IP:Windows 使用
ipconfig,Ubuntu/macOS 使用ifconfig。 - 确保两台主机在同一网段且能互相 Ping 通。
- 查看本机 IP:Windows 使用
- 修改代码:
- 将
server.py中的server_ip修改为服务端主机的实际局域网 IP。 - 将
client.py中的目标 IP 修改为该服务端 IP。 - 代码示例:
1
2server_ip = "192.168.x.x" # 替换为实际IP
server_port = 12346
- 将
- 防火墙设置:确保服务端防火墙允许该端口通信(不建议直接关闭防火墙,建议添加入站规则)。
- 执行与抓包:仿照任务一的步骤进行文件传输并抓包分析。
3. TCP 实验思考题
请结合 Wireshark 的抓包截图和导出数据,回答以下问题:
基础分析:
- 在任务一(本地回环)中,客户端发送数据的端口是多少?这个端口是谁决定的?
- 在任务二(局域网)中,服务端和客户端的 IP 地址和端口号分别是什么?
- 为什么在任务一中不需要设置防火墙端口通行权限?
- 在任务二中,用于初始化 TCP 连接的 SYN 报文段序号(Sequence Number)是多少?在报文中哪个字段表明这是一个 SYN 报文?
- 前 6 个 TCP 报文段的长度各自是多少?
- 在跟踪文件中,是否存在重传的报文段?你需要检查哪里来确认这一点?
- 接收方在一个 ACK 中通常确认多少数据?你能观察到“每隔一个报文段确认一次”的情形吗?
- 该 TCP 连接的吞吐量(Bytes/Time)是多少?请解释计算方法。
进阶分析(TCP 拥塞控制):
使用 Wireshark 的 统计 -> TCP流图形 -> 图形序列 (Stevens) 功能生成图表,回答:
- 观察序列号-时间图,你如何判断 TCP 慢启动 (Slow Start) 的开始和结束?拥塞避免在什么地方开始起作用?(注:实际图像可能与教材的理想模型不同,请分析差异)。
- 总结本次实验抓取的 TCP 数据与教材中学习的理想情况有何不同?
第二部分:HTTP 协议抓包分析
1. 实验准备与环境
- 环境搭建:
- 以
code为根目录打开命令行。 - 安装依赖:
pip install flask。 - 启动简易服务器:运行
python app.py。
- 以
- 浏览器设置:每次实验前请务必清空浏览器缓存。
2. 实验内容与步骤
任务一:基本 HTTP GET/Response 交互
- 启动 Wireshark 开始抓包。
- 浏览器访问:
http://127.0.0.1:8080/step_1 - 停止抓包并使用过滤器
http查看数据。 - 分析要求:
- 你的浏览器运行的是 HTTP 1.0 还是 1.1?服务器用的是什么版本?
- 服务器返回的状态代码(Status Code)是什么?
- HTML 文件在服务器上的最后修改时间(Last-Modified)是什么?
- 传回的内容大小(Content-Length)是多少 Bytes?
任务二:获取较长的 HTML 文件
- 清空缓存,开始抓包。
- 浏览器访问:
http://127.0.0.1/step_2(注意端口,若 app.py 默认则可能为 8080,请依据实际运行提示)。 - 该页面包含较长文本,会触发 TCP 分段传输。
- 分析要求:
- 浏览器发送了多少个 HTTP GET 请求?
- 该 HTTP Response 数据包被拆分成了多少个 TCP 段来传送?
- 状态代码是什么?
任务三:获取有嵌入对象的 HTML 文件
- 清空缓存,开始抓包。
- 浏览器访问:
http://127.0.0.1/step_3 - 该页面包含两个图片链接,浏览器需自动获取这些嵌入对象。
- 分析要求:
- 浏览器向服务器发送了多少个 HTTP GET 请求?这些请求的目的网址分别是什么?
- 这两个图片是串行下载还是并行下载的?请结合抓包的时间戳进行解释。
实验报告要求
- 数据支撑:回答所有思考题时,必须提供 Wireshark 的截图或导出的数据包内容作为证据。
- 注释说明:在截图中对关键字段(如 SYN 标记、序列号、ACK 号等)进行标注和解释。
- 打印输出:建议使用 Wireshark 的
文件 -> 打印 -> Output to file功能导出关键数据包详情,附在报告中。
实验报告









































