首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

TCP 三次握手與四次揮手通俗解析:連接建立與釋放的核心機制

     編輯:Java 綜合教學

TCP 三次握手與四次揮手通俗解析

為什麼需要三次握手?

TCP 連接建立經歷三個階段:連接建立、數據傳輸、連接釋放。三次握手發生在連接建立階段,主要目的是防止已失效的連接請求報文段突然傳送到服務端,導致資源浪費。經典場景:客戶端發出的第一個 SYN 報文在網絡節點滯留,服務端誤以為是新請求並發送 SYN+ACK,若無第三次握手確認,服務端會白白等待數據,浪費資源。三次握手確保雙方都確認對方收發能力正常。

通俗比喻:打電話

  • A:「你好,我是 A,你聽得到嗎?」
  • B:「聽到啦,我是 B,你聽得到我嗎?」
  • A:「嗯,聽到啦,開始聊吧!」

為什麼釋放連接需要四次揮手?

TCP 是全雙工協議,雙方需分別關閉發送通道:

  1. 主機 A 發送 FIN,關閉發送通道,進入 FIN_WAIT1。
  2. 主機 B 回復 ACK,進入 CLOSE_WAIT,A 進入 FIN_WAIT2。
  3. 主機 B 發送完數據後發送 FIN,進入 LAST_ACK。
  4. 主機 A 回復 ACK,進入 TIME_WAIT,等待 2MSL 後關閉;B 收到 ACK 直接關閉。

為什麼 A 要等待 2MSL? 確保最後的 ACK 到達 B。若 ACK 丟失,B 會重發 FIN,A 在 2MSL 內收到則重發 ACK 並重新計時;否則認為連接可靠關閉。

狀態轉換圖解

三次握手:
A: SYN_SENT → ESTABLISHED
B: LISTEN → SYN_RCVD → ESTABLISHED

四次揮手:
A: FIN_WAIT1 → FIN_WAIT2 → TIME_WAIT → CLOSED
B: CLOSE_WAIT → LAST_ACK → CLOSED

參考來源:知乎專欄

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved