2010-03-16 111 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