2009-09-10 151 views
1

我有一個C#應用程序已運行好幾年了。它通過TCP/IP套接字連接到發送股票交易執行的機器。套接字一端連接,防火牆?

最近,我試圖將它部署到位於硬件防火牆後面的新數據中心中的某些機器上,並且我已經開始看到一些奇怪的斷開連接。

當發生斷開連接時,在我的應用程序(客戶端)中,除了停止通過套接字接收數據外,沒有任何異常。當我在調試器中停止它時,Wireshark確認沒有數據到達套接字,並且我的應用程序的接收線程在Receive()調用上被阻塞。套接字在netstat中顯示爲ESTABLISHED。

但是從服務器端來看,它看起來像我的客戶端正在斷開連接。看看它們的日誌,看起來它們的端點通常以(nRecvd = -1,errno = 104)或(nRecvd = 0,errno = 11)結束。 (104由同級重置連接)。

斷開似乎只發生在一段時間的活動之後。我現在通過在我的客戶端和他們的服務器之間實現心跳來解決這個問題,該服務器每20秒發送一條短消息並獲得答覆。這導致過去幾天斷開連接數降到0。

起初,我覺得硬件防火牆是個問題。它導致套接字在活動之後超時。但防火牆負責人聲稱,此端口上的連接超時(8887)爲2160分鐘。

我正在運行Windows Server 2003和.NET 3.5。交易服務器是一臺Linux機器(sles9我相信雖然我不確定)。

關於可能會發生什麼的任何想法?考慮到我無法訪問防火牆日誌並且無法更改交易服務器上的代碼,我該怎麼做才能進行更多的調試?

謝謝, 邁克

回答

1

你描述的現象很普遍,這是共同實施的心跳,保持TCP套接字活着通過像這樣的防火牆/網關你做到了。

該硬件可能會有2160分鐘的超時時間(根據我的經驗,20-30分鐘更常見),但如果存在任何類型的負載,連接通常會大幅下降。這樣的防火牆資源有限,並且當他們需要更多的連接跟蹤時,無論設置硬超時如何,他們都傾向於丟棄最早的連接,而無需任何活動。

如果你想調試這更多信息,請在防火牆的服務器端嗅,看看是否點兒什麼,會發生什麼,當服務器獲取斷開

+0

謝謝,只是想確保我在賽道與防火牆假設。在從防火牆到交易服務器的路徑上,他們不會爲我捕獲任何東西。最後,它變成了防火牆。儘管我要求10x確認端口號,但他們已經解開了錯誤的端口。 – 2009-09-11 18:19:18

0

我會在防火牆的兩側設置wiresharp看到TCP(下水平)會發生什麼。 而當管理員說「連接超時」是什麼。這是一個空閒,建立連接的超時?其他任何東西都沒有任何意義,我猜。

此外,您是否使用TCP的KeepAlive選項?並且是否由防火牆轉發?

正如我所說的,可能要運行在防火牆的兩側Wireshark的...