首页/计算机网络/05-transport/TCP选项字段 🔗 在 Obsidian 中打开
计算机网络 · 05-transport

TCP选项字段

重要度 ⭐⭐⭐⭐⭐选项字段MSS窗口缩放时间戳SACK
速查
选项格式 Kind(1) + Length(1) + Data(可变)。MSS(Kind=2,Len=4,以太网 1460);窗口缩放(Kind=3,Len=3,实际窗口 = 窗口字段 $\times 2^{shift}$);时间戳(Kind=8,Len=10,测 RTT + 防回绕 PAWS);SACK(Kind=4/5,选择性确认)。Kind=0 结束、Kind=1 NOP 填充对齐。

一、TCP头部结构

固定头部(20 字节)

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-------------------------------+-------------------------------+
|          源端口号              |          目的端口号           |
+-------------------------------+-------------------------------+
|                        序列号 (Seq)                            |
+---------------------------------------------------------------+
|                      确认号 (Ack)                             |
+-------+-------+-------+-------+-------------------------------+
|数据偏 |保留   |URGACK |窗口   |            校验和              |
|移(4)  |(6)    |PSHRST |大小   |                               |
|       |       |SYNFIN |       |                               |
+-------------------------------+-------------------------------+
|         紧急指针              |        选项(可变长)           |
+-------------------------------+-------------------------------+

选项字段格式

+--------+--------+------------------+
| Kind   | Length | Data             |
| (1字节) |(1字节) | (可变长)          |
+--------+--------+------------------+

Kind=0   : 选项列表结束
Kind=1   : 无操作(填充对齐)
Kind=2-255: 具体选项

二、MSS(最大报文段长度)

定义

  • Kind=2,Length=4
  • 通告本端能接收的最大 TCP 数据长度(不含 TCP 头部),通常在 SYN 报文中通告。

工作过程

客户端 → SYN (MSS=1460)   → 服务器
客户端 ← SYN+ACK (MSS=1460) ← 服务器

双方协商取较小值:
实际MSS = min(客户端MSS, 服务器MSS)

常见 MSS 值

网络类型MSS 值计算
以太网14601500(IP) − 20(IP头) − 20(TCP头)
PPPoE14521492 − 20 − 20
IPv6 以太网14401500 − 40 − 20
MSS vs MTUMTU:最大传输单元(IP 层,含 IP 头部);MSS:最大报文段长度(TCP 层,不含 TCP 头部)。关系:$MSS = MTU - IP_{头} - TCP_{头}$

三、窗口缩放选项

定义

  • Kind=3,Length=3
  • 扩大 TCP 窗口大小(原始窗口字段仅 16 bit,最大 65535 字节);窗口缩放因子(Shift Count)范围 0–14。

计算

实际窗口 $= 窗口字段值 \times 2^{缩放因子}$

例:窗口字段 = 32768,缩放因子 = 3,则实际窗口 $= 32768 \times 2^{3} = 262144$ 字节 = 256 KB。

协商过程

客户端 → SYN (窗口缩放=7)  → 服务器
客户端 ← SYN+ACK (窗口缩放=5) ← 服务器

数据传输:
客户端发送窗口 = 窗口字段 × 2^7   (用服务器通告的因子)
服务器发送窗口 = 窗口字段 × 2^5   (用客户端通告的因子)
为什么需要高带宽延迟积(BDP)网络需要大窗口:$100\text{Mbps} \times 100\text{ms RTT} = 10\text{Mb} = 1.25\text{MB}$,远超 65535;窗口缩放可将窗口扩大到 1GB。

四、时间戳选项

定义

  • Kind=8,Length=10,包含两个 4 字节时间戳值。
+--------+--------+----------+----------+
| Kind=8 | Len=10 | TSval    | TSecr    |
|        |        | (4字节)   | (4字节)   |
+--------+--------+----------+----------+

功能 1:RTT 测量

发送方记录发送时 $TSval = T_1$;收到 ACK 后 $TSecr = T_1$(对方回显),则 $RTT =$ 当前时间 $-$ $T_1$。比传统 Karn 算法更精确,用于调整超时重传时间。

功能 2:防止序列号回绕(PAWS)

  • 高速网络中,旧报文的序列号可能与新报文相同(回绕)。
  • 时间戳单调递增,可区分新旧报文:收到的时间戳小于之前收到的 → 丢弃(可能是旧报文)。

五、SACK(选择性确认)

定义

  • Kind=4(SACK 许可)、Kind=5(SACK),Length 可变
  • 允许接收方告知发送方哪些报文段已收到。

为什么需要

发送: [1-1000] [1001-2000] [2001-3000] [3001-4000]
收到: [1-1000] [1001-2000]    ×丢失×    [3001-4000]

无SACK: 发送方只能重传 2001-4000(Go-Back-N 式浪费)
有SACK: 发送方知道 3001-4000 已收到,只重传 2001-3000

SACK 块格式

+--------+--------+--------------------------+
| Kind=4 | Length | SACK块列表               |
|        |        | [左边界1, 右边界1]        |
|        |        | [左边界2, 右边界2]        |
+--------+--------+--------------------------+

工作示例

接收方在ACK中携带SACK:
ACK=2001, SACK=[3001-4001]

发送方解读: 2001 之前都收到,3001-4001 也收到
只重传: 2001-3000

六、其他选项

  • 窗口缩放协商(Kind=3):SYN 阶段协商,双方各自选择缩放因子。
  • 空操作(NOP,Kind=1):用于 4 字节对齐填充,不携带数据。
  • 选项结束(EOL,Kind=0):标记选项字段结束,填充到 4 字节边界。

七、选项协商总结

选项Kind长度使用场景
MSS24SYN 中协商最大段长度
窗口缩放33SYN 中协商窗口缩放因子
SACK 许可42SYN 中通告支持 SACK
SACK5可变数据传输中报告收到的块
时间戳810RTT 测量和 PAWS

记忆卡片

MSS 与 MTU 的关系?以太网 MSS?
$MSS = MTU - IP_{头} - TCP_{头}$;以太网 $MSS = 1500 - 20 - 20 = 1460$ 字节。
窗口缩放如何算实际窗口?
实际窗口 = 窗口字段 $\times 2^{缩放因子}$(如 32768 × 2³ = 262144 = 256KB)。
时间戳选项的两个功能?
① 精确测量 RTT(调整超时重传时间);② PAWS 防止序列号回绕。
SACK 解决什么问题?
选择性确认:只重传丢失的部分(2001-3000),避免 Go-Back-N 的浪费。

交互动画 · 选项字段字节布局

选项区字节序号(0..19) 0123456789 10111213141516171819 K=2L=4MSS1460 K=3L=3shift K=4L=2 NOP K=8L=10TSval(4B)TSvalTSvalTSvalTSecr(4B)TSecrTSecrTSecr MSS:K2 L4 · 通告最大段长,SYN 协商取 min 窗口缩放:K3 L3 · 实际窗口 = 窗口字段 × 2^shift SACK 许可:K4 L2 · SYN 中通告支持选择性确认 时间戳:K8 L10 · TSval/TSecr 测 RTT + 防回绕 PAWS NOP:K1 · 对齐填充;EOL:K0 · 选项结束
点击选项类型,橙色高亮其在选项区中的字节跨度
点击上方按钮开始
示意图:20 字节选项区样例布局(实际按需组合);每个选项 = Kind(1) + Length(1) + Data。

相关知识点

tcp-segment-format tcp-three-way-handshake

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。