1. 三次握手(建立连接)
三次握手用于可靠地建立TCP连接,确保双方具备双向通信能力。过程如下:
-
第一次握手(SYN)
-
客户端 → 服务器:发送
SYN=1
报文,携带随机生成的初始序列号(ISN,如Seq=x)。 -
目的:告知服务器客户端希望建立连接,并协商初始序列号。
-
客户端状态:
SYN_SENT
。
-
-
第二次握手(SYN-ACK)
-
服务器 → 客户端:回复
SYN=1, ACK=1
报文,确认客户端的序列号(Ack=x+1
),并携带服务器的初始序列号(Seq=y)。 -
目的:确认客户端的SYN,并声明服务器的初始序列号。
-
服务器状态:
SYN_RECEIVED
。
-
-
第三次握手(ACK)
-
客户端 → 服务器:发送
ACK=1
报文,确认服务器的序列号(Ack=y+1
)。 -
目的:告知服务器已收到SYN-ACK,连接正式建立。
-
双方状态:进入
ESTABLISHED
,开始数据传输。
-
为何需要三次握手?
-
防止历史连接干扰:若客户端发送的旧SYN因网络延迟到达,服务器会误认为新连接请求。通过三次握手,客户端可检测到重复SYN并拒绝(通过RST包)。
-
同步初始序列号:双方交换ISN,确保后续数据按序传输。
-
验证双向通信能力:三次交互确认双方的收发功能正常。
2. 四次挥手(终止连接)
四次挥手用于安全关闭TCP连接,确保双方数据发送完毕。过程如下:
-
第一次挥手(FIN)
-
主动关闭方(如客户端) → 被动关闭方:发送
FIN=1
报文(如Seq=u)。 -
目的:声明主动方不再发送数据,但仍可接收数据。
-
主动方状态:
FIN_WAIT_1
。
-
-
第二次挥手(ACK)
-
被动关闭方 → 主动方:回复
ACK=1
报文(Ack=u+1
)。 -
目的:确认收到FIN,但被动方可能仍有数据待发送。
-
被动方状态:
CLOSE_WAIT
(等待应用层处理剩余数据)。 -
主动方状态:
FIN_WAIT_2
(等待被动方的FIN)。
-
-
第三次挥手(FIN)
-
被动关闭方 → 主动方:发送
FIN=1
报文(如Seq=v)。 -
目的:被动方数据发送完毕,请求关闭连接。
-
被动方状态:
LAST_ACK
(等待最终ACK)。
-
-
第四次挥手(ACK)
-
主动方 → 被动方:回复
ACK=1
报文(Ack=v+1
)。 -
目的:确认被动方的FIN,双方连接关闭。
-
主动方状态:
TIME_WAIT
(等待2MSL时间后进入CLOSED
)。 -
被动方状态:收到ACK后立即进入
CLOSED
。
-
为何需要四次挥手?
-
全双工通信:TCP连接允许双向独立传输数据,需分别关闭每个方向。
-
确保数据完整性:被动方可能仍需发送剩余数据,需延迟发送FIN。
-
TIME_WAIT状态的意义:
-
防止最后一个ACK丢失(被动方重传FIN时可再次回复ACK)。
-
等待网络中残留的旧报文消亡(通过2MSL时间,通常1-4分钟)。
-
3. 特殊场景
-
三次挥手:若被动方在第二次挥手时同时发送FIN和ACK(如无剩余数据),则四次挥手变为三次。
-
同时关闭:双方同时发起FIN,直接进入
CLOSING
状态,交换ACK后关闭。
4. 总结
-
三次握手:确保双方初始序列号同步,验证双向通信能力。
-
四次挥手:保证数据完整传输,独立关闭双向连接。
-
设计核心:通过确认机制(ACK)和状态机管理,实现可靠连接。