Uitzenden en multicasting in Java

1. Inleiding

In dit artikel beschrijven we hoe één-op-alles (Broadcast) en één-op-veel (Multicast) communicatie kan worden afgehandeld in Java. De uitzend- en multicast-concepten die in dit artikel worden beschreven, zijn gebaseerd op het UDP-protocol.

We beginnen met een korte samenvatting van datagrammen en uitzendingen en hoe deze in Java worden geïmplementeerd. We kijken ook naar de nadelen van omroep en stellen multicasting voor als alternatief voor omroep.

Ten slotte sluiten we af met de ondersteuning van deze twee adresseringsmethoden in zowel IPv4 als IPv6.

2. Datagram samenvatting

Volgens de officiële definitie van een datagram: "Een datagram is een onafhankelijk, op zichzelf staand bericht dat over het netwerk wordt verzonden waarvan de aankomst, aankomsttijd en inhoud niet gegarandeerd zijn".

In Java is het java.net pakket toont het DatagramPacket en DatagramSocket klassen die kunnen worden gebruikt voor communicatie via het UDP-protocol. UDP wordt doorgaans gebruikt in scenario's waarin een lagere latentie belangrijker is dan gegarandeerde levering, zoals audio- / videostreaming, netwerkdetectie, enz.

Raadpleeg A Guide to UDP in Java voor meer informatie over UDP en datagrammen in Java.

3. Uitzenden

Broadcasting is een één-op-alle-vorm van communicatie, d.w.z. het is de bedoeling om het datagram naar alle knooppunten in het netwerk te sturen. Anders dan bij point-to-point communicatie,we hoeven het IP-adres van de doelhost niet te weten. In plaats daarvan wordt een uitzendadres gebruikt.

Volgens het IPv4-protocol is een uitzendadres een logisch adres waarop apparaten die op het netwerk zijn aangesloten, pakketten kunnen ontvangen. In ons voorbeeld gebruiken we een bepaald IP-adres, 255.255.255.255, dat is het uitzendadres van het lokale netwerk.

Routers die een lokaal netwerk met andere netwerken verbinden, sturen per definitie geen pakketten door die naar dit standaard uitzendadres worden verzonden. Later laten we ook zien hoe we alles kunnen doorlopen Netwerk interfaces, en verzend pakketten naar hun respectievelijke uitzendadressen.

Eerst laten we zien hoe u een bericht kunt uitzenden. In zoverre moeten we de setBroadcast () methode op de socket om het te laten weten dat het pakket moet worden uitgezonden:

openbare klasse BroadcastingClient {privé statische DatagramSocket socket = null; public static void main ((String [] args)) gooit IOException {broadcast ("Hallo", InetAddress.getByName ("255.255.255.255")); } openbare statische ongeldige uitzending (String broadcastMessage, InetAddress-adres) gooit IOException {socket = nieuwe DatagramSocket (); socket.setBroadcast (true); byte [] buffer = broadcastMessage.getBytes (); DatagramPacket-pakket = nieuw DatagramPacket (buffer, buffer.length, adres, 4445); socket.send (pakket); socket.close (); }}

Het volgende fragment laat zien hoe u alles kunt doorlopen Netwerk interfaces om hun uitzendadres te vinden:

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

Zodra we de lijst met uitzendadressen hebben, kunnen we de code in het uitzending() methode hierboven weergegeven voor elk van deze adressen.

Er is geen speciale code vereist aan de ontvangende kant om een ​​uitgezonden bericht te ontvangen. We kunnen dezelfde code hergebruiken die een normaal UDP-datagram ontvangt. Een gids voor UDP in Java bevat meer details over dit onderwerp.

4. Multicasting

Uitzenden is inefficiënt omdat pakketten naar alle knooppunten in het netwerk worden verzonden, ongeacht of ze geïnteresseerd zijn in het ontvangen van de communicatie of niet. Dit kan een verspilling van middelen zijn.

Multicasting lost dit probleem op en verzendt alleen pakketten naar die consumenten die geïnteresseerd zijn. Multicasting is gebaseerd op het concept van groepslidmaatschap, waarbij een multicast-adres elke groep vertegenwoordigt.

In IPv4 kan elk adres tussen 224.0.0.0 en 239.255.255.255 als multicast-adres worden gebruikt. Alleen die knooppunten die zich abonneren op een groep, ontvangen pakketten die naar de groep worden gecommuniceerd.

In Java, MulticastSocket wordt gebruikt om pakketten te ontvangen die naar een multicast IP worden gestuurd. Het volgende voorbeeld toont het gebruik van MulticastSocket:

openbare klasse MulticastReceiver breidt Thread {beschermde MulticastSocket socket = null; beschermde byte [] buf = nieuwe byte [256]; public void run () {socket = nieuwe MulticastSocket (4446); InetAddress group = InetAddress.getByName ("230.0.0.0"); socket.joinGroup (groep); while (true) {DatagramPacket packet = new DatagramPacket (buf, buf.length); socket.receive (pakket); String ontvangen = nieuwe String (packet.getData (), 0, packet.getLength ()); if ("end" .equals (ontvangen)) {break; }} socket.leaveGroup (groep); socket.close (); }}

Na het binden van het MulticastSocket naar een haven noemen we de deelnemen aan groep() methode, met de multicast IP als argument. Dit is nodig om de pakketten die naar deze groep zijn gepubliceerd te kunnen ontvangen. De verlaat groep() methode kan worden gebruikt om de groep te verlaten.

Het volgende voorbeeld laat zien hoe u naar een multicast-IP publiceert:

openbare klasse MulticastPublisher {privé DatagramSocket-socket; privé InetAddress-groep; privé-byte [] buf; public void multicast (String multicastMessage) gooit IOException {socket = new DatagramSocket (); group = InetAddress.getByName ("230.0.0.0"); buf = multicastMessage.getBytes (); DatagramPacket-pakket = nieuw DatagramPacket (buf, buf.length, group, 4446); socket.send (pakket); socket.close (); }}

5. Broadcast en IPv6

IPv4 ondersteunt drie soorten adressering: unicast, broadcast en multicast. Broadcast is in theorie een één-op-alles-communicatie, d.w.z. een pakket dat vanaf een apparaat wordt verzonden, kan het hele internet bereiken.

Omdat dit om voor de hand liggende redenen ongewenst is, werd de reikwijdte van de IPv4-uitzending aanzienlijk verkleind. Multicast, dat ook als een beter alternatief voor uitzending dient, kwam veel later binnen en bleef daardoor achter bij de acceptatie.

In IPv6 is multicast-ondersteuning verplicht gemaakt en er is geen expliciet concept van uitzending. Multicast is uitgebreid en verbeterd, zodat alle uitzendfuncties nu kunnen worden geïmplementeerd met een vorm van multicasting.

In IPv6 worden de meest linkse bits van een adres gebruikt om het type te bepalen. Voor een multicast-adres zijn de eerste 8 bits allemaal enen, d.w.z. FF00 :: / 8. Verder vertegenwoordigen bit 113-116 de reikwijdte van het adres, dat een van de volgende 4 kan zijn: Globaal, Site-lokaal, Link-lokaal, Node-lokaal.

Naast unicast en multicast ondersteunt IPv6 ook anycast, waarbij een pakket naar elk lid van de groep kan worden verzonden, maar niet naar alle leden hoeft te worden verzonden.

6. Samenvatting

In dit artikel hebben we de concepten van één-op-alles en één-op-veel type communicatie onderzocht met behulp van het UDP-protocol. We hebben voorbeelden gezien van hoe deze concepten in Java kunnen worden geïmplementeerd.

Ten slotte hebben we ook IPv4- en IPv6-ondersteuning onderzocht.

Volledige voorbeeldcode is beschikbaar op Github.