TCP連接狀態變化
參考文章:TCP連接的狀態詳解以及故障排查
TCP建立連接——三次握手
CLOSED:起始狀態,無任何連接。
LISTEN:服務端建立socket之后需要listen進入LISTEN(偵聽)模式,偵聽來自遠方的TCP連接請求。
SYN_SENT:客戶端建立socket之后需要connect服務器,向服務端發送SYN=j(隨機數)申請連接,然后會進入SYN_SENT狀態。
SYN_RCVD:服務端在** 偵聽模式 **下收到SYN后會向客戶端回應ACK=j+1,同時發送SYN=k,然后進入SYN_RCVD狀態。
ACK是確認標志,可以附帶進別的消息中,將ACK附帶進SYN中,所以只發送一個SYN/ACK。具體可以自行搜索,參考:TCP的確認系列——發送狀態轉換機
ESTABLISHED:客戶端收到ACK后進行驗證,同時回應服務端發來的SYN,返回ACK=k+1,然后進入ESTABLISHED狀態。服務端收到最后一個ACK后驗證,然后進入ESBABLESHED。表示雙方的連接建立完成,可以進行數據傳輸。
還有一種少見的建立連接的方式,不分服務端與客戶端,兩端同時發起連接,后面會給出一篇文章鏈接
TCP的連接和釋放
,里面有提到。
TCP斷開連接——四次揮手
一般由客戶端主動斷開連接,服務端只做被動連接。但是如果有必要,服務端也可主動斷開連接。
FIN_WAIT_1:在ESTABLISHED(連接)狀態下,主動斷開連接會向對端發送FIN,然后進入FIN_WAIT_1狀態。
CLOSED_WAIT:被動斷開連接的一端收到FIN之后,會回應ACK,然后進入CLOSED_WAIT狀態,在CLOSED_WAIT狀態下,連接只能發送數據不能接收數據。
FIN_WAIT_2:主動斷開連接的一端收到FIN的ACK回應后會進入FIN_WAIT_2狀態。此時無法再發送數據但是可以接受數據。
LAST_ACK:被動斷開連接的一端在緩沖區數據發送完成后會發送FIN然后進入LAST_ACK狀態。如果程序健壯性較差,在socket收到文件結束符之后沒有關閉socket,此處不會發出FIN,導致連接停留在CLOSED_WAIT&FIN_WAIT_2狀態。
TIME_WAIT:主動斷開連接的一端在收到對端的FIN后回應ACK然后進入TIME_WAIT。此狀態下連接已斷開,但為了避免最后一個ACK在網絡中迷路,而導致的狀態紊亂,端口會被保留2*MSL的時長。
MSL(Maximum Segment Lifetime)——參考:什么是2MSL
CLOSED:在TIME_WAIT狀態停留時間達到2*MSL之后進入CLOSED狀態,表示無任何連接。
還有一種少見的斷開連接的方式,兩邊同時主動斷開連接,在這種情況下會有有一種其他狀態——CLOSING狀態,后面的文章鏈接
TCP的連接和釋放
,里面有提及。