以下對幾個關鍵的中間狀態進行說明:

三次握手:

LISTEN:表示伺服器的某個SOCKET處於監聽狀態,可以進行連線了。

SYN_SENT:表示客戶端的某個SOCKET與伺服器進行connect時,首先發送SYN報文,然後進入SYN_SENT狀態,等待伺服器傳送ACK+SYN報文。

SYN_RECV:表示伺服器收到客戶端傳送的SYN報文,然後向客戶端傳送SYN+ACK報文,隨後伺服器進入SYN_RECV狀態。

ESTABLISHED:表示連線已經建立,當客戶端在SYN_SENT狀態時,收到伺服器傳送的ACK+SYN報文之後,然後進行第三次握手,客戶端傳送ACK報文,然後進入ESTABLISHED狀態,當處於SYN_RECV狀態的伺服器收到客戶端傳送的ACK報文之後,也進入ESTABLISHED狀態,然後連線建立。

四次揮手:

FIN_WAIT_1:表示客戶端SOCKET想主動關閉連線,於是向伺服器傳送FIN報文,然後進入FIN_WAIT_1狀態。

FIN_WAIT_2:表示客戶端收到伺服器發來的ACK報文,此時客戶端進入FIN_WAIT_2狀態,此時客戶端這邊的連線已經關閉,但伺服器端的連線還沒關閉,也就是伺服器還可以繼續向客戶端傳送資料。

CLOSING:這種狀態表示此時雙方剛好可能都在關閉連線,即客戶端向伺服器傳送FIN報文,進入FIN_WAIT_1狀態後,沒有收到伺服器發來的ACK報文,反而受到伺服器發來的FIN報文,說明此時客戶端和伺服器同時發起關閉連線,隨後,客戶端進入CLOSING狀態。

TIME_WAIT:表示收到了伺服器發來的FIN報文,然後客戶端傳送ACK報文,隨後進入TIME_WAIT狀態,等待2MSL之後進入CLOSED狀態。

CLOSE_WAIT:表示當伺服器收到客戶端發來的FIN報文之後,傳送ACK報文,隨後伺服器進入CLOSE_WAIT狀態。

LAST_ACK:表示伺服器主動關閉連線,向客戶端傳送FIN報文後,隨即進入LAST_ACK狀態,如果收到了客戶端發來的ACK報文之後,就進入CLOSED狀態。

需要解釋的是為何TIME_WAIT需要等2MSL時間才能回到CLOSED狀態:

如果網路不可靠,那麼就無法保證最後客戶端傳送的ACK報文伺服器端一定能夠收到,因此處於LAST_ACK狀態的伺服器可能會因為超時而未收到ACK報文,而重新向客戶端傳送FIN報文,TIME_WAIT的作用就是用來客戶端重新發送可能丟失的ACK報文。