TCP-IP詳解:TCP的狀態變遷圖

參考資料:TCP-IP詳解


TCP的狀態變遷圖

一個連接從開始建立到斷開,經歷了一連串的狀態變化,這次主要分析下它的狀態變遷圖,首先上經典的狀態變遷圖


客戶端的狀態變遷:CLOSED-->SYN_SENT-->ESTABLISHED-->FIN_WAIT_1-->FIN_WAIT_2-->TIME_WAIT-->CLOSED

服務器的狀態變遷:CLOSED-->LISTEN-->SYN_RCVD-->ESTABLISHED-->CLOSE_WAIT-->LAST_ACK--->CLOSED

CLOSED:這個狀態不是一個真正的狀態,是圖中假想的一個起點或者是終點

LISTEN: 服務器等待連接過來的狀態

SYN_SENT: 客戶端發起連接(主動打開),變成此狀態,如果SYN超時,或者服務器不存在直接CLOSED

SYN_RCVD:服務器收到SYN包的時候,就變成此狀態,

ESTABLISHED:完成三次握手,進入連接建立狀態,說明此時可以進行數據傳輸了

FIN_WAIT_1:客戶端執行主動關閉,發送完FIN包之後便進入FIN_WAIT_1狀態

FIN_WAIT_2:客戶端發送FIN包之後,收到ACK,即進入此狀態,其實就是半關閉的狀態

TIME_WAIT:這個狀態從圖上看,有3中情況,從FIN_WAIT_2進入,客戶端收到服務器發送過來的FIN包之後進入TIME_WAIT狀態,有CLOSING狀態進入,這是同時關閉的狀態,同時發起FIN請求,同時接收並做了ACK的回覆,從FIN_WAIT_1進入,收到對端的FIN,ACK,並回復ACK,這個地方感覺是,FIN和ACK是一塊來的.

CLOSE_WAIT:接收到FIN之後,被動的一方進入此狀態,並回復ACK

LAST_ACK:被動的一端發送FIN包之後 處於LAST_ACK狀態

CLOSING:兩邊同時發出FIN請求


2MSL等待狀態

TIME_WAIT狀態也成爲2MSL狀態,設立這個狀態的是因爲來保證可靠的實現TCP全雙工的關閉,MSL指的是報文最大的生存時間。對於一個具體實現所給定的MSL值,處理原則是:當TCP執行一個主動關閉,併發回最後一個ACK,該連接必須在TIME_WAIT狀態停留的時間爲2MSL。這樣可以讓TCP再次發送最後的ACK,以防這個ACK丟失!

處於TIME_WAIT狀態的連接,這個socket的四要素(Source IP,Source Port,Dest IP,Dest Port)不能被使用,只能在2MSL結束後才能再次被使用,其實這個地方,嚴格意義上來說是Port不能使用

某些實現中,可以使用SO_REUSEADDR選項,可以讓調用者對處於2MSL等待的本地端口進行賦值,但是我們將看到TCP原則上扔將避免使用仍處於2MSL連接中的端口。

對於客戶端來講,主動關閉是處於2MSL狀態下,但是如果不bind對應的PORT其實看起來沒什麼影響的,因爲下一次啓動客戶端,就應該分配到別的PORT了,但是對於bind Port的客戶端或者服務器來講,肯定是會報告Address already in use的錯誤。

有一個怪異的問題,別以爲SO_REUSEADDR就萬事大吉了,四要素處於2MSL,將不能被使用,儘管許多具體實現中允許一個進程重新使用仍處於2MSL等待的端口,但是TCP不能允許一個新的連接建立在相同的四元素上【有遇到過這樣的問題】。

1.  PC1 : Server啓動,監聽端口6666

2.  PC2:Client connect to Server port 1098

3.  停止PC1服務器進程,這個時候PC1 的6666 和PC2的1098 處於2MSL狀態

4.  在PC1上嘗試使用port6666啓動客戶端進程,同時與PC2端口1098進行連接

5.  會有Address already in use的錯誤

6.  使用SO_REUSEADDR,繼續做步驟5的動作

7.  仍然有Address already in use的錯誤

也就是說即使它能將它的本地端口設置爲6666,但它仍然不能和PC2的1098進行連接,因爲頂一個這個連接的四要素處於2MSL狀態


復位報文段

復位報文其實主要說的就是RST標誌被置位,無論何時一個報文段發往基準的連接出現錯誤,TCP都會發一個復位報文段,基準連接是指由目的IP地址和目的端口號以及源IP地址和源端口號指明的連接

a.到不存在的端口連接請求

這種狀況是比較常見的,這個port沒有被監聽,但是有client去connect,這個時候TCP就會使用復位



b.異常終止一個連接

終止連接的正常的方式,就是調用close發送FIN包,這種的方式可以稱爲有序釋放。但是有一個可能是發送一個復位報文而不是FIN來中途釋放連接,這種狀況就稱爲異常釋放

優點:1.丟棄任何待發送的數據並立即發送復位報文。 2.RST的接收方會區分另一端執行的是異常關閉還是正常關閉

如何產生異常關閉? linger no close SO_LINGER提供了異常關閉的能力。

如果說對端被RST了,就會產生一個Connection reset by peer的錯誤!



c.檢測半打開連接,對於半打開的連接,再次進行數據傳輸的時候,連接已經斷開的一端也會通過RST包來終止連接。這部分主要在下面的文章中介紹,詳細可以參考文章:TCP-IP詳解:TCP半打開連接


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章