Vysielanie a multicasting v Jave

1. Úvod

V tomto článku popisujeme, ako možno v prostredí Java zvládnuť komunikáciu typu „vše v jednom“ (Broadcast) a „one-to-many“ (Multicast). Koncepcie vysielania a multicastu uvedené v tomto článku sú založené na protokole UDP.

Začíname rýchlou rekapituláciou datagramov a vysielania a toho, ako sa implementuje v Jave. Pozeráme sa tiež na nevýhody vysielania a navrhujeme multicasting ako alternatívu k vysielaniu.

Nakoniec to uzavrieme diskusiou o podpore týchto dvoch metód adresovania v protokole IPv4 aj IPv6.

2. Rekapitulácia datagramu

Podľa oficiálnej definície datagramu „datagram je nezávislá samostatná správa odosielaná po sieti, ktorej príchod, čas príchodu a obsah nie sú zaručené“.

V Jave sa java.net balíček vystavuje DatagramPacket a DatagramSocket triedy, ktoré sa dajú použiť na komunikáciu prostredníctvom protokolu UDP. UDP sa zvyčajne používa v scenároch, kde je nižšia latencia dôležitejšia ako zaručené doručenie, ako napríklad streamovanie zvuku / videa, zisťovanie v sieti atď.

Ak sa chcete dozvedieť viac o UDP a datagramoch v Jave, prečítajte si Sprievodcu UDP v Jave.

3. Vysielanie

Vysielanie je komunikácia typu „všetci-všetci“, to znamená, že je zámerom poslať datagram do všetkých uzlov v sieti. Na rozdiel od komunikácie typu point-to-pointnemusíme poznať IP adresu cieľového hostiteľa. Namiesto toho sa použije vysielacia adresa.

Podľa protokolu IPv4 je vysielacia adresa logická adresa, na ktorej môžu zariadenia pripojené k sieti prijímať pakety. V našom príklade používame konkrétnu adresu IP, 255.255.255.255, čo je vysielacia adresa miestnej siete.

Podľa definície smerovače pripájajúce miestnu sieť k iným sieťam ďalej neposielajú pakety odoslané na túto predvolenú adresu vysielania. Neskôr tiež ukážeme, ako môžeme iterovať cez všetky možnosti Sieťové rozhraniaa odosiela »pakety na ich príslušné vysielacie adresy.

Najprv ukážeme, ako vysielať správu. V tomto rozsahu musíme nazvať setBroadcast () metóda na sokete, aby ste vedeli, že paket sa má vysielať:

verejná trieda BroadcastingClient {private static DatagramSocket socket = null; public static void main ((String [] args)) hodí 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 [] vyrovnávacia pamäť = broadcastMessage.getBytes (); Paket DatagramPacket = nový DatagramPacket (buffer, buffer.length, adresa, 4445); socket.send (paket); socket.close (); }}

Nasledujúci úryvok ukazuje, ako iterovať všetkými Sieťové rozhrania nájsť ich vysielaciu adresu:

List listAllBroadcastAddresses () vyvolá SocketException {List broadcastList = new ArrayList (); Výčtové rozhrania = 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); } návrat broadcastList; }

Keď máme zoznam vysielaných adries, môžeme kód spustiť v vysielanie () vyššie pre každú z týchto adries.

Existuje na prijímajúcej strane sa nevyžaduje žiadny špeciálny kód prijímať odvysielanú správu. Môžeme znova použiť ten istý kód, ktorý prijíma normálny datagram UDP. Sprievodca UDP v prostredí Java obsahuje ďalšie podrobnosti o tejto téme.

4. Multicasting

Vysielanie je neefektívne, pretože pakety sa odosielajú do všetkých uzlov v sieti bez ohľadu na to, či majú záujem o komunikáciu alebo nie. Môže to byť plytvanie zdrojmi.

Multicasting rieši tento problém a posiela pakety iba tým spotrebiteľom, ktorí majú záujem. Multicasting je založený na koncepte členstva v skupine, kde adresa multicast predstavuje každú skupinu.

V protokole IPv4 možno ako adresu viacsmerového vysielania použiť ľubovoľnú adresu v rozsahu 224.0.0.0 až 239.255.255.255. Pakety komunikované skupine dostávajú iba tie uzly, ktoré si predplatia skupinu.

V Jave MulticastSocket sa používa na príjem paketov odoslaných na multicastovú IP. Nasledujúci príklad demonštruje použitie MulticastSocket:

verejná trieda MulticastReceiver rozširuje vlákno {chránená zásuvka MulticastSocket = null; chránený bajt [] buf = nový bajt [256]; public void run () {socket = new MulticastSocket (4446); InetAddress group = InetAddress.getByName ("230.0.0.0"); socket.joinGroup (skupina); while (true) {DatagramPacket packet = new DatagramPacket (buf, buf.length); socket.receive (paket); Prijatý reťazec = nový reťazec (packet.getData (), 0, packet.getLength ()); if ("end" .equals (received)) {break; }} socket.leaveGroup (skupina); socket.close (); }}

Po zviazaní MulticastSocket do prístavu, nazývame pridať sa do skupiny() metóda s argumentom multicast IP. Toto je nevyhnutné na to, aby ste mohli prijímať pakety publikované pre túto skupinu. The opustit skupinu() Na opustenie skupiny je možné použiť túto metódu.

Nasledujúci príklad ukazuje, ako publikovať na multicast IP:

verejná trieda MulticastPublisher {súkromná zásuvka DatagramSocket; súkromná skupina InetAddress; súkromný bajt [] buf; public void multicast (String multicastMessage) vyvolá IOException {socket = new DatagramSocket (); group = InetAddress.getByName ("230.0.0.0"); buf = multicastMessage.getBytes (); Paket DatagramPacket = nový DatagramPacket (buf, buf.length, group, 4446); socket.send (paket); socket.close (); }}

5. Vysielanie a IPv6

Protokol IPv4 podporuje tri typy adresovania: unicast, broadcast a multicast. Broadcast je teoreticky komunikácia typu „všetci-všetci“, to znamená, že paket odoslaný zo zariadenia má potenciál dosiahnuť celý internet.

Pretože je to zo zrejmých dôvodov nežiaduce, rozsah vysielania IPv4 sa výrazne znížil. Multicast, ktorý slúži aj ako lepšia alternatíva k vysielaniu, prišiel oveľa neskôr, a preto zaostával za prijatím.

V IPv6 sa podpora multicastu stala povinnou a neexistuje žiadny výslovný koncept vysielania. Multicast bol rozšírený a vylepšený, takže všetky funkcie vysielania je teraz možné implementovať pomocou nejakej formy multicastingu.

V IPv6 sa na určenie jej typu používajú bity adresy najviac vľavo. Pre adresu viacsmerového vysielania je prvých 8 bitov všetko, to znamená FF00 :: / 8. Ďalej bit 113-116 predstavuje rozsah adresy, ktorá môže byť buď jedna z nasledujúcich 4: Globálna, Lokálna stránka, Linková lokálna, Uzlová lokálna.

Okrem unicast a multicast podporuje IPv6 aj anycast, v ktorom je možné odoslať paket ľubovoľnému členovi skupiny, ale nemusí sa zasielať všetkým členom.

6. Zhrnutie

V tomto článku sme preskúmali koncepty typu one-to-all a one-to-many typu komunikácie pomocou protokolu UDP. Videli sme príklady, ako implementovať tieto koncepty v Jave.

Nakoniec sme preskúmali aj podporu protokolu IPv4 a IPv6.

Celý príklad kódu je k dispozícii na stránkach Github.


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