網路的FIN WAIT 2狀態解釋和分析

2021-09-01 09:55:07 字數 2957 閱讀 1686

[b]關於網路裝置的fin_wait_2狀態解釋[/b]出處:

在http應用中,存在乙個問題,server由於某種原因關閉連線,如keepalive的超時,這樣,作為主動關閉的server一方就會進入 fin_wait2狀態,但tcp/ip協議棧有個問題,fin_wait2狀態是沒有超時的(不象time_wait狀態),所以如果client不關閉,這個fin_wait_2狀態將保持到系統重新啟動,越來越多的fin_wait_2狀態會致使核心crash。

產生原因:

1。常連線並且當連線一直處於idle狀態導致server close時,client程式設計缺陷,沒有向server 發出fin和ack包

2。apache1.1和apache1.2增加了linger_close()函式,前面的帖子有介紹,這個函式可能引起了這個問題(為什麼我也不清楚)

解決辦法:

1。對fin_wait_2狀態增加超時機制,這個特性在協議裡沒有體現,但在一些os中已經實現

如:linux、solaris、freebsd、hp-unix、irix等

2。不要用linger_close()編譯

3。用so_linger代替,這個在某些系統中還能很好地處理

4。增加用於儲存網路連線狀態的記憶體mbuf,以防止核心crash

5。disable keepalive

[b]tcp fin_wait_2狀態問題分析 [/b]

出處: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

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、如何解決

為 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。 必須手動建立此登錄檔值。 否則,使用預設值。

[b]hp-unix:

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

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

設定引數tcp_fin_wait_2_timeout值。

禁止keepalive

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);

關於網路裝置的FIN WAIT 2狀態解釋

在http應用中,存在乙個問題,server由於某種原因關閉連線,如keepalive的超時,這樣,作為主動關閉的server一方就會進入 fin wait2狀態,但tcp ip協議棧有個問題,fin wait2狀態是沒有超時的 不象time wait狀態 所以如果client不關閉,這個fin w...

網路狀態2

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

網路請求狀態值解釋

xmlhttp.readystate的值及解釋 0 請求未初始化 還沒有呼叫 open 1 請求已經建立,但是還沒有傳送 還沒有呼叫 send 2 請求已傳送,正在處理中 通常現在可以從響應中獲取內容頭 3 請求在處理中 通常響應中已有部分資料可用了,但是伺服器還沒有完成響應的生成。4 響應已完成 ...