精简版 · 小杯2026-08 冻结,已停止更新(发布前修订了 4 处已知错误)。后续勘误与新增内容只在正式版。看正式版(中杯)→
Skip to content

TCP 协议基础 ​

考情分析 ​

TCP 首部格式是 408 的常客,尤其是序号、确认号、各标志位(SYN/ACK/FIN)的含义,几乎是三次握手和四次挥手题目的前置知识。选择题经常考某个字段占多少位、某个标志位的作用。

考频:★★★★

TCP 的特点 ​

TCP(Transmission Control Protocol,传输控制协议)的设计目标是在不可靠的 IP 层之上提供可靠的端到端通信。

1. 面向连接

通信前必须先建立连接(三次握手),通信结束后释放连接(四次挥手)。连接是逻辑连接,不是物理连接。

2. 可靠传输

通过序号、确认、重传、校验和等机制,保证数据无差错、不丢失、不重复、按序到达。

3. 面向字节流

TCP 把应用层交下来的数据看作一连串无结构的字节流。TCP 不关心应用层一次写了多少数据,它会根据当前窗口大小和网络状况,自行决定每个报文段装多少数据。

4. 全双工通信

TCP 连接的两端都可以同时发送和接收数据。每一端都有发送缓冲区和接收缓冲区。

5. 点对点

TCP 连接只能是一对一的,不支持广播和多播。

TCP 报文段首部格式 ​

TCP 首部最少 20 字节,最多 60 字节(20 字节固定 + 最多 40 字节选项)。

 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)                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 数据偏移 | 保留 |U|A|P|R|S|F|          窗口大小              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           校验和              |          紧急指针             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                   选项(长度可变)                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

各字段详解 ​

字段长度说明
源端口16 位发送方端口号
目的端口16 位接收方端口号
序号 seq32 位本报文段数据部分第一个字节的编号
确认号 ack32 位期望收到的下一个字节的编号(即:确认号之前的所有字节都已正确收到)
数据偏移4 位TCP 首部长度,单位是 4 字节。最小值 5(20字节),最大值 15(60字节)
保留6 位保留未用,置 0
窗口16 位接收方告知发送方自己的接收窗口大小(rwnd),单位是字节
校验和16 位检验首部 + 数据,计算时加伪首部(同 UDP)
紧急指针16 位仅当 URG=1 时有效,指出紧急数据的末尾在报文段中的偏移量

六个标志位 ​

这六个标志位各占 1 位,是考试重点中的重点:

标志位全称含义
URGUrgent紧急位。URG=1 时紧急指针有效,数据优先传送
ACKAcknowledgment确认位。ACK=1 时确认号字段有效。TCP 规定连接建立后所有报文段 ACK 都必须为 1。注意:第一次握手 ACK=0(因为此时还没收到对方的任何报文)
PSHPush推送位。PSH=1 时接收方应尽快将数据交给应用层,不必等缓冲区满
RSTReset复位位。RST=1 时表示连接出现严重错误,必须释放连接后重建
SYNSynchronize同步位。SYN=1 表示这是一个连接请求或连接接受报文
FINFinish终止位。FIN=1 表示发送方数据已发完,要求释放连接

记忆技巧:三次握手用 SYN 和 ACK,四次挥手用 FIN 和 ACK,出问题用 RST。

序号和确认号 ​

这两个字段是理解 TCP 可靠传输的基础。

序号 seq: TCP 把要传送的每一个字节都编了号。序号字段的值 = 本报文段数据部分第一个字节的编号。

确认号 ack: 表示"我已经收到了确认号之前的所有数据,现在期望你发序号 = 确认号的那个字节"。

举例:A 向 B 发送了 seq=201, 长度=100 的报文段(包含字节 201~300),B 收到后回复 ack=301,意思是"301 之前的数据我都收到了,下一个给我发 301"。

MSS(最大报文段长度) ​

MSS 是 TCP 报文段中数据部分的最大长度,不包含 TCP 首部。MSS 在连接建立时通过 SYN 报文段中的选项字段协商。

MSS=MTU−IP首部长度−TCP首部长度

以太网的 MTU = 1500 字节,所以典型的 MSS = 1500 - 20 - 20 = 1460 字节。

MSS 的选择是一个权衡:太大了 IP 层要分片,太小了首部开销比例过高。

TCP 连接的标识 ​

一个 TCP 连接由四元组唯一标识:

(源 IP,源端口,目的 IP,目的端口)

这意味着同一台服务器的同一个端口(如 80 端口)可以同时服务多个客户端——因为不同客户端的源 IP 或源端口不同,形成不同的四元组,对应不同的 TCP 连接。

TCP 的常见选项字段 ​

TCP 首部 20 字节是固定的,后面最多还有 40 字节的选项。常见的选项包括:

选项说明
MSS在 SYN 报文段中协商最大报文段长度
窗口缩放(Window Scale)将窗口字段的值左移指定位数,突破 65535 字节的窗口上限
时间戳(Timestamp)用于 RTT 测量和防止序号回绕
SACK选择确认,告知发送方哪些不连续的数据块已收到
NOP填充字节,用于对齐

选项字段的长度必须是 4 字节的整数倍。不足的部分用 NOP(No-Operation)或 EOL(End of Option List)填充。

交互可视化 ​

加载可视化中...

易错点 ​

1. 序号 seq 和确认号 ack 是不同的概念

seq 是"我发的数据从第几个字节开始",ack 是"我期望收到的下一个字节编号"。做题时一定分清这两个值。

2. 数据偏移的单位是 4 字节,不是 1 字节

数据偏移字段 4 位,最大值 15,所以 TCP 首部最大长度 = 15 x 4 = 60 字节。

3. ACK 标志位和确认号 ack 不是一回事

大写 ACK 是标志位(0 或 1),小写 ack 是确认号(32 位的具体数值)。ACK=1 时确认号才有效。

4. SYN 和 FIN 要消耗一个序号

SYN 报文段和 FIN 报文段虽然可以不携带数据,但它们各自需要消耗一个序号。这在计算三次握手和四次挥手的序号时非常关键。

补充细节(高频考点):

  • SYN 报文段(第一次、第二次握手)不能携带数据,但消耗一个序号
  • 第三次握手的 ACK 报文段可以携带数据;如果不携带数据,则不消耗序号(下一个数据报文段的序号仍为 x+1)
  • FIN 报文段可以携带数据,无论是否携带都消耗一个序号

疑难点 ​

为什么可靠传输放在传输层而不是网络层?

这是 TCP/IP 的端到端设计哲学——网络核心(路由器)只做最基本的转发,复杂的可靠性保障交给端系统的传输层。这样网络核心保持简单高效,不同应用按需选择可靠(TCP)或不可靠(UDP)的传输服务。如果在网络层做可靠传输,所有应用都被迫承受开销,即使视频通话这类不需要可靠传输的应用也无法避免。而且即使每一跳都可靠了,端系统内部仍可能丢包,最终还是需要在端系统做一次端到端校验。

TCP 和 UDP 首部开销差距为什么这么大?

TCP 首部固定 20 字节(加选项最多 60 字节),UDP 首部固定 8 字节。TCP 首部大是因为要携带序号、确认号、窗口大小等用于可靠传输和流量控制的字段。对于短报文(如 DNS 查询),TCP 的首部开销占比很高。UDP 适合实时性要求高、允许少量丢包的场景(DNS、视频、语音),TCP 适合数据完整性要求高的场景(文件传输、网页、邮件)。

本文对应考点 ​

  • TCP 首部最小 20 字节,最大 60 字节
  • 数据偏移字段的含义与单位(4 字节)
  • 六个标志位的含义,尤其是 SYN、ACK、FIN
  • 序号和确认号的计算
  • SYN 和 FIN 各消耗一个序号
  • MSS 的概念和计算方法
  • TCP 面向字节流 vs UDP 面向报文

真题练习 ​

相关真题(2题)