1.l syn_sent:這個狀態與syn_rcvd 狀態相呼應,當客戶端socket執行connect()進行連線時,它首先傳送syn報文,然後隨即進入到syn_sent 狀態,並等待服務端的傳送三次握手中的第2個報文。syn_sent 狀態表示客戶端已傳送syn報文。
2.l listen:表示伺服器端的某個socket處於監聽狀態,可以接受客戶端的連線。
3.l syn_rcvd:表示伺服器接收到了來自客戶端請求連線的syn報文。在正常情況下,這個狀態是伺服器端的socket在建立tcp連線時的三次握手會話過程中的乙個中間狀態,很短暫,基本上用netstat很難看到這種狀態,除非故意寫乙個監測程式,將三次tcp握手過程中最後乙個ack報文不予傳送。當tcp連線處於此狀態時,再收到客戶端的ack報文,它就會進入到established 狀態。
4.l established:表示tcp連線已經成功建立。
5.l 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看到。
6.l fin_wait_2:上面已經解釋了這種狀態的由來,實際上fin_wait_2狀態下的socket表示半連線,即有一方呼叫close()主動要求關閉連線。注意:fin_wait_2 是沒有超時的(不像time_wait 狀態),這種狀態下如果對方不關閉(不配合完成4次揮手過程),那這個 fin_wait_2 狀態將一直保持到系統重啟,越來越多的fin_wait_2 狀態會導致核心crash。
7.l 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狀態。(這種情況應該就是四次揮手變成三次揮手的那種情況)
8.lclosing:這種狀態在實際情況中應該很少見,屬於一種比較罕見的例外狀態。正常情況下,當一方傳送fin報文後,按理來說是應該先收到(或同時收到)對方的ack報文,再收到對方的fin報文。但是closing 狀態表示一方傳送fin報文後,並沒有收到對方的ack報文,反而卻也收到了對方的fin報文。什麼情況下會出現此種情況呢?那就是當雙方幾乎在同時close()乙個socket的話,就出現了雙方同時傳送fin報文的情況,這是就會出現closing 狀態,表示雙方都正在關閉socket連線。
9.l close_wait:表示正在等待關閉。怎麼理解呢?當對方close()乙個socket後傳送fin報文給自己,你的系統毫無疑問地將會回應乙個ack報文給對方,此時tcp連線則進入到close_wait狀態。接下來呢,你需要檢查自己是否還有資料要傳送給對方,如果沒有的話,那你也就可以close()這個socket並傳送fin報文給對方,即關閉自己到對方這個方向的連線。有資料的話則看程式的策略,繼續傳送或丟棄。簡單地說,當你處於close_wait 狀態下,需要完成的事情是等待你去關閉連線。
10.l last_ack:當被動關閉的一方在傳送fin報文後,等待對方的ack報文的時候,就處於last_ack 狀態。當收到對方的ack報文後,也就可以進入到closed 可用狀態了。
11.l closed:初始狀態,表示tcp連線是「關閉著的」或「未開啟的」。
tcpip協議的11種狀態
傳智掃地僧課程學習筆記。很多操作,是在應用底層操作的,為什麼三次握手,因此全雙工通訊,兩端都要確認。學socket程式設計,關鍵是理解tcp ip內部的狀態機理,學指標使用,關鍵是理解記憶體布局使用,執行主動關閉的那一端,進入time wait狀態,之前伺服器關閉後,再次啟動,提示埠占用,是因為仍然...
10深刻理解TCP IP的11種協議狀態
在呼叫listen int socked,int backlog 函式的時候,做了2件事情 1 將主動套接字轉換為被動套接字。tcp狀態轉換圖從closed狀態轉換為listen狀態 2 backlog規定了核心應該為相應的套接字排隊的最大連線個數。核心為這個監聽套接字維護兩個佇列 兩個佇列之和不能...
TCP IP協議 TCP IP協議棧及框架
tcp ip協議同iso osi模型一樣,也可以安排成棧形式。但這個棧不同於iso osi版本,比iso osi棧少,所以又稱之為短棧。另外,需要知道的是 tcp ip協議棧只是許多支援iso osi分層模型協議棧的一種,是乙個具體的協議棧。對於tcp ip協議棧劃分為幾層更合適,多年來專家們一直未...