TCP的連接狀態是如何變化的?
TCP是一種面向連接的可靠傳輸協議,TCP使用三次握手和四次揮手來建立和終止連接。通過三次握手,發送方和接收方交換序列號、窗口大小等信息,確保雙方都準備好進行數據傳輸。在傳輸過程中,通過四次揮手正常終止連接,確保最后的數據能夠完整傳輸。
圖片
圖片
TCP客戶端和服務器在建立連接和斷開連接的過程中,會存在不同的狀態遷移變化。
圖片
建立連接時的狀態變遷:
1、建立連接之前服務器和客戶端的狀態都為CLOSED。
2、服務器創建socket后開始監聽,變為LISTEN狀態。
3、客戶端請求建立連接,向服務器發送SYN報文,客戶端的狀態變為SYN_SENT。
4、服務器收到客戶端的報文后,向客戶端發送ACK和SYN報文,此時服務器的狀態變為SYN_RCVD。
5、客戶端收到服務器的ACK和SYN報文,就向服務器發送ACK,客戶端狀態變為ESTABLISHED
6、服務器收到客戶端的ACK后也變為ESTABLISHED。
至此,3次握手完成,連接建立!
圖片
斷開連接時的狀態變遷(服務器也可以主動斷開連接,以客戶端主動斷開連接為例):
1、客戶端先向服務器發送FIN報文,請求斷開連接,其狀態變為FIN_WAIT1。
2、服務器收到FIN后向客戶端發送ACK,服務器狀態變為CLOSE_WAIT。
3、客戶端收到ACK后就進入FIN_WAIT2狀態。此時連接已經斷開了一半了。
4、如果服務器還有數據要發送給客戶端,就會繼續發送。直到發完了,就發送FIN報文,此時服務器進入LAST_ACK狀態。
5、客戶端收到服務器的FIN后,馬上發送ACK給服務器,此時客戶端進入TIME_WAIT狀態,再過了2MSL長的時間后進入CLOSED狀態(MSL指的是報文最大生存時間)。
6、服務器收到客戶端的ACK就進入CLOSED狀態。
至此,四次揮手完成,連接結束!
圖片
斷開連接過程中,有兩點需要注意:
1、如果客戶端發送FIN報文后,在收到服務器的ACK之前先收到了服務器的FIN,此時客戶端回復ACK給服務器,狀態變為CLOSING狀態,等客戶端再收到服務器的ACK后,狀態變為TIME_WAIT狀態。
2、如果客戶端發送FIN報文后,收到了服務器同時帶有ACK和FIN標志的報文,可以直接進入到TIME_WAIT狀態,而無須經過FIN_WAIT_2狀態。
圖片