2014-11-24 194 views
3

我想要一個服務器,多個客戶端需要打開一個websocket併發送數據。但它看起來像很多客戶無法建立連接..Websocket連接卡在FIN_WAIT1 FIN_WAIT2狀態

在服務器計算機上,當我做一個lsofnetstat -an,我看到了很多的連接狀態FIN_WAIT1從連接FIN_WAIT2開示處於ESTABLISHED狀態。截至目前,打開文件的ulimit是1024。 在這兩個狀態中卡住的連接會被計入打開的文件列表中嗎?如果是這樣的話,1024極限會很快耗盡。

/proc/sys/net/ipv4/tcp_orphan_retries0,這相當於8似乎 https://serverfault.com/questions/274212/what-does-tcp-orphan-retries-set-to-0-mean/408882#408882

我諮詢這個鏈接: https://serverfault.com/questions/7689/how-do-i-get-rid-of-sockets-in-fin-wait1-state

但我不明白得多。 我已經閱讀了關於網絡上的這兩個狀態,並且我意識到它們是協議的一部分,但我更喜歡這些連接不會卡在它們沒有用的狀態。 我能以某種方式做到嗎?我應該改變ulimit嗎?但那只是意味着問題將在x + y而不是x時發生。

回答

2

無論何時您看到Fin_Wait狀態或任何等待狀態,我們通常都會將這些狀態稱爲1/2會話。 TCP堆棧按照請求和響應的順序遵循非常嚴格的協議。正是由於這些規則,它才知道如何以及何時以及如何嘗試通過發送重試來恢復。在任何等待狀態的情況下,堆棧知道它正在等待某事。只有兩件事會滿足這個條件1)某種正確的反應或2)超時。

當然,最好的方法是獲得適當的迴應。應該做些工作來找出爲什麼有這麼多的等待。有時候,這是由於交換,路由和其他網絡相關活動不穩定所致。但是,這也可能是拒絕服務攻擊的結果,因爲他們不關心國家。應用程序層必要資源的唯一釋放方式是應用程序重新獲得控制權。 TCP僅在以下情況下進行控制:1)工作流程正常或2)發生超時或其他異常情況。例如,FIN和RST可以隨時發送出去。他們都被認爲擊敗了其他任何國家。請記住,並非所有客戶端或主機都採用與我們正在討論的不同TCP Stack實現相同的方式。

根據系統,可以配置一些,很多或很少的TCP堆棧參數。 Fin Waits上有Timeout值的可配置參數以及RST Waits。也許你可以調整這些來解決你的問題。