天天看點

TCP狀态轉移圖

 本文轉至:http://kb.cnblogs.com/a/1552552/

tcp狀态轉移圖

TCP狀态轉移圖

tcp的狀态轉移圖說到底就是一個狀态機的不同狀态之間的轉換關系以及觸發這些狀态需要的條件,一共存在11個狀态

1.closed:起始點,在逾時或者連接配接關閉時候進入此狀态。

2.listen:svr端在等待連接配接過來時候的狀态,svr端為此要調用socket, bind,listen函數,就能進入此狀态。此稱為應用程式被動打開(等待用戶端來連接配接)。

3.syn_sent:用戶端發起連接配接,發送syn給伺服器端。如果伺服器端不能連接配接,則直接進入closed狀态。

4.syn_rcvd:跟3對應,伺服器端接受用戶端的syn請求,伺服器端由listen狀态進入syn_rcvd狀态。同時伺服器端要回應一個ack,同時發送一個syn給用戶端;另外一種情況,用戶端在發起syn的同時接收到伺服器端得syn請求,用戶端就會由syn_sent到syn_rcvd狀态。

5.established:伺服器端和用戶端在完成3次握手進入狀态,說明已經可以開始傳輸資料了。

以上是建立連接配接時伺服器端和用戶端産生的狀态轉移說明。相對來說比較簡單明了,如果你對三次握手比較熟悉,建立連接配接時的狀态轉移還是很容易了解。

接下來伺服器端和用戶端就進行資料傳輸。。。。,當然,裡面也大有學問,就此打住,稍後再表。

下面,我們來看看連接配接關閉時候的狀态轉移說明,關閉需要進行4次雙方的互動,還包括要處理一些善後工作(time_wait狀态),注意,這裡主動關閉的一方或被動關閉的一方不是指特指伺服器端或者用戶端,是相對于誰先發起關閉請求來說的:

6.fin_wait_1:主動關閉的一方,由狀态5進入此狀态。具體的動作時發送fin給對方。

7.fin_wait_2:主動關閉的一方,接收到對方的fin ack,進入此狀态。由此不能再接收對方的資料。但是能夠向對方發送資料。

8.close_wait:接收到fin以後,被動關閉的一方進入此狀态。具體動作時接收到fin,同時發送ack。

9.last_ack:被動關閉的一方,發起關閉請求,由狀态8進入此狀态。具體動作時發送fin給對方,同時在接收到ack時進入closed狀态。

10.closing:兩邊同時發起關閉請求時,會由fin_wait_1進入此狀态。具體動作是,接收到fin請求,同時響應一個ack。

11.time_wait:最糾結的狀态來了。從狀态圖上可以看出,有3個狀态可以轉化成它,我們一一來分析:

a.由fin_wait_2進入此狀态:在雙方不同時發起fin的情況下,主動關閉的一方在完成自身發起的關閉請求後,接收到被動關閉一方的fin後進入的狀态。

b.由closing狀态進入:雙方同時發起關閉,都做了發起fin的請求,同時接收到了fin并做了ack的情況下,由closing狀态進入。

c.由fin_wait_1狀态進入:同時接受到fin(對方發起),ack(本身發起的fin回應),與b的差別在于本身發起的fin回應的ack先于對方的fin請求到達,而b是fin先到達。這種情況機率最小。

關閉的4次連接配接最難了解的狀态是time_wait,存在time_wait的2個理由:

1.可靠地實作tcp全雙工連接配接的終止。

2.允許老的重複分節在網絡中消逝。