1. 程式人生 > >關於TCP連接狀態的解釋

關於TCP連接狀態的解釋

time 服務端 連接狀態 無法 lose use 三次 三次握手 發送

TCP各個狀態主要存在於三次握手和四次揮手的過程

1、TCP建立連接時的三次握手:

技術分享圖片

服務端應用監聽端口處於LISTEN狀態,等待建立連接。

第一次握手:客戶端發送SYN=一個隨機數,然後進入SYN_SENT狀態。

第二次握手:服務端收到SYN後,向客戶端回應ACK=隨機數+1,同時發送SYN=k,然後進入SYN_RCVD狀態。

第三次握手:客戶端收到ACK後進行驗證,並回應SYN,返回ACK=k+1,然後進入ESTABLISHED狀態,服務端收到該ACK後進行驗證,然後也進入ESTABLISHED狀態。

服務端和客戶端都進入ESTABLISHED狀態後,表示連接建立完成,可以傳輸數據。

2、TCP斷開連接時的四次揮手:

技術分享圖片

TCP連接中的任一端都可以主動斷開連接,應用中一般是客戶端主動斷開。

客戶端向服務器端發送FIN,表示要斷開連接,然後進入FIN_WAIT1狀態。

服務端收到FIN後,回應ACK,然後進入CLOSE_WAIT狀態。此時,服務端只能發送數據,不能接收數據。等服務端將緩沖區的數據發送完成後,向客戶端發送FIN,然後進入LAST_ACK狀態。

客戶端收到FIN的ACK後,進入FIN_WAIT_2狀態,此時客戶端無法再發送數據,只能接收數據。客戶端收到服務端發來的FIN(表示服務端已將緩沖區的數據發送完成),向服務端回應ACK(確認客戶端已經收到該FIN),然後客戶端進入TIME_WAIT狀態。

服務端收到ACK後,也進入TIME_WAIT狀態,客戶端進入TIME_WAIT狀態後,在等待等待2*MSL時間,進入CLOSED狀態,連接關閉。

關於MSL時間:

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。

關於TCP連接狀態的解釋