圖1 tcp狀態變遷圖
咋一看這圖,讓人頭大。下面會詳細分析圖中的所有狀態,這些狀態跟tcp三次握手與四次揮手有著非常密切的聯絡,關於這個可以參看前面拙文。
closed:表示初始狀態。對服務端和c客戶端雙方都一樣。
listen:表示監聽狀態。服務端呼叫了listen函式,可以開始accept連線了。
syn_sent:表示客戶端已經傳送了syn報文。當客戶端呼叫connect函式發起連線時,首先發syn給服務端,然後自己進入syn_sent狀態,並等待服務端傳送ack+syn。
syn_rcvd:表示服務端收到客戶端傳送syn報文。服務端收到這個報文後,進入syn_rcvd狀態,然後傳送ack+syn給客戶端。
established:表示連線已經建立成功了。服務端傳送完ack+syn後進入該狀態,客戶端收到ack後也進入該狀態。
fin_wait_1:表示主動關閉連線。無論哪方呼叫close函式傳送fin報文都會進入這個這個狀態。
fin_wait_2:表示被動關閉方同意關閉連線。主動關閉連線方收到被動關閉方返回的ack後,會進入該狀態。
time_wait:表示收到對方的fin報文並傳送了ack報文,就等2msl後即可回到closed狀態了。如果fin_wait_1狀態下,收到對方同時帶fin標誌和ack標誌的報文時,可以直接進入time_wait狀態,而無須經過fin_wait_2狀態。
closing:表示雙方同時關閉連線。如果雙方幾乎同時呼叫close函式,那麼會出現雙方同時傳送fin報文的情況,此時就會出現closing狀態,表示雙方都在關閉連線。
close_wait:表示被動關閉方等待關閉。當收到對方呼叫close函式傳送的fin報文時,回應對方ack報文,此時進入close_wait狀態。
last_ack:表示被動關閉方傳送fin報文後,等待對方的ack報文狀態,當收到ack後進入closed狀態。
特別提示的是:為什麼time_wait狀態還需要等待2msl才能回到closed狀態?或者為什麼tcp要引入time_wait狀態?
《tcp/ip詳解》中如此解釋:當tcp執行乙個主動關閉,並發回最後乙個ack後,該連線必須在time_wait狀態停留的時間為2倍的msl,這樣可以讓tcp再次傳送最後的ack以防止這個ack丟失(另一端超時重發最後的fin)。
附註:msl(maximum segment lifetime)即最大生存時間,rfc 793中指出msl為2分鐘,但是實現中的常用值為30秒、1分鐘或者2分鐘。
TCP狀態轉換
tcp建立連線協議 三次握手 客戶端傳送乙個帶syn標誌的tcp報文到伺服器。這是三次握手過程中的報文1。伺服器端回應客戶端的,這是三次握手中的第2個報文,這個報文同時帶ack標誌和syn標誌。因此它表示對剛才客戶端syn報文的回應 同時又標誌syn給客戶端,詢問客戶端是否準備好進行資料通訊。客戶必...
tcp狀態說明
tcp連線狀態詳解 listen 偵聽來自遠方的tcp埠的連線請求 syn sent 再傳送連線請求後等待匹配的連線請求 syn received 再收到和傳送乙個連線請求後等待對方對連線請求的確認 established 代表乙個開啟的連線 fin wait 1 等待遠端tcp連線中斷請求,或先前...
TCP狀態轉移
tcp狀態轉移,一共存在11個狀態,請看下圖 1.closed 起始點,在超時或者連線關閉時候進入此狀態。2.listen svr端在等待連線過來時候的狀態,svr端為此要呼叫socket,bind,listen函式,就能進入此狀態。此稱為應用程式被動開啟 等待客戶端來連線 3.syn sent 客...