Wie funktioniert ein Multiplayer-Spiel zuverlässig hinter NAT?

20

Sogar Spiele, die 100% Client / Server sind, haben manchmal Probleme, wenn sich der Client hinter NAT befindet. Peee-Peer-Spiele sind ein noch größeres Problem. Einige Spiele müssen mehrere Transporte (z. B. UDP und TCP) oder mehrere Verbindungen (z. B. einen anderen UDP-Port für Sprache) verwenden.

Wie kann sichergestellt werden, dass ein Spiel zuverlässig funktioniert, wenn es hinter einem NAT-Router ausgeführt wird?

  • Peer-Peer: Es ist kein zentraler Server vorhanden. Spieler A startet ein Spiel und Spieler B möchte mitmachen
  • Client-Server: Ein zentraler Server an einer bekannten Adresse (Hostname) akzeptiert alle eingehenden Verbindungen. Jeder Client kommuniziert nur mit diesem Server.
  • Combo: Wo der Server nur Matchmaking betreibt, aber Spielaktualisierungen Peer-Peer sind. Unterschiedliche Peers können möglicherweise jeden Player mit einer anderen IP / einem anderen Port sehen (z. B. einige Clients befinden sich hinter demselben NAT und einige befinden sich auf einem anderen Router).
kevin42
quelle

Antworten:

9

Die am häufigsten verwendete Technik wird als NAT-Punch-Through bezeichnet. Hier ist ein anständiges Intro: http://www.mindcontrol.org/~hplus/nat-punch.html

Zumindest für UDP gibt es ein OSS-Projekt: http://udt.sourceforge.net/index.html

Ich glaube, RakNet unterstützt auch Punch-Through. Es ist kommerziell, hat aber eine kostenlose "Indie" -Lizenz. Siehe hier: http://www.jenkinssoftware.com/

Wenn Sie nach "NAT Punsch" googeln, erhalten Sie viel mehr Lesematerial

Rachel Blum
quelle
1
Ich weiß, dass dies eine sehr alte Frage und Antwort ist, aber wenn jemand dies liest, wird RakNet von OculusVR erworben und ist jetzt Open Source mit einer 2-Klausel-BSD-Lizenz. github.com/OculusVR/RakNet
Quad
9
  • Lassen Sie den Server oder den Peer nicht von einem Client über seine eigene Adresse informieren. Mit anderen Worten, binden Sie die IP von Client A nicht in ein Spielpaket ein und lassen Sie Client B oder den Server auf diese Adresse antworten. Antworten Sie immer auf die Adresse / den Port, von dem die Nachricht stammt.

  • Minimieren Sie die verschiedenen UDP- oder TCP-Ports, die für das Spiel verwendet werden. Dies erleichtert das Einrichten von NAT-Regeln.

  • Ermöglichen Sie dem Benutzer, den im Spiel verwendeten Standardport zu überschreiben. Auf diese Weise können mehrere Server hinter demselben NAT gehostet werden.

  • Dokumentiere die Ports und alle Regeln, denen sie folgen, in deiner Spieldokumentation (danke für diesen einen Zorba). In Descent 3 habe ich sogar eine eigenständige Testanwendung erstellt, mit der Sie Probleme mit Ihrem Router oder der NAT-Konfiguration beheben können, indem Sie Pakete an einen Testserver senden.
kevin42
quelle
7
Fügen Sie zusätzlich zu dieser ansonsten guten Antwort einen Hinweis zu den Gameports in die Spieldokumentation ein . Es ist erstaunlich, wie viele Spiele dies nicht tun - die Leute rollen die Ports manuell mit "netstat" aus und machen die Hälfte davon falsch.
ZorbaTHut
Mit UDP wissen Sie nicht wirklich, woher die Nachricht stammt. Alles kann in die Absenderadresse geschrieben werden.
MickLH
0

Verwenden Sie neben anderen Antworten ein vorhandenes Rad: http://miniupnp.free.fr/ Diese Bibliothek bekämpft fast alle Störungen in Form von Funktionen und gibt Ihnen die Kontrolle darüber, wann und wie Sie schlagen und ziehen müssen :)

Underscorediscovery
quelle