Skip to main content

Appendix C. TCP Verification (TCP 验证)

本附录提供了验证 TCP 实现正确性的指南和测试方法.

C.1. 验证方法

C.1.1. 单元测试

头部处理测试:

  • 正确解析 TCP 头部字段
  • 正确生成 TCP 头部
  • 选项解析和生成
  • 校验和计算

序列号测试:

  • 序列号递增
  • 序列号环绕处理
  • 确认号处理

C.1.2. 集成测试

连接管理测试:

测试用例: 正常三次握手
1. 客户端发送 SYN
2. 服务器响应 SYN-ACK
3. 客户端发送 ACK
4. 验证连接建立

测试用例: 同时打开
1. 两端同时发送 SYN
2. 两端接收 SYN 并发送 SYN-ACK
3. 验证连接建立

测试用例: 正常关闭
1. 一端发送 FIN
2. 另一端确认并发送 FIN
3. 第一端确认
4. 验证连接关闭

数据传输测试:

  • 小数据包传输
  • 大数据传输 (需要分段)
  • 乱序数据处理
  • 重复数据检测

C.1.3. 互操作性测试

与标准实现对接:

  • Linux TCP 栈
  • BSD TCP 栈
  • Windows TCP 栈

测试场景:

  • 不同 MSS 值
  • 不同窗口大小
  • 各种选项组合

C.2. 常见问题检测

C.2.1. 序列号问题

检查项:

  • ISN 是否随机生成
  • 是否正确处理序列号环绕
  • 是否正确比较序列号

测试方法:

# 伪代码: 序列号环绕测试
seq1 = 0xFFFFFFFF - 100
seq2 = 100
assert seq2 > seq1 # 使用模 2^32 算术

C.2.2. 校验和问题

检查项:

  • 是否包含伪头部
  • 是否正确处理奇数长度数据
  • 是否在发送时计算
  • 是否在接收时验证

测试方法:

1. 构造已知校验和的段
2. 验证实现计算出相同校验和
3. 修改段内容
4. 验证实现检测到校验和错误

C.2.3. 窗口管理问题

检查项:

  • 窗口大小是否作为无符号数处理
  • 零窗口探测是否正确实现
  • 窗口缩放是否正确应用

C.2.4. 重传问题

检查项:

  • 是否实现超时重传
  • RTO 计算是否正确
  • 是否实现快速重传

C.3. 性能验证

C.3.1. 吞吐量测试

测试工具:

  • iperf3
  • netperf
  • nuttcp

测试场景:

# 单连接吞吐量
iperf3 -c server -t 60

# 多连接吞吐量
iperf3 -c server -P 10 -t 60

# 不同窗口大小
iperf3 -c server -w 256K -t 60

C.3.2. 延迟测试

测试方法:

  • 测量 RTT (往返时间)
  • 测量连接建立时间
  • 测量数据传输延迟

C.3.3. 拥塞控制验证

测试场景:

  • 慢启动行为
  • 拥塞避免行为
  • 丢包响应
  • 快速重传和快速恢复

C.4. 安全性验证

C.4.1. 序列号可预测性测试

测试方法:

1. 建立多个连接
2. 记录每个连接的 ISN
3. 分析 ISN 的随机性
4. 确保无法预测

C.4.2. RST 攻击防护测试

测试方法:

1. 建立连接
2. 发送窗口外的 RST
3. 验证连接未被重置
4. 发送窗口内的 RST
5. 验证连接正确处理

C.4.3. SYN Flood 防护测试

测试方法:

1. 发送大量 SYN 段
2. 不完成握手
3. 验证服务器响应性
4. 确认资源未耗尽

C.5. 压力测试

C.5.1. 连接数测试

# 测试最大并发连接数
ab -n 100000 -c 10000 http://server/

C.5.2. 高速率测试

# 测试高包速率下的稳定性
pktgen 配置高速率数据包生成

C.5.3. 长时间运行测试

# 24 小时稳定性测试
iperf3 -c server -t 86400

C.6. 边界条件测试

C.6.1. 极端值测试

测试用例:

  • MSS = 1 (最小值)
  • MSS = 65535 (最大值)
  • Window = 0 (零窗口)
  • Window = 65535 (最大窗口)
  • 序列号接近 2^32 (环绕边界)

C.6.2. 异常输入测试

测试用例:

  • 畸形头部
  • 无效选项
  • 错误的校验和
  • 无效的标志组合

C.7. 协议一致性测试

C.7.1. RFC 合规性

检查项:

  • MUST 要求全部实现
  • SHOULD 要求大部分实现
  • 处理所有定义的状态
  • 正确响应所有事件

C.7.2. 状态机验证

测试方法:

1. 遍历所有状态转换
2. 验证每个转换的条件
3. 确认终止状态正确
4. 测试异常状态处理

C.8. 调试工具

C.8.1. 包捕获工具

# tcpdump 捕获 TCP 流量
tcpdump -i eth0 -w capture.pcap tcp port 80

# Wireshark 分析
wireshark capture.pcap

C.8.2. 系统工具

# 查看 TCP 连接状态
netstat -ant
ss -ant

# 查看 TCP 统计
netstat -s | grep -i tcp

# 查看 TCP 内核参数
sysctl -a | grep tcp

C.8.3. 测试框架

推荐工具:

  • Packetdrill - TCP 行为测试脚本
  • tcptrace - TCP 连接分析
  • tcpstat - TCP 统计分析

C.9. 验证报告

建议包含:

  1. 测试环境描述
  2. 测试用例列表
  3. 测试结果汇总
  4. 发现的问题列表
  5. 性能指标
  6. RFC 合规性声明

注意: TCP 验证是一个复杂的过程. 建议使用自动化测试工具和持续集成来确保实现的正确性和稳定性.