fragen stichworte

Soll ich auf RHEL / CentOS eine Multicast-Route für einen blinden Sender erstellen?

Ein CentOS 5-System scheint nicht mit einer Route für Multicast-Verkehr aus der Box zu kommen. Was zu sein scheint, ist, falls konfiguriert, eine Standardroute zu verwenden. Mit anderen Worten, eine Routing-Tabelle wie folgt:

# 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

funktioniert mit meiner Java-basierten Multicast-Client-Anwendung (oder dem nachstehenden Testfall), die voraussichtlich an eine standortlokale Multicast-Adresse senden kann.

Diese Einrichtung funktioniert. Wenn ich keine Standardroute habe, z.

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

Meine Java-Anwendung schlägt fehl, wenn sie versucht, zu senden. Ich kann dies korrigieren, indem Sie die Multicast-Route hinzufügen:

# route add -net 224.0.0.0/4 via eth0

Und das dauerhaft tun:

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

Soll ich diese Route trotzdem erstellen? Ist es schädlich, wenn die Standardroute Multicastverkehr verarbeitet, abgesehen davon, dass sie nicht mehr funktionieren würde, wenn die Standardroute wegfällt?


Hier ist ein kurzer Testfall, der durch Ausführen von javac Sender.java; java Sender ausgeführt werden kann. Es sendet ein 0-Byte-UDP-Paket an die standortlokale Adresse 239.192.0.1. Wenn ich keine Standardroute habe, schlägt die

fehl
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)

Wenn jedoch eine Standardroute (oder die oben erwähnte Multicastroute) vorhanden ist, wird das Paket erfolgreich an 239.192.0.1 gesendet.

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

antworten

Normalerweise möchten Sie keine Multicast-Route. Nicht benötigt.

Was zeigt netstat -gn an? Joins sollten standardmäßig die Schnittstelle mit der niedrigsten Nummer eth0 verlassen.

Siehe die folgenden Schritte: Multicast scheint an RHEL 5.5

nicht zu funktionieren

Sie sollten nur eine Route in Ihrem Host hinzufügen muss multi-homed.

Siehe:

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

Andernfalls wird die Standardroute das Richtige tun.

Um dem auf den Grund zu gehen, habe ich ein virtuelles Netzwerk zwischen zwei Systemen erstellt. Die Antwort darauf, ob die Route 224.0.0.0/4 benötigt wird, hängt von der Anwendung und der Netzwerkkonfiguration ab.

Diese Antworten gelten für meine Anwendung, die ein blinder Absender ist. Es tritt keiner Multicast-Gruppe bei, da es nicht daran interessiert ist, Datenverkehr zu empfangen - es wird nur an andere Systeme gesendet, die mit der Gruppe verbunden sind, an die es sendet. Daher habe ich die Anforderungen für den Beitritt zu einer bestimmten Multicast-Gruppe nicht bewertet.

Die Szenarien sind wie folgt:

  1. Die Anwendung setzt den Socket vor dem Senden auf eine bestimmte Schnittstelle (z. B. mit Javas Methode setNetworkInterface). Dies erfordert keine Abdeckung der Routing-Tabelle des Netzwerks 224.0.0.0/4. Multicast-Pakete werden auf der gebundenen Schnittstelle übertragen.

  2. Die Anwendung setzt den Socket vor dem Senden nicht auf eine bestimmte Schnittstelle, und es existiert eine Standardroute. Multicast-Pakete werden auf der von der Standardroute angegebenen Schnittstelle übertragen.

  3. Die Anwendung setzt den Socket vor dem Senden nicht auf eine bestimmte Schnittstelle, und es ist keine Standardroute vorhanden. Es gibt jedoch eine Abdeckung der Multicastgruppenadresse in der Routingtabelle. Multicast-Pakete werden auf der Schnittstelle gesendet, die von der Route angegeben wird, die die Multicast-Gruppenadresse abdeckt.

  4. Die Anwendung setzt den Socket vor dem Senden nicht auf eine bestimmte Schnittstelle, und es existiert keine Route, die die Multicast-Gruppenadresse abdeckt. Die Anwendung wird mit "keine Route zum Host" fehlschlagen.

  5. Bonus-Szenario: Die Anwendung setzt den Socket nicht auf eine bestimmte Schnittstelle und sowohl eine Standardroute auf einer Schnittstelle als auch eine Multicast-Route auf der anderen -Schnittstelle existieren, wobei letzterer die Multicast-Gruppenadresse abdeckt. Multicast-Pakete werden auf der letzteren Schnittstelle übertragen.

Die Antwort scheint zu sein, dass eine Multicast-Route in der Tat erforderlich ist, wenn die Anwendung keine Schnittstelle zum Übertragen auswählt. Es hat auch Vorrang vor der Standardroute, was im Nachhinein Sinn macht. Nur der Schnittstellenabschnitt der Routen scheint verwendet zu werden.