tcp/quic lab finished

This commit is contained in:
2025-12-25 14:33:29 +08:00
parent ac5b4bc15d
commit 200566e8fe
261 changed files with 2664 additions and 0 deletions

View File

@ -0,0 +1,109 @@
# 计算机网络实验TCP 与 QUIC 协议对比 (Linux 指南)
本指南根据 Windows 版本的实验手册,针对 Linux 环境进行了适配。
## 1. 预备工作
确保已安装以下工具和库:
- `gcc` (编译器)
- `quiche` 库 (已安装头文件和共享库/静态库)
- `openssl` (用于生成证书)
- `tcpdump``wireshark` (用于抓包)
- `iproute2` (用于 `tc` 流量控制)
## 2. 编译
使用提供的 Makefile 编译所有程序:
```bash
make
```
这将生成以下可执行文件:
- `tcp_server`, `tcp_client` (任务一:基础 TCP)
- `quic_server`, `quic_client` (任务二:基础 QUIC)
- `tcp_perf_server`, `tcp_perf_client` (任务三TCP 性能测试)
- `quic_perf_server`, `quic_perf_client` (任务三QUIC 性能测试)
*注意:如果编译报错提示找不到 `quiche.h` 或库文件,请修改 `Makefile` 中的路径,指向您本地 `quiche` 安装的 `include` 和 `lib` 目录。*
## 3. 任务一:基础 TCP 客户端-服务器
1. **启动服务器:**
```bash
./tcp_server
```
2. **运行客户端 (在新的终端窗口)**
```bash
./tcp_client
```
**预期输出:** 客户端发送消息,服务器接收并回复。
## 4. 任务二:基础 QUIC 客户端-服务器
1. **启动服务器:**
```bash
./quic_server
```
2. **运行客户端 (在新的终端窗口)**
```bash
./quic_client
```
**预期输出:** 完成 QUIC 握手,客户端发送流数据,服务器回显数据。
## 5. 任务三:性能分析
### 3.1 连接建立时间
1. 在回环接口 (`lo`) 上开始抓包:
```bash
sudo tcpdump -i lo -w handshake.pcap
```
*(或者使用 Wireshark 监听 `lo` 接口)*
2. 再次运行 TCP 或 QUIC 的客户端/服务器程序。
3. 使用 Wireshark 打开 `handshake.pcap`,分析从第一个包 (TCP 的 SYN 或 QUIC 的 Initial) 到握手完成的时间差。
### 3.2 吞吐量测试 (100MB 传输)
**基准测试 (正常网络)**
1. 运行 TCP 性能服务器:`./tcp_perf_server`
2. 运行 TCP 性能客户端:`./tcp_perf_client`
3. 记录输出的 MB/s 吞吐量。
4. 重复上述步骤测试 QUIC (`./quic_perf_server`, `./quic_perf_client`)。
**模拟网络环境 (丢包 / 延迟)**
在 Linux 下我们使用 `tc` (Traffic Control) 的 `netem` 模块,替代 Windows 下的 `clumsy` 工具。
**场景 A: 5% 丢包率**
1. 设置回环接口 5% 丢包:
```bash
sudo tc qdisc add dev lo root netem loss 5%
```
2. 再次运行性能测试程序。
3. **重要:** 测试结束后删除规则!
```bash
sudo tc qdisc del dev lo root
```
**场景 B: 100ms 延迟**
1. 设置 100ms 延迟:
```bash
sudo tc qdisc add dev lo root netem delay 100ms
```
2. 再次运行性能测试程序。
3. 删除规则:
```bash
sudo tc qdisc del dev lo root
```
### 3.3 & 3.4 进阶测试
- **多路复用:** 当前的 `quic_perf_client` 使用单个流 (Stream ID 4)。您可以修改代码并行启动多个流,以测试 QUIC 解决队头阻塞问题的能力。
- **网络恢复:** 在长传输过程中,使用 `tc` 设置 100% 丢包 (`loss 100%`) 持续 30 秒,然后删除规则 (`del`),观察连接是否能恢复传输。