← 返回首页

深入理解 TCP 三次握手与四次挥手机制及其状态变迁

在传输层协议中,TCP(传输控制协议)作为一种面向连接的、可靠的、基于字节流的通信协议,其核心在于连接的管理。为了在不可靠的 IP 网络上建立可靠的数据传输通道,TCP 引入了著名的“三次握手”与“四次挥手”机制。

三次握手的主要目的是确认双方的接收与发送能力均正常,并同步初始化序列号(ISN)。首先,客户端向服务端发送一个带有 SYN 标志位的报文段,进入 SYN_SENT 状态,表示请求建立连接。服务端收到后,如果同意连接,则会回复一个包含 SYN 和 ACK 标志位的报文段,确认客户端的序列号,同时带上自己的初始化序列号,此时服务端进入 SYN_RCVD 状态。最后,客户端收到服务端的响应后,必须再次发送一个确认报文段(ACK),此时客户端进入 ESTABLISHED 状态,服务端在收到该 ACK 后也进入 ESTABLISHED 状态。至此,双向通信链路正式建立,数据可以开始安全传输。

然而,当数据传输完毕需要断开连接时,过程则变得相对复杂,需要经过四次挥手。这是因为 TCP 是全双工的,每个方向的连接都必须单独关闭。首先,主动关闭方(通常是客户端)发送一个 FIN 报文段,用来关闭主动方到被动方的数据传送,此时主动方进入 FIN_WAIT_1 状态。被动关闭方收到 FIN 后,会发送一个 ACK 响应,确认收到,并进入 CLOSE_WAIT 状态。此时,主动方收到 ACK 后进入 FIN_WAIT_2 状态。这时,被动方可能还有未发送完毕的数据,待其数据全部发送完成后,被动方会向主动方发送一个 FIN 报文段,请求关闭该方向的连接,被动方进入 LAST_ACK 状态。主动方收到 FIN 后,必须发送最后一个 ACK 回应,并进入 TIME_WAIT 状态。为了防止最后的 ACK 报文丢失以及清除网络中残留的报文,主动方必须在 TIME_WAIT 状态下等待 2MSL(最大报文生存时间)的时间,随后才能彻底进入 CLOSED 状态。被动方在收到最后的 ACK 后,则直接进入 CLOSED 状态。