Wie finde ich einen Spieleserver im LAN-Netzwerk mit IPv6-Technologie?

8

In den IPv4-Tagen haben Benutzer einfach Broadcast-Pakete verwendet, um zu überprüfen, ob im Netzwerk Server verfügbar sind, wie in dieser Antwort beschrieben . Im IPv6-Protokoll wurde die Broadcast-Unterstützung jedoch eingestellt. Es gibt noch Multicast-Unterstützung, aber wie kann / soll ich sie verwenden?

Ali1S232
quelle

Antworten:

7

Bei der Übertragung sendet der Client eine Nachricht an alle im Netzwerk und alle Server antworten. Mit Multicast definieren Sie eine Multicast-Gruppenadresse, die von allen Servern abonniert wird. Der Client sendet dann eine Nachricht an die Gruppe. Die abonnierten Server empfangen sie und antworten.

Multicast ist für den Fall vorgesehen, dass ein Absender an eine Gruppe von Empfängern senden möchte, z. B. wenn ein Spielclient an eine (potenzielle) Gruppe von Servern senden möchte. Multicast-Adressen sind spezielle Adressen, bei denen das System weiß, dass sie unterschiedlich behandelt werden. Der Empfänger teilt dem System mit, dass er an eine bestimmte Gruppe gesendete Nachrichten empfangen möchte, und der Absender sendet eine Nachricht an die Gruppenadresse. In einem LAN funktioniert dies einfach. In LANs benötigen Sie Multicast-Routing, das in den meisten Netzwerken nicht implementiert ist. Aber Broadcast würde auch nicht über LANs funktionieren.

Durch die Verwendung von Multicast wird sichergestellt, dass nur die Systeme im Netzwerk, die die Nachricht erhalten möchten, diese empfangen.

Wie Sie dies implementieren, hängt von der Programmiersprache usw. ab.

Die Struktur einer IPv6-Multicast-Adresse lautet wie folgt:

  • Es beginnt immer mit den ersten 8 Bits der Adresse, die auf 1 gesetzt sind, was bedeutet, dass die ersten beiden Zeichen der Adresse sind ff;
  • Das dritte Zeichen (Bits 9 bis 12) in der Adresse gibt Flags an. In Ihrem Fall möchten Sie wahrscheinlich eine feste Multicast-Adresse für Ihre Anwendung. In diesem Fall ist das 3. Zeichen ein Zeichen, 0das eine permanent zugewiesene Multicast-Adresse angibt.
  • Das 4. Zeichen (Bits 13 bis 16) bestimmt den Umfang der Adresse. Sie werden sehr wahrscheinlich den Wert 2für den LAN-Bereich (Link-Local) verwenden.

Zusammen bedeutet dies, dass Sie eine Adresse verwenden, die mit beginnt ff02:.

Multicast-Adressen werden von IANA vergeben. RFC3307 definiert, wie es gemacht wird (das Kriterium ist Expert Review, daher ist es nicht erforderlich, einen RFC über das, was Sie tun, oder ähnliches zu schreiben). In dieser Antwort verwende ich die Multicast-Adresse ff02::db8:aa:bb, die sich in dem für die Dokumentation reservierten Block befindet.

Sie müssen keinen Root-Zugriff haben, um Multicast verwenden zu können. Die folgenden Python3.3-Beispiele können mit einem normalen Benutzerkonto ausgeführt werden:

Der Server (überwacht die Multicast-Adresse):

#!/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)

Und der Client (Senden an die Multicast-Gruppe und Abhören der Antworten):

#!/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))

Ich habe Python 3.3 verwendet, weil ältere Versionen keine haben socket.if_nametoindex, aber alles andere sollte auch in Python 2 funktionieren.

PS: Die Verwendung einer vorhandenen Bibliothek oder eines vorhandenen Frameworks für die Serviceerkennung, wie in einer anderen Antwort vorgeschlagen, ist eine gute Idee. Es wird Multicast unter der Haube verwenden, aber Sie müssen kein eigenes Protokoll entwerfen und implementieren.

Sander Steffann
quelle
Benötigen Sie keine Administratorrechte, um eine Gruppe zu erstellen / einer Gruppe beizutreten? und außerdem, wie funktioniert diese Gruppensache? Ich meine, wähle ich die Gruppenadresse, wenn ich eine erstellen / beitreten möchte?
Ali1S232
Ich werde die Antwort erweitern, um einige weitere Details aufzunehmen
Sander Steffann
Diese Antwort ist wahrscheinlich technisch richtig, aber es fehlt eine Erklärung, wie Multicast funktioniert. Verstehe ich es richtig, dass Sie einen Multicast-Socket erstellen können und dann jeder im Netzwerk weiß, wo sich dieser Socket befindet?
API-Beast
Auch wenn ja, wie wird unterschieden, welche Sockets sich im lokalen Netzwerk befinden und welche sich außerhalb befinden, wie das Internet?
API-Beast
Erweiterte Antwort
Sander Steffann
4

Es gibt Protokolle für die Diensterkennung, die moderne Anwendungen anstelle von Broadcast- oder Home-Spun-Multicast-Lösungen verwenden sollten, unabhängig davon, ob Sie IPv4 oder IPv6 verwenden.

Apple pusht mDNS / DNS-SD und Microsoft pusht UPnP . Beide erreichen die gleichen Ziele für eine einfache Serviceerkennung, während UPnP viele zusätzliche Funktionen bietet.

Es gibt frei verfügbare Bibliotheken für diese beiden APIs für mehrere Plattformen. Die relevanten Betriebssysteme umfassen native Unterstützung. Linux bietet Unterstützung über Semi-Standard-Systemkomponenten, die in den meisten Distributionen standardmäßig installiert sind.

Beachten Sie, dass UPnP auch für die Firewall-Konfiguration verwendet werden kann und daher möglicherweise die bessere Wahl für Spiele ist, bei denen Internet gespielt werden soll, obwohl Sie sich nicht auf die UPnP-Firewall-Steuerung verlassen oder diese benötigen können, da viele Benutzer keine kompatiblen Router haben oder die nicht aktivieren Feature aus Paranoia.

Sean Middleditch
quelle