我正在尝试使用源特定多播(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
步骤
期望结果:
Reader1可以看到来自多播的数据
Reader2无法查看来自多播的数据。
我担心以上情况并非如此,因为在我使用非源特定组播的测试中,IP_ADD_MEMBERSHIP具有全局效果。因此,reader2的套接字看到数据,因为它绑定到已连接到查看数据的接口的唯一多播地址。 this link under "Joining a Multicast"的信息与我的观察结果相符。
IP_ADD_SOURCE_MEMBERSHIP可能与IP_ADD_MEMBERSHIP的行为不同,但文档很少,在这方面并不具体。
具体问题:
我对网络编程缺乏经验,所以请原谅我理解中的任何缺点。
感谢您的帮助。
答案 0 :(得分:2)
我已经解决了这个问题,在获得Unix Network Programming的副本后,这种行为至少看起来很清楚,也是可以理解的。
答案是肯定的,无论是SSM还是其他方式,所有多播连接都是全局的。这样做的原因是连接实际上从发出连接请求的进程中生成了几层。基本上,它告诉IP层接受来自指定源的多播数据包,并将它们提供给使用多播地址绑定到套接字的任何进程。
由于IPv4的地址空间有限,实际上引入了SSM。当在因特网上使用多播时,没有足够的唯一多播地址,使得每个想要使用一个的人可以具有唯一的地址。 SSM将源地址与多播地址配对,该多播地址作为一对形成全局唯一标识符,即共享多播地址,例如, 239.10.5.1和源192.168.1.5。因此SSM存在的原因纯粹是为了在有限的地址空间中促进多播。在我们的软件工作的环境中(思科)SSM用于冗余和传输的便利性,在同一IP:端口组合上堆叠多个数据流,并让下游客户端选择他们想要的流。这一切都很好,直到给定的主机想要访问多播中的多个流,因为它们都在相同的多播地址上,所有订阅的进程都获取所有数据,这是不可避免的,因为网络堆栈的工作方式。
最终解决方案
既然已经理解了行为,那么解决方案很简单,但在每个运行过程中都需要额外的代码。每个进程必须从多播地址中过滤传入的数据,并且只从他们感兴趣的源中读取数据。我曾希望SSM内置一些“魔法”来自动执行此操作,但是没有。 recvfrom()
已经提供了发件人地址,因此这样做成本相对较低。