TCP 三次握手与四次挥手的原理是什么?
TCP 连接建立需要经过三次握手,终止则需要四次挥手。此过程确保了可靠的数据传输和连接管理。
TCP 连接的建立和终止是保证网络传输可靠性的关键机制。以下是详细过程。
TCP 三次握手(Connection Establishment)
三次握手用于创建 TCP 连接,确保双方的发送和接收能力正常。步骤依次为:
- 第一次握手(SYN SENT):
客户端发送 SYN 报文给服务端,其中 SYN 标志位设为 1,并携带一个随机生成的初始序列号(Seq = x)。客户端进入SYN_SENT
状态,表示已发送连接请求。示例报文:SYN=1, Seq=x
-
第二次握手(SYN RECV):
服务端收到 SYN 报文后,回复 SYN + ACK 报文。将 ACK 标志位设为 1(Ack = x + 1 表示确认客户端序列号),SYN 标志位设为 1,并携带自己的初始序列号(Seq = y)。服务端进入SYN_RECV
状态。整个过程确认了服务端的发送/接收能力和客户端的接收能力。 - 第三次握手(ESTABLISHED):
客户端返回 ACK 报文给服务端。将 ACK 标志位设为 1(Ack = y + 1),Seq 字段更新为 x + 1。双方成功进入ESTABLISHED
状态,连接建立完成。示例报文:ACK=1, Ack=y+1, Seq=x+1
需要三次握手的原因:防止失效的旧连接请求占用资源(如网络阻塞后迟滞的请求),并确保双向通信能力。
TCP 四次挥手(Connection Termination)
四次挥手用于关闭连接,因双方可能处于半关闭状态(如单方面有残余数据)。步骤依次为:
-
第一次挥手(FIN WAIT-1):
客户端发送 FIN 报文给服务端,表示已无数据发送(但未关闭接收)。序列号如 Seq = m。客户端进入FIN_WAIT_1
状态。 -
第二次挥手(CLOSE WAIT):
服务端回复 ACK 报文确认收到(Ack = m + 1),自身进入CLOSE_WAIT
状态。客户端接收到后进入FIN_WAIT_2
状态,继续等待服务端的最终关闭信号。 - 第三次挥手(LAST ACK):
服务端在确认无剩余数据后发送 FIN 报文给客户端。携带 Seq,如 Seq = n。服务端进入LAST_ACK
状态,表示等待客户端的最终确认。示例报文:FIN=1, Seq=n, Ack=m+1
-
第四次挥手(CLOSED):
客户端回复 ACK 报文(Ack = n + 1),并进入TIME_WAIT
状态以防丢包重传;服务端收到后正式关闭进入CLOSED
状态。整个终止过程释放资源。需要四次挥手的原因:因 TCP 是全双工通信,关闭连接时需双方各自确认无残留数据并同步状态。
在总结中,三次握手确保初始同步可靠,而四次挥手保障结束阶段数据完整传输。