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

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


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.

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.