Como fazer um jogo multiplayer funcionar de forma confiável por trás do NAT?

20

Mesmo jogos 100% cliente / servidor às vezes apresentam problemas quando o cliente está atrás do NAT. Jogos peee-peer são problemas ainda maiores. Alguns jogos precisam usar vários transportes (como UDP e TCP) ou várias conexões (como uma porta UDP diferente para voz).

Quais são algumas maneiras de garantir que um jogo funcione de maneira confiável quando executado atrás de um roteador NAT?

  • Ponto a ponto: não existe servidor centralizado. O jogador A inicia um jogo e o jogador B quer entrar
  • Cliente-servidor: um servidor centralizado em um endereço conhecido (nome do host) aceita todas as conexões de entrada. Cada cliente se comunica apenas com esse servidor.
  • Combinação: onde o servidor é apenas uma partida, mas as atualizações do jogo são ponto a ponto. Pares diferentes podem ver cada jogador com um IP / porta diferente potencialmente (por exemplo, alguns clientes estão atrás do mesmo NAT e outros em um roteador diferente)
kevin42
fonte

Respostas:

9

A técnica mais usada é chamada de passagem de NAT. Aqui está uma introdução decente: http://www.mindcontrol.org/~hplus/nat-punch.html

Há um projeto OSS pelo menos para UDP: http://udt.sourceforge.net/index.html

RakNet também suporta punch-through, acredito. É comercial, mas tem uma licença "Indie" gratuita. Veja aqui: http://www.jenkinssoftware.com/

Pesquisando no "NAT punch", você terá muito mais material de leitura

Rachel Blum
fonte
11
Sei que essa é uma pergunta e resposta muito antiga, mas se alguém ler isso, a RakNet é adquirida pela OculusVR e agora é de código aberto com licença BSD de 2 cláusulas. github.com/OculusVR/RakNet
Quad
9
  • Não faça com que um cliente informe o servidor ou o par de seu próprio endereço. Em outras palavras, não incorpore o IP do cliente A em um pacote de jogos e faça com que o cliente B ou o servidor responda a esse endereço. Sempre responda ao endereço / porta de onde a mensagem se originou.

  • Minimize as diferentes portas UDP ou TCP usadas para o jogo. Isso facilita a configuração das regras NAT.

  • Permitir que o usuário substitua a porta padrão usada no jogo. Dessa maneira, vários servidores podem ser hospedados atrás do mesmo NAT.

  • Documente as portas e quaisquer regras que eles sigam na documentação do jogo (obrigado por esse Zorba). No Descent 3, fui até a criação de um aplicativo de teste independente que ajudaria a solucionar problemas de configuração do roteador ou NAT enviando pacotes para um servidor de teste.
kevin42
fonte
7
Além dessa resposta boa, inclua uma nota das portas do jogo na documentação do jogo . É incrível quantos jogos não fazem isso - as pessoas eliminam as portas manualmente com o "netstat" e entendem errado metade delas.
ZorbaTHut
Com o UDP, você realmente não sabe de onde a mensagem se originou. Tudo pode ser escrito no endereço de retorno.
MickLH
0

Juntamente com outras respostas, use uma roda existente: http://miniupnp.free.fr/ Esta biblioteca combate quase todos os aborrecimentos na forma de funções, oferecendo controle sobre quando e como perfurar e puxar :)

underscorediscovery
fonte