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 的目的是:
- 确保客户端发送的最后一个 ACK 报文能到达服务端;
- 确保本次连接的所有报文都从网络中消失,避免新连接收到旧连接的残留报文。
三、 与你的建站需求关联
你搭建「思迈时光」个人网站时,HTTP/HTTPS 协议基于 TCP,每次浏览器访问你的网站,都会经历「三次握手建立连接 → 传输网页数据 → 四次挥手断开连接」的完整流程;而你之前关注的 CDN 加速,也会通过优化 TCP 握手的初始拥塞窗口等参数,提升连接建立速度。