🔧 环境:Linux / macOS 终端;Windows 用户使用 WSL2
环境准备
# macOS
brew install bind netcat iproute2mac
# Ubuntu / Debian / WSL2
sudo apt update && sudo apt install -y dnsutils traceroute netcat-openbsd iproute2 curl
验证安装:
dig -v && curl --version && traceroute --version
Part A:DNS(5 分)
A1. 基本解析(1 分)
dig www.wikipedia.org
要回答的问题:
ANSWER SECTION中返回了几条记录?分别是什么类型?- 如果出现了 CNAME,说明了什么?(提示:第 6、7 讲)
- 各条记录的 TTL 分别是多少?为什么它们可能不同?
A2. 观察缓存效果(1 分)
dig www.wikipedia.org | grep "Query time"
# 立刻再执行一次
dig www.wikipedia.org | grep "Query time"
要回答:两次的 Query time 差多少?解释原因(第 7 讲)。
A3. 追踪完整的层次结构(2 分)⭐
dig +trace www.wikipedia.org
要回答:
- 一共经过了几级服务器?分别是什么角色?
- 找出输出中根服务器、TLD 服务器、权威服务器各自的回答
- 这是迭代查询还是递归查询?为什么?
A4. 查询不同的记录类型(1 分)
dig wikipedia.org MX # 邮件服务器
dig wikipedia.org NS # 权威服务器
dig wikipedia.org AAAA # IPv6 地址
dig -x 8.8.8.8 # 反向解析
要回答:-x 做的是什么类型的查询?它的 Name 字段长什么样,为什么?
Part B:路径与时延(5 分)
B1. traceroute(2 分)
traceroute www.wikipedia.org
traceroute 1.1.1.1
要回答:
- 到这两个目标各经过几跳?
- ⭐ 是否出现
* * *?这说明该跳故障了吗?(第 3、22 讲) - ⭐ 是否出现某一跳的时延大于它后面的跳?给出至少两种解释。
B2. ping 与时延分布(2 分)
ping -c 20 1.1.1.1
要回答:
- 记录 min / avg / max / mdev 四个值
- ⭐ max 与 min 的差距说明了什么?(提示:第 3 讲的排队时延)
- 估算你到该服务器的物理距离下界(用
d = 传播速度 × 单向时延,传播速度取 2×10⁸ m/s)
B3. Bufferbloat 实测(1 分)⭐
# 终端 1:持续 ping
ping 1.1.1.1
# 终端 2:同时开始一个大文件下载(或在浏览器里下载任意大文件)
curl -o /dev/null https://speed.cloudflare.com/__down?bytes=200000000
要回答:下载开始后 ping 值变化了多少?这是什么现象?(第 16 讲)
Part C:HTTP(6 分)
C1. 读懂 curl -v(2 分)
curl -v https://example.com -o /dev/null
在输出中找出并标注:
- DNS 解析结果
- TCP 连接建立
- ⭐ TLS 握手:协议版本、密码套件
- ⭐ 服务器证书的颁发者与有效期
- 发出的 HTTP 请求首部
- 收到的 HTTP 响应状态码与首部
C2. 各阶段耗时(2 分)⭐
curl -w "\nDNS: %{time_namelookup}\nTCP: %{time_connect}\nTLS: %{time_appconnect}\n首字节: %{time_starttransfer}\n总计: %{time_total}\n" \
-o /dev/null -s https://www.wikipedia.org
要回答:
- 哪个阶段最耗时?
- ⭐ 用同样的命令再跑一次,哪些时间变小了?为什么?
- 把每个阶段与第 29 讲的时间线对应起来
C3. 条件 GET(1 分)
curl -v https://example.com -o /dev/null 2>&1 | grep -i "last-modified\|etag"
# 用上一步得到的 ETag 值:
curl -v -H 'If-None-Match: "你得到的ETag"' https://example.com -o /dev/null
要回答:第二次请求的状态码是什么?响应体有多大?省下了什么、没省下什么?(第 5 讲)
C4. 手工说 HTTP(1 分)⭐
printf 'GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n' | nc example.com 80
要回答:
- ⭐ 为什么必须有
Host:首部?去掉它试试会怎样(第 5 讲) - ⭐ 为什么行尾必须是
\r\n而不是\n? - 为什么这里用 80 端口而不是 443?换成 443 会怎样?
Part D:本机连接状态(4 分)
D1. 查看连接(2 分)
ss -tan # 所有 TCP 连接及状态
ss -tlnp # 正在监听的端口
要回答:
- 找出至少三种不同的 TCP 状态,说明各自的含义(第 14 讲)
- ⭐ 找出处于
TIME_WAIT的连接。它为什么存在?会持续多久? - 你的机器上有哪些进程在监听端口?其中有没有你不认识的?
D2. 观察四元组(2 分)⭐
# 终端 1
nc -l 9999
# 终端 2
nc localhost 9999
# 终端 3
ss -tan | grep 9999
要回答:
- 你看到了几条连接记录?为什么(第 9、10 讲)
- ⭐ 写出这条连接的完整四元组
- 再开一个
nc localhost 9999,四元组的哪一项变了?
常见问题
Q:traceroute 全是 * * * 怎么办?
A:某些网络(尤其是企业网、部分校园网)会屏蔽 ICMP 或 UDP 探测。试试 traceroute -I(用 ICMP)或 traceroute -T -p 443(用 TCP SYN)。在报告中说明你用了哪种方式,这本身就是一个好的观察。
Q:dig +trace 报错?
A:某些网络强制所有 DNS 走本地解析器,无法直接查询根服务器。可以改用在线工具(如 dig 的 Web 版本)完成 A3,并在报告中说明原因。
Q:Bufferbloat 测试看不出变化? A:说明你的路由器可能已经启用了 AQM(现代路由器越来越多默认开启 FQ-CoDel),或者你的带宽远大于测试流量。试试同时开多个下载。观察到"没有 bufferbloat"也是一个有效结论,但要说明你的测试条件。
提示
📌 这个作业最大的价值不在于分数,而在于建立一个习惯:当你对网络有疑问时,你可以直接去看。这门课后面所有的抽象概念,都能在这些工具里找到对应的观察。
📌 建议把这些命令加进你的日常工具箱。curl -w 的计时输出在排查线上问题时极其有用。