我应该在RHEL / CentOS上为一个盲发者创build一个组播路由吗?

一个CentOS 5系统似乎没有出现多播stream量的路由。 它似乎做的是使用默认路由,如果configuration。 换句话说,像这样的路由表:

# 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的多播客户端应用程序(或下面的testing用例)一起工作,该应用程序希望能够发送到站点本地多播地址。

这个设置工作。 如果我没有默认路由,例如

 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 

我应该创build这条路吗? 让默认路由处理组播stream量是否有害,除了默认路由消失会停止工作?


这是一个简短的testing用例,可以通过执行javac Sender.java; java Sender来运行javac Sender.java; java Sender javac Sender.java; java Sender 。 它发送一个0字节的UDP数据包到站点本地地址239.192.0.1。 如果我没有默认路由,则会失败

 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。

Sender.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)); } } 

您只需要在您的主机中添加一个路由是多宿主的。

看到:

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

否则,默认path将做正确的事情。

您通常不需要多播路由。 不需要。

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

请参阅我注意到的步骤: 多播在RHEL 5.5中似乎不起作用

为了解决这个问题,我在两个系统之间创build了一个虚拟networking。 是否需要224.0.0.0/4路由的答案取决于应用程序和networkingconfiguration。

这些答案对我的申请是有效的,这是一个盲人发件人。 它不join任何组播组,因为它不感兴趣的接收stream量 – 只发送到其他系统join到它发送到的组。 因此,我没有评估join任何特定组播组的要求。

情景如下:

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

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

  3. 应用程序在发送之前不会将套接字设置为特定的接口,并且不存在默认路由,但路由表中存在组播地址的覆盖范围。 多播包将在覆盖多播组地址的路由指定的接口上传输。

  4. 应用程序在发送之前不会将套接字设置为特定的接口,也不存在覆盖多播组地址的路由。 该应用程序将失败,“没有路由到主机”。

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

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