TCP 是面向连接的可靠传输协议,三次握手的核心目的是建立双向可靠通信链路四次挥手的核心目的是安全断开全双工连接,两者的报文交互和字段变化是理解 TCP 工作机制的关键。

一、 TCP 三次握手(建立连接)

核心目标

确认客户端 ↔ 服务端双方的发送能力接收能力都正常,同步双方的初始序列号(ISN),为后续可靠传输做准备。

1. 文字版流程图

假设 客户端 主动发起连接,服务端 监听端口(如 80、22)等待连接:

plaintext

客户端(C)                            服务端(S)
    |                                   |
    |  1. 发送 SYN 报文                 |
    |  [SYN=1, seq=x]  →→→→→→→→→→→→→→  |  处于 LISTEN 状态
    |                                   |
    |  2. 接收 SYN+ACK 报文             |
    |  ←←←←←←←←←←←←←← [SYN=1, ACK=1, seq=y, ack=x+1]
    |                                   |  处于 SYN_RCVD 状态
    |  3. 发送 ACK 报文                 |
    |  [ACK=1, seq=x+1, ack=y+1] →→→→→  |
    |                                   |  处于 ESTABLISHED 状态
    |                                   |
    双方进入 ESTABLISHED 状态,开始传输数据

2. 报文核心字段解析

TCP 报文的标志位序列号 / 确认号是握手的关键,核心字段说明:

字段作用三次握手中的变化
SYN同步标志位,SYN=1 表示这是一个连接请求 / 响应报文第 1 步 C→S:SYN=1(请求同步);第 2 步 S→C:SYN=1(响应同步)
ACK确认标志位,ACK=1 表示报文携带确认号第 2 步 S→C 起 ACK=1(后续报文默认带)
seq序列号,标记当前报文数据的起始序号第 1 步 C 随机生成初始序号 x;第 2 步 S 随机生成初始序号 y;第 3 步 C 序号变为 x+1(SYN 报文占 1 个序号)
ack确认号,标记期望收到的下一个字节的序号第 2 步 S 确认号 ack=x+1(期望收到 C 的下一个序号);第 3 步 C 确认号 ack=y+1(期望收到 S 的下一个序号)

3. 核心作用(为什么需要 3 次?)

  • 2 次握手不够:如果只有 2 次,服务端无法确认自己的发送能力是否被客户端接收(客户端的 ACK 报文是关键验证),会导致无效连接占用服务端资源。
  • 3 次握手刚好:双方都完成了「我能发、我能收、我知道你能发、我知道你能收」的双向验证。

二、 TCP 四次挥手(断开连接)

核心目标

TCP 是全双工通信(双方可同时收发数据),断开连接时需分别关闭两个方向的传输链路,因此需要 4 次交互。

1. 文字版流程图

假设 客户端 主动发起断开请求(实际双方都可主动断开):

plaintext

客户端(C)                            服务端(S)
    |                                   |
    |  1. 发送 FIN 报文                 |
    |  [FIN=1, ACK=1, seq=u] →→→→→→→→  |  处于 ESTABLISHED 状态
    |  (关闭 C→S 的发送链路)          |
    |                                   |  处于 CLOSE_WAIT 状态
    |  2. 接收 ACK 报文                 |
    |  ←←←←←←←←←←←←←← [ACK=1, seq=v, ack=u+1]
    |  (确认 C→S 链路关闭)            |
    |                                   |
    |  3. 接收 FIN 报文                 |
    |  ←←←←←←←←←←←←←← [FIN=1, ACK=1, seq=w, ack=u+1]
    |                                   |  (关闭 S→C 的发送链路)
    |                                   |  处于 LAST_ACK 状态
    |  4. 发送 ACK 报文                 |
    |  [ACK=1, seq=u+1, ack=w+1] →→→→→  |
    |                                   |  收到 ACK 后进入 CLOSED 状态
    |  等待 2MSL 后进入 CLOSED 状态

2. 报文核心字段解析

重点关注 FIN 标志位和双向链路关闭的逻辑:

字段作用四次挥手中的变化
FIN终止标志位,FIN=1 表示请求关闭连接第 1 步 C→S:FIN=1(关闭 C→S 方向);第 3 步 S→C:FIN=1(关闭 S→C 方向)
seq序列号第 1 步 C 的序号 u(当前已发送数据的最后一个序号 +1);第 3 步 S 的序号 w
ack确认号第 2 步 S 确认号 ack=u+1(确认收到 C 的 FIN 报文);第 4 步 C 确认号 ack=w+1(确认收到 S 的 FIN 报文)

3. 核心疑问解答

(1) 为什么需要 4 次挥手?

TCP 是全双工,关闭方向是独立的

  • 第 1-2 次:客户端关闭「自己→服务端」的发送链路,服务端确认该方向关闭;
  • 第 3-4 次:服务端关闭「自己→客户端」的发送链路,客户端确认该方向关闭。如果合并成 3 次,会导致某一方的发送链路未被确认关闭,丢失数据。

(2) 客户端为什么要等 2MSL

MSL(Maximum Segment Lifetime)是报文在网络中的最大生存时间,等待 2MSL 的目的是:

  1. 确保客户端发送的最后一个 ACK 报文能到达服务端;
  2. 确保本次连接的所有报文都从网络中消失,避免新连接收到旧连接的残留报文。

三、 与你的建站需求关联

你搭建「思迈时光」个人网站时,HTTP/HTTPS 协议基于 TCP,每次浏览器访问你的网站,都会经历「三次握手建立连接 → 传输网页数据 → 四次挥手断开连接」的完整流程;而你之前关注的 CDN 加速,也会通过优化 TCP 握手的初始拥塞窗口等参数,提升连接建立速度。