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=MTUIP首部长度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 面向报文