接收不需要的多播流量

时间:2012-07-19 12:03:02

标签: linux kernel multicast

我有以下情况;主机HostRec:

1)主机的NIC bond0已加入组播组multicast1和multicast2 - 因为应用程序已请求此操作。 2)我在同一主机HostRec上启动多播侦听应用程序,该主机侦听multicast3和UDP port3上的流量。 3)我在另一台主机HostSend上启动了一个多播发送应用程序。

此时我有以下三种情况:

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

b)如果组播发送应用程序在multicast2和port3上发布消息,则在步骤2中启动的侦听应用程序仍然会收到这些消息。如果组播发送应用程序在multicast1和port3上发布消息,则行为相同。这种行为是错误的。

c)如果发送应用程序(步骤3)开始发布多播地址multicast4和udp port3(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

谢谢, sommario

1 个答案:

答案 0 :(得分:4)

这是预期的行为,虽然起初看起来确实有些奇怪。虽然您认为绑定了多播组/端口,但您实际做的是:

  1. 绑定到接口上的UDP端口。
  2. 将此接口订阅到给定的多播组。
  3. 这两个动作非常独立。第一个结果是您的进程将接收所有UDP(多播或非多播),这些数据包是UDP并且发往您的端口/接口。第二个结果是确保发送到给定多播地址的数据包(由网络路由器)发送到您的接口。

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