我是否应该在 RHEL/CentOS 上为盲发件人创建多播路由?

我是否应该在 RHEL/CentOS 上为盲发件人创建多播路由?

CentOS 5 系统似乎没有预装多播流量路由。看起来要做的是使用默认路由(如果已配置)。换句话说,路由表如下:

# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
10.42.128.0     0.0.0.0         255.255.255.0   U         0 0          0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth0
0.0.0.0         10.42.128.1     0.0.0.0         UG        0 0          0 eth0

将与我的基于 Java 的多播客户端应用程序(或下面的测试用例)一起工作,该应用程序希望能够发送到站点本地多播地址。

此设置有效。如果我没有默认路由,例如

Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
10.42.128.0     0.0.0.0         255.255.255.0   U         0 0          0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth0

我的 Java 应用程序在尝试发送时会失败。我可以通过添加多播路由来纠正此问题:

# route add -net 224.0.0.0/4 via eth0

并永久执行上述操作:

# echo 224.0.0.0/4 via eth0 >>/etc/sysconfig/network-scripts/route-eth0

我是否应该创建此路由?除了默认路由消失时会停止工作之外,让默认路由处理多播流量还有什么坏处吗?


这是一个简短的测试用例,可以通过执行来运行javac Sender.java; java Sender。它向站点本地地址 239.192.0.1 发送一个 0 字节的 UDP 数据包。如果我没有设置默认路由,它将失败,并显示

Exception in thread "main" java.io.IOException: Network is unreachable
        at java.net.PlainDatagramSocketImpl.send(Native Method)
        at java.net.DatagramSocket.send(DatagramSocket.java:629)
        at Sender.main(MulticastSender.java:7)

但是,如果存在默认路由(或者我上面提到的多播路由),它将成功将数据包发送到 239.192.0.1。

发送者.java

import java.net.*;

class Sender {
    public static void main(String[] args) throws Throwable {
        MulticastSocket socket = new MulticastSocket();
        InetAddress groupAddress = InetAddress.getByName("239.192.0.1");
        socket.send(new DatagramPacket(new byte[0], 0, groupAddress, 9999));
    }
}

答案1

为了弄清这个问题,我在两个系统之间创建了一个虚拟网络。是否需要 224.0.0.0/4 路由取决于应用程序和网络配置。

这些答案对我的应用程序有效,它是一个盲目发送者。它不加入任何多播组,因为它对接收流量不感兴趣——只将其发送到加入它要发送的组的其他系统。因此,我没有评估加入任何特定多播组的要求。

具体场景如下:

  1. 应用程序在发送之前将套接字设置为特定接口(例如使用 Java 的设置网络接口方法)。这不需要任何 224.0.0.0/4 网络的路由表覆盖。多播数据包将在绑定接口上传输。

  2. 应用程序在发送前不将套接字设置为特定接口,存在默认路由。多播数据包将在默认路由指定的接口上传输。

  3. 应用程序在发送前没有将套接字设置为特定的接口,也没有默认路由,但路由表中存在多播组地址的覆盖,多播数据包将在覆盖多播组地址的路由指定的接口上传输。

  4. 应用程序在发送前未将套接字设置为特定接口,并且不存在覆盖多播组地址的路由。应用程序将失败,并显示“无主机路由”。

  5. 奖励场景:应用程序没有将套接字设置为特定接口,并且一个接口上有一个默认路由,另一个接口上的多播路由其他存在一个接口,后者覆盖组播组地址,组播数据包将在后一个接口上传输。

答案似乎是,如果应用程序没有选择要传输的接口,则确实需要多播路由。它还会抢占默认路由,事后看来这是有道理的。似乎只使用了路由的接口部分。

答案2

您只需要在主机是多宿主时添加一条路由。

看:

http://sourceforge.net/apps/trac/ganglia/wiki/Ganglia%203.1.x%20Installation%20and%20Configuration

否则,默认路由将执行正确的操作。

答案3

通常,您不希望使用多播路由。没有必要。

显示什么netstat -gn?连接应该从编号最低的接口出发eth0默认情况下。

请参阅我所记的步骤:多播似乎无法在 RHEL 5.5 上运行

相关内容