4

我需要想出可以可靠地多播到其他客户端的客户端。这意味着我将使用 TCP 在多播组内的客户端之间进行可靠连接。这不是 n^2 连接数吗?这对我来说似乎有点傻。难道/不应该有一种更容易可靠地多播的方法吗?

编辑:UNIX/C

编辑:我没有澄清多线程是如何发挥作用的。但如果我要打开 n^2 个连接,我想,我会是多线程的,这比我想要的更复杂。

4

7 回答 7

4

有几种可靠的多播解决方案。

我已经尝试了前两个。

规范很简单,像标准 udp 多播一样工作,但包含 nacks……如果您不需要更多,那就太好了。有一些实现也支持带宽自适应和其他改进。

DDS 向前迈进了一步。它真的很棒(我知道 RTI 的实现并且效果很好)并且具有很多功能以及非常好的设计。它基于可靠和容错性,并且有一个开放的实现

顺便说一句,至少 DDS 和 NORM 不需要 n^2 连接。它们像多播 udp 一样工作。

于 2010-03-17T22:59:16.420 回答
2

您需要看一下0MQ,它是一个高速消息传递系统,它具有使用OpenPGM的Pragmatic General Multicast (PGM)可靠多播的能力之一。

最近在lwn.net上有一篇关于它的文章:

0MQ:一种新的消息传递方法

于 2010-03-17T22:50:53.933 回答
2

根据您的目标平台......

你可以看看Pragmatic General Multicast。据我了解,这是 Microsoft MSMQ 和 Tibco Rendezvous 使用的,可以通过 Winsock 访问(请参阅:http: //msdn.microsoft.com/en-us/library/ms740125 (VS.85).aspx )。

于 2010-03-16T11:46:38.163 回答
1

多播和 TCP 是互斥的。

通过 UDP 实现可靠的交付是疯狂的。自 1980 年代以来没有人这样做,而且就性能和 BW 开销而言,不可能像任何廉价的 TCP 堆栈一样好。更正:有时它是手动完成的,但仅限于特殊运输,例如极长或极窄的管道。

N^2 个连接不是很傻。与 1Hz keepalives 的连接不会花费太多。费用是流量。这是您的设计需要关注的内容。

于 2010-03-16T09:20:32.510 回答
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

于 2010-03-16T13:40:10.923 回答
0

当然还有一种更有效的方法——您继续使用 UDB,并自己重新实现可靠发送。不过,这不是微不足道的。但至少你只需要在发送站点上保存一次发送的数据包。

于 2010-03-16T09:11:39.280 回答
0

只是一个想法,但是您的工作是否需要使用网络协议来完成。您还可以考虑使用基于发布-订阅的模型的消息服务来实现这一点。

如果您确实需要网络,那么您将不得不处理大量连接,或者确保自己交付。在走这条路之前,请确保您的要求。

于 2010-03-16T16:09:06.980 回答