Emitiranje i multicasting u Javi

1. Uvod

U ovom članku opisujemo kako se na Javi može rukovati komunikacijama jedan prema svima (Broadcast) i jedan prema više (Multicast). Koncepti emitiranja i višestrukog slanja navedeni u ovom članku temelje se na UDP protokolu.

Počinjemo s brzim osvrtom na datagrame i emitiranje te na način na koji se to implementira u Javi. Također razmatramo nedostatke emitiranja i predlažemo multicasting kao alternativu emitiranju.

Na kraju, zaključujemo raspravom o podršci za ove dvije metode adresiranja i u IPv4 i u IPv6.

2. Sažetak datagrama

Prema službenoj definiciji datagrama, „Datagram je neovisna, samostalna poruka poslana mrežom čiji dolazak, vrijeme dolaska i sadržaj nisu zajamčeni“.

U Javi je java.net paket izlaže DatagramPacket i DatagramSocket klase koje se mogu koristiti za komunikaciju putem UDP protokola. UDP se obično koristi u scenarijima gdje je niža latencija važnija od zajamčene isporuke, kao što je streaming audio / video zapisa, otkrivanje mreže itd.

Da biste saznali više o UDP-u i datagramima na Javi, pogledajte Vodič za UDP na Javi.

3. Emitiranje

Emitiranje je vrsta komunikacije jedan za sve, tj. Namjera je poslati datagram svim čvorovima u mreži. Za razliku od slučaja komunikacije od točke do točke,ne moramo znati IP adresu ciljanog domaćina. Umjesto toga koristi se adresa za emitiranje.

Prema protokolu IPv4, adresa za emitiranje je logična adresa na kojoj je uređajima povezanim na mrežu omogućen prijem paketa. U našem primjeru koristimo određenu IP adresu, 255.255.255.255, koja je adresa lokalne mreže.

Prema definiciji, usmjerivači koji povezuju lokalnu mrežu s drugim mrežama ne prosljeđuju pakete poslane na ovu zadanu adresu emitiranja. Kasnije također pokazujemo kako možemo sve ponavljati Mrežna sučeljai šalju pakete na odgovarajuće adrese emitiranja.

Prvo demonstriramo kako emitirati poruku. U toj mjeri moramo nazvati setBroadcast () metodom na utičnici kako bi se obavijestilo da se paket emitira:

javna klasa BroadcastingClient {private static DatagramSocket socket = null; public static void main ((String [] args)) baca IOException {broadcast ("Hello", InetAddress.getByName ("255.255.255.255")); } javno statično void emitiranje (String broadcastMessage, InetAddress adresa) baca IOException {socket = new DatagramSocket (); socket.setBroadcast (true); bajt [] međuspremnik = broadcastMessage.getBytes (); DatagramPacket paket = novi DatagramPacket (međuspremnik, buffer.length, adresa, 4445); socket.send (paket); socket.close (); }}

Sljedeći isječak pokazuje kako se sve ponavlja Mrežna sučelja kako biste pronašli adresu emitiranja:

Popis listAllBroadcastAddresses () baca SocketException {Popis broadcastList = novi ArrayList (); Sučelja za nabrajanje = 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); } povratak broadcastList; }

Nakon što imamo popis emitiranih adresa, možemo izvršiti kod u emitiranje () gore prikazana metoda za svaku od ovih adresa.

Tamo je na strani primanja nije potreban poseban kod za primanje emitirane poruke. Možemo ponovno upotrijebiti isti kod koji prima uobičajeni UDP datagram. Vodič za UDP na Javi sadrži više detalja o ovoj temi.

4. Multicasting

Emitiranje je neučinkovito jer se paketi šalju svim čvorovima u mreži, bez obzira jesu li zainteresirani za primanje komunikacije ili ne. Ovo može biti gubljenje resursa.

Multicasting rješava ovaj problem i šalje pakete samo onim potrošačima koji su zainteresirani. Multicasting se temelji na konceptu članstva u grupi, gdje multicast adresa predstavlja svaku skupinu.

U IPv4, bilo koja adresa između 224.0.0.0 do 239.255.255.255 može se koristiti kao adresa za višestruko slanje. Samo oni čvorovi koji su pretplaćeni na grupu primaju pakete prenesene grupi.

U Javi, MulticastSocket koristi se za primanje paketa poslanih na multicast IP. Sljedeći primjer pokazuje upotrebu MulticastSocket:

javna klasa MulticastReceiver proširuje Thread {zaštićena MulticastSocket socket = null; zaštićeni bajt [] buf = novi bajt [256]; javna void run () {socket = new MulticastSocket (4446); InetAddress grupa = InetAddress.getByName ("230.0.0.0"); socket.joinGroup (grupa); while (true) {DatagramPacket paket = novi DatagramPacket (buf, buf.length); socket.receive (paket); String primljen = novi String (packet.getData (), 0, packet.getLength ()); if ("end" .equals (primljeno)) {break; }} socket.leaveGroup (grupa); socket.close (); }}

Nakon vezivanja MulticastSocket u luku, zovemo joinGroup () metoda, s multicast IP-om kao argumentom. To je potrebno da biste mogli primati pakete objavljene u ovoj grupi. The napusti grupu() metoda može se koristiti za napuštanje grupe.

Sljedeći primjer pokazuje kako objaviti na multicast IP-u:

javna klasa MulticastPublisher {privatna utičnica DatagramSocket; privatna InetAddress grupa; privatni bajt [] buf; javno void multicast (String multicastMessage) baca IOException {socket = new DatagramSocket (); group = InetAddress.getByName ("230.0.0.0"); buf = multicastMessage.getBytes (); DatagramPacket paket = novi DatagramPacket (buf, buf.length, group, 4446); socket.send (paket); socket.close (); }}

5. Emitiranje i IPv6

IPv4 podržava tri vrste adresiranja: jednosmjerno, emitirano i multicast. Emitiranje je, u teoriji, komunikacija jedan-za-sve, tj. Paket poslan s uređaja može doći do cijelog interneta.

Budući da to iz očitih razloga nije poželjno, opseg emitiranja IPv4 značajno je smanjen. Multicast, koji ujedno služi i kao bolja alternativa emitiranju, ušao je mnogo kasnije i stoga je zaostao u usvajanju.

U IPv6 podrška za višestruko slanje postala je obavezna i ne postoji izričit koncept emitiranja. Multicast je proširen i poboljšan tako da se sve značajke emitiranja sada mogu implementirati s nekim oblikom multicastinga.

U IPv6, krajnji lijevi bitovi adrese koriste se za određivanje vrste. Za multicast adresu, prvih 8 bitova su svi, tj. FF00 :: / 8. Dalje, bit 113-116 predstavlja opseg adrese, koja može biti jedna od sljedećih 4: Global, Site-local, Link-local, Node-local.

Uz unicast i multicast, IPv6 također podržava anycast, u kojem se paket može poslati bilo kojem članu grupe, ali ne mora biti poslan svim članovima.

6. Sažetak

U ovom smo članku istražili koncepte vrste komunikacije jedan prema svima i jedan prema više koristeći UDP protokol. Vidjeli smo primjere kako implementirati ove koncepte u Javu.

Konačno, istražili smo i podršku za IPv4 i IPv6.

Cjelovit primjer koda dostupan je na Githubu.