Penyiaran dan Pelbagai Siaran di Jawa

1. Pengenalan

Dalam artikel ini, kami menerangkan bagaimana komunikasi one-to-all (Broadcast) dan one-to-many (Multicast) dapat ditangani di Java. Konsep siaran dan multicast yang digariskan dalam artikel ini berdasarkan protokol UDP.

Kami mulai dengan ringkasan cepat datagrams dan penyiaran dan bagaimana ia dilaksanakan di Java. Kami juga melihat kelemahan penyiaran dan mencadangkan pelbagai siaran sebagai alternatif untuk penyiaran.

Akhirnya, kami menyimpulkan dengan membincangkan sokongan untuk kedua kaedah menangani ini di IPv4 dan IPv6.

2. Recap Datagram

Mengikut definisi rasmi datagram, "Datagram adalah mesej mandiri dan mandiri yang dikirim melalui rangkaian yang kedatangan, waktu kedatangan, dan kandungannya tidak dijamin".

Di Java, paket java.net memperlihatkan kelas DatagramPacket dan DatagramSocket yang dapat digunakan untuk komunikasi melalui protokol UDP. UDP biasanya digunakan dalam senario di mana latensi yang lebih rendah lebih penting daripada penghantaran yang dijamin, seperti streaming audio / video, penemuan rangkaian, dll.

Untuk mengetahui lebih lanjut mengenai UDP dan datagram di Java, lihat Panduan untuk UDP di Java.

3 . Penyiaran

Penyiaran adalah jenis komunikasi satu-ke-semua, iaitu tujuannya adalah untuk menghantar datagram ke semua node dalam rangkaian. Tidak seperti dalam hal komunikasi point-to-point, kita tidak perlu mengetahui Alamat IP host sasaran . Sebaliknya, alamat siaran digunakan.

Sesuai dengan Protokol IPv4, alamat siaran adalah alamat logik, di mana peranti yang disambungkan ke rangkaian diaktifkan untuk menerima paket. Dalam contoh kami, kami menggunakan alamat IP tertentu, 255.255.255.255 , yang merupakan alamat siaran rangkaian tempatan.

Secara definisi, penghala yang menghubungkan rangkaian tempatan ke rangkaian lain tidak meneruskan paket yang dihantar ke alamat siaran lalai ini. Kemudian kami juga menunjukkan bagaimana kami dapat melakukan iterasi melalui semua NetworkInterfaces , dan menghantar paket ke alamat siaran masing-masing.

Pertama, kami menunjukkan cara menyiarkan mesej. Sejauh ini, kita perlu memanggil kaedah setBroadcast () pada soket untuk memberitahu bahawa paket itu akan disiarkan:

public class BroadcastingClient { private static DatagramSocket socket = null; public static void main((String[] args)) throws 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[] buffer = broadcastMessage.getBytes(); DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, 4445); socket.send(packet); socket.close(); } }

Coretan seterusnya menunjukkan cara melakukan lelaran melalui semua NetworkInterfaces untuk mencari alamat siaran mereka:

List listAllBroadcastAddresses() throws SocketException { List broadcastList = new ArrayList(); Enumeration interfaces = 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); } return broadcastList; }

Setelah kami mempunyai senarai alamat siaran, kami dapat menjalankan kod dalam kaedah siaran () yang ditunjukkan di atas untuk setiap alamat ini.

Tidak ada kod khas yang diperlukan di pihak penerima untuk menerima mesej yang disiarkan. Kita boleh menggunakan semula kod yang sama yang menerima datagram UDP biasa. Panduan untuk UDP di Java mengandungi lebih banyak perincian mengenai topik ini.

4. Multicasting

Penyiaran tidak efisien kerana paket dihantar ke semua node dalam rangkaian, tidak kira sama ada mereka berminat untuk menerima komunikasi atau tidak. Ini mungkin pembaziran sumber.

Multicasting menyelesaikan masalah ini dan hanya menghantar paket kepada pengguna yang berminat. Multicast didasarkan pada konsep keahlian kumpulan , di mana alamat multicast mewakili setiap kumpulan.

Di IPv4, alamat antara 224.0.0.0 hingga 239.255.255.255 dapat digunakan sebagai alamat multicast. Hanya nod yang melanggan kumpulan yang menerima paket yang dikomunikasikan kepada kumpulan.

Di Java, MulticastSocket digunakan untuk menerima paket yang dikirim ke IP multicast. Contoh berikut menunjukkan penggunaan MulticastSocket :

public class MulticastReceiver extends Thread { protected MulticastSocket socket = null; protected byte[] buf = new byte[256]; public void run() { socket = new MulticastSocket(4446); InetAddress group = InetAddress.getByName("230.0.0.0"); socket.joinGroup(group); while (true) { DatagramPacket packet = new DatagramPacket(buf, buf.length); socket.receive(packet); String received = new String( packet.getData(), 0, packet.getLength()); if ("end".equals(received)) { break; } } socket.leaveGroup(group); socket.close(); } }

Setelah mengikat MulticastSocket ke port, kami memanggil kaedah joinGroup () , dengan IP multicast sebagai argumen. Ini perlu untuk dapat menerima paket yang diterbitkan kepada kumpulan ini. Kaedah LeaveGroup () boleh digunakan untuk meninggalkan kumpulan.

Contoh berikut menunjukkan cara menerbitkan ke IP multicast:

public class MulticastPublisher { private DatagramSocket socket; private InetAddress group; private byte[] buf; public void multicast( String multicastMessage) throws IOException { socket = new DatagramSocket(); group = InetAddress.getByName("230.0.0.0"); buf = multicastMessage.getBytes(); DatagramPacket packet = new DatagramPacket(buf, buf.length, group, 4446); socket.send(packet); socket.close(); } }

5. Siaran dan IPv6

IPv4 menyokong tiga jenis pengalamatan: unicast, siaran dan multicast. Siaran, secara teori, adalah komunikasi satu-ke-semua, iaitu paket yang dihantar dari peranti berpotensi menjangkau seluruh internet.

Oleh kerana ini tidak diinginkan untuk alasan yang jelas, skop penyiaran IPv4 dikurangkan dengan ketara. Multicast, yang juga berfungsi sebagai alternatif yang lebih baik untuk penyiaran, masuk kemudian dan oleh itu tertangguh dalam penggunaan.

Di IPv6, sokongan multicast telah dibuat wajib, dan tidak ada konsep penyiaran yang jelas. Multicast telah diperluas dan diperbaiki sehingga semua fitur penyiaran kini dapat dilaksanakan dengan beberapa bentuk multicasting.

Dalam IPv6, bit alamat paling kiri digunakan untuk menentukan jenisnya. Untuk alamat multicast, 8 bit pertama adalah semuanya, iaitu FF00 :: / 8. Selanjutnya, bit 113-116 mewakili ruang lingkup alamat, yang boleh menjadi salah satu daripada 4 berikut: Global, Site-local, Link-local, Node-local.

Selain unicast dan multicast, IPv6 juga menyokong anycast, di mana paket boleh dihantar kepada mana-mana ahli kumpulan, tetapi tidak perlu dihantar kepada semua ahli.

6. Ringkasan

Dalam artikel ini, kami meneroka konsep jenis komunikasi satu-ke-semua dan satu-ke-banyak menggunakan protokol UDP. Kami melihat contoh bagaimana menerapkan konsep-konsep ini di Jawa.

Akhirnya, kami juga meneroka sokongan IPv4 dan IPv6.

Kod contoh lengkap boleh didapati di Github.