Как игры решают проблемы с маршрутизатором NAT? - PullRequest
2 голосов
/ 28 марта 2012

Последние несколько дней я работаю над онлайн-игрой, игрой для двух игроков, в которой один запускает сервер (прослушивает определенный порт), а другой подключается к нему, вводя его IP-адрес.У этого метода есть две проблемы:

  • Очень неудобно вводить IP-адрес оппонента.
  • Сервер не должен находиться за маршрутизатором, поскольку NAT препятствует его работе.

Первая проблема может быть решена с помощью службы знакомств, которая заботится о IP-адресе без беспокойства пользователей.Но я не уверен, как я могу решить вторую проблему.Я читал о «дыроколе по TCP», но согласно тому, что я прочитал, это невозможно сделать, когда оба игрока находятся за маршрутизатором.Если это правда, то как работают игры с такими службами сватовства, как Halo 3, где один из игроков является хостом?

Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 28 марта 2012

Я полагаю, что ваша вторая проблема также может быть решена с помощью вашей службы / сервера.Этот сервер должен знать общедоступные IP-адреса и порты двух игроков за их соответствующими NAT.Пакеты, которые получит сервер, будут содержать общедоступный IP-адрес каждого игрока.Все, что нужно сделать серверу - это перенаправить открытый IP + порт игрока на другой.Когда каждый игрок знает общедоступный IP-адрес другого, он должен иметь возможность напрямую общаться друг с другом.Однако успех методов обхода NAT сильно зависит от конфигурации каждого устройства NAT.

В земле VOIP / SIP у них есть пара RFC, которые имеют дело с этим.Отметьте ICE и ICE-TCP (для TCP), которые используют STUN и TURN .Вероятно, это немного излишне, если вы реализуете эти протоколы в своей игре, но я думаю, что они являются хорошим ресурсом для изучения методов обхода NAT.

1 голос
/ 28 марта 2012

Вы можете использовать технику, которая называется UDP Hole Punching, для игр в любом случае UDP может быть лучшим выбором.Но вам все еще нужен какой-то сервер рандеву, чтобы включить первоначальное рукопожатие клиентов.

См. Здесь для получения общей информации

0 голосов
/ 28 марта 2012

Вы не должны писать службу по поиску совпадений, которая отвечает только за поиск совпадения (список серверов AKA).

Лучшим решением было бы создать главный сервер, к которому игроки могут автоматически подключаться.Главный сервер позволяет создавать или присоединять существующие совпадения.Игроки не должны соединяться друг с другом, они всегда должны подключаться к главному серверу.

Например, «основным сервером» Halo является Xbox Live.

0 голосов
/ 28 марта 2012

На этот вопрос на GameDev.SE есть несколько полезных ответов, включая ссылку на это введение в сквозной доступ к NAT: http://www.mindcontrol.org/~hplus/nat-punch.html

...