天津大学计算机网络课程实验项目 - 基于UDP的用户态TCP协议栈完整实现
本项目是天津大学计算机网络课程的综合性实验项目,从零实现了一个完整的用户态TCP协议栈,基于UDP协议构建,严格遵循RFC标准。项目包含完整的代码实现、技术报告和演示文稿。
- ✅ 完整的TCP协议栈:连接管理、可靠传输、流量控制、拥塞控制
- ✅ 创新性优化:OFO红黑树(15倍性能提升)、CUBIC拥塞控制、HyStart慢启动
- ✅ 完善的测试环境:Vagrant双虚拟机网络模拟、tcset流量控制
- ✅ 完整的项目文档:技术报告(LaTeX)、演示文稿(Beamer)
- 📊 可观测性系统:完整的Trace日志、性能分析工具
netproj/
├── tju_tcp/ # TCP协议栈核心代码
│ ├── inc/ # 头文件目录
│ │ ├── tju_tcp.h # TCP核心结构和接口
│ │ ├── cubic.h # CUBIC拥塞控制
│ │ ├── ofo_buffer.h # OFO红黑树
│ │ ├── retransmission.h # 重传定时器
│ │ └── trace.h # Trace日志系统
│ ├── src/ # 源代码目录
│ │ ├── tju_tcp.c # TCP核心实现(2500+ LOC)
│ │ ├── cubic.c # CUBIC算法
│ │ ├── ofo_buffer.c # 红黑树乱序处理
│ │ ├── retransmission.c # 重传机制
│ │ ├── kernel.c # 内核线程和包分发
│ │ └── trace.c # 日志系统
│ ├── test/ # 测试程序
│ │ ├── test_rdt_*.c # 可靠传输测试
│ │ ├── test_client.c # 客户端测试
│ │ └── test_server.c # 服务器测试
│ ├── Makefile # 编译配置
│ └── README.md # TCP实现详细文档
│
├── report/ # 技术报告(LaTeX)
│ ├── main.tex # 报告主文件
│ ├── include/ # 内容章节
│ │ ├── cover.tex # 封面
│ │ ├── abstract.tex # 摘要
│ │ └── body.tex # 正文
│ ├── figures/ # 报告图表(40+张)
│ ├── references/ # 参考文献
│ └── setup/ # LaTeX格式配置
│
├── beamer_ppt/ # 演示文稿(LaTeX Beamer)
│ ├── beamersapienza.tex # 主文件
│ ├── beamerthemesintef.sty # 主题样式
│ ├── assets/ # 主题资源
│ └── *.png # 演示图表
│
├── Vagrantfile # 虚拟机配置
├── ubuntu_netproj.box # Vagrant box镜像
└── README.md # 本文档
开发环境:
- Linux系统(Ubuntu 18.04+ 推荐)
- GCC 7.0+ 或 Clang 5.0+
- Make工具
- Python 3.6+(用于性能分析,可选)
虚拟机环境(推荐):
- VirtualBox 6.0+
- Vagrant 2.2+
1. 启动虚拟机环境
# 启动client和server双虚拟机
vagrant up
# SSH连接到client
vagrant ssh client
# SSH连接到server(新终端)
vagrant ssh server2. 编译项目
在client虚拟机中:
cd /vagrant/tju_tcp
make3. 运行测试
Server端(在server虚拟机):
cd /vagrant/tju_tcp/test
./rdt_serverClient端(在client虚拟机):
cd /vagrant/tju_tcp/test
./rdt_client4. 配置网络环境
# 设置带宽、延迟、丢包率
sudo tcset enp0s8 --rate 100Mbps --delay 20ms --loss 0.1%
# 查看当前配置
sudo tcshow enp0s8
# 重置网络参数
sudo tcdel enp0s8 --allcd tju_tcp
make
# 编译测试程序
cd test && make- ✅ 三次握手:完整的连接建立流程
- ✅ 四次挥手:优雅关闭连接
- ✅ 状态机:支持全部11种TCP状态
- CLOSED, LISTEN, SYN_SENT, SYN_RECV
- ESTABLISHED
- FIN_WAIT_1, FIN_WAIT_2, CLOSING, TIME_WAIT
- CLOSE_WAIT, LAST_ACK
滑动窗口机制:
- 发送端:维护发送队列,追踪未确认数据
- 接收端:按序缓冲区 + OFO红黑树
OFO红黑树优化:
- 传统链表:O(n) 查找/插入
- 红黑树:O(log n) 查找/插入
- 性能提升:15倍加速(n=100)
- 自动段合并,减少内存碎片
- 精确维护
recv_ofo_bytes计数
RTT估计与RTO计算(RFC 6298):
SRTT = (1-α) * SRTT + α * R
RTTVAR = (1-β) * RTTVAR + β * |SRTT - R|
RTO = SRTT + K * RTTVAR
- α = 1/8, β = 1/4, K = 4
- RTO范围:[200ms, 10s]
- 指数退避:超时时 RTO *= 2
快速重传:
- 3个重复ACK触发
- 无需等待RTO超时
接收窗口通告:
free_space = SIZE - received_len - recv_ofo_bytes
adv_window = floor(free_space / MSS)零窗口探测(关键创新):
- 触发条件:peer_adv_window = 0
- 探测间隔:200 ms
- 探测包:1字节
- 作用:防止窗口更新ACK丢失导致的死锁
TCP Reno(基础):
- 慢启动:cwnd指数增长
- 拥塞避免:cwnd线性增长
- 快速恢复:3个重复ACK时减半
CUBIC算法(RFC 8312,高带宽优化):
W_cubic(t) = C(t-K)³ + W_max
K = ∛(W_max(1-β)/C)
- β = 0.7(保守减少)
- C = 0.4(增长速率)
- TCP友好性:cwnd = max(W_cubic, W_tcp)
HyStart慢启动优化:
- ACK Train检测:间隔 > 2ms
- 延迟增长检测:RTT增长 > 12.5%
- 快速退出慢启动,避免过度丢包
8种事件类型:
TRACE_SEND(sock, seq, len) // 发送事件
TRACE_RECV(sock, seq, len) // 接收事件
TRACE_DELV(sock, len) // 投递事件
TRACE_SWND(sock, swnd_bytes) // 发送窗口
TRACE_RWND(sock, rwnd) // 接收窗口
TRACE_CWND(sock, cwnd, ssthresh) // 拥塞窗口
TRACE_RTTS(sock, rtt_ms, rto_ms) // RTT/RTO
TRACE_CUBIC_EVENT(...) // CUBIC事件支持可视化分析:
- 窗口演化图
- RTT/RTO时间序列
- 拥塞窗口状态机
- 性能统计指标
| 测试场景 | 吞吐量 | 网络环境 | 文件大小 |
|---|---|---|---|
| 可靠传输 | 8.57 Mbps | 100Mbps, 20ms延迟, 0.1%丢包 | 50 MB |
| 流量控制 | 20.02 Mbps | 100Mbps, 100ms±20ms延迟, 2%丢包 | 150 MB |
| 拥塞控制 | 0.22 Mbps | 10Mbps, 200ms RTT, 2%丢包 | 950 KB |
可靠传输测试:
- 平均RTT:76.77 ms
- 重传率:48.44%
- RTT采样覆盖率:16%
- 瓶颈:RTT采样不足
流量控制测试:
- 零窗口事件:56次 (3.71%)
- 窗口利用率:98.29%
- RTT采样覆盖率:114.78%
拥塞控制测试:
- CWND范围:1-10.7 MSS
- 状态分布:拥塞避免58.6%, 超时24.6%
- 理论吞吐量:0.45 Mbps(Mathis公式)
- 实际/理论:49%
位于 report/ 目录,使用LaTeX编写的正式技术报告:
内容结构:
- 项目背景与需求分析
- 系统架构设计
- 核心算法原理与实现
- 性能测试与分析
- 创新点总结
- 参考文献
编译方式:
cd report
xelatex main.tex
bibtex main
xelatex main.tex
xelatex main.tex或使用在线平台(推荐):
- Overleaf:直接上传整个
report/目录 - TexStudio:本地编辑和编译
位于 beamer_ppt/ 目录,使用LaTeX Beamer编写:
特点:
- 专业的学术报告风格
- 40+张技术图表
- 完整的实验流程展示
- 性能数据可视化
编译方式:
cd beamer_ppt
xelatex beamersapienza.tex在 tju_tcp/inc/tcp_config.h 中:
// 缓冲区大小
#define TCP_RECVWN_SIZE (5000 * 1024 * 1024) // 5GB
#define TCP_SENDWN_SIZE (5000 * 1024 * 1024) // 5GB
// MSS(最大段大小)
#define MSS 1375
// RTO参数
#define RTO_MIN_MS 200 // 最小RTO:200ms
#define RTO_MAX_MS 10000 // 最大RTO:10s
#define RTO_INIT_MS 1000 // 初始RTO:1s
// 重传限制
#define MAX_RETRIES 8 // 最大重传次数在 tju_tcp/src/tju_tcp.c 中:
int g_enable_cubic = 1; // 1=CUBIC, 0=Reno在 tju_tcp/inc/trace.h 中:
#define ENABLE_TRACE 1 // 1=启用, 0=禁用在 Vagrantfile 中修改:
# 修改网络参数
host.vm.provision "shell",
inline: "sudo tcset enp0s8 --rate 100Mbps --delay 20ms --loss 0.1%"# 1. 连接建立/关闭测试
./test/test_client # Client端
./test/test_server # Server端
# 2. 可靠传输测试
./test/rdt_client # 发送50MB数据
./test/rdt_server # 接收并验证
# 3. 连接关闭测试
./test/close_client
./test/close_server# 1. 设置网络环境
sudo tcset enp0s8 --rate 100Mbps --delay 20ms --loss 0.1%
# 2. 运行测试(生成trace文件)
./test/rdt_client # 生成 client.event.trace
./test/rdt_server # 生成 server.event.trace
# 3. 分析trace日志
python3 test/gen_graph_seq.py client.event.trace
python3 test/gen_graph_win.py client.event.trace低延迟场景:
sudo tcset enp0s8 --rate 100Mbps --delay 20ms --loss 0.1%高延迟场景:
sudo tcset enp0s8 --rate 10Mbps --delay 200ms --loss 2%抖动场景:
sudo tcset enp0s8 --rate 100Mbps --delay 100ms --delay-distro 20ms --loss 2%问题:传统链表处理乱序数据复杂度 O(n)
解决方案:红黑树实现
- 查找/插入:O(log n)
- 自动段合并
- 精确计数维护
- 实测效果:15倍性能提升(n=100)
问题:窗口更新ACK丢失导致死锁
解决方案:主动探测
- 200ms间隔
- 1字节探测包
- 强制接收端回复
效果:完全避免死锁,窗口利用率98.29%
问题:Reno在高带宽长距离网络效率低
解决方案:CUBIC + HyStart
- 三次函数增长曲线
- TCP友好性保证
- 快速慢启动退出
效果:高带宽网络性能优化
Trace系统:
- 8种事件类型
- 实时性能监控
- 可视化分析支持
支持分析:
- 窗口演化
- RTT/RTO趋势
- 拥塞控制状态
- 性能瓶颈定位
- 每个socket独立锁
- 条件变量精准唤醒
- 内核/应用线程分离
- 阅读
tju_tcp/src/tju_tcp.c中的握手/挥手代码 - 运行
test_client和test_server - 理解TCP状态机转换
- 学习滑动窗口原理
- 研究
ofo_buffer.c红黑树实现 - 分析
retransmission.c重传逻辑 - 运行
rdt_client/server测试
- 理解窗口通告计算
- 研究零窗口探测机制
- 分析trace日志中的窗口演化
- 学习CUBIC算法原理(RFC 8312)
- 研究
cubic.c实现细节 - 对比CUBIC vs Reno性能
- 使用trace系统分析瓶颈
- 调整TCP参数
- 实验不同网络环境
- ❌ 不支持SACK(选择性确认)
- ❌ 不支持延迟ACK
⚠️ RTT采样覆盖率偏低(可靠传输测试)⚠️ 窗口预测不够智能
- SACK支持:精确标识丢包位置,减少重传
- 延迟ACK:每隔一个包或200ms发送ACK
- RTT采样优化:提高覆盖率,降低重传率
- 窗口预测:智能预测窗口恢复时机
- 并行化:接收端多线程处理,提升吞吐
MIT License
李智铭
天津大学 计算机科学与技术学院
- 天津大学计算机网络课程组
- RFC标准制定者
- 开源社区
- RFC 793: Transmission Control Protocol
- RFC 6298: Computing TCP's Retransmission Timer
- RFC 8312: CUBIC for Fast Long-Distance Networks
- RFC 2018: TCP Selective Acknowledgment Options
- Ha, S., Rhee, I., & Xu, L. (2008). CUBIC: A New TCP-Friendly High-Speed TCP Variant
- Ha, S., & Rhee, I. (2011). Hybrid Slow Start for High-Bandwidth and Long-Distance Networks
- Mathis, M., et al. (1997). The Macroscopic Behavior of the TCP Congestion Avoidance Algorithm
项目链接:https://github.com/CRAIG2864/TJUCNP
最后更新:2024-10