傳輸層 TCP 三次握手與四次揮手:你真的理解了嗎?

當你打電話給朋友,不能上來就直接聊吧?總得先確認對方在線,否則就是自言自語。

TCP 連線也是一樣,得先握手,後通訊:

你:餵,在嗎? (SYN)
朋友:在啊,你呢? (SYN+ACK)
你:OK,開始聊天! (ACK)
斷開時,也得揮手道別,否則可能對方還在等你繼續說話。


一、TCP 三次握手
來看一下 TCP 連線建立的完整流程:

(1) 第一次握手:客戶端發送 SYN 封包,表示“我要建立連線”,同時攜帶一個初始序號 seq = x。

(2) 第二次握手:伺服器收到 SYN 後,回應一個 SYN-ACK,表示“我收到了你的請求,並且我也準備好了”,同時附帶自己的初始序號 seq = y,以及對客戶端 seq = x 的確認 ack = x + 1。

(3) 第三次握手:客戶端收到伺服器的 SYN-ACK,發送 ACK 確認“好的,我們可以通信了”,並且 ack = y + 1,至此連接建立。
為什麼是三次握手?一次兩次不行嗎

防止歷史連接的影響:如果採用二次握手,伺服器收到 SYN 後直接建立連接,但客戶端的 SYN 可能是網路延遲後重複到達的“舊請求”,這會導致伺服器錯誤地建立無效連接,而三次握手可以避免這一問題。
確保雙方的收發能力:第三次握手讓客戶端確認了伺服器的接收和傳送能力,避免了「盲目同意」的情況。
二、TCP 四次揮手
如果說三次握手是“戀愛的開始”,那麼四次揮手就是“分手的全過程”——理性且克制,既保證對方準備好,也不給彼此拖泥帶水的機會。
第一次揮手:客戶端不想再發送資料了,向伺服器發送 FIN(Finish)請求,表示「我準備關閉連線了」。
第二次揮手: 伺服器收到 FIN 後,回覆一個 ACK,表示「我知道你要關閉了,但我這邊可能還有些資料沒處理完」。
第三次揮手: 伺服器處理完資料後,也發送一個 FIN,表示「好了,我也不發送資料了」。
第四次揮手: 用戶端收到伺服器的 FIN 後,回覆 ACK,並進入 TIME_WAIT 狀態,確保伺服器收到 ACK 後才徹底關閉連線。
為什麼是四次揮手?

TCP 是全雙工通訊:資料的發送和接收是分開的,每一方都要單獨關閉自己的資料流,因此需要兩對 FIN-ACK 進行確認。
TIME_WAIT 機制:客戶端在最後進入 TIME_WAIT 狀態,確保伺服器收到 ACK,防止「最後的再見」遺失。