网络设计:排除用户的一对多高带宽传输

时间:2016-02-22 17:09:40

标签: networking network-programming bandwidth broadcasting

如果StackOverflow是这个问题的错误交易所,请帮助我找到正确的。

短版

网络应用程序的最佳设计是什么,其中一个用户将恒定的高带宽数据流传输到许多其他地址?解决方案不得要求上传者为每个接收者复制数据包,最好不要传输给发送者未接受的用户。

长版

我和朋友编写了一个应用程序,可以让某人实时向他想要接收数据的一个或多个收件人传输数据。我设计了高级应用程序协议来使用UDP并对数据进行编码,这样每个数据包都可以丢失而不会损害其余数据包的使用。此解决方案需要管理每个用户的套接字并将每个数据包发送给每个用户。

这里的问题是流可以是非常高的带宽。用户可以修改他发送的数据质量的设置,并最终向每个用户发送6 Mbps。期望用户足够支付他的ISP以允许一次将这样的流上传到其他四个用户的优选最小值是不可行的。

我们需要一种方法让发送器只发送一次数据包并让每个用户收到一份副本。

我们看过多播。它可能是我们最终需要使用的东西,但我们担心任何人都可以加入任何团体。最好不允许我们不希望看到数据不被允许加入的用户。还有一个问题是,如果多个发射器碰巧使用同一组,观众可能会发现他们正在接收多个流'当他们只想要一个数据时,他们需要数据。

我的搜索揭示了IBM十多年前发布的名为Explicit Multicast(Xcast)的内容,看起来很完美,但我还没有找到任何信息来确定这项技术是否得到普遍支持。此外,我还没有看到它是否支持数据报。

有谁知道设计满足我们需求的应用程序的最佳方式?

请记住,我们没有资金支持我们的项目。解决方案需要免费。

修改

在上面的摘要中,我暗示但未能明确说明这是针对实时应用程序的。应用程序背后的激励驱动力是尽可能使客户/接收者尽可能地保持紧密联系。如果数据包丢失或来不及用于保持服务器和客户端同步,则需要忽略它们。这就是为什么我在UDP上设计应用程序协议,每个数据包中都有独立的数据。即使客户端在给定的时间步长中只收到300个数据包中的一个数据包,它也会使用它所获得的数据包。

我认为I_am_Helpful的推荐可能是朝着正确方向(或可能是目的地)迈出的一大步。我需要做一些实验来确定使用像Spread这样的系统是否有效。但是,我认为我的传输时间预算不会超过17毫秒。

如果你能想到一个能够为实时应用程序(unlike Spread, see p. 3)发送不可靠数据报给特定用户组(如Spread)的系统,请告诉我。

2 个答案:

答案 0 :(得分:0)

  

我们需要一种方法让发射机正好发送一次数据包   每个用户都收到一份副本。

在我有限的知识中,我会说Reliable Multicasting似乎是小组广播的可行选择之一。我想提一下,有一些可能的Java API' *可以帮助你实现同样的目标:

  1. JGroups Java API
  2. The Spread Toolkit - > Spread包含一个用户应用程序链接的库,一个在处理器组的每台计算机上运行的二进制守护程序,以及各种实用程序和演示程序。
  3. Appia
  4. *注意:我从未使用过这些API。

      

    最好不要让我们不想看到的用户   数据不允许加入。

    他们提供此功能,例如,Spread支持数千个具有不同成员集的群组。它还为消息提供了一系列可靠性,排序和稳定性保证。 JGroups可用于创建进程组,其成员可以相互发送消息。它还具有组创建和删除等功能(组成员可以分布在LAN或WAN上)。

      

    如果多个发射器碰巧使用,还存在问题   在同一组中,观众可能会发现他们正在接收多个   流'当他们只想要一个数据时,他们需要数据。

    如果您可以轻松地在同一网络中创建多个组(使用Spread等),那么,我相信这将不再是一个问题。您有责任将用户解密为不同的群组。

    我希望给定的信息有所帮助。祝你好运。

答案 1 :(得分:0)

通过多播,您可以实现您想要的效果:一次发送每个数据包,但身份验证似乎是您的一个问题。

一种可能的解决方案可能是simetric加密,其中相同的密钥用于加密和解密。通过TCP,您的客户端连接到服务器并获取传输的多播IP地址及其关联密钥,然后它们加入多播组并解密传输。

如果您接受更灵活的解决方案,则可以使用服务器将实时传输发送到一组分布式服务器。您的客户端通过单播连接到这些分布式服务器之一,并且在完成身份验证后,它们将包含在接收方列表中。每个分布式服务器通过UDP将每个新的传输包发送到每个注册的客户端在普通情况下,您的客户端将具有与在多播组中交付相同的体验,但服务器将花费更多带宽。一次允许多次传输,因此它可能对您有好处,并且您可以拥有更多控制权,因为客户端可以向服务器发送信号,如PAUSE等。