TCP(传输控制协议)建立连接的过程称为 三次握手(Three-Way Handshake)。这是为了确保通信双方能够可靠地建立连接,并同步初始序列号。以下是详细步骤:
三次握手过程(通俗比喻:打电话确认双方都能听到)
1. 第一次握手:客户端 → 服务器(SYN)
-
动作:客户端发送一个 SYN 报文(SYN=1,随机生成一个初始序列号
seq=x
)。 -
目的:告诉服务器“我想和你建立连接,我的初始序列号是 x”。
-
状态变化:
-
客户端进入
SYN_SENT
(同步已发送)状态。 -
服务器处于监听状态(
LISTEN
)。
-
2. 第二次握手:服务器 → 客户端(SYN-ACK)
-
动作:服务器收到 SYN 后,回复一个 SYN-ACK 报文(SYN=1,ACK=1,确认号
ack=x+1
,并生成自己的初始序列号seq=y
)。 -
目的:告诉客户端“我收到你的请求了,同意建立连接,我的初始序列号是 y”。
-
状态变化:
-
服务器进入
SYN_RCVD
(同步已接收)状态。
-
3. 第三次握手:客户端 → 服务器(ACK)
-
动作:客户端收到 SYN-ACK 后,发送一个 ACK 报文(ACK=1,确认号
ack=y+1
,序列号seq=x+1
)。 -
目的:告诉服务器“我确认你同意连接了,现在可以开始通信了”。
-
状态变化:
-
客户端和服务器均进入
ESTABLISHED
(已建立连接)状态。
-
为什么需要三次握手?
-
防止历史连接干扰:
如果客户端发送了多个旧的 SYN 请求(例如网络延迟导致),三次握手能确保服务器只响应最新的请求。 -
同步初始序列号:
双方通过交换序列号,确保后续数据传输的有序性和可靠性。 -
确认双方的通信能力:
三次握手验证了客户端和服务器的发送和接收能力均正常。
通俗比喻
想象两个人打电话:
-
第一次握手:A 打电话给 B,说:“喂,能听到吗?”(SYN)。
-
第二次握手:B 回答:“能听到,你能听到我吗?”(SYN-ACK)。
-
第三次握手:A 说:“我也能听到你!”(ACK)。
此时通话正式建立,双方可以开始聊天。
常见问题
Q1:为什么不是两次握手?
如果只有两次握手:
-
服务器无法确认客户端是否收到了自己的确认报文。
-
若客户端的 SYN 因网络延迟重复发送,服务器可能会建立多个无效连接。
Q2:三次握手会被攻击吗?
是的,例如 SYN 洪泛攻击(攻击者伪造大量 SYN 请求,耗尽服务器资源),但现代操作系统通过优化(如 SYN Cookie 机制)可以缓解。
Q3:TCP 断开连接需要几次挥手?
四次挥手(FIN-ACK 交互),因为 TCP 是全双工的,双方需分别关闭发送和接收通道。
总结
三次握手是 TCP 可靠传输的基石,通过简单的“发请求 → 回确认 → 再确认”机制,确保了双方通信的可靠性和一致性。