Как сделать так, чтобы многопользовательская игра надежно работала за NAT?


20

Даже игры, которые на 100% клиент / сервер, иногда имеют проблемы, когда клиент находится за NAT. Игры Peee-Peer - еще большая проблема. В некоторых играх необходимо использовать несколько транспортов (например, UDP и TCP) или несколько подключений (например, другой порт UDP для голоса).

Какими способами можно убедиться, что игра работает надежно при работе за маршрутизатором NAT?

  • Одноранговый: централизованный сервер не существует. Игрок A начинает игру, а игрок B хочет присоединиться
  • Клиент-сервер: централизованный сервер по общеизвестному адресу (имя хоста) принимает все входящие соединения. Каждый клиент общается только с этим сервером.
  • Комбо: Там, где сервер только подыскивает, а обновления игры равноправны. Разные одноранговые узлы могут видеть каждого проигрывателя с разным IP / портом (например, некоторые клиенты находятся за одним и тем же NAT, а другие - на другом маршрутизаторе).

Ответы:


9

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

Есть проект OSS по крайней мере для UDP: http://udt.sourceforge.net/index.html

RakNet также поддерживает punch-through. Он коммерческий, но имеет бесплатную "инди" лицензию. Смотрите здесь: http://www.jenkinssoftware.com/

Погуглив для «NAT punch», вы получите гораздо больше материала для чтения


1
Я знаю, что это действительно старый вопрос и ответ, но если кто-то прочитает это, RakNet приобретается OculusVR и теперь с открытым исходным кодом с лицензией BSD с 2 пунктами. github.com/OculusVR/RakNet
Quad

9
  • Не заставляйте клиента сообщать серверу или пиру о своем собственном адресе. Другими словами, не встраивайте IP-адрес клиента A в игровой пакет, а клиент B или сервер отвечают на этот адрес. Всегда отвечайте на адрес / порт, с которого пришло сообщение.

  • Минимизируйте различные порты UDP или TCP, используемые для игры. Это упрощает настройку правил NAT.

  • Разрешить пользователю переопределить порт по умолчанию, используемый в игре. Таким образом, несколько серверов могут быть размещены за одним и тем же NAT.

  • Документируйте порты и любые правила, которым они следуют, в документации к вашей игре (спасибо за это Zorba). В Descent 3 я дошел до создания отдельного тестового приложения, которое помогло бы вам устранить неполадки в конфигурации маршрутизатора или NAT, отправив пакеты на тестовый сервер.

7
В дополнение к этому, в противном случае, хорошему ответу, включите примечание игровых портов в документацию к игре . Удивительно, как много игр этого не делают - люди вручную вырывают порты с помощью «netstat» и наполовину ошибаются.
ZorbaTHut

С UDP вы действительно не знаете, откуда пришло сообщение. В обратном адресе можно написать что угодно.
MickLH

0

Наряду с другими ответами, используйте существующее колесо: http://miniupnp.free.fr/ Эта библиотека борется почти со всеми неудобствами в функциональной форме, давая вам контроль над тем, когда и как пробивать и тянуть :)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.