Kringkasting og multicasting i Java

1. Introduksjon

I denne artikkelen beskriver vi hvordan en-til-alle (Broadcast) og en-til-mange (Multicast) kommunikasjon kan håndteres i Java. Kringkastings- og multicast-konseptene som er skissert i denne artikkelen er basert på UDP-protokollen.

Vi starter med et raskt sammendrag av datagrammer og kringkasting og hvordan det implementeres i Java. Vi ser også på ulemper ved kringkasting og foreslår multicasting som et alternativ til kringkasting.

Til slutt avslutter vi med å diskutere støtte for disse to adresseringsmetodene i både IPv4 og IPv6.

2. Datagramoppsummering

I henhold til den offisielle definisjonen av et datagram, "Et datagram er en uavhengig, selvstendig melding sendt over nettverket hvis ankomst, ankomsttid og innhold ikke er garantert".

I Java er java.net pakken avslører DatagramPakke og DatagramSocket klasser som kan brukes til kommunikasjon via UDP-protokollen. UDP brukes vanligvis i scenarier der lavere ventetid er viktigere enn garantert levering, for eksempel lyd / video streaming, nettverksoppdagelse, etc.

For å lære mer om UDP og datagrammer i Java, se En guide til UDP i Java.

3. Kringkasting

Kringkasting er en type kommunikasjon, dvs. intensjonen er å sende datagrammet til alle nodene i nettverket. I motsetning til i tilfelle punkt-til-punkt kommunikasjon,vi trenger ikke å vite målvertens IP-adresse. I stedet brukes en kringkastingsadresse.

I henhold til IPv4-protokoll er en kringkastingsadresse en logisk adresse der enheter som er koblet til nettverket er aktivert for å motta pakker. I vårt eksempel bruker vi en bestemt IP-adresse, 255.255.255.255, som er kringkastingsadressen til det lokale nettverket.

Per definisjon videresender ikke rutere som kobler et lokalt nettverk til andre nettverk pakker som sendes til denne standard kringkastingsadressen. Senere viser vi også hvordan vi kan gjenta gjennom alt Nettverksgrensesnitt, og send pakker til deres respektive kringkastingsadresser.

Først demonstrerer vi hvordan du sender en melding. I denne grad må vi kalle setBroadcast () metode på kontakten for å fortelle at pakken skal sendes:

offentlig klasse BroadcastingClient {privat statisk DatagramSocket-kontakt = null; public static void main ((String [] args)) kaster IOException {kringkasting ("Hello", InetAddress.getByName ("255.255.255.255")); } offentlig statisk ugyldig kringkasting (String broadcastMessage, InetAddress-adresse) kaster IOException {socket = ny DatagramSocket (); socket.setBroadcast (true); byte [] buffer = broadcastMessage.getBytes (); DatagramPacket-pakke = ny DatagramPacket (buffer, buffer.lengde, adresse, 4445); socket.send (pakke); socket.close (); }}

Neste kodebit viser hvordan du kan gjenta det hele Nettverksgrensesnitt for å finne sin kringkastingsadresse:

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

Når vi har listen over kringkastingsadresser, kan vi utføre koden i kringkaste() metoden vist ovenfor for hver av disse adressene.

Det er ingen spesiell kode kreves på mottakersiden for å motta en kringkastet melding. Vi kan bruke den samme koden som mottar et vanlig UDP-datagram. En guide til UDP i Java inneholder flere detaljer om dette emnet.

4. Multicasting

Kringkasting er ineffektiv ettersom pakker sendes til alle noder i nettverket, uavhengig av om de er interessert i å motta kommunikasjonen eller ikke. Dette kan være sløsing med ressurser.

Multicasting løser dette problemet og sender pakker til bare de forbrukerne som er interessert. Multicasting er basert på et konsept for gruppemedlemskap, hvor en multicast-adresse representerer hver gruppe.

I IPv4 kan hvilken som helst adresse mellom 224.0.0.0 og 239.255.255.255 brukes som en multicast-adresse. Bare de nodene som abonnerer på en gruppe mottar pakker som er kommunisert til gruppen.

I Java, MulticastSocket brukes til å motta pakker sendt til en multicast IP. Følgende eksempel viser bruken av MulticastSocket:

offentlig klasse MulticastReceiver utvider tråd {beskyttet MulticastSocket-sokkel = null; beskyttet byte [] buf = ny byte [256]; public void run () {socket = new MulticastSocket (4446); InetAddress group = InetAddress.getByName ("230.0.0.0"); socket.joinGroup (gruppe); while (true) {DatagramPacket-pakke = ny DatagramPacket (buf, buf.length); socket.receive (pakke); Streng mottatt = ny streng (packet.getData (), 0, packet.getLength ()); if ("slutt" .equals (mottatt)) {pause; }} socket.leaveGroup (gruppe); socket.close (); }}

Etter å ha bundet MulticastSocket til en havn, kaller vi bli med i gruppe() metode, med multicast IP som argument. Dette er nødvendig for å kunne motta pakkene som er publisert til denne gruppen. De forlat gruppe() metoden kan brukes til å forlate gruppen.

Følgende eksempel viser hvordan du publiserer til en multicast-IP:

offentlig klasse MulticastPublisher {privat DatagramSocket-kontakt; privat InetAddress-gruppe; privat byte [] buf; public void multicast (String multicastMessage) kaster IOException {socket = new 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 støtter tre typer adressering: unicast, kringkasting og multicast. Broadcast er i teorien en en-til-alle-kommunikasjon, dvs. en pakke sendt fra en enhet har potensialet til å nå hele internett.

Siden dette er uønsket av åpenbare grunner, ble omfanget av IPv4-sendingen betydelig redusert. Multicast, som også fungerer som et bedre alternativ til kringkasting, kom inn mye senere og følgelig forsinket i adopsjonen.

I IPv6 har multicast-støtte blitt obligatorisk, og det er ikke noe eksplisitt kringkastingsbegrep. Multicast er utvidet og forbedret slik at alle kringkastingsfunksjoner nå kan implementeres med en eller annen form for multicasting.

I IPv6 brukes de venstre biter av en adresse for å bestemme typen. For en multicast-adresse er de første 8 bitene alle, dvs. FF00 :: / 8. Videre representerer bit 113-116 omfanget av adressen, som kan være en av de følgende 4: Global, Site-local, Link-local, Node-local.

I tillegg til unicast og multicast, støtter IPv6 også anycast, der en pakke kan sendes til ethvert medlem av gruppen, men ikke trenger å sendes til alle medlemmer.

6. Sammendrag

I denne artikkelen utforsket vi begrepene en-til-alle og en-til-mange-type kommunikasjon ved hjelp av UDP-protokollen. Vi så eksempler på hvordan du implementerer disse konseptene i Java.

Til slutt utforsket vi også IPv4- og IPv6-støtte.

Fullstendig eksempelkode er tilgjengelig på Github.


$config[zx-auto] not found$config[zx-overlay] not found