理解 TCP(四):狀態流轉

JerryC發表於2017-03-02

更好閱讀體驗:《理解 TCP 和 UDP》— By Gitbook

無論客戶端還是伺服器,在雙方 TCP 通訊的過程中,都會有著一個「狀態」的概念,狀態會隨著 TCP 通訊的不同階段而變化。

TCP 狀態流轉圖

TCP 狀態流轉圖.png
TCP 狀態流轉圖.png

各種狀態表示的意思

CLOSED:表示初始狀態

LISTEN:表示伺服器端的某個 socket 處於監聽狀態,可以接受連線

SYN_SENT:在服務端監聽後,客戶端 socket 執行 CONNECT 連線時,客戶端傳送 SYN 報文,此時客戶端就進入 SYN_SENT 狀態,等待服務端確認。

SYN_RCVD:表示服務端接收到了 SYN 報文。

ESTABLISHED:表示連線已經建立了。

FIN_WAIT_1:其中一方請求終止連線,等待對方的 FIN 報文。

FIN_WAIT_2:在 FIN_WAIT_2 之後, 當對方迴應 ACK 報文之後,進入該狀態。

TIME_WAIT:表示收到了對方的 FIN 報文,併傳送出了 ACK 報文,就等 2MSL 之後即可回到 CLOSED 狀態。

CLOSING:一種罕見狀態,發生在傳送 FIN 報文之後,本應是先收到 ACK 報文,卻先收到對方的 FIN 報文,那麼就從 FIN_WAIT_1 的狀態進入 CLOSING 狀態。

CLOSE_WAIT:表示等待關閉,在 ESTABLISHED 過渡到 LAST_ACK 的一個過渡階段,該階段需要考慮是否還有資料傳送給對方,如果沒有,就可以關閉連線,傳送 FIN 報文,然後進入 LAST_ACK 狀態。

LAST_ACK:被動關閉一方傳送 FIN 報文之後,最後等待對方的 ACK 報文所處的狀態。

CLOSED:當收到 ACK 保溫後,就可以進入 CLOSED 狀態了。

參考

《後臺開發 核心技術與應用實踐》
《計算機網路》

相關文章