Примечание: это вопрос о сети, а не об играх. Я использую StarCraft просто в качестве примера.
Игра StarCraft (не StarCraft 2) поддерживает онлайн-игру. Один человек принимает гостей, а другие присоединяются. Если хозяин уходит во время игры, игра может продолжаться бесконечно без хозяина. Как это работает?
Рассмотрим следующий сценарий:
- Я размещаю 3 против 3. Обратите внимание, что для того, чтобы люди могли присоединиться, мой маршрутизатор должен быть настроен на перенаправление портов 6112, TCP и UDP (см. Поддержка Blizzard ).
- Пять человек присоединяются. Все (включая меня) находятся за роутером. Я начинаю игру.
- Через три минуты игры около двадцати фанатиков вливаются в мою базу. Никто не помогает мне.
- Моя база уничтожена, поэтому я ухожу (игра не дает вам выбора).
- Игра продолжается без хозяина (у хозяев осталось два игрока).
Как оставшиеся пять клиентов (которым не нужно пересылать 6112) остаются подключенными?
Если я правильно понимаю: если две программы хотят общаться друг с другом, одна из них должна быть «сервером» и прослушивать соединения через порт, тогда как другая должна быть «клиентом» и инициировать запрос соединения на этом порт. Они не могут просто начать посылать пакеты друг другу (и я даже не знаю, как они будут, если оба находятся за маршрутизаторами).
Кто-то, принимающий игру, является сервером, а те, кто присоединяется к ней, являются клиентами. Легко увидеть, как клиенты могут начать общаться с сервером. Чего я не понимаю: как клиенты начинают общаться друг с другом, не проходя через сервер? Разрешает ли интернет-протокол серверу устанавливать соединения между клиентами?
Вполне возможно, что в случае StarCraft игровой трафик проходит через серверы Battle.net. StarCraft поддерживает соединение с Battle.net во время игр (для сообщений от друзей и т. Д.). Однако я сомневаюсь, что игровой трафик проходит через него, потому что, если он это сделал, зачем хостам нужно переносить вперед 6112?
Мой вопрос: может ли сервер с несколькими подключенными к нему клиентами инициировать соединения между ними?
I host a 3 versus 3. Note that, for people to be able to join, my router has to be configured to port forward 6112, TCP and UDP (see Blizzard Support).
Очевидно, это необходимо для запуска игры, чтобы пользователи могли найти вас, но не обязательно оставаться на связи.