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 路由取决于应用程序和网络配置。
这些答案对我的应用程序有效,它是一个盲目发送者。它不加入任何多播组,因为它对接收流量不感兴趣——只将其发送到加入它要发送的组的其他系统。因此,我没有评估加入任何特定多播组的要求。
具体场景如下:
应用程序在发送之前将套接字设置为特定接口(例如使用 Java 的设置网络接口方法)。这不需要任何 224.0.0.0/4 网络的路由表覆盖。多播数据包将在绑定接口上传输。
应用程序在发送前不将套接字设置为特定接口,存在默认路由。多播数据包将在默认路由指定的接口上传输。
应用程序在发送前没有将套接字设置为特定的接口,也没有默认路由,但路由表中存在多播组地址的覆盖,多播数据包将在覆盖多播组地址的路由指定的接口上传输。
应用程序在发送前未将套接字设置为特定接口,并且不存在覆盖多播组地址的路由。应用程序将失败,并显示“无主机路由”。
奖励场景:应用程序没有将套接字设置为特定接口,并且一个接口上有一个默认路由,另一个接口上的多播路由其他存在一个接口,后者覆盖组播组地址,组播数据包将在后一个接口上传输。
答案似乎是,如果应用程序没有选择要传输的接口,则确实需要多播路由。它还会抢占默认路由,事后看来这是有道理的。似乎只使用了路由的接口部分。
答案2
您只需要在主机是多宿主时添加一条路由。
看:
http://sourceforge.net/apps/trac/ganglia/wiki/Ganglia%203.1.x%20Installation%20and%20Configuration
否则,默认路由将执行正确的操作。