0

我正在编写一个在的Redhat Enterprise Linux 6 服务器上接收多播数据的应用程序。支持团队给了我一个应用程序,用于测试服务器是否可以获取多播数据流。

一旦我启动测试应用程序,并且 tcpdump 也在运行,我可以看到多播数据进入,例如,

12:58:21.645968 IP 10.26.12.22.50002 > 238.6.6.36.50002: UDP, length 729
12:58:21.648369 IP 10.26.12.22.50002 > 238.6.6.36.50002: UDP, length 969
12:58:21.649406 IP 10.26.12.22.50002 > 238.6.6.36.50002: UDP, length 893
12:58:21.651823 IP 10.26.12.22.50002 > 238.6.6.36.50002: UDP, length 604
12:58:21.654079 IP 10.26.12.22.50002 > 238.6.6.36.50002: UDP, length 913
12:58:21.656724 IP 10.26.12.22.50002 > 238.6.6.36.50002: UDP, length 1320
12:58:21.658194 IP 10.26.12.22.50002 > 238.6.6.36.50002: UDP, length 124
12:58:21.658226 IP 10.26.12.22.50002 > 238.6.6.36.50002: UDP, length 217
12:58:21.658348 IP 10.26.12.22.50002 > 238.6.6.36.50002: UDP, length 182
12:58:21.658625 IP 10.26.12.22.50002 > 238.6.6.36.50002: UDP, length 1014
12:58:21.659592 IP 10.26.12.22.50002 > 238.6.6.36.50002: UDP, length 135
12:58:21.659842 IP 10.26.12.22.50002 > 238.6.6.36.50002: UDP, length 242
12:58:21.660674 IP 10.26.12.22.50002 > 238.6.6.36.50002: UDP, length 242
12:58:21.660743 IP 10.26.12.22.50002 > 238.6.6.36.50002: UDP, length 84
12:58:21.662327 IP 10.26.12.22.50002 > 238.6.6.36.50002: UDP, length 84
12:58:21.669154 IP 10.26.12.22.50002 > 238.6.6.36.50002: UDP, length 161
12:58:21.669365 IP 10.26.12.22.50002 > 238.6.6.36.50002: UDP, length 166
12:58:21.670792 IP 10.26.12.22.60002 > 238.230.230.100.60002: UDP, length 49
12:58:21.670796 IP 10.26.12.22.60002 > 238.230.230.100.60002: UDP, length 49
12:58:21.670798 IP 10.26.12.22.60002 > 238.230.230.100.60002: UDP, length 49
12:58:21.670799 IP 10.26.12.22.60002 > 238.230.230.100.60002: UDP, length 49

但是应用程序无法拾取任何数据流,即应用程序运行时就好像多播数据订阅不成功一样。

支持团队向我保证测试应用程序没有问题,因为它在其他服务器上运行良好。由于我有一个服务器,因此服务器上的某些设置可能不正确。

我想知道我应该寻找哪些 Linux 设置可能会阻止应用程序接收多播数据,即使认为 tcpdump 可以看到数据。缺少库或包?

谢谢。

4

3 回答 3

3

首先,值得检查的是 RHEL 6 在内核级别启用了多播支持。(它可能会,但我没有可用的 RHEL 6 来检查)确保 /proc/net/igmp 文件存在。

还要检查多播地址范围是否路由到您期望的接口。如果这是不正确的,您可能会遇到一些有趣的症状,即仅在 tcpdump (混杂地)嗅探数据包时接收多播。如果您的 NIC 不能正确支持多播,也可能出现这种情况。一些较旧的 NIC 可能还需要设置为混杂模式才能接收任何多播,无论 ifconfig 中显示的多播设置如何。

另一件事是在测试应用程序运行时检查 /proc/net/igmp 文件的内容。/proc/net/igmp 文件将包含服务器正在接收的所有多播组地址的列表。如果“组”列中有一个条目对应于测试应用程序要接收的多播组地址(在您的情况下为 238.6.6.36 和 238.230.230.100),则 IP_ADD_MEMBERSHIP(或 IP_ADD_SOURCE_MEMBERSHIP)套接字选项可能具有被正确调用,并且在正确的 NIC 上。请注意,组列以十六进制和倒数列出多播组地址 - 因此 238.6.6.36 将被列为 240606EE。

如果您在运行测试应用程序的同一台机器上运行多播路由器(例如 Xorp、igmpproxy),您的情况可能会更复杂。如果是这种情况,您还应该调查 /proc/net/ip_mr_vif 和 /proc/net/ip_mr_cache 文件以确保有适当的条目。

于 2012-03-29T00:00:25.027 回答
2

请检查开关级别。在我的情况下,我被集群卡住了。我的集群仅适用于多播。但是我在多播中面临一些丢包。这对我来说太奇怪了。但最终我从我最好的朋友之一(谷歌)那里得到了解决方案。我刚刚在我的交换机级别禁用了IGMP,它工作正常..

于 2012-12-11T12:49:37.350 回答
1

我在 RHEL 6 机器上遇到了类似的问题。我通过防火墙将所需的 UDP 端口添加到允许的端口来解决它。尝试添加 udp 端口​​ 50002。

于 2012-03-28T21:59:20.180 回答