2013-11-02 65 views
2

考慮到我們的設置中只涉及Windows和Linux計算機,爲什麼我應該使用應用程序級別的心跳而不是TCP Keepalive來檢測舊連接?應用程序級別更適合TCP Keepalive嗎?

+0

不確定你在問什麼,更多信息? – raffian

+1

如何檢測到連接已過時?意思是,它不再連接到另一端(但沒有收到RST數據包)。 ZeroMQ文檔詳細介紹了應用程序級技巧來克服這個問題,但我不明白爲什麼在套接字級上設置TCP keepalive選項是不夠的。 –

回答

2

從約翰·傑弗里斯響應:ZMQ Pattern Dealer/Router HeartBeating

「心跳沒有必要保持連接(沒有用於TCP套接字ZMQ_TCP_KEEPALIVE套接字選項)相反,需要雙方心跳知道對方。方仍然活躍,如果任何一方確實發現另一方不活躍,則可採取其他行動。「

0

TCP keepalive提供與應用程序級別心跳完全不同的功能。 Keepalive就是這樣做的,它保持TCP會話處於活動狀態,而不是讓它在長時間的靜默之後超時。這非常重要,並且(如果適用)您應該在應用程序中使用它。但是由於不活動而導致TCP會話的死亡只是連接在一對ZMQ套接字之間斷開的一種方式。一個端點可能會在90分鐘內失去電源並處於脫機狀態,TCP Keepalive在這種情況下不會執行蹲點。

應用程序級別的心跳是而不是旨在保持TCP會話處於活動狀態,並希望在可能的情況下依靠該功能的keepalive。心跳是在那裏告訴你的應用程序,連接實際上仍然是活動的,對等套接字仍然正常工作。這會告訴你,你的同伴無法使用,因此你可以做出相應的表現,通過高速緩存消息,拋出一個異常,發出警報,等等等等等等

簡而言之:

  • 一個TCP保持活動旨在保持連接(但並不能防止所有斷開的情況)
  • 應用級的心跳旨在告訴你的應用程序如果的連接是否處於活動
+3

我想不同意。你說,如果一個端點在90分鐘內斷電,TCP keepalive不會蹲下嗎?那將是怎麼回事,因爲離線端點將不再響應TCP ​​keepalive,連接將被視爲死亡。這正是我使用TCP Keepalive的場景,並且它非常完美。 –

+0

你強迫我做一些閱讀 - 我只用Keepalive來避免空閒超時,但看到它*旨在實際提供斷開連接的信息(如果它們也發生的話)。也就是說,答案仍然是ZMQ *不使用TCP keepalives的這個特性,*不*爲應用程序提供斷開連接事件數據,所以它被減少*僅僅執行它防止閒置的角色。這是設計師的一個有意識的決定,他們的推理歸結爲他們抽象的一個目標是使斷開連接和重新連接更加無縫。 – Jason

+0

是的,底層的TCP連接會死掉,但ømq流會保持連接狀態。這正是我在這之後所做的。但是,ømq4.0爲應用程序提供了檢測傳輸級別斷開並對其作出反應的方法。像IRC這樣的協議實現協議級心跳,而不是使用TCP保持活動。這讓我有些困惑。 –

相關問題