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