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