TCP連線狀態詳解

2021-06-16 22:36:20 字數 1913 閱讀 5932

下面是每乙個tcp連線在任意時刻可能處於的狀態,在linux下可以在netstat命令的最後一列(state列)裡看到。

各個狀態的含義如下:

closed :初始狀態,表示tcp連線是「關閉著的」或「未開啟的」。

listen :表示伺服器端的某個socket處於監聽狀態,可以接受客戶端的連線。

syn_rcvd :表示接收到了syn報文。在正常情況下,這個狀態是伺服器端的socket在建立tcp連線時的三次握手會話過程中的乙個中間狀態,很短暫,基本上用netstat很難看到這種狀態,除非故意寫乙個監測程式,將三次tcp握手過程中最後乙個ack報文不予傳送。當tcp連線處於此狀態時,再收到客戶端的ack報文,它就會進入到established 狀態。

syn_sent :這個狀態與syn_rcvd 狀態相呼應,當客戶端socket執行connect()進行連線時,它首先傳送syn報文,然後隨即進入到syn_sent 狀態,並等待服務端的傳送三次握手中的第2個報文。syn_sent 狀態表示客戶端已傳送syn報文。

established :表示tcp連線已經成功建立。

fin_wait_1 :這個狀態得好好解釋一下,其實fin_wait_1 和fin_wait_2 兩種狀態的真正含義都是表示等待對方的fin報文。而這兩種狀態的區別是:fin_wait_1狀態實際上是當socket在established狀態時,它想主動關閉連線,向對方傳送了fin報文,此時該socket進入到fin_wait_1 狀態。而當對方回應ack報文後,則進入到fin_wait_2 狀態。當然在實際的正常情況下,無論對方處於任何種情況下,都應該馬上回應ack報文,所以fin_wait_1 狀態一般是比較難見到的,而fin_wait_2 狀態有時仍可以用netstat看到。

fin_wait_2 :上面已經解釋了這種狀態的由來,實際上fin_wait_2狀態下的socket表示半連線,即有一方呼叫close()主動要求關閉連線。注意:fin_wait_2 是沒有超時的(不像time_wait 狀態),這種狀態下如果對方不關閉(不配合完成4次揮手過程),那這個 fin_wait_2 狀態將一直保持到系統重啟,越來越多的fin_wait_2 狀態會導致核心crash。

time_wait :表示收到了對方的fin報文,並傳送出了ack報文。 time_wait狀態下的tcp連線會等待2*msl(max segment lifetime,最大分段生存期,指乙個tcp報文在internet上的最長生存時間。每個具體的tcp協議實現都必須選擇乙個確定的msl值,rfc 1122建議是2分鐘,但bsd傳統實現採用了30秒,linux可以cat /proc/sys/net/ipv4/tcp_fin_timeout看到本機的這個值),然後即可回到closed 可用狀態了。如果fin_wait_1狀態下,收到了對方同時帶fin標誌和ack標誌的報文時,可以直接進入到time_wait狀態,而無須經過fin_wait_2狀態。

closing :這種狀態在實際情況中應該很少見,屬於一種比較罕見的例外狀態。正常情況下,當一方傳送fin報文後,按理來說是應該先收到(或同時收到)對方的ack報文,再收到對方的fin報文。但是closing 狀態表示一方傳送fin報文後,並沒有收到對方的ack報文,反而卻也收到了對方的fin報文。什麼情況下會出現此種情況呢?那就是當雙方幾乎在同時close()乙個socket的話,就出現了雙方同時傳送fin報文的情況,這是就會出現closing 狀態,表示雙方都正在關閉socket連線。

close_wait :表示正在等待關閉。怎麼理解呢?當對方close()乙個socket後傳送fin報文給自己,你的系統毫無疑問地將會回應乙個ack報文給對方,此時tcp連線則進入到close_wait狀態。接下來呢,你需要檢查自己是否還有資料要傳送給對方,如果沒有的話,那你也就可以close()這個socket並傳送fin報文給對方,即關閉自己到對方這個方向的連線。有資料的話則看程式的策略,繼續傳送或丟棄。簡單地說,當你處於close_wait 狀態下,需要完成的事情是等待你去關閉連線。

TCP連線狀態詳解

closed 表示初始狀態。listen 表示伺服器端的某個socket處於監聽狀態,可以接受連線。syn sent 在服務端監聽後,客戶端socket執行connect連線時,客戶端傳送syn報文,此時客戶端就進入 syn sent狀態,等待服務端的確認 syn rcvd 表示服務端接受到了syn...

TCP連線狀態詳解

對於linux 套接字通訊,從連線建立到連線斷開,其狀態總共有11種,在三次握手和四次揮手,狀態變化比較快,在連線建立時,狀態比較穩定,下面簡單介紹一下各個狀態的情況。狀態彙總 11種 listen 偵聽來自遠方的tcp埠的連線請求 syn sent 再傳送連線請求後等待匹配的連線請求 客戶端 sy...

TCP連線狀態描述

狀 態 說 明 closed 不存在tcp連線 listen 乙個應用層協議已經發布了乙個被動開啟,並且有意接收 tcp連線試圖 syn sent 乙個應用層協議已經傳送了乙個主動開啟,並且傳送了乙個 syn段 syn rcvd 乙個syn 段被接收,並且乙個 syn ack 被傳送 establi...