Comment faire fonctionner un jeu multijoueur de manière fiable derrière NAT?

20

Même les jeux 100% client / serveur ont parfois des problèmes lorsque le client est derrière NAT. Les jeux de pipi sont encore plus importants. Certains jeux doivent utiliser plusieurs transports (comme UDP et TCP) ou plusieurs connexions (comme un port UDP différent pour la voix).

Quels sont les moyens de s'assurer qu'un jeu fonctionne de manière fiable lorsqu'il s'exécute derrière un routeur NAT?

  • Peer-Peer: Aucun serveur centralisé n'existe. Le joueur A commence une partie et le joueur B veut se joindre
  • Client-Serveur: Un serveur centralisé sur une adresse bien connue (nom d'hôte) accepte toutes les connexions entrantes. Chaque client communique uniquement avec ce serveur.
  • Combo: où le serveur est juste un matchmaking, mais les mises à jour du jeu sont peer-peer. Différents pairs peuvent voir chaque joueur avec un IP / port différent potentiellement (par exemple, certains clients sont derrière le même NAT et certains sont sur un routeur différent)
kevin42
la source

Réponses:

9

La technique la plus couramment utilisée est appelée punch-through NAT. Voici une introduction décente: http://www.mindcontrol.org/~hplus/nat-punch.html

Il existe au moins un projet OSS pour UDP: http://udt.sourceforge.net/index.html

RakNet prend également en charge le punch-through, je crois. C'est commercial, mais il a une licence "Indie" gratuite. Voir ici: http://www.jenkinssoftware.com/

Googler pour "NAT punch" vous donnera beaucoup plus de matériel de lecture

Rachel Blum
la source
1
Je sais que c'est une très vieille question et réponse mais si quelqu'un lit cela, RakNet est acquis par OculusVR et maintenant open-source avec une licence BSD à 2 clauses. github.com/OculusVR/RakNet
Quad
9
  • Ne demandez pas à un client d'informer le serveur ou l'homologue de sa propre adresse. En d'autres termes, n'intégrez pas l'IP du client A dans un paquet de jeu et demandez au client B ou au serveur de répondre à cette adresse. Répondez toujours à l'adresse / au port d'origine du message.

  • Minimisez les différents ports UDP ou TCP utilisés pour le jeu. Cela facilite la configuration des règles NAT.

  • Autorisez l'utilisateur à remplacer le port par défaut utilisé dans le jeu. De cette façon, plusieurs serveurs peuvent être hébergés derrière le même NAT.

  • Documentez les ports et les règles qu'ils suivent dans la documentation de votre jeu (merci pour celui-là Zorba). Dans Descent 3, je suis allé jusqu'à créer une application de test autonome qui vous aiderait à dépanner votre routeur ou votre configuration NAT en envoyant des paquets à un serveur de test.
kevin42
la source
7
En plus de cette réponse par ailleurs satisfaisante, incluez une note des ports de jeu dans la documentation du jeu . C'est incroyable combien de jeux ne font pas cela - les gens extraient les ports manuellement avec "netstat" et se trompent la moitié.
ZorbaTHut
Avec UDP, vous ne savez pas vraiment d'où vient le message. Tout peut être écrit dans l'adresse de retour.
MickLH
0

Avec d'autres réponses, utilisez une roue existante: http://miniupnp.free.fr/ Cette bibliothèque combat presque tous les ennuis sous forme de fonction, vous donnant le contrôle sur quand et comment frapper et tirer :)

découverte
la source