TCP鏈接狀態詳解

一、tcp狀態:服務器

LISTEN:偵聽來自遠方的TCP端口的鏈接請求

SYN-SENT:再發送鏈接請求後等待匹配的鏈接請求

SYN-RECEIVED:再收到和發送一個鏈接請求後等待對方對鏈接請求的確認

ESTABLISHED:表明一個打開的鏈接

FIN-WAIT-1:等待遠程TCP鏈接中斷請求,或先前的鏈接中斷請求的確認

FIN-WAIT-2:從遠程TCP等待鏈接中斷請求

CLOSE-WAIT:等待從本地用戶發來的鏈接中斷請求

CLOSING:等待遠程TCP對鏈接中斷的確認

LAST-ACK:等待原來的發向遠程TCP的鏈接中斷請求的確認

TIME-WAIT:等待足夠的時間以確保遠程TCP接收到鏈接中斷請求的確認

CLOSED:沒有任何鏈接狀態
網絡

二、示意圖
socket

三、所有11種狀態tcp

    3.一、客戶端獨有的:   
spa

  (1)SYN_SENT (2)FIN_WAIT1 (3)FIN_WAIT2 (4)CLOSING (5)TIME_WAIT 。it

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

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


四、狀態變遷數據

    4.一、創建鏈接時的狀態變遷客戶端

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

    4.二、斷開鏈接時的狀態變遷

            因爲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丟包的時候,由於網絡傳輸有時會有意外。

相關文章
相關標籤/搜索