Bagaimana menemukan server game di jaringan LAN dengan teknologi IPv6?

8

Kembali pada hari-hari IPv4, orang hanya menggunakan paket siaran memeriksa apakah ada server yang tersedia di jaringan seperti yang dijelaskan dalam jawaban ini . Tetapi dalam protokol IPv6 mereka telah menjatuhkan dukungan siaran. Masih ada dukungan multicast yang tersedia, tetapi bagaimana saya bisa menggunakannya?

Ali1S232
sumber

Jawaban:

7

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 0yang menunjukkan alamat multicast yang ditetapkan secara permanen;
  • Karakter ke-4 (bit 13 hingga 16) menentukan ruang lingkup alamat. Anda kemungkinan besar akan menggunakan nilai 2untuk 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.

Sander Steffann
sumber
tidakkah Anda memerlukan izin administratif untuk membuat / bergabung dengan grup? dan selain itu bagaimana cara kerja grup ini? Maksud saya, apakah saya memilih alamat grup ketika saya ingin membuat / bergabung dengan satu?
Ali1S232
Saya akan memperluas jawabannya dengan memasukkan beberapa perincian lebih lanjut
Sander Steffann
Jawaban ini mungkin secara teknis benar tetapi melewatkan sedikit penjelasan tentang cara kerja multicast. Apakah saya memahaminya dengan benar bahwa Anda dapat membuat soket multicast dan kemudian semua orang di jaringan tahu di mana soket ini?
API-Beast
Juga jika demikian, bagaimana membedakan soket yang ada di jaringan lokal, dan yang di luar, seperti internet.
API-Beast
Jawaban yang diperluas
Sander Steffann
4

Ada protokol untuk penemuan layanan yang harus digunakan aplikasi modern alih-alih solusi broadcast atau multicast home-spun, baik Anda menggunakan IPv4 atau IPv6.

Apple mendorong mDNS / DNS-SD dan Microsoft mendorong UPnP . Keduanya mencapai tujuan yang sama untuk penemuan layanan sederhana, sementara UPnP menawarkan banyak fitur tambahan.

Ada pustaka yang tersedia secara bebas untuk kedua API tersebut untuk beberapa platform. OS yang relevan termasuk dukungan asli. Linux menawarkan dukungan melalui komponen sistem semi-standar yang diinstal secara default di sebagian besar distro.

Perhatikan bahwa UPnP juga dapat digunakan untuk konfigurasi firewall dan karenanya mungkin merupakan pilihan yang lebih baik untuk game yang berencana bermain Internet, meskipun Anda tidak dapat mengandalkan atau memerlukan kontrol firewall UPnP karena banyak pengguna tidak memiliki router yang kompatibel atau memutar fitur dari paranoia.

Sean Middleditch
sumber