快速瞭解 TCP 連接的 11 種狀態及其轉換
本文意在用簡短的文字總結一下 TCP 的 11 種狀態及其轉換過程。
TCP 的 11 種狀態
1. CLOSED
-
• 表示連接處於關閉狀態。
-
• 這是 TCP 連接的初始狀態或連接終止後的狀態。
-
• 常見場景:服務端程序尚未啓動監聽,或者客戶端和服務端都已完成連接釋放。
2. LISTEN
-
• 服務器端狀態,表示服務器在監聽某個端口,等待客戶端發起連接。
-
• 常見於服務端主動調用
listen()
函數時。
3. SYN-SENT
-
• 客戶端發起連接請求後進入此狀態。
-
• 表示已經發送了 SYN(同步序號)包,等待服務器的響應。
-
• 常見於客戶端調用
connect()
函數後。
4. SYN-RECEIVED
-
• 服務端收到客戶端的 SYN 包後,回覆 SYN+ACK(同步序號 + 確認)包,並進入此狀態。
-
• 等待客戶端的最終確認(ACK)。
5. ESTABLISHED
-
• 表示連接已成功建立,客戶端和服務端可以正常發送和接收數據。
-
• 這是 TCP 連接的穩定狀態,也是數據傳輸的主要階段。
6. FIN-WAIT-1
-
• 主動關閉連接的一方進入此狀態,表示發送了 FIN(結束)包,等待對方的 ACK。
-
• 常見於調用
close()
函數的程序。
7. FIN-WAIT-2
-
• 主動關閉的一方收到對方的 ACK 後進入此狀態,等待對方發送 FIN。
-
• 表示本方已完成數據發送。
8. CLOSE-WAIT
-
• 被動關閉的一方收到對方的 FIN 後進入此狀態,表示對方已關閉數據發送。
-
• 等待本方處理完剩餘任務併發送 FIN。
9. CLOSING
-
• 當雙方几乎同時發起關閉請求時會進入此狀態。
-
• 表示雙方都發送了 FIN,但尚未收到對方的 ACK。
-
• 此狀態比較少見。
10. LAST-ACK
-
• 被動關閉的一方發送 FIN 後進入此狀態,等待對方的 ACK。
-
• 收到 ACK 後即可進入 CLOSED 狀態。
11. TIME-WAIT
-
• 主動關閉的一方在收到對方的 FIN 和 ACK 後進入此狀態。
-
• 等待一段時間(通常是 2MSL,兩個最大報文段生存時間),以確保對方收到 ACK,防止舊數據包乾擾。
TCP 狀態轉換流程
三次握手(連接建立)
TCP 通過三次握手建立可靠連接,具體流程如下:
- 1. CLOSED → SYN-SENT(客戶端發起連接)
- • 客戶端發送 SYN 包,並進入 SYN-SENT 狀態。
- 2. LISTEN → SYN-RECEIVED(服務器接收連接請求)
- • 服務器收到 SYN 包後,回覆 SYN+ACK,並進入 SYN-RECEIVED 狀態。
- 3. SYN-SENT → ESTABLISHED(客戶端確認連接)
- • 客戶端收到 SYN+ACK 後,回覆 ACK,進入 ESTABLISHED 狀態。
- 4. SYN-RECEIVED → ESTABLISHED(服務器確認連接)
- • 服務器收到 ACK 後,進入 ESTABLISHED 狀態。
此時連接建立完成,雙方可以開始數據通信。
四次揮手(連接釋放)
TCP 通過四次揮手確保連接安全關閉,具體流程如下:
- 1. ESTABLISHED → FIN-WAIT-1(主動關閉方發送 FIN)
- • 主動關閉的一方發送 FIN 包,進入 FIN-WAIT-1 狀態。
- 2. ESTABLISHED → CLOSE-WAIT(被動關閉方收到 FIN)
- • 被動關閉的一方收到 FIN 包後,回覆 ACK,進入 CLOSE-WAIT 狀態。
- 3. FIN-WAIT-1 → FIN-WAIT-2(主動關閉方收到 ACK)
- • 主動關閉的一方收到對方的 ACK 後進入 FIN-WAIT-2 狀態。
- 4. CLOSE-WAIT → LAST-ACK(被動關閉方發送 FIN)
- • 被動關閉的一方完成必要的任務後,發送 FIN,進入 LAST-ACK 狀態。
- 5. FIN-WAIT-2 → TIME-WAIT(主動關閉方收到 FIN)
- • 主動關閉的一方收到對方的 FIN 後,回覆 ACK,進入 TIME-WAIT 狀態。
- 6. LAST-ACK → CLOSED(被動關閉方收到 ACK)
- • 被動關閉的一方收到 ACK 後,進入 CLOSED 狀態。
- 7. TIME-WAIT → CLOSED(主動關閉方等待超時)
- • 主動關閉的一方等待 2MSL 後,進入 CLOSED 狀態。
特殊狀態轉換
- 1. CLOSING
-
• 當雙方几乎同時發起關閉時,會進入此狀態,表示雙方都發送了 FIN,但還在等待對方的 ACK。
-
• 狀態轉換較快,最終會進入 TIME-WAIT 或 CLOSED。
- 2. TIME-WAIT
-
• 確保延遲的數據包不會干擾後續連接。
-
• 等待時間通常是兩個最大報文段生存時間(2MSL)。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/Bjq39k78p9uliudcIW0T9Q