Skip to content

CRAIG2864/TJU-CNP

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

TJU TCP/IP Network Project

天津大学计算机网络课程实验项目 - 基于UDP的用户态TCP协议栈完整实现

License Platform C Standard LaTeX

📋 项目概述

本项目是天津大学计算机网络课程的综合性实验项目,从零实现了一个完整的用户态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: 使用Vagrant虚拟机(推荐)

1. 启动虚拟机环境

# 启动client和server双虚拟机
vagrant up

# SSH连接到client
vagrant ssh client

# SSH连接到server(新终端)
vagrant ssh server

2. 编译项目

在client虚拟机中:

cd /vagrant/tju_tcp
make

3. 运行测试

Server端(在server虚拟机):

cd /vagrant/tju_tcp/test
./rdt_server

Client端(在client虚拟机):

cd /vagrant/tju_tcp/test
./rdt_client

4. 配置网络环境

# 设置带宽、延迟、丢包率
sudo tcset enp0s8 --rate 100Mbps --delay 20ms --loss 0.1%

# 查看当前配置
sudo tcshow enp0s8

# 重置网络参数
sudo tcdel enp0s8 --all

方式2: 本地直接编译

cd tju_tcp
make

# 编译测试程序
cd test && make

🔬 核心功能

1. 连接管理

  • 三次握手:完整的连接建立流程
  • 四次挥手:优雅关闭连接
  • 状态机:支持全部11种TCP状态
    • CLOSED, LISTEN, SYN_SENT, SYN_RECV
    • ESTABLISHED
    • FIN_WAIT_1, FIN_WAIT_2, CLOSING, TIME_WAIT
    • CLOSE_WAIT, LAST_ACK

2. 可靠传输

滑动窗口机制:

  • 发送端:维护发送队列,追踪未确认数据
  • 接收端:按序缓冲区 + 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超时

3. 流量控制

接收窗口通告:

free_space = SIZE - received_len - recv_ofo_bytes
adv_window = floor(free_space / MSS)

零窗口探测(关键创新):

  • 触发条件:peer_adv_window = 0
  • 探测间隔:200 ms
  • 探测包:1字节
  • 作用:防止窗口更新ACK丢失导致的死锁

4. 拥塞控制

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%
  • 快速退出慢启动,避免过度丢包

5. Trace日志系统

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编写的正式技术报告:

内容结构:

  1. 项目背景与需求分析
  2. 系统架构设计
  3. 核心算法原理与实现
  4. 性能测试与分析
  5. 创新点总结
  6. 参考文献

编译方式:

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

🔧 配置说明

TCP参数配置

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

Trace日志控制

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%

🎯 技术亮点

1. OFO红黑树优化

问题:传统链表处理乱序数据复杂度 O(n)

解决方案:红黑树实现

  • 查找/插入:O(log n)
  • 自动段合并
  • 精确计数维护
  • 实测效果:15倍性能提升(n=100)

2. 零窗口探测机制

问题:窗口更新ACK丢失导致死锁

解决方案:主动探测

  • 200ms间隔
  • 1字节探测包
  • 强制接收端回复

效果:完全避免死锁,窗口利用率98.29%

3. CUBIC拥塞控制

问题:Reno在高带宽长距离网络效率低

解决方案:CUBIC + HyStart

  • 三次函数增长曲线
  • TCP友好性保证
  • 快速慢启动退出

效果:高带宽网络性能优化

4. 完整的可观测性

Trace系统

  • 8种事件类型
  • 实时性能监控
  • 可视化分析支持

支持分析

  • 窗口演化
  • RTT/RTO趋势
  • 拥塞控制状态
  • 性能瓶颈定位

5. 线程安全设计

  • 每个socket独立锁
  • 条件变量精准唤醒
  • 内核/应用线程分离

📖 学习路线

阶段1: 基础连接管理

  1. 阅读 tju_tcp/src/tju_tcp.c 中的握手/挥手代码
  2. 运行 test_clienttest_server
  3. 理解TCP状态机转换

阶段2: 可靠传输机制

  1. 学习滑动窗口原理
  2. 研究 ofo_buffer.c 红黑树实现
  3. 分析 retransmission.c 重传逻辑
  4. 运行 rdt_client/server 测试

阶段3: 流量控制

  1. 理解窗口通告计算
  2. 研究零窗口探测机制
  3. 分析trace日志中的窗口演化

阶段4: 拥塞控制

  1. 学习CUBIC算法原理(RFC 8312)
  2. 研究 cubic.c 实现细节
  3. 对比CUBIC vs Reno性能

阶段5: 性能优化

  1. 使用trace系统分析瓶颈
  2. 调整TCP参数
  3. 实验不同网络环境

⚠️ 已知问题与改进方向

当前限制

  • ❌ 不支持SACK(选择性确认)
  • ❌ 不支持延迟ACK
  • ⚠️ RTT采样覆盖率偏低(可靠传输测试)
  • ⚠️ 窗口预测不够智能

改进方向

  1. SACK支持:精确标识丢包位置,减少重传
  2. 延迟ACK:每隔一个包或200ms发送ACK
  3. RTT采样优化:提高覆盖率,降低重传率
  4. 窗口预测:智能预测窗口恢复时机
  5. 并行化:接收端多线程处理,提升吞吐

📄 许可证

MIT License

👤 作者

李智铭
天津大学 计算机科学与技术学院

🙏 致谢

  • 天津大学计算机网络课程组
  • RFC标准制定者
  • 开源社区

📚 参考文献

  1. RFC 793: Transmission Control Protocol
  2. RFC 6298: Computing TCP's Retransmission Timer
  3. RFC 8312: CUBIC for Fast Long-Distance Networks
  4. RFC 2018: TCP Selective Acknowledgment Options
  5. Ha, S., Rhee, I., & Xu, L. (2008). CUBIC: A New TCP-Friendly High-Speed TCP Variant
  6. Ha, S., & Rhee, I. (2011). Hybrid Slow Start for High-Bandwidth and Long-Distance Networks
  7. Mathis, M., et al. (1997). The Macroscopic Behavior of the TCP Congestion Avoidance Algorithm

项目链接https://github.com/CRAIG2864/TJUCNP

最后更新:2024-10

About

TianJin University Computer Network Practice

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published