🔧 工具:Wireshark 4.x(免费,全平台)
环境与安全须知
# 安装
# macOS: brew install --cask wireshark
# Ubuntu: sudo apt install wireshark
# Windows: 从 wireshark.org 下载
⚠️ 重要的伦理与法律提醒:
⭐ 只抓取【你自己产生的】流量。
⭐ 不要在公共网络上抓取他人流量 —— 这在多数司法辖区是违法的,
也违反学校的可接受使用政策(AUP)。
⭐ 抓包文件可能包含 Cookie、令牌等敏感信息。提交前请检查,
必要时用 Wireshark 的 "Export Specified Packets" 只导出相关分组。
基础过滤器速查:
| 目的 | 显示过滤器 |
|---|---|
| 只看 HTTP | http |
| 只看某主机 | ip.addr == 93.184.216.34 |
| 只看 DNS | dns |
| 只看某条 TCP 连接 | 右键分组 → Follow → TCP Stream |
| TCP 重传 | tcp.analysis.retransmission |
| 只看握手 | tcp.flags.syn == 1 |
| 排除本机 SSH | not tcp.port == 22 |
Part A:HTTP(12 分)
捕获:开始抓包 → 访问 http://gaia.cs.umass.edu/wireshark-labs/HTTP-wireshark-file1.html(一个纯 HTTP 的教学页面)→ 停止抓包。
⭐ 用 http 过滤。
A1. 基本请求响应(4 分)
- 你的浏览器使用的 HTTP 版本是什么?服务器呢?
- 浏览器声明接受哪些语言(
Accept-Language)? - ⭐ 你的 IP 和服务器 IP 分别是什么?在哪一层的哪个字段里看到的?
- 服务器返回的状态码是什么?
- HTML 文件被修改的时间是什么(
Last-Modified)? - 服务器返回了多少字节的内容(
Content-Length)?
A2. 条件 GET(4 分)⭐
刷新页面两次(第二次用普通刷新,不要强制刷新)。
- ⭐ 第二次请求中出现了什么新的首部?它的值从哪来?
- ⭐ 服务器这次返回的状态码是什么?
- 这次响应包含实体体吗?大小是多少?
- 计算:这次交互节省了多少字节?节省了几个 RTT?(第 5 讲)
A3. 含多个对象的页面(4 分)
访问一个包含多张图片的页面。
- 一共发出了多少个 HTTP 请求?
- ⭐ 它们使用了几条 TCP 连接?(提示:看源端口)
- ⭐ 这些请求是串行还是并行发出的?用时间戳证明你的判断
- 结合第 5、6 讲,解释你观察到的行为对应哪种连接策略
Part B:DNS(10 分)
捕获:清空 DNS 缓存后访问一个新网站。
# macOS: sudo dscacheutil -flushcache
# Linux: sudo systemd-resolve --flush-caches
# Windows: ipconfig /flushdns
⭐ 用 dns 过滤。
B1. 查询与响应(5 分)
- ⭐ DNS 查询使用的是 UDP 还是 TCP?端口号是多少?为什么是这个选择(第 10 讲)?
- 查询报文的目的 IP 是什么?它对应你系统配置中的哪一项?
- 查询的是什么类型的记录?
- ⭐ 响应中返回了几条记录?有 CNAME 吗?各自的 TTL 是多少?
- ⭐ 查询报文和响应报文的事务 ID 是否相同?这个字段的作用是什么(第 7 讲的缓存投毒)?
B2. 时序分析(5 分)⭐
- 测量从 DNS 查询发出到响应到达的时间
- ⭐ 找到该 DNS 响应之后的第一个 TCP SYN 分组,测量二者的时间差
- 计算:DNS 解析占了"从输入网址到 TCP 连接建立"总时间的百分之多少?
- 结合第 29 讲的时间线,说明这个比例是否符合预期
Part C:TCP(20 分)⭐ 本实验的核心
捕获:抓一次下载较大文件的过程(建议 1–10 MB)。
⭐ 用 tcp 过滤,并 Follow → TCP Stream 锁定一条连接。
C1. 三次握手(4 分)
- ⭐ 找到 SYN、SYN-ACK、ACK 三个分组,记录各自的 Seq 和 Ack
- ⭐ 客户端和服务器的**初始序号(ISN)**分别是多少?它们是 0 吗?为什么(第 13 讲)?
- ⭐ 握手中协商了哪些 TCP 选项?找出 MSS、窗口缩放因子、SACK 支持
- 测量握手耗时。它应当约等于什么?
C2. 序号与确认号(4 分)
选取传输中间的连续三个数据分组。
- 制表列出每个分组的 Seq、Ack、payload 长度
- ⭐ 验证:
下一个分组的 Seq = 上一个分组的 Seq + payload 长度 - ⭐ 验证:
ACK 值 = 已按序收到的最后一个字节 + 1 - 是否观察到捎带确认(携带数据的分组同时确认了对方的数据)?
C3. 拥塞窗口的增长 ⭐(6 分)
⭐ 使用 Statistics → TCP Stream Graphs → Time Sequence (Stevens)。
- 截图并标注这张图
- ⭐ 找出慢启动阶段:斜率是如何变化的?
- ⭐ 通过统计"每个 RTT 内发出的未确认字节数",估算 cwnd 在前 5 个 RTT 的值
- ⭐ 是否观察到斜率从指数变为线性的转折点?如果有,它对应什么(第 16 讲)?
- 是否观察到丢包(重传)?如果有,重传后的斜率发生了什么变化?
C4. 重传分析(4 分)
⭐ 用过滤器 tcp.analysis.flags。
- 是否有重传?如果有,是超时重传还是快速重传?
- ⭐ 判断依据是什么?(提示:看重传前是否有连续 3 个重复 ACK)
- 是否观察到 SACK 选项?它告诉了发送方什么?
- 若完全没有重传,说明什么?换一个更差的网络环境(如手机热点)再抓一次
C5. 连接关闭(2 分)
- ⭐ 找到 FIN。一共有几个 FIN?为什么(第 14 讲)?
- 是谁先发起关闭的?
- ⭐ 是否观察到 RST?如果有,可能是什么原因?
Part D:IP 与以太网(12 分)
D1. IP 头部(4 分)
任选一个 TCP 分组,展开 IP 层。
- IP 头部长度是多少字节?有选项吗?
- ⭐ TTL 是多少?(Windows、Linux、macOS 的初始 TTL 各不相同——你能推断出对方是什么系统吗?)
- 上层协议字段的值是多少?对应什么协议?
- ⭐ 是否发生了分片?如何判断(看哪三个字段)?
D2. TTL 逐跳递减(4 分)⭐
# 一边抓包,一边执行
traceroute -q 1 www.wikipedia.org
⭐ 用过滤器 icmp。
- ⭐ 找到 TTL = 1、2、3 的三个出站探测分组
- ⭐ 找到对应的三个 ICMP 响应,记录它们的类型和代码
- ⭐ 最后一个响应的类型和代码与前面的不同吗?为什么(第 22 讲)?
D3. 以太网与 ARP(4 分)⭐
⭐ 用过滤器 arp(若没有,先执行 arp -d 清空 ARP 缓存再访问网络)。
- ⭐ ARP 请求的目的 MAC 是什么?为什么是这个值?
- ARP 响应的源 MAC 是谁的?
- ⭐ 随便找一个访问外网的 IP 分组,记录它的目的 MAC。它是目标服务器的 MAC 吗?为什么?
- ⭐ 结合第 24 讲,用你抓到的数据说明「IP 端到端不变,MAC 逐跳更换」
Part E:802.11 无线(6 分,选做加分)
⚠️ 需要支持监听模式(monitor mode)的无线网卡。若你的设备不支持,可使用课程提供的示例抓包文件 wifi_capture.pcapng。
⭐ 用过滤器 wlan。
- ⭐ 找到一个信标帧(Beacon)。它的发送间隔是多少?包含哪些信息(SSID、支持速率)?
- ⭐ 找到一个数据帧,指出它的四个地址字段分别是什么。为什么需要四个(第 25 讲)?
- ⭐ 找到一个数据帧及其对应的 ACK。测量二者的时间间隔,与 SIFS 的标准值比较
- 是否观察到重传(帧控制字段中的 Retry 位为 1)?重传率是多少?
提示与常见困难
Q:抓到的全是 TLS 加密流量,看不到 HTTP。
A:这正是本课程要教的东西起作用了。Part A 请使用指定的 http:// 教学页面。若要解密自己的 HTTPS 流量,可以设置 SSLKEYLOGFILE 环境变量并在 Wireshark 中配置——这是一个很好的加分探索,但注意它只对你自己的浏览器有效(第 28 讲)。
Q:分组太多,找不到我要的。
A:先用捕获过滤器(Capture Filter,如 host example.com)减少噪声,再用显示过滤器精确定位。两者语法不同,别混淆。
Q:C3 的 cwnd 怎么估算? A:cwnd ≈ 某一时刻的在途未确认字节数。在 Time-Sequence 图上,就是同一时刻「已发送曲线」与「已确认曲线」之间的垂直距离。Wireshark 的 Window Scaling 图也有帮助。
为什么这个实验重要
📌 期末考试会给你一段真实的抓包摘要,要求你解释发生了什么。能读懂抓包,是这门课与"背过这门课"之间最实在的区别。
📌 在工作中,抓包是网络问题排查的终局手段。当日志、监控、猜测都失效时,抓包告诉你线上到底传了什么。