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).

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


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.

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 :)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.