# 计算机网络实验: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`),观察连接是否能恢复传输。