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.允許老的重複分節在網路中消逝。
TCP狀態轉移
tcp狀態轉移,一共存在11個狀態,請看下圖 1.closed 起始點,在超時或者連線關閉時候進入此狀態。2.listen svr端在等待連線過來時候的狀態,svr端為此要呼叫socket,bind,listen函式,就能進入此狀態。此稱為應用程式被動開啟 等待客戶端來連線 3.syn sent 客...
TCP狀態轉移
被動開啟 active open 客戶端通過connect發起主動開啟。客戶端通過connect連線伺服器,客戶端tcp將傳送乙個syn包,告訴伺服器客戶端將在待建立連線傳送資料的初始序列號。客戶端 closed syn sent 伺服器端必須ack客戶端syn,同時傳送乙個syn,告訴客戶端,伺服...
TCP狀態轉移
1 伺服器程式執行,listen監聽之後伺服器進入listen狀態,等待客戶端的連線 2 當伺服器監聽到服務請求 接收到同步報文段 會傳送syn同步報文段和確認報文段,並進入syn rcvd狀態。3 當伺服器接收到客戶端返回的ack確認報文段,伺服器進入established狀態 情況一 4 當伺服...