¿Cómo hacer que un juego multijugador funcione de manera confiable detrás de NAT?

20

Incluso los juegos que son 100% cliente / servidor a veces tienen problemas cuando el cliente está detrás de NAT. Los juegos peee-peer son problemas aún mayores. Algunos juegos necesitan usar múltiples transportes (como UDP y TCP) o múltiples conexiones (como un puerto UDP diferente para voz).

¿Cuáles son algunas formas de asegurarse de que un juego funcione de manera confiable cuando se ejecuta detrás de un enrutador NAT?

  • Peer-Peer: no existe un servidor centralizado. El jugador A comienza un juego y el jugador B quiere unirse
  • Cliente-servidor: un servidor centralizado en una dirección conocida (nombre de host) acepta todas las conexiones entrantes. Cada cliente solo se comunica con ese servidor.
  • Combo: donde el servidor solo es emparejamiento, pero las actualizaciones del juego son de igual a igual. Diferentes pares pueden ver cada jugador con una IP / puerto diferente potencialmente (por ejemplo, algunos clientes están detrás del mismo NAT y otros están en un enrutador diferente)
kevin42
fuente

Respuestas:

9

La técnica más comúnmente utilizada se conoce como perforación de NAT. Aquí hay una introducción decente: http://www.mindcontrol.org/~hplus/nat-punch.html

Hay un proyecto OSS al menos para UDP: http://udt.sourceforge.net/index.html

RakNet también admite perforaciones, creo. Es comercial, pero tiene una licencia "Indie" gratuita. Ver aquí: http://www.jenkinssoftware.com/

Buscar en Google "NAT punch" te dará mucho más material de lectura

Rachel Blum
fuente
1
Sé que esta es una pregunta y respuesta realmente antigua, pero si alguien lee esto, OculkRR adquiere RakNet y ahora es de código abierto con licencia BSD de 2 cláusulas. github.com/OculusVR/RakNet
Quad
9
  • No haga que un cliente informe al servidor o al igual de su propia dirección. En otras palabras, no incruste la IP del cliente A en un paquete de juego y haga que el cliente B o el servidor respondan a esa dirección. Siempre responda a la dirección / puerto desde donde se originó el mensaje.

  • Minimice los diferentes puertos UDP o TCP utilizados para el juego. Esto facilita la configuración de las reglas NAT.

  • Permitir al usuario anular el puerto predeterminado utilizado en el juego. De esta manera, se pueden alojar varios servidores detrás del mismo NAT.

  • Documente los puertos y las reglas que siguen en la documentación de su juego (gracias por ese Zorba). En Descent 3, llegué a crear una aplicación de prueba independiente que lo ayudaría a solucionar problemas de su enrutador o configuración NAT enviando paquetes a un servidor de prueba.
kevin42
fuente
77
Además de esta buena respuesta, incluye una nota de los puertos del juego en la documentación del juego . Es sorprendente la cantidad de juegos que no hacen esto: las personas eliminan los puertos manualmente con "netstat" y se equivocan.
ZorbaTHut
Con UDP, realmente no sabes de dónde se originó el mensaje. Cualquier cosa se puede escribir en la dirección del remitente.
MickLH
0

Junto con otras respuestas, use una rueda existente: http://miniupnp.free.fr/ Esta biblioteca combate casi todas las molestias en forma funcional, dándole control sobre cuándo y cómo golpear y tirar :)

descubrimiento subrayado
fuente