更好閱讀體驗:《理解 TCP 和 UDP》— By Gitbook
無論客戶端還是伺服器,在雙方 TCP 通訊的過程中,都會有著一個「狀態」的概念,狀態會隨著 TCP 通訊的不同階段而變化。
TCP 狀態流轉圖
各種狀態表示的意思
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 狀態了。