Broadcasting og multicasting i Java

1. Introduktion

I denne artikel beskriver vi, hvordan en-til-alle (Broadcast) og en-til-mange (Multicast) kommunikation kan håndteres i Java. De udsendelses- og multicast-koncepter, der er skitseret i denne artikel, er baseret på UDP-protokollen.

Vi starter med en hurtig oversigt over datagrammer og udsendelser, og hvordan det implementeres i Java. Vi undersøger også ulemper ved transmission og foreslår multicasting som et alternativ til transmission.

Endelig afslutter vi med at diskutere support til disse to adresseringsmetoder i både IPv4 og IPv6.

2. Datagram-resumé

I henhold til den officielle definition af et datagram, “Et datagram er en uafhængig, selvstændig besked sendt over netværket, hvis ankomst, ankomsttid og indhold ikke er garanteret”.

I Java er java.net pakke udsætter DatagramPakke og DatagramSocket klasser, der kan bruges til kommunikation via UDP-protokollen. UDP bruges typisk i scenarier, hvor lavere latenstid er vigtigere end garanteret levering, såsom lyd / video streaming, netværksopdagelse osv.

For at lære mere om UDP og datagrammer i Java henvises til En vejledning til UDP i Java.

3. Broadcasting

Broadcasting er en type kommunikation, dvs. hensigten er at sende datagrammet til alle knudepunkter i netværket. I modsætning til i tilfælde af punkt-til-punkt kommunikation,vi behøver ikke at kende målhostens IP-adresse. I stedet bruges en udsendelsesadresse.

I henhold til IPv4-protokol er en udsendelsesadresse en logisk adresse, hvorpå enheder, der er tilsluttet netværket, har mulighed for at modtage pakker. I vores eksempel bruger vi en bestemt IP-adresse, 255.255.255.255, som er udsendelsesadressen for det lokale netværk.

Per definition videresender routere, der forbinder et lokalt netværk til andre netværk, ikke pakker sendt til denne standardudsendelsesadresse. Senere viser vi også, hvordan vi kan gentage det hele Netværksinterfacesog sende pakker til deres respektive udsendelsesadresser.

Først demonstrerer vi, hvordan man sender en besked. I dette omfang er vi nødt til at kalde setBroadcast () metode på stikkontakten for at fortælle det, at pakken skal sendes:

offentlig klasse BroadcastingClient {privat statisk DatagramSocket-sokkel = null; offentlig statisk ugyldig hoved ((String [] args)) kaster IOException {udsendelse ("Hej", InetAddress.getByName ("255.255.255.255")); } offentlig statisk ugyldig udsendelse (String broadcastMessage, InetAddress-adresse) kaster IOException {socket = ny DatagramSocket (); socket.setBroadcast (sand); byte [] buffer = broadcastMessage.getBytes (); DatagramPacket-pakke = ny DatagramPacket (buffer, buffer.længde, adresse, 4445); socket.send (pakke); socket.close (); }}

Det næste uddrag viser, hvordan man gentager det hele Netværksinterfaces for at finde deres udsendelsesadresse:

List listAllBroadcastAddresses () kaster SocketException {List broadcastList = new ArrayList (); Tællingsgrænseflader = NetworkInterface.getNetworkInterfaces (); while (interfaces.hasMoreElements ()) {NetworkInterface networkInterface = interfaces.nextElement (); hvis (networkInterface.isLoopback () ||! networkInterface.isUp ()) {fortsæt; } networkInterface.getInterfaceAddresses (). stream () .map (a -> a.getBroadcast ()) .filter (Objects :: nonNull) .forEach (broadcastList :: add); } returner broadcastList; }

Når vi først har listen over udsendelsesadresser, kan vi udføre koden i udsende() metode vist ovenfor for hver af disse adresser.

Der er der kræves ingen særlig kode på den modtagende side for at modtage en udsendt besked. Vi kan genbruge den samme kode, der modtager et normalt UDP-datagram. En guide til UDP i Java indeholder flere detaljer om dette emne.

4. Multicasting

Broadcasting er ineffektivt, da pakker sendes til alle noder i netværket, uanset om de er interesserede i at modtage kommunikationen eller ej. Dette kan være spild af ressourcer.

Multicasting løser dette problem og sender kun pakker til de forbrugere, der er interesserede. Multicasting er baseret på et koncept for gruppemedlemskab, hvor en multicast-adresse repræsenterer hver gruppe.

I IPv4 kan enhver adresse mellem 224.0.0.0 og 239.255.255.255 bruges som en multicast-adresse. Kun de noder, der abonnerer på en gruppe, modtager pakker, der kommunikeres til gruppen.

I Java, MulticastSocket bruges til at modtage pakker sendt til en multicast-IP. Følgende eksempel viser brugen af MulticastSocket:

offentlig klasse MulticastReceiver udvider tråd {beskyttet MulticastSocket-sokkel = null; beskyttet byte [] buf = ny byte [256]; offentlig ugyldig kørsel () {socket = ny MulticastSocket (4446); InetAddress-gruppe = InetAddress.getByName ("230.0.0.0"); socket.joinGroup (gruppe); while (true) {DatagramPacket-pakke = ny DatagramPacket (buf, buf.length); socket.receive (pakke); Streng modtaget = ny streng (packet.getData (), 0, packet.getLength ()); if ("slut" .equals (modtaget)) {pause; }} socket.leaveGroup (gruppe); socket.close (); }}

Efter binding af MulticastSocket til en havn, kalder vi Tilmeld gruppe() metode med multicast IP som argument. Dette er nødvendigt for at kunne modtage de pakker, der er offentliggjort til denne gruppe. Det Forlad gruppe() metode kan bruges til at forlade gruppen.

Følgende eksempel viser, hvordan man udgiver til en multicast-IP:

offentlig klasse MulticastPublisher {privat DatagramSocket-stik; privat InetAddress-gruppe; privat byte [] buf; offentlig ugyldig multicast (String multicastMessage) kaster IOException {socket = ny DatagramSocket (); gruppe = InetAddress.getByName ("230.0.0.0"); buf = multicastMessage.getBytes (); DatagramPacket-pakke = ny DatagramPacket (buf, buf.length, group, 4446); socket.send (pakke); socket.close (); }}

5. Broadcast og IPv6

IPv4 understøtter tre typer adressering: unicast, broadcast og multicast. Broadcast er i teorien en en-til-alle-kommunikation, dvs. en pakke sendt fra en enhed har potentialet til at nå hele internettet.

Da dette af åbenlyse grunde er uønsket, blev IPv4-udsendelsens omfang reduceret betydeligt. Multicast, som også fungerer som et bedre alternativ til udsendelse, kom meget senere ind og følgelig forsinket ved vedtagelsen.

I IPv6 er multicast-support blevet obligatorisk, og der er ikke noget udtrykkeligt koncept for transmission. Multicast er blevet udvidet og forbedret, så alle udsendelsesfunktioner nu kan implementeres med en eller anden form for multicasting.

I IPv6 bruges de længste venstre bit af en adresse til at bestemme dens type. For en multicast-adresse er de første 8 bits alle, dvs. FF00 :: / 8. Yderligere repræsenterer bit 113-116 adressens omfang, som kan være en af ​​følgende 4: Global, Site-local, Link-local, Node-local.

Ud over unicast og multicast understøtter IPv6 også anycast, hvor en pakke kan sendes til ethvert medlem af gruppen, men ikke behøver at blive sendt til alle medlemmer.

6. Resume

I denne artikel udforskede vi begreberne en-til-alle og en-til-mange-kommunikationstype ved hjælp af UDP-protokollen. Vi så eksempler på, hvordan man implementerer disse begreber i Java.

Endelig undersøgte vi også IPv4- og IPv6-support.

Komplet eksempelkode er tilgængelig på Github.