TCP連接配接的11種狀态變遷
1、先上圖:

2、全部11種狀态
2.1、用戶端獨有的:(1)SYN_SENT (2)FIN_WAIT1 (3)FIN_WAIT2 (4)CLOSING (5)TIME_WAIT 。
2.2、伺服器獨有的:(1)LISTEN (2)SYN_RCVD (3)CLOSE_WAIT (4)LAST_ACK 。
2.3、共有的:(1)CLOSED (2)ESTABLISHED 。
3、狀态變遷
3.1、建立連接配接時的狀态變遷
一開始,建立連接配接之前伺服器和用戶端的狀态都為CLOSED。伺服器建立socket後開始監聽,變為LISTEN狀态。用戶端請求建立連接配接,向伺服器發送SYN封包,用戶端的狀态變為SYN_SENT。伺服器收到用戶端的封包後向用戶端發送ACK和SYN封包,此時伺服器的狀态變為SYN_RCVD。然後,用戶端收到ACK、SYN,就向伺服器發送ACK,用戶端狀态變為ESTABLISHED,伺服器收到用戶端的ACK後也變為ESTABLISHED。此時,3次握手完成,連接配接建立!
3.2、斷開連接配接時的狀态變遷
由于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丢包的時候,因為網絡傳輸有時會有意外。
什麼是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。