Broadcasting und Multicasting in Java

1. Einleitung

In diesem Artikel beschreiben wir, wie One-to-All- (Broadcast) und One-to-Many- (Multicast) Kommunikation in Java gehandhabt werden kann. Die in diesem Artikel beschriebenen Broadcast- und Multicast-Konzepte basieren auf dem UDP-Protokoll.

Wir beginnen mit einer kurzen Zusammenfassung der Datagramme und des Rundfunks und der Implementierung in Java. Wir untersuchen auch die Nachteile des Rundfunks und schlagen Multicasting als Alternative zum Rundfunk vor.

Abschließend diskutieren wir die Unterstützung dieser beiden Adressierungsmethoden in IPv4 und IPv6.

2. Datagramm-Zusammenfassung

Gemäß der offiziellen Definition eines Datagramms ist „ein Datagramm eine unabhängige, in sich geschlossene Nachricht, die über das Netzwerk gesendet wird und deren Ankunft, Ankunftszeit und Inhalt nicht garantiert sind“.

In Java macht das Paket java.net die Klassen DatagramPacket und DatagramSocket verfügbar, die für die Kommunikation über das UDP-Protokoll verwendet werden können. UDP wird normalerweise in Szenarien verwendet, in denen eine geringere Latenz wichtiger ist als eine garantierte Bereitstellung, z. B. Audio- / Video-Streaming, Netzwerkerkennung usw.

Weitere Informationen zu UDP und Datagrammen in Java finden Sie in einem Handbuch zu UDP in Java.

3 . Rundfunk

Broadcasting ist eine One-to-All-Art der Kommunikation, dh das Datagramm soll an alle Knoten im Netzwerk gesendet werden. Anders als bei der Punkt-zu-Punkt-Kommunikation müssen wir die IP-Adresse des Zielhosts nicht kennen . Stattdessen wird eine Broadcast-Adresse verwendet.

Gemäß IPv4-Protokoll ist eine Broadcast-Adresse eine logische Adresse, auf der mit dem Netzwerk verbundene Geräte Pakete empfangen können. In unserem Beispiel verwenden wir eine bestimmte IP-Adresse, 255.255.255.255 , die die Broadcast-Adresse des lokalen Netzwerks ist.

Per Definition leiten Router, die ein lokales Netzwerk mit anderen Netzwerken verbinden, keine an diese Standard-Broadcast-Adresse gesendeten Pakete weiter. Später zeigen wir auch, wie wir alle NetworkInterfaces durchlaufen und Pakete an ihre jeweiligen Broadcast-Adressen senden können.

Zunächst zeigen wir, wie eine Nachricht gesendet wird. Insofern müssen wir die setBroadcast () -Methode für den Socket aufrufen , um ihn darüber zu informieren, dass das Paket gesendet werden soll:

public class BroadcastingClient { private static DatagramSocket socket = null; public static void main((String[] args)) throws IOException { broadcast("Hello", InetAddress.getByName("255.255.255.255")); } public static void broadcast( String broadcastMessage, InetAddress address) throws IOException { socket = new DatagramSocket(); socket.setBroadcast(true); byte[] buffer = broadcastMessage.getBytes(); DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, 4445); socket.send(packet); socket.close(); } }

Das nächste Snippet zeigt, wie Sie alle NetworkInterfaces durchlaufen , um ihre Broadcast-Adresse zu finden:

List listAllBroadcastAddresses() throws SocketException { List broadcastList = new ArrayList(); Enumeration interfaces = NetworkInterface.getNetworkInterfaces(); while (interfaces.hasMoreElements()) { NetworkInterface networkInterface = interfaces.nextElement(); if (networkInterface.isLoopback() || !networkInterface.isUp()) { continue; } networkInterface.getInterfaceAddresses().stream() .map(a -> a.getBroadcast()) .filter(Objects::nonNull) .forEach(broadcastList::add); } return broadcastList; }

Sobald wir die Liste der Broadcast-Adressen haben, können wir den Code in der oben gezeigten Broadcast () -Methode für jede dieser Adressen ausführen .

Auf der Empfangsseite ist kein spezieller Code erforderlich , um eine gesendete Nachricht zu empfangen. Wir können denselben Code wiederverwenden, der ein normales UDP-Datagramm empfängt. Ein Handbuch zu UDP in Java enthält weitere Details zu diesem Thema.

4. Multicasting

Broadcasting ist ineffizient, da Pakete an alle Knoten im Netzwerk gesendet werden, unabhängig davon, ob sie am Empfang der Kommunikation interessiert sind oder nicht. Dies kann eine Verschwendung von Ressourcen sein.

Multicasting löst dieses Problem und sendet Pakete nur an interessierte Verbraucher. Multicasting basiert auf einem Gruppenmitgliedschaftskonzept , bei dem eine Multicast-Adresse jede Gruppe darstellt.

In IPv4 kann jede Adresse zwischen 224.0.0.0 und 239.255.255.255 als Multicast-Adresse verwendet werden. Nur die Knoten, die eine Gruppe abonnieren, empfangen Pakete, die an die Gruppe übermittelt wurden.

In Java wird MulticastSocket zum Empfangen von Paketen verwendet, die an eine Multicast-IP gesendet werden. Das folgende Beispiel zeigt die Verwendung von MulticastSocket :

public class MulticastReceiver extends Thread { protected MulticastSocket socket = null; protected byte[] buf = new byte[256]; public void run() { socket = new MulticastSocket(4446); InetAddress group = InetAddress.getByName("230.0.0.0"); socket.joinGroup(group); while (true) { DatagramPacket packet = new DatagramPacket(buf, buf.length); socket.receive(packet); String received = new String( packet.getData(), 0, packet.getLength()); if ("end".equals(received)) { break; } } socket.leaveGroup(group); socket.close(); } }

Nachdem wir das MulticastSocket an einen Port gebunden haben , rufen wir die joinGroup () -Methode mit der Multicast-IP als Argument auf. Dies ist erforderlich, um die für diese Gruppe veröffentlichten Pakete empfangen zu können. Mit der Methode grantGroup () kann die Gruppe verlassen werden.

Das folgende Beispiel zeigt, wie auf einer Multicast-IP veröffentlicht wird:

public class MulticastPublisher { private DatagramSocket socket; private InetAddress group; private byte[] buf; public void multicast( String multicastMessage) throws IOException { socket = new DatagramSocket(); group = InetAddress.getByName("230.0.0.0"); buf = multicastMessage.getBytes(); DatagramPacket packet = new DatagramPacket(buf, buf.length, group, 4446); socket.send(packet); socket.close(); } }

5. Broadcast und IPv6

IPv4 unterstützt drei Arten der Adressierung: Unicast, Broadcast und Multicast. Broadcast ist theoretisch eine One-to-All-Kommunikation, dh ein von einem Gerät gesendetes Paket kann das gesamte Internet erreichen.

Da dies aus offensichtlichen Gründen unerwünscht ist, wurde der Umfang der IPv4-Übertragung erheblich reduziert. Multicast, das auch als bessere Alternative zum Rundfunk dient, kam viel später und blieb daher bei der Einführung zurück.

In IPv6 wurde die Multicast-Unterstützung obligatorisch gemacht, und es gibt kein explizites Konzept für die Übertragung. Multicast wurde erweitert und verbessert, sodass alle Broadcast-Funktionen jetzt mit einer Form von Multicasting implementiert werden können.

In IPv6 werden die am weitesten links stehenden Bits einer Adresse verwendet, um ihren Typ zu bestimmen. Bei einer Multicast-Adresse sind die ersten 8 Bits alle Einsen, dh FF00 :: / 8. Ferner stellen Bit 113-116 den Bereich der Adresse dar, der einer der folgenden 4 sein kann: Global, Site-lokal, Link-lokal, Knoten-lokal.

Neben Unicast und Multicast unterstützt IPv6 auch Anycast, bei dem ein Paket an jedes Mitglied der Gruppe gesendet werden kann, aber nicht an alle Mitglieder gesendet werden muss.

6. Zusammenfassung

In diesem Artikel haben wir die Konzepte der Eins-zu-Alle- und Eins-zu-Viele-Art der Kommunikation unter Verwendung des UDP-Protokolls untersucht. Wir haben Beispiele gesehen, wie diese Konzepte in Java implementiert werden können.

Schließlich haben wir auch die IPv4- und IPv6-Unterstützung untersucht.

Der vollständige Beispielcode ist auf Github verfügbar.