2008-12-08 66 views
3

我最近遇到了TCP服務器和客戶端之間的中間連接斷開的問題。如果主服務器關閉,客戶端需要連接到輔助服務器。當主服務器購買時(例如,通過在終端上執行^ C),會有TCP關閉序列通過,客戶端成功檢測到斷開的鏈接並嘗試次要服務器。但是,如果中間鏈接發生故障,客戶端和服務器將不知道它。客戶端可以檢測到的唯一方式是其TCP緩衝區充滿失敗的「發送」操作。TCP Keepalive是確定斷鏈的唯一機制嗎?

作爲解決方案,已使用'TCP Keepalive'機制。這件作品令人滿意。

我的問題是'TCP Keepalive'唯一的解決方案?

-Prabhu

回答

1

保持連接的目的是要對付所謂的半開連接,當一方側(通常是接收請求的服務器)是不知道連接已斷開。客戶端通常知道它,因爲嘗試向服務器發送請求會返回錯誤。

另一種選擇是讓聽者運行 - 當客戶端檢測通訊科的問題,它只是試圖再次連接到服務器。服務器獲取傳入連接,檢查它是否來自同一個IP地址,如果是這種情況,請關閉打開的連接並建立一個新連接。

但是,如果客戶端不知道該連接下樓和服務器需要發送的東西,有沒有辦法讓服務器重新建立連接,但TCP存活。

如果您不想使用keepalive,則可以使用應用程序級保持活動,例如,發送特定於應用程序的回顯消息。

+0

根據RFC 1122,TCP在開始發送保持活動探測器之前至少需要2小時的空閒時間。如果不是大多數應用程序,這可能會成爲問題,並會限制TCP Keepalive的有用性。 – 2009-06-25 09:13:06

+6

您可以使用TCP_KEEPCNT,TCP_KEEPIDLE和TCP_KEEPINTVL套接字選項(使用SOL_TCP級別,而不是SOL_SOCKET)控制保持活動行爲。 2小時不是最小空閒時間 - 這是默認空閒時間。 – qrdl 2009-06-25 09:23:46

1

你可以創造和實現自己的使用保持活動的TCP的亂波段功能,但我不會考慮,除非你有一個已經建成了一個有些顯著問題您。

2

我總是在應用程序級處理這通過延長通過TCP客戶端和服務器之間的協議交談,「保持激活」 -Messages服務器和客戶端例如發送此消息每秒鐘,如果他們沒有「Keep Alive」 - 在2秒鐘內收到消息,連接可能會關閉。

TCP的保活機制是好的,但很難在不同的平臺上工作時,特別是使用。

1

即使沒有SO_KEEPALIVE集,如果試圖沿着死的TCP連接發送數據時,它通常被複位,或將最終超時 - 無論這些發送錯誤的應用程序最終。

SO_KEEPALIVE意味着這可能會在其他空閒連接上檢測到更早。就這樣。

+0

是的標記。我的要求是客戶應儘快嘗試輔助服務器。沒有Keepalive機制,故障轉移到中級的時間非常延遲。 – 2008-12-08 09:49:23

2

另一種解決方案是在單獨的套接字上使用心跳。這樣,你幾乎可以立即知道連接是否斷開。當您的主要連接正在發送沒有消息邊界的流式數據時,這非常有用。