141 lines
3.9 KiB
Markdown
141 lines
3.9 KiB
Markdown
# 计算机网络实验: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 进阶测试:多路复用与多连接对比
|
||
|
||
本实验任务要求对比 TCP 多连接与 QUIC 多流复用的性能。
|
||
|
||
**场景 1: TCP 多连接并发**
|
||
同时建立 5 个 TCP 连接,每个连接传输 20MB 数据 (总计 100MB)。
|
||
|
||
1. 启动 TCP 多连接服务器:
|
||
```bash
|
||
./tcp_multi_server
|
||
```
|
||
2. 启动 TCP 多连接客户端:
|
||
```bash
|
||
./tcp_multi_client
|
||
```
|
||
3. 记录服务器输出的总时间与吞吐量。
|
||
|
||
**场景 2: QUIC 单连接多流复用**
|
||
建立 1 个 QUIC 连接,在其中同时开启 5 个流 (Stream),每个流传输 20MB 数据 (总计 100MB)。
|
||
|
||
1. 启动 QUIC 多流服务器:
|
||
```bash
|
||
./quic_multi_server
|
||
```
|
||
2. 启动 QUIC 多流客户端:
|
||
```bash
|
||
./quic_multi_client
|
||
```
|
||
3. 记录服务器输出的统计数据。
|
||
|
||
**分析重点:**
|
||
- 在正常网络下,两者的总耗时差异。
|
||
- 使用 `tc` 模拟丢包 (如 5%) 后,对比两者性能下降的幅度。QUIC 的多流复用应能避免 TCP 的“队头阻塞”问题 (即一个包丢失不影响其他流的传输),从而在丢包环境下表现更优。
|
||
|
||
### 3.4 网络恢复测试
|