傳輸層 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,防止“最后的再見”丟失。