文章摘要
LIK.CC-GPT
客户端首先发送一个SYN(同步序列编号)消息给服务器,服务器收到后回复一个SYN-ACK(同步序列编号-确认)消息,最后客户端再发送一个ACK(确认)消息确认服务器已经收到SYN-ACK消息,从而完成三次握手,建立起一个可靠的TCP连接。 客户端(Client)
客户端首先发送一个SYN(同步序列编号)消息给服务器,服务器收到后回复一个SYN-ACK(同步序列编号-确认)消息,最后客户端再发送一个ACK(确认)消息确认服务器已经收到SYN-ACK消息,从而完成三次握手,建立起一个可靠的TCP连接。
客户端(Client) 服务器(Server)
| |
| (1) SYN(seq=x) |
| --------------------------------------> |
| |
| (2) SYN-ACK(seq=y, ack=x+1) |
| <-------------------------------------- |
| |
| (3) ACK(ack=y+1) |
| --------------------------------------> |
| |
| 连接建立完成! |
| (ESTABLISHED) (ESTABLISHED)
TCP的三次握手是建立可靠网络连接的关键过程,确保通信双方具备数据收发能力并同步初始序列号。以下是详细分步说明:
三次握手流程
-
第一次握手(SYN)
- 动作:客户端发送
SYN
报文(SYN=1,seq=x),进入SYN_SENT
状态。 - 目的:向服务器发起连接请求,并告知初始序列号
x
。
- 动作:客户端发送
-
第二次握手(SYN-ACK)
- 动作:服务器收到
SYN
后,回复SYN-ACK
报文(SYN=1,ACK=1,seq=y,ack=x+1),进入SYN_RCVD
状态。 - 目的:
- 确认客户端的
SYN
(通过ack=x+1
); - 告知自身初始序列号
y
。
- 确认客户端的
- 动作:服务器收到
-
第三次握手(ACK)
- 动作:客户端发送
ACK
报文(ACK=1,seq=x+1,ack=y+1),进入ESTABLISHED
状态;服务器收到后也进入ESTABLISHED
状态。 - 目的:确认服务器的
SYN-ACK
,完成双向连接建立。
- 动作:客户端发送
为什么需要三次握手?
-
防止历史连接干扰
- 若客户端因网络延迟重发了
SYN
,旧的SYN
可能稍后到达服务器。三次握手机制允许客户端通过第三次ACK
判断是否接受旧连接,避免资源浪费。
- 若客户端因网络延迟重发了
-
同步双方序列号
- 双方通过三次交互确认彼此的初始序列号(
x
和y
),为后续可靠传输奠定基础。
- 双方通过三次交互确认彼此的初始序列号(
-
避免资源浪费
- 两次握手可能导致服务器在未确认客户端状态时提前分配资源,引发“半开连接”问题。
常见问题
-
如果第三次
ACK
丢失怎么办?
服务器会重传SYN-ACK
,直到超时关闭连接。若客户端随后发送数据,服务器会通过数据包中的ACK
字段确认连接有效。 -
SYN洪泛攻击
攻击者伪造大量SYN
但不回复ACK
,耗尽服务器资源。防御手段包括SYN Cookies
(延迟资源分配直至第三次握手完成)。
总结
三次握手通过两次序列号确认和双向能力验证,确保了TCP连接的可靠性与一致性。这一机制是TCP“面向连接”特性的核心基础,解决了网络延迟、丢包和重复报文等潜在问题。