Vernetzung ohne Portweiterleitung

8

Ich versuche, meinem Spiel Netzwerkfunktionen hinzuzufügen. Ich möchte, dass jeder Benutzer das Spiel hosten kann und jeder als Client eine Verbindung herstellen kann. Der Client sendet dem Host Informationen über die Position seines Spielers usw. Wenn der Host eine Nachricht empfängt, validiert er diese und sendet sie dann an seine anderen Clients. Ich werde mich hauptsächlich mit UDP beschäftigen, aber ich werde auch TCP für Chat- und Lobby-Sachen benötigen.

Das Problem ist, dass ich scheinbar kein Paket vom Client an den Host senden kann oder umgekehrt, ohne die Portweiterleitung auf meinem Router zu aktivieren. Aber ich denke nicht, dass dies notwendig ist. Ich glaube, der Grund, warum ich eine Portweiterleitung benötige, ist, dass ich ein Paket von einem Computer in einem LAN an einen anderen Computer in einem anderen LAN senden möchte, aber keiner von beiden hat eine globale IP-Adresse, da sie sich in einem LAN befinden. Ich kann also wirklich nur Pakete senden, die auf den Router des anderen Netzwerks abzielen, der diese an den Computer weiterleiten muss, den ich erreichen möchte. Wie kann ich dies ohne Portweiterleitung tun? Irgendwie kann ein Webserver ohne Portweiterleitung mit meinem Computer kommunizieren, der keine globale IP hat. Und ich habe viele Multiplayer-Spiele gespielt, bei denen ich die Portweiterleitung nicht aktivieren muss. Also muss es möglich sein.

Übrigens benutze ich SDL_Net. Ich denke nicht, dass dies etwas ändern wird.

Ponkadoodle
quelle
Der Webserver hat eine globale IP (oder welche Geräte auch immer davor stehen).
Oskar Duveborn

Antworten:

13

Viele zu einem NAT (viele Computer mit privaten Adressen hinter einer öffentlichen Adresse) funktionieren folgendermaßen: Der Router verfolgt ausgehende Pakete und kann sie beim Empfang einer Antwort an den internen Computer senden, der die ursprüngliche Anforderung gesendet hat. Das funktioniert also gut, wenn Sie eine Website mit einer öffentlichen IP-Adresse besuchen.

Es ist jedoch nicht möglich, ein erstes Paket von außen an einen bestimmten Computer im Inneren zu senden, es sei denn, auf dem Router ist eine Weiterleitungsregel definiert: Es gibt keine Möglichkeit, einen bestimmten Computer zu adressieren, und der Router verfügt nicht über Informationen seine Verbindungstabelle, weil es keine Antwort ist.

Skype hat eine Technik populär gemacht, die als Firewall Hole Punching bezeichnet wird : Ein Server mit einer öffentlichen Adresse wird von den Clients kontaktiert. Anschließend sendet es eine Antwort an Client A zurück und weist ihn an, udp-Pakete an den Router von Client B an einem Port zu senden, von dem erwartet wird, dass der Router von Client B als Quellport für das nächste ausgehende Paket verwendet wird. Und es weist Client B an, ein Paket an den Router an Client A an einem Port zu senden, von dem erwartet wird, dass der Router von A als Quellport für sein nächstes ausgehendes Paket verwendet wird. Wenn die Vorhersage korrekt ist, können A und B jetzt direkt miteinander sprechen.

Für das Stanzen von Firewall-Löchern muss ein Server mit einer öffentlichen IP-Adresse als Moderator fungieren. Und es erfordert viel Wissen über die Implementierungen eines gemeinsamen NAT-Routers, um die ausgehenden Quellports korrekt vorherzusagen. Obwohl Open Source-Implementierungen verfügbar sind, sollten Sie versuchen, diese Technik zu vermeiden, da sie unzuverlässig ist und viele Kopfschmerzen verursacht. Skye greift auf die Verwendung des Servers mit der öffentlichen IP-Adresse zurück, um alle Pakete weiterzuleiten, wenn die Vorhersagen fehlschlagen.

Hendrik Brummermann
quelle
4

Irgendwie kann ein Webserver ohne Portweiterleitung mit meinem Computer kommunizieren, der keine globale IP hat

Wichtig ist, dass der Webserver selbst über ein globales IP / Port-Paar verfügt, das es eindeutig identifiziert. Ihr Computer stellt eine Verbindung zum Webserver her, der die Informationen über denselben Kanal zurücksendet.

Diese Technik ist offensichtlich nicht verfügbar, wenn beide Seiten hinter einer Art NAT stehen, wie dies bei Peer-to-Peer-Spielen üblich ist. Stattdessen müssen Sie das NAT austricksen.

Die Technik, nach der Sie suchen, wird als Locher oder Durchstanzen bezeichnet , insbesondere UDP- Locher oder TCP- Locher . In diesem Fall stellen beide Clients eine Verbindung zu einem globalen Server her, der ihnen über das "Loch" in der Firewall durch die vorhandene Verbindung sagt, wie sie sich miteinander verbinden sollen.

Für das Stanzen von Löchern ist ein öffentlicher Server mit einer globalen IP / einem globalen Port erforderlich, um die anfängliche Verbindung und Übergabe abzuwickeln. Die Anforderungen an Bandbreite / Verarbeitung sind jedoch gering. Wenn Sie einen globalen Lobby-Server haben, sollte dieser problemlos damit umgehen können.


quelle
4

Google Talk verwendet libjingle , um dasselbe zu erreichen.

Andere Bibliotheken für ICE / STUN / TURN sind PJNATH und libnice

bkersten
quelle
Link funktioniert nicht
Blunderchips