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: 具体选项
客户端 → SYN (MSS=1460) → 服务器 客户端 ← SYN+ACK (MSS=1460) ← 服务器 双方协商取较小值: 实际MSS = min(客户端MSS, 服务器MSS)
| 网络类型 | MSS 值 | 计算 |
|---|---|---|
| 以太网 | 1460 | 1500(IP) − 20(IP头) − 20(TCP头) |
| PPPoE | 1452 | 1492 − 20 − 20 |
| IPv6 以太网 | 1440 | 1500 − 40 − 20 |
实际窗口 $= 窗口字段值 \times 2^{缩放因子}$
例:窗口字段 = 32768,缩放因子 = 3,则实际窗口 $= 32768 \times 2^{3} = 262144$ 字节 = 256 KB。
客户端 → SYN (窗口缩放=7) → 服务器 客户端 ← SYN+ACK (窗口缩放=5) ← 服务器 数据传输: 客户端发送窗口 = 窗口字段 × 2^7 (用服务器通告的因子) 服务器发送窗口 = 窗口字段 × 2^5 (用客户端通告的因子)
+--------+--------+----------+----------+ | Kind=8 | Len=10 | TSval | TSecr | | | | (4字节) | (4字节) | +--------+--------+----------+----------+
发送方记录发送时 $TSval = T_1$;收到 ACK 后 $TSecr = T_1$(对方回显),则 $RTT =$ 当前时间 $-$ $T_1$。比传统 Karn 算法更精确,用于调整超时重传时间。
发送: [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
+--------+--------+--------------------------+ | Kind=4 | Length | SACK块列表 | | | | [左边界1, 右边界1] | | | | [左边界2, 右边界2] | +--------+--------+--------------------------+
接收方在ACK中携带SACK: ACK=2001, SACK=[3001-4001] 发送方解读: 2001 之前都收到,3001-4001 也收到 只重传: 2001-3000
| 选项 | Kind | 长度 | 使用场景 |
|---|---|---|---|
| MSS | 2 | 4 | SYN 中协商最大段长度 |
| 窗口缩放 | 3 | 3 | SYN 中协商窗口缩放因子 |
| SACK 许可 | 4 | 2 | SYN 中通告支持 SACK |
| SACK | 5 | 可变 | 数据传输中报告收到的块 |
| 时间戳 | 8 | 10 | RTT 测量和 PAWS |
↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。