总结
- 第 一 次 握手:客户端->服务器,SYN = 1, seq = x
- 第 二 次 握手:服务器->客户端,SYN = 1, ACK = 1, seq = y, ack = x+1
- 第 三 次 握手:客户端->服务器,ACK = 1, seq = x+1, ack = y+1
TCP 三次握手详解
TCP 是面向连接的协议,在数据传输前必须通过“三次握手(Three-Way Handshake)”建立可靠的连接。该过程确保客户端与服务器都具备发送和接收数据的能力。
一、三次握手流程图解
客户端 服务器
| |
|------- SYN=1, seq=x -------->|
| |
|<------ SYN=1, ACK=1, seq=y, ack=x+1 ----|
| |
|------- ACK=1, seq=x+1, ack=y+1 ------>|
| |
二、三次握手详细步骤
✅ 第一次握手
- 客户端 → 服务器
- 发送标志位:
SYN = 1
(同步标志) - 序列号:
seq = x
(随机初始序列号) - 状态变化:
- 客户端由
CLOSED
状态进入SYN_SENT
- 客户端由
📌 作用:客户端告诉服务器,“我想和你建立连接,并且我这边已经准备好发送数据了。”
✅ 第二次握手
- 服务器 → 客户端
- 发送标志位:
SYN = 1
+ACK = 1
(确认标志) - 序列号:
seq = y
(服务器随机生成) - 确认号:
ack = x + 1
(对客户端seq
的确认)
📌 作用:服务器回应客户端,表示“我收到你的请求,并且我也准备好了通信。”
- 状态变化:
- 服务器由
LISTEN
进入SYN_RCVD
- 服务器由
✅ 第三次握手
- 客户端 → 服务器
- 发送标志位:
ACK = 1
- 序列号:
seq = x + 1
- 确认号:
ack = y + 1
(对服务器seq
的确认)
📌 作用:客户端确认服务器的接收和发送能力正常,连接正式建立。
- 状态变化:
- 客户端进入
ESTABLISHED
- 服务器也进入
ESTABLISHED
- 客户端进入
三、为什么是三次握手?不是两次或四次?
❓ 为什么不能是两次握手?
如果只进行两次握手:
- 客户端发送
SYN
后,服务器回复SYN-ACK
并认为连接已建立。 - 若客户端因网络延迟未能及时收到
SYN-ACK
,可能超时重发,而服务器会为每个请求分配资源,容易遭受 SYN Flood 攻击。 - 此外,服务器无法确认客户端是否能接收数据。
✅ 三次握手的作用:
- 防止已失效的连接请求突然传到服务器(避免资源浪费)
- 双方都能确认彼此具有发送和接收能力
- 提高安全性,防止部分 DDoS 攻击
四、关键字段说明
字段 | 含义 |
---|---|
SYN |
Synchronize,用于发起连接 |
ACK |
Acknowledgment,确认收到对方的数据 |
seq |
Sequence Number,序列号,标识本次发送的数据起始位置 |
ack |
Acknowledgment Number,确认号,期望收到的下一段数据起始位置 |
五、总结对比表
握手次数 | 角色 | 标志位 | 序列号 | 确认号 | 作用 |
---|---|---|---|---|---|
第一次 | 客户端 → 服务器 | SYN=1 |
seq=x |
- | 客户端请求建立连接 |
第二次 | 服务器 → 客户端 | SYN=1 , ACK=1 |
seq=y |
ack=x+1 |
服务器确认并同步 |
第三次 | 客户端 → 服务器 | ACK=1 |
seq=x+1 |
ack=y+1 |
客户端最终确认连接 |
六、补充知识点:ISN(Initial Sequence Number)
- 每次握手的
seq
值是一个随机初始序列号(ISN)。 - ISN 不是从 0 开始,而是基于时间戳动态生成,防止攻击者猜测。
- 目的是增强安全性,防止 TCP 会话劫持(Session Hijacking)。
七、一句话总结
TCP 三次握手是为了在不可靠的网络中建立一个可靠的连接,确保双方都能发送和接收数据,同时防止资源浪费和提升安全性。