TCP 三次握手(Three-Way Handshake)是 TCP 建立可靠连接 的标准过程,目的是确认双方的 收发能力 并 同步序列号。
一、为什么要三次?
核心目的只有三点:
- 确认客户端能发、服务器能收
- 确认服务器能发、客户端能收
- 同步双方的初始序列号(ISN)
少一次不安全,多一次没必要,因此是 三次。
二、三次握手全过程
第一次:客户端 → 服务器(SYN)
客户端请求建立连接。
- 标志位:
SYN = 1 - 初始序列号:
Seq = x(随机生成)
Client → Server
SYN = 1, Seq = x
👉 表示:我想跟你建立连接
第二次:服务器 → 客户端(SYN + ACK)
服务器同意连接,并确认客户端的请求。
- 标志位:
SYN = 1,ACK = 1 - 服务器序列号:
Seq = y - 确认号:
Ack = x + 1
Server → Client
SYN = 1, ACK = 1
Seq = y, Ack = x + 1
👉 表示:我收到了你的请求,我也准备好了
第三次:客户端 → 服务器(ACK)
客户端确认服务器的响应。
- 标志位:
ACK = 1 - 确认号:
Ack = y + 1
Client → Server
ACK = 1, Ack = y + 1
👉 表示:我确认收到你的响应,可以开始通信了
三、状态变化(非常常考)
| 角色 | 状态变化 |
|---|---|
| 客户端 | CLOSED → SYN_SENT → ESTABLISHED |
| 服务器 | CLOSED → LISTEN → SYN_RCVD → ESTABLISHED |
四、为什么不能两次?
如果只有两次握手:
- 服务器无法确认 客户端是否收到了自己的 SYN
- 容易造成 历史连接请求被误认为有效连接
- 可能引发 资源浪费或连接错乱
三次握手正好解决了这些问题。
五、口诀记忆版
SYN 请求 → SYN+ACK 应答 → ACK 确认
或者一句话:
你找我?我答应你。好,开始吧。