TCP 11種狀態轉換

2021-09-13 10:05:14 字數 2296 閱讀 9846

注:實線路線表示客戶端的正常狀態變遷

虛線路線表示服務端的正常狀態變遷

rst表示復位,用來異常的關閉連線,在tcp的設計中它是不可或缺的。傳送rst包關閉連線時,不必等緩衝區的包都發出去,直接就丟棄快取區的包傳送rst包。而接收端收到rst包後,也不必傳送ack包來確認。

簡單解釋:

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

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

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

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

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

6 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看到。

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

8 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狀態。(這種情況應該就是四次揮手變成三次揮手的那種情況)

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

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

11 last_ack :當被動關閉的一方在傳送fin報文後,等待對方的ack報文的時候,就處於last_ack 狀態。當收到對方的ack報文後,也就可以進入到closed 可用狀態了。

TCP連線的11種狀態變遷

tcp連線的11種狀態變遷 1 先上圖 2 全部11種狀態 2.1 客戶端獨有的 1 syn sent 2 fin wait1 3 fin wait2 4 closing 5 time wait 2.2 伺服器獨有的 1 listen 2 syn rcvd 3 close wait 4 last a...

TCP連線的11種狀態變遷

1 先上圖 2 全部11種狀態 2.1 客戶端獨有的 1 syn sent 2 fin wait1 3 fin wait2 4 closing 5 time wait 2.2 伺服器獨有的 1 listen 2 syn rcvd 3 close wait 4 last ack 2.3 共有的 1 c...

TCP狀態轉換

tcp建立連線協議 三次握手 客戶端傳送乙個帶syn標誌的tcp報文到伺服器。這是三次握手過程中的報文1。伺服器端回應客戶端的,這是三次握手中的第2個報文,這個報文同時帶ack標誌和syn標誌。因此它表示對剛才客戶端syn報文的回應 同時又標誌syn給客戶端,詢問客戶端是否準備好進行資料通訊。客戶必...