三次握手--确保信息传输的可靠性
第一次握手(客户端 → 服务器)客户端发送 SYN(同步)报文,携带初始序列号 seq = x,请求建立连接。此时客户端状态:SYN_SENT。
第二次握手(服务器 → 客户端)服务器收到 SYN 后,回复 SYN + ACK(同步 + 确认)报文:
第三次握手(客户端 → 服务器)客户端收到 SYN + ACK 后,发送 ACK(确认)报文:
为什么需要三次?
一次握手:服务器无法确认客户端是否能收到自己的响应,不可靠。
两次握手:客户端无法确认服务器是否收到自己的确认,可能导致服务器资源浪费(如客户端因网络问题未收到服务器的 SYN+ACK,但服务器已准备好连接)。
三次握手:双方均确认 “对方能收能发”,确保连接可靠。
四次挥手(关闭 TCP 连接)
TCP 连接是全双工的(双方可同时收发数据),关闭连接时需双方方向分别释放,因此需要四次挥手。
过程:
第一次挥手(主动关闭方 → 被动关闭方)假设客户端主动关闭,发送 FIN(结束)报文,序列号 seq = u,表示不再发送数据。客户端状态:FIN_WAIT_1。
第二次挥手(被动关闭方 → 主动关闭方)服务器收到 FIN 后,回复 ACK 报文,确认序列号 ack = u + 1,自身序列号 seq = v。此时服务器可能还有数据要发送,状态变为 CLOSE_WAIT;客户端收到后进入 FIN_WAIT_2,等待服务器的剩余数据。
第三次挥手(被动关闭方 → 主动关闭方)服务器发送完所有数据后,发送 FIN 报文,序列号 seq = w(基于之前的 v 递增),表示自己也不再发送数据。服务器状态:LAST_ACK。
第四次挥手(主动关闭方 → 被动关闭方)客户端收到 FIN 后,回复 ACK 报文,确认序列号 ack = w + 1,自身序列号 seq = u + 1。客户端状态:TIME_WAIT(等待 2MSL 时间,确保服务器收到确认,防止残留报文影响新连接);服务器收到后进入 CLOSED 状态。客户端等待超时后也进入 CLOSED,连接彻底关闭。
为什么需要四次?
第二次挥手仅确认 “收到关闭请求”,但被动关闭方可能还有数据未发送,无法立即发送 FIN,因此需分两次(ACK 和 FIN)。
三次握手时 SYN + ACK 可合并,是因为服务器在建立连接时无需等待额外数据;而关闭时需先确认再发完剩余数据,因此无法合并。
三次握手:通过三次交互确认双方收发能力,建立可靠连接。
四次挥手:因全双工特性,双方需分别确认关闭,确保数据传输完毕。