詳解TCP四次揮手過程,為什么揮手需要四次?

詳解TCP四次揮手過程,為什么揮手需要四次?

文章圖片


TCP(Transmission Control Protocol , 傳輸控制協議)是一種面向連接的、可靠的、基于字節流的傳輸層協議 。
它不僅確保數據的完整性 , 還設計了一套完整的連接管理機制:
? 三次握手(建立連接)
? 四次揮手(斷開連接)
【詳解TCP四次揮手過程,為什么揮手需要四次?】其中 , 四次揮手是TCP連接斷開時的關鍵步驟 , 確保雙方都能正確釋放源 , 避免數據丟失或連接異常終止 。
四次揮手過程TCP是全雙工通信 , 意味著數據可以同時在兩個方向傳輸 。 因此 , 連接的斷開不僅需要客戶端通知服務器自己不再發送數據 , 還需要服務器通知客戶端自己也不再發送數據 。 這就導致了四次揮手的過程 , 而不是簡單的三次握手 。

第一次揮手
客戶端發送FIN(終止請求):客戶端發送一個FIN(Finish)報文 , 表示自己不再發送數據 , 進入FIN-WAIT-1狀態 。 此時 , 客戶端仍然可以接收數據 , 但不會再主動發送數據 。
第二次揮手
服務器回復ACK(確認):服務器收到FIN后 , 發送一個ACK(Acknowledgment)報文 , 確認收到客戶端的終止請求 , 進入CLOSE-WAIT狀態 。 此時 , 服務器仍然可以繼續發送數據 。
第三次揮手
服務器發送FIN(終止請求):服務器在完成數據傳輸后 , 發送FIN報文 , 表示自己也不再發送數據 , 進入LAST-ACK狀態 。
第四次揮手
客戶端回復ACK(確認):客戶端收到服務器的FIN后 , 發送ACK報文 , 確認收到服務器的終止請求 , 進入TIME-WAIT狀態 。 此時 , 客戶端會等待一段時間(通常是2MSL , 即最大報文生存時間的兩倍) , 確保服務器收到ACK后才徹底關閉連接 。
其中TIME-WAIT的作用:
TIME-WAIT狀態的存在是為了確保最后一個ACK能夠被服務器正確接收 , 防止舊的TCP報文影響新的連接 。 通常 , TIME-WAIT狀態會持續2MSL(最大報文生存時間) , 以確保所有可能的延遲數據包都被清除 。
TIME-WAIT還可以防止已失效的連接請求報文段影響新的連接 。 如果客戶端在發送完最后一個ACK后立即釋放連接 , 那么可能會導致服務器的FIN報文丟失 , 進而影響新的連接建立 。
下圖為完整流程的簡圖:

為什么握手是三次 , 揮手卻要四次?簡單的來講:基于TCP穩定的通信 , 在連接斷開時不僅要終止數據的發送 , 還要確保對方的數據已經完全接收 。 同時TCP是全雙工通信 , 所以每個通道都需要單獨關閉 , 這導致請求回復的機制需要重復兩遍 , 也就是4次是這個確認機制的最小步驟 。
總的來講 , 三次握手是建立可靠連接 , 而四次揮手則是為了保證數據傳輸的完整性 。 但是在實際的應用中如高并發服務器環境中:
TIME-WAIT狀態可能會導致大量端口占用 , 影響服務器性能 。 為了解決這個問題 , 許多系統會采用TCP連接復用或縮短TIME-WAIT時間的方式來優化連接釋放過程 。
某些系統在Socket選項中也提供了SO_REUSEADDR選項 , 允許新的連接在TIME-WAIT狀態下復用舊的端口 , 從而提高服務器的并發能力 。

    推薦閱讀