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
my 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
を実行することで実行できる短いテストケースです。 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));
}
}
この問題を解決するために、2つのシステム間に仮想ネットワークを作成しました。 224.0.0.0/4ルートが必要かどうかの答えは、アプリケーションとネットワーク構成によって異なります。
これらの回答は、ブラインド送信者である私のアプリケーションに有効です。トラフィックの受信には関心がないため、マルチキャストグループには参加しません。送信先のグループに参加している他のシステムにのみ送信します。したがって、特定のマルチキャストグループに参加するための要件を評価しませんでした。
シナリオは次のとおりです。
アプリケーションは、送信する前にソケットを特定のインターフェースに設定します(たとえば、Javaの setNetworkInterface メソッドを使用)。これには、224.0.0.0/4ネットワークのルーティングテーブルカバレッジは必要ありません。マルチキャストパケットは、バインドされたインターフェイスで送信されます。
アプリケーションは送信前にソケットを特定のインターフェースに設定せず、デフォルトルートが存在します。マルチキャストパケットは、デフォルトルートで指定されたインターフェイスで送信されます。
アプリケーションは送信前にソケットを特定のインターフェイスに設定せず、デフォルトルートは存在しませんが、ルーティングテーブルにはマルチキャストグループアドレスのカバレッジがあります。マルチキャストパケットは、マルチキャストグループアドレスをカバーするルートで指定されたインターフェイスで送信されます。
アプリケーションは送信前にソケットを特定のインターフェイスに設定せず、マルチキャストグループアドレスをカバーするルートが存在しません。アプリケーションは「ホストへのルートがありません」で失敗します。
ボーナスシナリオ:アプリケーションはソケットを特定のインターフェイスに設定せず、1つのインターフェイスのデフォルトルートと別のインターフェースが存在し、後者はマルチキャストグループアドレスをカバーします。マルチキャストパケットは後者のインターフェースで送信されます。
答えは、アプリケーションが送信するインターフェイスを選択しない場合、マルチキャストルートが実際に必要であるということのようです。また、後から見ると意味のあるデフォルトルートも優先します。ルートのインターフェース部分のみが使用されているように見えます。
通常、マルチキャストルートを設定する必要はありません。必要ありません。
netstat -gn
公演?結合は、デフォルトで最小番号のインターフェースeth0から出て行く必要があります。
私がメモした手順を参照してください: マルチキャストはRHEL 5.5で動作していないようです
ホストにマルチホームのルートを追加する必要があるだけです。
見る:
http://sourceforge.net/apps/trac/ganglia/wiki/Ganglia%203.1.x%20Installation%20and%20Configuration
それ以外の場合は、デフォルトのルートが正しいことを行います。