TCP協議狀態大集合

2021-10-07 05:11:15 字數 2170 閱讀 4948

tcp協議在連線和斷開連線的過程中,客戶端或者服務端的狀態如下。總共有11種狀態:

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 狀態下,需要完成的事情是等待你去關閉連線。

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

jQuery Select操作大集合

jquery獲取select選擇的text和value 語法解釋 select id change function 為select新增事件,當選擇其中一項時觸發 var checktext select id find option selected text 獲取select選擇的text va...

SQL基礎大集合

可以把 sql 分為兩個部分 資料操作語言 dml 和 資料定義語言 ddl sql 結構化查詢語言 是用於執行查詢的語法。但是 sql 語言也包含用於更新 插入和刪除記錄的語法。一定要記住,sql對大小寫不敏感!查詢和更新指令構成了 sql 的 dml 部分 1,select 從資料庫表中獲取資料...

FTP命令大集合

ftp的命令列格式為 ftp v d i n g 主機名 引數介紹 v 顯示遠端伺服器的所有響應資訊 d 使用除錯方式 n 限制ftp的自動登入,即不使用.netrc檔案 g 取消全域性檔名 ftp使用的內部命令如下 其中括號表示可選 1.cmd args 在本地機種執行互動shell exit回到...