在相同的多播地址上加入源特定的多播

时间:2015-02-27 03:35:16

标签: c linux sockets networking multicast

我正在尝试使用源特定多播(SSM)为Linux上的应用程序设置组播源,并且代码正常(使用C接口)但我想验证系统将按照我的预期运行到。

设定:
组播地址 - 233.X.X.X:9876
Source1 - 192.X.X.1
Source2 - 192.X.X.2
Interface1 - 192.X.X.100
Interface1 - 192.X.X.101

步骤

  1. 配置以便只有Source1发送到多播地址
  2. 启动一个绑定到多播地址的读取器(reader1),并将多播与ssm src一起作为Source1加入,接口作为Interface1加入
  3. 观察读者1上的数据
  4. 执行相同(reader2)但使用Source2和Interface2
  5. 期望结果:
    Reader1可以看到来自多播的数据 Reader2无法查看来自多播的数据。

    我担心以上情况并非如此,因为在我使用非源特定组播的测试中,IP_ADD_MEMBERSHIP具有全局效果。因此,reader2的套接字看到数据,因为它绑定到已连接到查看数据的接口的唯一多播地址。 this link under "Joining a Multicast"的信息与我的观察结果相符。

    IP_ADD_SOURCE_MEMBERSHIP可能与IP_ADD_MEMBERSHIP的行为不同,但文档很少,在这方面并不具体。

    具体问题:

    1. 是使用IP_ADD_SOURCE_MEMBERSHIP全局的多播连接,即会导致任何套接字绑定()到多播地址以接收来自该源的数据包。
    2. SSM应该如何使用?有一个N个源的多播地址是否有意义?
    3. 我对网络编程缺乏经验,所以请原谅我理解中的任何缺点。

      感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

我已经解决了这个问题,在获得Unix Network Programming的副本后,这种行为至少看起来很清楚,也是可以理解的。

  1. 答案是肯定的,无论是SSM还是其他方式,所有多播连接都是全局的。这样做的原因是连接实际上从发出连接请求的进程中生成了几层。基本上,它告诉IP层接受来自指定源的多播数据包,并将它们提供给使用多播地址绑定到套接字的任何进程。

  2. 由于IPv4的地址空间有限,实际上引入了SSM。当在因特网上使用多播时,没有足够的唯一多播地址,使得每个想要使用一个的人可以具有唯一的地址。 SSM将源地址与多播地址配对,该多播地址作为一对形成全局唯一标识符,即共享多播地址,例如, 239.10.5.1和源192.168.1.5。因此SSM存在的原因纯粹是为了在有限的地址空间中促进多播。在我们的软件工作的环境中(思科)SSM用于冗余和传输的便利性,在同一IP:端口组合上堆叠多个数据流,并让下游客户端选择他们想要的流。这一切都很好,直到给定的主机想要访问多播中的多个流,因为它们都在相同的多播地址上,所有订阅的进程都获取所有数据,这是不可避免的,因为网络堆栈的工作方式。

  3. 最终解决方案
    既然已经理解了行为,那么解决方案很简单,但在每个运行过程中都需要额外的代码。每个进程必须从多播地址中过滤传入的数据,并且只从他们感兴趣的源中读取数据。我曾希望SSM内置一些“魔法”来自动执行此操作,但是没有。 recvfrom()已经提供了发件人地址,因此这样做成本相对较低。