2010-03-16 46 views
4

我需要想出可以可靠地多播到其他客戶端的客戶端。這意味着我將使用TCP在多播組中的客戶端之間可靠地進行連接。沒有達到n^2的連接數量嗎?這對我來說似乎有點愚蠢。會不會/不應該有一種方法可以更加輕鬆地進行多播?TCP多播和多線程

編輯:UNIX/C

編輯:我沒有澄清多線程如何發揮作用的。但如果我打開n^2連接,我想,我會多線程,這比我想要的更復雜。

+0

你需要多播嗎?你可以嘗試在明星/戒指/網格類型模式中構建你的客戶... – wds 2010-03-16 10:49:50

+0

是的,需要組播。不幸的是,我無力改變這種狀況。 – 2010-03-16 10:52:43

+1

這與多線程有什麼關係? – 2010-03-16 12:14:04

回答

4

有幾個可靠組播解決方案。

我已經試過前兩個人。

規範很簡單,像標準udp組播一樣工作,但是包含nacks ...如果你不需要更多的話,那麼它非常棒。有一些實現也支持帶寬適配和其他改進。

DDS是一個進步。這真的很棒(我知道RTI的實現,它的效果很好),並且具有很多功能以及非常好的設計。它基於可靠和容錯性,並且有一個open implementation

順便說一下,至少DDS和NORM不需要n^2連接。他們像多播udp一樣工作。

+0

謝謝,我不太使用DDS,但使用他們的模型來解決我的問題。 – 2010-03-17 23:57:32

0

當然,還有一種更有效的方法 - 你保持使用UDB,並重新實現可靠的發送自己。雖然不是微不足道的。但至少你只需要在發送站點上保持發送數據包一次。

+1

那些不使用TCP的人註定要重新實現它,以便解釋某人。不是所有可能世界中最好的。 – 2010-03-16 16:06:36

+0

很無知的答案。 TCP是點對點,他正在談論播出。如果您不希望將流量分發X次(其中x是偵聽器的數量),則重新實現TCP的一部分是唯一的解決方案。現實不會屈從於安德魯B的有趣想法。 – TomTom 2010-03-16 20:25:12

1

多播和TCP是互斥的。

通過UDP實現可靠的傳輸是堅果。從20世紀80年代以來,沒有人會這樣做,就性能和BW開銷而言,不可能像任何廉價的TCP堆棧那樣做得很好。更正:有時候是手動完成的,但僅限於異國情調的運輸,例如極長或狹窄的管道。

N^2連接不是很愚蠢。與1Hz keepalives的連接不會花費太多。流量成本是多少?這是您的設計需要關注的內容。

+0

第一部分是正確的 - 但對於金融服務中的海量數據場景,序列號的UDP仍然是一條路 - 即使交換機的最新實現也使用這種方式。 – weismat 2010-03-16 09:31:11

+1

我不同意。從審查衆多財務應用程序的豐富經驗(諮詢TASE,其他人),任何去UDP的團隊都對此表示歉意。他們會提供無關的藉口,如「目標應用程序的系統開銷」 – 2010-03-16 10:41:42

+0

是什麼讓你說沒有正文實現可靠的多播?你錯了 - > http://en.wikipedia.org/wiki/Reliable_multicast – 2010-03-17 23:00:41

0

如上所述,PGM是一個選項。我們遇到的問題是,如果客戶無法跟上傳入的數據,它會斷開連接。由於我們從來沒有能夠可靠地保證'速度夠快'的客戶端,所以我們在UDP多播的基礎上實現了我們自己的可靠性協議。當涉及動態連接/斷開連接時,該實現不是完全通用的,但它可能適用於您。你可以在這裏找到實現:

http://www.equalizergraphics.com/cgi-bin/viewvc.cgi/trunk/src/lib/net/rspConnection.h?view=markup http://www.equalizergraphics.com/cgi-bin/viewvc.cgi/trunk/src/lib/net/rspConnection.cpp?view=markup

+0

供參考:PGM協議的OpenPGM實施允許您完全自定義協議參數,例如從不斷開不可恢復的數據丟失。 – 2010-03-19 10:23:37

0

只是一個想法,但確實需要你的工作要與網絡協議來完成。您也可以考慮使用基於發佈 - 訂閱的消息服務實現此模型。

如果你確實需要聯網,那麼你將不得不處理大量的連接,或確保自己交付。在走下這條路之前,要確保你的要求。

2

你需要看看0MQ這是一個高速消息系統,它具有可靠的多播功能之一,使用Pragmatic General Multicast (PGM)使用OpenPGM

最近有關於它的文章中lwn.net:

0MQ: A new approach to messaging

+0

直接使用OpenPGM或0MQ之間的選擇取決於您希望如何處理線程,因爲0MQ爲IO處理提供線程池,而OpenPGM根本沒有內部線程。 – 2010-03-19 10:21:49