TCP-IP详解卷3 第2章:T/TCP协议(概述、选项与实现变量)

来源:《TCP/IP详解 卷3:TCP事务协议,HTTP,NNTP和UNIX域协议》(W. Richard Stevens,中文版)第 2 章,云盘文件为该书扫描/文字版 PDF 拆分件的 002.PDF(第 2 章,约 24-30 页)。旧中文 PDF 文字版存在字间空格噪声(如”T / T C P”),本笔记已清洗。

核心问题:TCP 用于事务的两个痛点

TCP 应用于客户-服务器”事务”(一问一答短交互)时有两个固有低效:

  1. 三次握手额外多一个 RTT:客户测得的事务时间被握手开销拉长。
  2. TIME_WAIT 滞留 240 秒:客户进程主动关闭连接后,需在对等 FIN 之后滞留约 240 秒。

痛点组合的实际后果:TIME_WAIT × 16 比特端口号限制了同一对主机间的最大事务速率——每 240 秒最多约 64512 个可用端口 ≈ 每秒 268 个事务;局域网 RTT 1~3ms 下真实需求可能超过这个上限。即使速率低于该上限,TIME_WAIT 期间每个连接仍需内核控制块(BSD 实现:IP 控制块 84B + TCP 控制块 140B + 首部模板 40B),例如每 240 秒 50000 次事务就要约 13.2MB 内核内存。

T/TCP 的解法:绕过三次握手(TAO),并把 TIME_WAIT 从 240 秒截断到约 12 秒。

TAO:TCP 加速打开

  • 核心机制 TAO(TCP Accelerated Open):给每台主机的每个连接分配唯一标识符——连接计数 CC(Connection Count)。
  • 每台 T/TCP 主机为每个对等主机保留”最新连接的 CC”一段时间。
  • TAO 测试:服务器收到带 CC 的 SYN 时,若 CC 大于该主机对记录的最新 CC,即可断定这是一个新 SYN(而非重复的老 SYN),于是直接接受连接、跳过三次握手。测试失败则退回标准三次握手。

三个新 TCP 选项(RFC 1644)

TCP 选项全景:MSS / 窗口放宽 / 时间戳(RFC 1323 等既有 5 项)之外,T/TCP 新增 3 项:

选项含义
CC连接计数,随连接上每个报文段发送
CCnew仅用于主动打开的 SYN 报文段中,替代 CC
CCecho应答方回声收到的 CC,证明对端支持 T/TCP

所有选项带长度域,不认识它们的旧 TCP 实现可以安全跳过(向后兼容)。

实现所需变量(三层)

  • 每内核:tcp_ccgen——32 位全局 CC 计数器,每建立一个连接(不论主被动、是否用 T/TCP)加 1,永不为 0(回绕到 0 时置 1)。
  • 每主机(TAO 缓存,复用路由表项实现):
    • tao_cc:最后一次从该主机收到的不含 ACK 的合法 SYN(主动打开)中的 CC 值——TAO 测试的比较基准;新表项初始化为 0(未定义)。
    • tao_ccsent:发给该主的最后一个不含 ACK 的 SYN 中的 CC;若为 0 则只有对方回过 CCecho 后才置非 0。
    • tao_mssopt:最后一次从该主机收到的 MSS 选项值。
  • 每连接(TCP 控制块新增):
    • cc_send:本连接各报文段携带的 CC 值;
    • cc_recv:期望对方报文段携带的 CC 值;
    • t_duration:连接已建立时长——主动关闭时若时长 < MSL,TIME_WAIT 可截断(这就是 240s→12s 的来源)。

状态变迁图的两点改造

  1. 常规 TCP 状态图共 10 个状态。本书画法把要发送的报文段类型标在状态框内而非变迁线上——因为 T/TCP 中一个报文段可能引发多次状态变迁(例如同时含 SYN+数据+FIN+ACK 的报文段),重要的是处理完后的最终状态。
  2. TCP 输入处理顺序是协议规定的(RFC 793),非实现自由:例如 SYN_SENT 态收到 SYN+数据+FIN+ACK 报文段,处理顺序固定为 SYN → ACK → 数据 → FIN,每个标志都可能改变连接状态。

T/TCP 的 7 个扩展状态(加星状态)

SYN_SENT*、SYN_RCVD*、ESTABLISHED*、CLOSE_WAIT*、LAST_ACK*、FIN_WAIT_1*、CLOSING*。

实现上并不需要真正新增状态机:扩展状态只是既有状态的扩充,每个连接只需 2 个新标志(是否还需发 SYN、是否还需发 FIN)即可组合定义这 7 种状态——协议扩展保持简单是本章的工程要点。

例子:T/TCP 客户主动打开时发出 SYN+数据+FIN,进入 SYN_SENT*;收到对方的 SYN+数据+FIN+ACK 应答后,客户端连接经历一串状态变迁(ACK 使状态到 FIN_WAIT_1,随后…直到 TIME_WAIT)。

可行动点 / 关联

  • 理解现代语境:T/TCP(RFC 1644/1647/2385)最终未获广泛部署,但”用加密时间戳代替状态缓存做 SYN 新鲜性验证”的思想在 TCP MD5 签名选项、乃至 TFO(TCP Fast Open, RFC 7413) 中复活。TFO cookie ≈ CC 的现代继承者。
  • “事务速率受 TIME_WAIT×端口空间约束”的推导方法,适用于今天评估短连接 HTTP 客户端的端口耗尽问题(与 TCP-IP详解卷2-实现-全书章节索引 中 TIME_WAIT/定时器章节互补)。
  • 本书卷3共 21 章;第 2 章属于”第一部分 T/TCP”(第 2-12 章),第二部分 HTTP(13-19 章)、第三部分 NNTP 与 UNIX 域协议。