Dengan siaran, klien mengirim pesan ke semua orang di jaringan dan semua server membalas. Dengan multicast, Anda menentukan alamat grup multicast dan semua server berlangganan. Klien kemudian mengirim pesan ke grup, server yang telah berlangganan menerimanya dan membalas.
Multicast adalah untuk ketika satu pengirim ingin mengirim ke sekelompok penerima, seperti ketika seorang klien permainan ingin mengirim ke sekelompok server (potensial). Alamat multicast adalah alamat khusus di mana sistem tahu untuk memperlakukannya secara berbeda. Penerima memberi tahu sistem bahwa ia ingin menerima pesan yang dikirim ke grup tertentu, dan pengirim mengirim pesan ke alamat grup. Pada LAN ini hanya berfungsi. Di seluruh LAN Anda membutuhkan perutean multicast yang tidak diterapkan pada sebagian besar jaringan. Tetapi siaran juga tidak akan bekerja di LAN.
Menggunakan multicast memastikan bahwa hanya sistem di jaringan yang peduli untuk menerima pesan yang akan menerimanya.
Bagaimana Anda menerapkan ini tergantung pada bahasa pemrograman dll.
Struktur alamat multicast IPv6 adalah sebagai berikut:
- Itu selalu dimulai dengan 8 bit pertama dari alamat yang diatur ke 1, yang berarti bahwa dua karakter pertama dari alamat tersebut adalah
ff
;
- Karakter ke-3 (bit 9 hingga 12) di alamat menentukan flag. Dalam kasus Anda, Anda mungkin menginginkan alamat multicast yang diperbaiki untuk aplikasi Anda. Dalam hal itu karakter ke-3 akan menjadi
0
yang menunjukkan alamat multicast yang ditetapkan secara permanen;
- Karakter ke-4 (bit 13 hingga 16) menentukan ruang lingkup alamat. Anda kemungkinan besar akan menggunakan nilai
2
untuk lingkup tautan-lokal (LAN).
Bersama-sama ini berarti Anda akan menggunakan alamat yang dimulai dengan ff02:
.
Alamat multicast diberikan oleh IANA. RFC3307 mendefinisikan cara melakukannya (kriteria adalah Expert Review, jadi tidak perlu menulis RFC tentang apa yang Anda lakukan atau hal semacam itu). Dalam jawaban ini saya akan menggunakan alamat multicast ff02::db8:aa:bb
, yang ada di blok disediakan untuk dokumentasi.
Anda tidak harus memiliki akses root untuk menggunakan multicast. Contoh Python3.3 berikut dapat dijalankan dengan akun pengguna normal:
Server (mendengarkan pada alamat multicast):
#!/usr/bin/env python3.3
import socket
import struct
if_idx = socket.if_nametoindex('en0')
addr = 'ff02::db8:aa:bb'
port = 42424
group = socket.inet_pton(socket.AF_INET6, addr) + struct.pack("I", if_idx)
sock = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, group)
sock.bind(('::', port))
while True:
msg, sender = sock.recvfrom(1024)
print('Received "%s" from "%s"' % (str(msg, 'UTF-8'), sender))
sock.sendto(bytes('Received %d bytes from you' % len(msg), 'UTF-8'), sender)
Dan klien (mengirim ke grup multicast dan mendengarkan balasan):
#!/usr/bin/env python3.3
import socket
if_idx = socket.if_nametoindex('en0')
addr = 'ff02::db8:aa:bb'
port = 42424
sock = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, if_idx)
sock.sendto(bytes('Hello there!', 'UTF-8'), (addr, port))
while True:
# You probably wait a certain time for replies, not indefinitely like this example
msg, sender = sock.recvfrom(1024)
print('Received "%s" from "%s"' % (str(msg, 'UTF-8'), sender))
Saya menggunakan Python 3.3 karena versi yang lebih lama tidak memiliki socket.if_nametoindex
, tetapi yang lainnya juga harus bekerja di Python 2.
PS: menggunakan perpustakaan atau kerangka kerja yang ada untuk penemuan layanan seperti yang disarankan dalam jawaban lain adalah ide yang bagus. Ini akan menggunakan multicast di bawah tenda tetapi menyelamatkan Anda dari keharusan merancang dan mengimplementasikan protokol Anda sendiri.