什么是可靠组播的最有效协议?

15
当发送方需要在以太网上向少量接收者(例如不到十个)可靠地组播(每秒传输几兆字节)大量数据时,最高效的协议是什么? 在“可靠”指的是,如果一个数据包丢失了,该协议会确保重发它,以便任何接收者都没有数据丢失。术语“高效”很难定义,但假设我们想要在两端使用适度的CPU使用率的情况下最大化吞吐量并最小化网络带宽。这仍然不是一个明确的定义,但这是我能想出的最好的定义。流式或消息式协议均可接受。
我希望能得到实际案例,并且我将欣然接受主观答案,即您喜欢的组播协议,如果您可以解释其优缺点。

多少个接收器?如果你有少于十个的接收器,那么可以考虑一些点对点通信。 - mcoolive
7个回答

22

真实世界的示例:TIBCO Rendezvous。

TIBCO Rendezvous使用多播发送带有序列号的数据。如果客户端检测到丢失的序列号,它会在多播组上发送消息“嘿,我错过了数据包12345”。服务器会重新多播该数据。服务器有一个可配置的缓冲区以防止客户端请求它时出现问题。

问题:

假设有一个单独的客户端,它会丢失一半的数据包,并且有100个正常的客户端。该客户端为每隔一个数据包发送一个重传请求。服务器开始导致健康客户端之一的负载足够大,以至于它开始丢弃数据包并请求重传。这造成的额外负载导致另一个健康客户端开始请求重传。如此循环下去,导致拥塞崩溃。

Tibco提供了一种解决方法,即切断发送过多重传请求的订阅者。这使得单个订阅者更难引起拥塞崩溃。

减少拥塞崩溃的另一个解决方法是限制服务器愿意重传的数据量。

Tibco还应在客户端和服务器中提供启发式方法,以确定重传请求和重传本身是多播还是单播。他们没有这样做。(对于服务器,如果只有一个客户端在某个时间窗口内请求,则可以将重传请求单播;对于客户端,如果服务器已经在重传的数据包中告诉您 - 只有您一个人请求重传,请在未来进行单播)

从根本上说,您必须在保证客户端接收数据的强度和拥塞崩溃风险之间做出决策。您必须猜测数据包丢失的位置以及重传最有效的方式是单播还是多播。如果服务器理解数据并且可以决定是否发送重传数据(因为有更新的数据可发送,使得重传变得无关紧要),那么您的情况要比Tibco RV等框架好得多。

有时理解数据会导致错误的假设。例如,市场数据 - 起初可能认为不重新传输报价是可以接受的,但后来发现订阅者正在保留报价历史记录,而不仅仅是跟踪当前报价。也许您可能根据订阅者的不同要求有所不同,一些客户将更喜欢单播 TCP 而不是多播。

在某些时候,您需要在服务器端进行任意决策,以确定在重传或缓慢客户端情况下需要缓存多少数据。


非常清晰简洁的解释。据我所知,Tibco使用PGM协议,并且从OpenPGM网站上可以明确得知它提供可靠的多播功能。然而,我不确定它是否也能保证低延迟。是否可能实现实时可靠的多播?如果PGM无法实现,是否有其他可用的技术?非常感谢。 - chepukha
是的,Tibco提供低延迟。一个典型的用例是在同一房间(相同的局域网)的许多屏幕上广播金融价值。由于组播风暴的风险(如上所述),我们喜欢将网络分割成隔离的组播区域。它不是一个年轻的产品,现在有其他解决方案。 - mcoolive

5

继TIBCO之后,PGM协议是一种可靠的开放标准组播协议,具有许多优化功能,可在网络元素加速的情况下高效地工作在非常大的规模上。PGM由TIBCO和CISCO开发,并且是TIBCO Rendezvous下面的一个可选协议,其默认协议为TRDP,两者设计非常相似。

您可以计算PGM的理论效率,如此处所列。

http://code.google.com/p/openpgm/wiki/PgmPerformance

不幸的是,现实世界中的网络设备、网卡和一般计算机架构的性能远低于理论最大值。



1
我可以建议UFTP。它使用基于NAK的机制来确定重新传输哪些数据包,并具有使用TFMCC进行拥塞控制或固定传输速率的选项。
每个文件都会分多个阶段发送,第一阶段传输整个文件,而后续阶段仅发送需要重新传输的数据包。每个客户端会跟踪其接收到和未接收到的数据包。在特定检查点(以及阶段结束时),如果接收方自上次检查点起未接收到任何数据包,则会发送一个列出未接收到数据包的NAK。这样做的好处是低丢包率的接收器将比高丢包率的接收器更快完成。UFTP还可以配置为删除百分比超过某个阈值的NAK接收器。
通过仅限制对已经出现丢失的接收器的NAK,可以减少拥塞崩溃的风险,即发送方被接收器反馈压倒。
披露:UFTP的作者。

它能在IPoIB上运行吗?我经常收到NAK,所以服务器永远不会停止重发数据包。我在客户端看到了文件,但是一旦我停止服务器,文件就被删除了! - Vahid Noormofidi
@Vahid 我从未使用过IPoIB,所以我不能确定,但我想它应该像任何IP链接一样工作。 - dbush

1

比特流!

不开玩笑。你可能想要了解一下

UDP对于多播很有用,但它不能提供你所寻找的保证 - BitTorrent将要求你从原始源传输超过一个完整副本,但它仍然相当高效并提供有用的保证,特别是考虑到每个“块”数据传递时所做的校验和有多少。


谢谢,我从未考虑过BitTorrent。虽然它不适合我的应用程序,但这是一个有趣的想法。 - JayMcClellan
BitTorrent在网络协议和协议设计方面提出了许多有趣的想法。 - user109878
2
他特别要求在子网上分发数据的协议要高效。虽然BitTorrent适用于与多个对等方共享大文件,但在局域网设置中并不高效。 - liwp
对不起,请问你有更好的替代方案吗? - clee

0

这是一个开放性的研究问题;虽然有商业解决方案可用,但价格昂贵。祝好运。


0

如果你真的想要可靠地同时向多个客户端传输数据,我认为你应该考虑一下流控制传输协议作为UDP / 多播的替代方案。


Alan:你确认使用这个协议可以同时从一个端点向多个客户端传输相同的信息吗?我目前正在研究将其用于调度金融市场数据的可能性。 - Guillaume Paris
SCTP和单播一般来说,对于OP所尝试的任务并不高效:将“每秒传输几兆字节”到多个接收器,并“最大化吞吐量和最小化网络带宽”。带宽消耗随接收器数量呈线性增长,使用12个接收器时,1GbE链路将在10MB/s处饱和。使用可靠的组播,例如PGM,在理想情况下(无数据包丢失),带宽完全独立于接收器数量,即当进行10MB/s时,1GbE链路将少于10%的饱和。 - Evgeniy Berezovsky
此外,相对于TCP,SCTP在多个客户端方面是否更好? TCP已经在硬件上进行了大量优化,例如网卡。这通常意味着大大降低了CPU消耗(OP也感兴趣的内容),例如Rx Coalescing、Checksum offload等等。因此,一般来说,任何新手都很难超越它。话虽如此,我希望SCTP及其概念,特别是在IP上的高效复用,能够得到应有的采用。 - Evgeniy Berezovsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接