TCP FIN WAIT 2狀態問題分析

2021-07-05 00:06:37 字數 2526 閱讀 2167

tcp fin_wait_2狀態問題分析

1、出現fin_wait_2一般為客戶端,如果為服務端出現,則表明是服務端主動發起的斷開。

c:\documents and settings\administrator>netstat -an|findstr 10.208.8.2:

tcp    10.88.2.26:9002        10.208.8.2:1040        fin_wait_2

tcp    10.88.2.26:9002        10.208.8.2:1048        fin_wait_2

tcp    10.88.2.26:9002        10.208.8.2:1051        fin_wait_2

tcp    10.88.2.26:9002        10.208.8.2:1052        fin_wait_2

tcp    10.88.2.26:9002        10.208.8.2:1056        fin_wait_2

tcp    10.88.2.26:9002        10.208.8.2:1058        fin_wait_2 #netstat -an|grep 10.116.50.30  www.2cto.com  

tcp        0      0 192.168.129.44.64306   10.116.50.30.53081       fin_wait_2

tcp        0      0 192.168.129.44.63611   10.116.50.30.57966       fin_wait_2

tcp        0      0 192.168.129.44.57835   10.116.50.30.49188       fin_wait_2

tcp        0      0 192.168.129.44.57502   10.116.50.30.52615       established

2、為什麼發生

a.客戶端狀態遷移(主動結束連線)closed->syn_sent->established->fin_wait_1->fin_wait_2->time_wait->closedb.伺服器狀態遷移closed->listen->syn收到->established->close_wait->last_ack->closed 有缺陷的客戶端與持久連線

有一些客戶端在處理持久連線(aka keepalives)時存在問題。當連線空閒下來伺服器關閉連線時(基於keepalivetimeout指令), 客戶端的程式編制使它不傳送fin和ack回伺服器。這樣就意味著這個連線 將停留在fin_wait_2狀態直到以下之一發生:

客戶端為同乙個或者不同的站點開啟新的連線,這樣會使它在該個套接字上完全關閉以前的連線。

使用者退出客戶端程式,這樣在一些(也許是大多數?)客戶端上會使作業系統完全關閉連線。

fin_wait_2超時,在那些具有fin_wait_2狀態超時設定的伺服器上。

如果你夠幸運,這樣意味著那些有缺陷的客戶端會完全關閉連線並釋放你伺服器的資源。 然而,有一些情況下套接字永遠不會完全關閉,比如乙個撥號客戶端在關閉客戶端程式之前從isp斷開。 此外,有的客戶端有可能空置好幾天不建立新連線,並且這樣在好幾天裡保持著套接字的有效即使已經不再使用。 這是

瀏覽器或者操作

系統的tcp實現的bug。

3、如何解決  www.2cto.com  

為 fin_wait_2 增加 超時機制

windows:

開始->執行->輸入regedit

hkey_local_machine\system\currentcontrolset\services\tcpip\parameters

在詳細資訊窗格中雙擊 tcpfinwait2delay ,然後從 30 到 300 中輸入乙個值。 

請注意 如果不存在 tcpfinwait2delay 值,必須為 reg _ dword 登錄檔值來建立它。 登錄檔該值控制 tcp 連線之前等待的秒數它被強制關閉, 關閉 (s,sd_send) 函式呼叫之後。 在預設值為 240 秒。 此值範圍是 30 到 300。 必須手動建立此登錄檔值。 否則,使用預設值。

hp-unix:

#ndd -set /dev/tcp tcp_fin_wait_2_timeout 60000   (1分鐘)

執行上述命令,重起系統後將失效,如果需要一致起作用,則修改下列檔案:/etc/rc.config.d/nddconf

設定引數tcp_fin_wait_2_timeout值。

禁止keepalive  www.2cto.com  

apache:編輯你的httpd.conf並把"keepalive on"改為"keepalive off"。

使用linger:

linger    lig;   

lig.l_onoff=1;   

lig.l_linger=0;   

int    ilen=sizeof(linger);   

setsockopt(socket,sol_socket,so_linger,(char*)&lig,ilen);

TCP FIN WAIT1狀態的實驗和驗收

本文純屬實踐和驗證。請先閱讀下面的文章 乙個有趣的實驗 tcp傳送緩衝區滿,然後殺掉程序 處於fin wait1狀態 接收端是無感知的。如果你知道其中的緣由,那麼本文就不必讀了,讀過你不知道,請務必花10分鐘左右的時間熟讀本文。其實以上的文章除了做了乙個實驗之外,什麼都沒有說,絲毫沒有回答why!然...

網路狀態2

如果你想在ios程式中提供一僅在wifi網路下使用 reeder 或者在沒有網路狀態下提供離線模式 evernote 那麼你會使用到reachability來實現網路檢測。如何使用通知 簡單的功能 reachablity 是乙個ios下檢測,ios裝置網路環境用的庫。蘋果官方提供的doc githu...

狀態模式解決燈開關狀態問題

clevercode最近在研究狀態設計模式,發現狀態設計模式能夠解決很多設計問題。當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。2.1 上下文環境 context 它定義了客戶程式需要的介面並維護乙個具體狀態角色的例項,將與狀態相關的操作委託給當前的concrete sta...