TCP鏈接的11種狀態變遷

TCP鏈接的11種狀態變遷 
服務器


一、先上圖:網絡



二、所有11種狀態socket

    2.一、客戶端獨有的:(1)SYN_SENT (2)FIN_WAIT1 (3)FIN_WAIT2 (4)CLOSING (5)TIME_WAIT 。tcp

    2.二、服務器獨有的:(1)LISTEN (2)SYN_RCVD (3)CLOSE_WAIT (4)LAST_ACK 。ide

    2.三、共有的:(1)CLOSED (2)ESTABLISHED 。spa


三、狀態變遷orm

    3.一、創建鏈接時的狀態變遷blog

          一開始,創建鏈接以前服務器和客戶端的狀態都爲CLOSED。服務器建立socket後開始監聽,變爲LISTEN狀態。客戶端請求創建鏈接,向服務器發送SYN報文,客戶端的狀態變爲SYN_SENT。服務器收到客戶端的報文後向客戶端發送ACK和SYN報文,此時服務器的狀態變爲SYN_RCVD。而後,客戶端收到ACK、SYN,就向服務器發送ACK,客戶端狀態變爲ESTABLISHED,服務器收到客戶端的ACK後也變爲ESTABLISHED。此時,3次握手完成,鏈接創建!ip

    3.二、斷開鏈接時的狀態變遷路由

        因爲tcp鏈接是全雙工的,斷開鏈接會比創建鏈接麻煩一點點。客戶端先向服務器發送FIN報文,請求斷開鏈接,其狀態變爲FIN_WAIT1。服務器收到FIN後向客戶端發生ACK,服務器狀態變爲CLOSE_WAIT。客戶端收到ACK後就進入FIN_WAIT2狀態。此時鏈接已經斷開了一半了。若是服務器還有數據要發送給客戶端,就會繼續發送。直到發完了,就發送FIN報文,此時服務器進入LAST_ACK狀態。客戶端收到服務器的FIN後,立刻發送ACK給服務器,此時客戶端進入TIME_WAIT狀態,再過了2MSL長的時間後進入CLOSED狀態。服務器收到客戶端的ACK就進入CLOSED狀態。

        至此,還有一個狀態沒有說起:CLOSING狀態。CLOSING狀態表示客戶端發生了FIN,但沒有收到服務器的ACK,卻收到了服務器的FIN。這種狀況發生在服務器發送的ACK丟包的時候,由於網絡傳輸有時會有意外。

f2d6022158f74eca73e1e2c54ba407e3.jpg


什麼是2MSL

MSL是Maximum Segment Lifetime英文的縮寫,中文能夠譯爲「報文最大生存時間」,他是任何報文在網絡上存在的最長時間,超過這個時間報文將被丟棄。由於tcp報文(segment)是ip數據報(datagram)的數據部分,具體稱謂請參見《數據在網絡各層中的稱呼》一文,而ip頭中有一個TTL域,TTL是time to live的縮寫,中文能夠譯爲「生存時間」,這個生存時間是由源主機設置初始值但不是存的具體時間,而是存儲了一個ip數據報能夠通過的最大路由數,每通過一個處理他的路由器此值就減1,當此值爲0則數據報將被丟棄,同時發送ICMP報文通知源主機。RFC 793中規定MSL爲2分鐘,實際應用中經常使用的是30秒,1分鐘和2分鐘等。

   2MSL即兩倍的MSL,TCP的TIME_WAIT狀態也稱爲2MSL等待狀態,當TCP的一端發起主動關閉,在發出最後一個ACK包後,即第3次握手完成後發送了第四次握手的ACK包後就進入了TIME_WAIT狀態,必須在此狀態上停留兩倍的MSL時間,等待2MSL時間主要目的是怕最後一個ACK包對方沒收到,那麼對方在超時後將重發第三次握手的FIN包,主動關閉端接到重發的FIN包後能夠再發一個ACK應答包。在TIME_WAIT狀態時兩端的端口不能使用,要等到2MSL時間結束纔可繼續使用。當鏈接處於2MSL等待階段時任何遲到的報文段都將被丟棄。不過在實際應用中能夠經過設置SO_REUSEADDR選項達到沒必要等待2MSL時間結束再使用此端口。


   TTL與MSL是有關係的但不是簡單的相等的關係,MSL要大於等於TTL。

相關文章
相關標籤/搜索