# 计算机网络实验: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 网络恢复测试