tcp 狀態轉移圖詳解


首先看一張圖片:

 

虛線表示服務端的狀態轉移,實現表示客戶端的狀態轉移。

初始的close狀態並不是真是的狀態,只是為了方便描述開始和終止狀態而構造出來的。

從服務端的狀態轉移開始說:

服務端打開后處於listen狀態,等待客戶端的連接請求。當服務端收到客戶端發來的SYN時,服務端回復SYN和ACK進入SYNRECEIVE狀態,這里對應三次握手的第一次和第二次,即 客戶端發送請求,服務端回復ACK並發送SYN。服務端再次受到ACK時,服務端認為連接已經建立,進入ESTABLISHED狀態。服務端收到FIN時,表明客戶端要關閉連接,這時服務端進入CLOSE_WAIT狀態,此時,服務端不再接收數據,但是可以繼續發生數據,當服務端的數據發送完成后,服務端發送FIN,進入LASK_ACK狀態,在LASK_ACK狀態下,收到客戶端發來的針對FIN的ACK后,服務端關閉連接,進入CLOSE狀態。

客戶端的狀態轉移:

客戶端發送SYN進入SYNSNED 狀態,當收到服務端發來的SYN和ACK后,發送ACK, 這里是三次握手中,第三次的過程。客戶端發送完ACK進入連接建立狀態ESTABLISHED。客戶端發送FIN主動關閉連接,進入FIN_WAIT_1,在這個狀態下,服務可能回復:

1.ACK(表明服務端還要繼續發送數據), 此時,客戶端進入FIN_WAIT_2狀態,等待服務端關閉連接。

2.或者收到FIN(服務端剛好也要關閉連接),此時,客戶端發送ACK,並進入CLOSING狀態,等待接收之前發送FIN 對應的ACK。

3.或者收到FIN+ACK(服務端收到關閉連接請求同時也發生關閉連接),此時,客戶端發送ACK,進入TIME_WAIT狀態。

對於1和2情況,當收到服務端發來的FIN回復ACK(1的情況)或收到ACK(2的情況)后,客戶端進入TIME_WAIT狀態。

TIME_WAIT 狀態是在服務端發送FIN后,客戶回復ACK后,客戶端需要等待2MSL時間,此時若是客戶端回復的ACK因為網絡的原因,服務端沒有收到,服務端要重發FIN,客戶端此時處於TIME_WAIT狀態,可以繼續發送ACK。 總體來說TIME_WAIT狀態時為了保證最后一個ACK因丟失,而等待重發的時間。

上面的解釋 僅僅是正常狀態的變遷。(粗實線和粗的虛線) 當SYNRECEIVE狀態是由LISTEN狀態進入時,(收到RST)才能變遷至LISTEN狀態。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM