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,
0
das eine permanent zugewiesene Multicast-Adresse angibt.
- Das 4. Zeichen (Bits 13 bis 16) bestimmt den Umfang der Adresse. Sie werden sehr wahrscheinlich den Wert
2
fü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.
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.
quelle