首页/计算机网络/05-transport/TCP报文段格式 🔗 在 Obsidian 中打开
计算机网络 · 05-transport

TCP报文段格式

重要度 ⭐⭐ 题型 选择 / 简答 计算机网络/传输层报文段传输层可靠传输
速查
TCP 是面向连接、可靠、基于字节流的传输层协议,把应用层数据封装为报文段。首部固定 20 字节,可选部分最长 40 字节,总长 20~60 字节;最大报文段长度 MSS 只协商数据部分的上限(不含首部)。

核心概念

TCP 概述

TCP(Transmission Control Protocol,传输控制协议)是面向连接的、可靠的、基于字节流的传输层协议。TCP 将应用层数据封装为报文段(Segment)进行传输。

TCP 报文段结构

TCP 报文段由首部数据两部分组成。首部固定部分为 20 字节,可选部分最长 40 字节,因此首部总长 20~60 字节。

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          源端口号             |        目的端口号              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        序号 (Sequence Number)                  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     确认号 (Acknowledgment Number)             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 数据偏移|保留 |C|E|U|A|P|R|S|F|            窗口大小             |
| (4位)  |(3位)|W|C|R|C|S|S|Y|I|                               |
|        |     |R|E|G|K|H|T|N|N|                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           校验和              |        紧急指针                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    选项(可选,0~40字节)                       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         数据                                    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

各字段详解

固定首部字段(20 字节)

字段长度说明
源端口号16 位发送方进程端口号,范围 0~65535
目的端口号16 位接收方进程端口号
序号 (Seq)32 位本报文段数据的第一个字节在整个字节流中的编号
确认号 (Ack)32 位期望收到对方下一个报文段的第一个字节的编号
数据偏移4 位TCP 首部长度,单位为 4 字节(32 位字),最大值 15,即首部最长 60 字节
保留3 位保留为将来使用,目前置 0
标志位 (Flags)9 位NS, CWR, ECE, URG, ACK, PSH, RST, SYN, FIN(RFC 3168 后为 9 位)
窗口大小16 位接收窗口大小,单位为字节,用于流量控制
校验和16 位覆盖首部和数据,计算时包括伪首部
紧急指针16 位$URG=1$ 时有效,指出紧急数据的末尾在数据中的偏移

9 个标志位详解

标志位全称含义
NSNonce SumECN-nonce 隐藏保护位(RFC 3540),用于防止接收方隐藏丢包
CWRCongestion Window Reduced发送方已按 ECN 要求降低拥塞窗口
ECEECN-EchoECN 回显。=1 表示对端报告了拥塞(配合 ECN 使用)
URGUrgent紧急标志。=1 时紧急指针字段有效,数据需优先处理
ACKAcknowledgment确认标志。=1 时确认号字段有效。连接建立后所有报文段 $ACK=1$
PSHPush推送标志。=1 时接收方应尽快将数据交付应用层,不等缓冲区满
RSTReset复位标志。=1 时表示连接出现严重差错,需释放并重建连接
SYNSynchronize同步标志。=1 时表示连接请求或连接接受(用于三次握手)
FINFinish终止标志。=1 时表示发送方数据已发完,请求释放连接(用于四次挥手)

可选字段(最长 40 字节)

常见选项:

  • 最大报文段长度 MSS:协商 TCP 数据部分的最大长度(不含首部)
  • 窗口扩大因子:将 16 位窗口字段左移若干位,扩大窗口范围
  • 时间戳:用于计算 RTT 和防止序号回绕
  • 选择确认 SACK:允许接收方报告不连续的数据块

关键机制

1. 序号和确认号

TCP 对每个字节编号(不是对报文段编号)。

  • 序号 Seq:本报文段数据部分第一个字节的编号
  • 确认号 Ack:期望收到的下一个字节的编号,表示该编号之前的所有数据已正确接收
  • 累积确认:确认号表示该号之前所有数据都已正确收到

2. 校验和计算

校验和覆盖范围 = 伪首部 + TCP 首部 + TCP 数据

伪首部(来自 IP 层,不实际传输):

  • 源 IP 地址(4 字节)
  • 目的 IP 地址(4 字节)
  • 全零(1 字节)
  • 协议号 6(1 字节,TCP 的协议号)
  • TCP 长度(2 字节,首部 + 数据)

3. 窗口机制

窗口大小字段(16 位)表示接收窗口大小:

  • 值为 0:发送方暂停发送(零窗口)
  • 发送方的发送窗口 $\leq$ 接收方通告的窗口值
  • 用于流量控制

关键定义表格

概念定义
报文段TCP 传输的数据单元,由首部和数据组成
MSS最大报文段长度,TCP 数据部分的最大值(不含首部)
序号数据第一个字节在字节流中的位置
确认号期望下一个收到的字节编号
数据偏移首部长度字段,以 4 字节为单位
累积确认确认号 N 表示 N 之前的所有数据已正确接收
伪首部用于校验和计算的虚拟首部,来自 IP 层信息
接收窗口接收方缓冲区还能接收的数据量
MSS vs MTU$MSS = MTU - IP_{hdr} - TCP_{hdr}$,通常 $MSS = 1460$ 字节

手算示例

例 1:计算首部长度

题目:某 TCP 报文段的数据偏移字段值为 5(二进制 0101),求首部长度。

数据偏移 = 5,单位为 4 字节,故首部长度 $= 5 \times 4 = 20$ 字节(即无可选字段,最小首部)。

例 2:计算含选项的首部长度

题目:某 TCP 报文段数据偏移字段为 15(二进制 1111),且携带了 MSS 选项(4 字节)和窗口扩大因子选项(3 字节)及 1 字节填充。求首部总长度。

  • 数据偏移 = 15,单位为 4 字节,首部长度 $= 15 \times 4 = 60$ 字节(最大首部)
  • 固定部分 = 20 字节
  • 选项 + 填充 $= 60 - 20 = 40$ 字节

例 3:序号和确认号计算

题目:A 向 B 发送数据,$MSS = 1000$ 字节。A 已发送了序号为 1001 的报文段(携带 1000 字节数据)。B 的确认号应该是多少?

  • 报文段序号 = 1001,数据长度 = 1000 字节
  • 该报文段覆盖的字节:1001 ~ 2000
  • B 确认号 = 2001(表示 2001 之前的所有数据已正确收到)

例 4:三次握手的标志位

题目:写出 TCP 三次握手中三个报文段的标志位设置。

报文段发送方→接收方SYNACK说明
第 1 个客户端→服务器10连接请求,$SYN=1$
第 2 个服务器→客户端11同意连接,$SYN=1,ACK=1$
第 3 个客户端→服务器01确认,$ACK=1$

例 5:校验和伪首部

题目:TCP 校验和计算时为什么要包含伪首部?

  • TCP 校验和覆盖:伪首部 + TCP 首部 + TCP 数据
  • 伪首部包含:源 IP、目的 IP、协议号、TCP 长度
  • 目的:确保 TCP 报文段到达了正确的主机和正确的协议
  • 如果只有 TCP 首部校验,无法检测 IP 地址错误的情况
  • 伪首部不实际传输,仅用于发送端和接收端的校验计算

时间/空间复杂度

项目说明
首部大小固定 20 字节,最大 60 字节
序号空间32 位,范围 $0 \sim 2^{32}-1$(约 4 GB 后回绕)
窗口大小基本 16 位(最大 65535 字节),可选扩大因子最大 14 位(最大约 1 GB)
端口空间16 位,0~65535(0 保留,1~1023 熟知端口)

常见考法

高频设问
  1. 报文段字段含义:各字段的功能、长度、单位
  2. 序号确认号计算:给定发送情况,计算 Seq 和 Ack
  3. 标志位判断:根据报文段内容判断各标志位的值
  4. 三次握手 / 四次挥手:各阶段报文段的标志位和序号变化
  5. MSS vs MTU:三者的关系和计算
  6. 校验和计算:伪首部的作用和组成
  7. 数据偏移字段:首部长度的计算

易错点

必记
  1. 序号是对字节编号,不是对报文段编号:TCP 是面向字节流的
  2. 确认号是"期望的下一个":$Ack=N$ 表示 N 之前的所有字节已收到
  3. 数据偏移的单位是 4 字节:不是 1 字节,值最大为 15
  4. 窗口大小的单位是字节:不是报文段
  5. SYN 和 FIN 也消耗序号:SYN 和 FIN 各占用 1 个序号
  6. ACK 标志 $\neq$ 确认号字段:$ACK=1$ 表示确认号字段有效;$ACK=0$ 时确认号字段无意义
  7. 校验和包含伪首部:伪首部是虚拟的,不实际传输

核心结论

必背
  1. TCP 首部固定 20 字节,通过数据偏移字段可扩展到 60 字节
  2. 序号和确认号实现可靠传输累积确认
  3. 9 个标志位(NS / CWR / ECE / URG / ACK / PSH / RST / SYN / FIN)控制 TCP 连接管理和数据传输
  4. 窗口大小实现流量控制
  5. 校验和覆盖伪首部 + 首部 + 数据,确保端到端正确性
  6. MSS 是 TCP 数据部分最大值,$MSS = MTU - IP_{hdr}(20) - TCP_{hdr}(20)$
  7. SYN / FIN 各消耗一个序号,ACK 不消耗

记忆卡片

TCP 首部的固定长度?最大长度?
固定 20 字节,最大 60 字节(20 + 40 选项)。数据偏移为 5 → 20 字节,为 15 → 60 字节。
TCP 的序号是对什么编号?
字节编号,不是对报文段编号;Seq 是数据部分第一个字节在字节流中的位置。
哪个握手报文 $SYN=1$ 但 $ACK=0$?
第一个报文段(客户端连接请求)。第二个 $SYN=1,ACK=1$,第三个 $ACK=1$。
TCP 校验和的计算范围?
伪首部 + TCP 首部 + TCP 数据。伪首部含源/目的 IP、协议号、TCP 长度,不实际传输。
MSS 和 MTU 的关系?
$MSS = MTU - IP_{hdr} - TCP_{hdr}$。以太网 $MTU=1500$,两首部各 20 → $MSS=1460$ 字节。
窗口字段的单位是什么?
字节,而非报文段;16 位最大 65535,需窗口扩大因子突破。

交互动画 · TCP 首部字段解剖

bit 0 15 | 16 31 源端口号16 bit 目的端口号16 bit 序号 Sequence Number32 bit 确认号 Acknowledgment Number32 bit 数据偏移4 保留3 标志位 Flags9 窗口大小16 bit 校验和16 bit 紧急指针16 bit 选项 Options + 填充0 ~ 40 byte 数据(应用层载荷)≤ MSS
点击按钮或直接点击图中字段,查看该字段的作用
首部固定 20 字节(前 5 行),选项使首部最长可达 60 字节
示意图:一行 = 32 bit。前 5 行为固定首部(20 字节),虚线框为可变长部分;橙色高亮表示当前选中的字段。

相关知识点

tcp-three-way-handshake tcp-options-field

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