计算机网络综合实验指南
本实验将结合《计算机网络自顶向下》前三章的核心概念,通过实际操作加深对应用层、运输层和网络层的理解。实验涵盖 HTTP/TCP抓包分析、DNS解析观察、网页性能评估及简单Socket编程,帮助你将理论转化为实践。
实验准备
-
工具:
-
Wireshark(下载链接)
-
Chrome 浏览器
-
Python 环境(推荐安装 Python 3.x)
-
-
网络环境:确保能访问互联网(如访问
http://example.com
)。
实验任务 1:使用 Wireshark 捕获 HTTP/TCP 流量
目标:观察 TCP 三次握手、HTTP 请求/响应、TCP 四次挥手。
步骤:
-
启动 Wireshark:
-
选择监听的网络接口(如 Wi-Fi)。
-
设置过滤条件:
tcp.port == 80
(仅捕获 HTTP 流量)。 -
点击 蓝色鲨鱼鳍按钮 开始抓包。
-
-
触发 HTTP 请求:
-
打开浏览器,访问
http://example.com
。
-
-
停止抓包:
-
返回 Wireshark,点击 红色方块按钮 停止捕获。
-
-
分析数据包:
-
TCP 三次握手:
-
查找前三个 TCP 包(Flags: SYN → SYN-ACK → ACK)。
-
点击 SYN 包,查看 Transmission Control Protocol 下的
Sequence Number
和Acknowledgment Number
。
-
-
HTTP 请求/响应:
-
查找
GET / HTTP/1.1
请求包,展开 Hypertext Transfer Protocol 查看请求头。 -
找到状态码为
200 OK
的响应包,查看响应内容。
-
-
TCP 四次挥手:
-
过滤
tcp.flags.fin == 1
,观察 FIN 和 ACK 包的交互。
-
-
验证问题:
-
三次握手中,Client 和 Server 的初始序列号(ISN)分别是多少?
-
HTTP 响应包中的
Content-Type
是什么? -
四次挥手中,哪一方先发送了 FIN 包?
实验任务 2:分析 DNS 查询
目标:理解域名解析过程,观察 DNS 协议交互。
步骤:
-
清空 DNS 缓存(可选):
-
Windows:
ipconfig /flushdns
-
macOS/Linux:
sudo dscacheutil -flushcache
-
-
捕获 DNS 流量:
-
在 Wireshark 中设置过滤条件:
dns
。 -
在浏览器中访问一个新域名(如
http://neverssl.com
)。
-
-
分析 DNS 数据包:
-
查找 DNS Query 和 DNS Response。
-
展开 Domain Name System,查看查询类型(如 A 记录)、响应 IP 地址。
-
注意事务 ID(Transaction ID)如何匹配请求与响应。
-
验证问题:
-
DNS 查询的类型是 A 记录还是 AAAA 记录?
-
域名解析耗时多少毫秒?(查看
Time
列) -
DNS 响应中返回的 IP 地址是什么?
实验任务 3:使用 Chrome 开发者工具分析网页性能
目标:评估网页加载性能,识别关键耗时阶段。
步骤:
-
打开 Network 面板:
-
Chrome 中按
F12
→ 切换到 Network 标签。 -
勾选 Disable cache(避免缓存干扰)。
-
-
捕获网页加载过程:
-
访问一个复杂网页(如
http://www.nytimes.com
)。 -
观察所有请求的加载顺序和时间线。
-
-
分析性能瓶颈:
-
按 Time 列排序,找到耗时最长的请求。
-
点击该请求 → 查看 Timing 标签,分析各阶段耗时:
-
Queuing:请求排队时间。
-
DNS Lookup:DNS 查询耗时。
-
Initial connection:TCP 握手 + SSL 握手(HTTPS)。
-
Content Download:下载内容耗时。
-
-
验证问题:
-
页面加载共发起了多少个请求?
-
耗时最长的请求是哪种类型(JS、图片、XHR)?
-
该请求的
Content Download
阶段耗时多少?
实验任务 4:编写简单的 Socket 程序
目标:体验 TCP/UDP 通信,理解协议差异。
步骤:
-
TCP 客户端/服务端通信:
-
服务端代码(Python):
python
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(('0.0.0.0', 8080)) s.listen() conn, addr = s.accept() print(f"Connected by {addr}") data = conn.recv(1024) print(f"Received: {data.decode()}") conn.send(b"Hello from server!") conn.close()
-
客户端代码(Python):
python
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('localhost', 8080)) s.send(b"Hello from client!") data = s.recv(1024) print(f"Received: {data.decode()}") s.close()
-
运行观察:
-
先启动服务端,再运行客户端,查看控制台输出。
-
-
-
UDP 客户端/服务端通信:
-
服务端代码:
python
import socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.bind(('0.0.0.0', 8080)) data, addr = s.recvfrom(1024) print(f"Received from {addr}: {data.decode()}") s.sendto(b"Hello from UDP server!", addr)
-
客户端代码:
python
import socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.sendto(b"Hello from UDP client!", ('localhost', 8080)) data, addr = s.recvfrom(1024) print(f"Received: {data.decode()}") s.close()
-
运行观察:
-
注意无需建立连接,直接发送数据。
-
-
验证问题:
-
TCP 和 UDP 在代码中有何关键区别?
-
如果先启动客户端再启动服务端,TCP 和 UDP 的行为有何不同?
-
UDP 服务端能否收到客户端消息?为什么?
实验总结与拓展
知识点回顾:
-
应用层:HTTP/DNS 协议格式、网页性能优化。
-
运输层:TCP 可靠传输机制(握手、挥手)、UDP 无连接特性。
-
工具使用:Wireshark 抓包、Chrome 开发者工具分析。
拓展挑战:
-
使用 Wireshark 捕获 HTTPS 流量(需导入浏览器证书)。
-
修改 Socket 程序,实现多客户端并发通信(TCP 多线程)。
-
分析 HTTP/2 与 HTTP/1.1 的流量差异(如多路复用)。