4

我有以下情况;主机 HostRec:

1) 主机的 NIC 绑定 0 已加入多播组 multicast1 和多播2 - 因为应用程序已请求此。2) 我在同一主机 HostRec 上启动了一个多播侦听应用程序,它侦听多播 3 和 UDP 端口 3 上的流量。3) 我在另一台主机 HostSend 上启动多播发送应用程序。

此时我有以下3种情况:

a) 如果 step3 的发送应用程序在多播地址 multicast3 和 udp port3 上发布,则消息被上面 step2 启动的侦听应用程序正确接收。这是预期的行为。

b) 如果多播发送应用程序在多播2 和端口3 上发布消息,则这些消息仍会被在步骤2 上启动的侦听应用程序接收。如果多播发送应用程序在多播 1 和端口 3 上发布消息,则行为相同。这种行为是错误的。

c) 如果发送应用程序(步骤 3)开始在多播地址 multicast4 和 udp 端口​​ 3 上发布(HostRec 上的 NIC bond0 没有加入该多播组),则在步骤 2 上启动的侦听应用程序没有正确接收到消息。这又是预期的行为。

您能否建议主机的多播内核配置是否有任何问题?

uname -a Linux HostRec 2.6.18-164.2.1.el5 #1 SMP Mon Sep 21 04:37:42 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux

谢谢,索马里奥

4

1 回答 1

4

这是预期的行为,尽管起初看起来确实有点奇怪。尽管您认为您正在绑定到多播组/端口,但您真正在做的是:

  1. 绑定到接口上的 UDP 端口。
  2. 将此接口订阅到给定的多播组。

这两个动作是相当独立的。第一个的结果是您的进程将接收所有的 UDP 数据包(无论是否多播)并且发往您的端口/接口。第二个的结果是确保发送到给定多播地址的数据包(由网络路由器)发送到您的接口。

大多数人不希望这样,事实上他们只想接收单个多播组的数据,不想担心网络上发生的其他事情。实现这一点的最佳方法是确保一个端口仅用于一个多播组。一种常见的做法是使用多播组的最后一个八位字节作为端口的最低有效八位字节。例如 224.0.0.22/端口 19022 和 224.0.0.150/19150。这样你就永远不会得到错误的数据(只要没有人通过 UDP 将数据单播到这些端口)。

于 2012-08-06T07:06:38.120 回答