TCP的連線狀態是如何變化的?
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狀態。