Как MMO справится с подсчетом и отправкой пакетов для тысяч игроков каждый тик в игре с живым действием?

Я работаю над игрой, и я думаю о том, чтобы войти в сеть. Я программировал около 5 лет и занимался разработкой игр последние 2 года. Я действительно учусь только онлайн и по книгам в свободное время. Я планирую сделать java-сервер для Amazon AWS EC2, но мне просто интересно, как ММО справляется с несколькими игроками каждый тик.

Это просто мощь серверов? Я не ищу код или что-нибудь, просто в целом, как работают серверы.

Сервер просто выполняет все вычисления для всех игроков и десятков или сотен тысяч объектов, а затем отправляет и получает тысячи пакетов каждый тик? Кажется, что одному компьютеру это сложно, но это действительно сервер.

2 ответа

Решение

Как работает и какова работа сервера?

  • Ваш сервер создаст сокет и откроет порт.

  • Протокол для онлайн-игры обычно в UDP, потому что он быстрее.

  • Ваш сервер должен обрабатывать ВСЕ клиентские соединения.

  • Вы можете добавить сервер, который может войти в учетную запись и перенаправить его на игровой сервер (это относится ко всем большим MMO).

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

  • Таким образом, сервер является основной частью онлайн-игры.

На самом деле, компьютер действительно быстр для выполнения некоторых вычислений, самая тяжелая часть современной видеоигры - это физика и графика... К счастью, обе эти части находятся на клиентской части.

Но сервер должен быть сильным! Не как клиент, потому что ему не нужен большой графический процессор, но ему нужно большое количество оперативной памяти / процессора (зависит от игры), и он также должен оставаться холодным.

Фактически, игровой сервер может обрабатывать большое количество соединений благодаря протоколу UDP и потому, что все тяжелые части программы находятся на стороне клиента. Вы можете посмотреть здесь: Создание многопользовательской игры на python и прочитать часть, когда я объясню разницу между протоколом UDP и TCP.

All the others informations about how work an MMO server are linked at the end of this topic.

Теперь мы можем попытаться построить сервер!

Во-первых, вы знаете, как создать сервер?

  • Запрограммируйте или загрузите сервер для проведения теста (например, TeamSpeak или Mumble).

  • Запустите его с вашего компьютера и разрешите его входные соединения с вашего брандмауэра.

  • Войдите в свой модем и перенаправьте / перенаправьте порт вашего сервера на ваш компьютер.

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

Теперь вы можете попробовать войти на ваш сервер. Но...!

Ваш компьютер имеет три IP-адреса:

  • Адрес обратной связи: localhost, 127.0.0.0 ("0" может измениться)

  • Адрес в интрасети (IP-адрес вашего компьютера): 192.168.0.0, 172.16.0.0, 10.0.0.0

  • И интернет-адрес (IP-адрес вашего модема): 0.0.0.0

Как узнать ваш IP интранет / интернет? Это зависит от вашей операционной системы и вашего модема. Для внутренней сети используйте свой терминал и напишите "ifconfig" или "ipconfig". Для вашего интернет-адреса иногда пишется, когда вы входите в свой модем, или вам нужно посетить веб-сайт, который может показать вам ваш IP.

Если вы создали сервер и не перенаправили порт с вашего модема, вы все равно можете получить доступ к своему серверу локально с помощью вашего адреса обратной связи, а другие компьютеры, подключенные к тому же модему, также могут получить доступ к серверу с адресом интрасети. Кроме того, если вам нужно проверить, доступен ли ваш сервер из интернета, вам нужно проверить соединение с вашим интернет-IP, но некоторые модемы не разрешают внешние соединения из интранета... Так что если ваше соединение с интернет-IP не работает, попробуйте зайти на ваш сервер с другого модема (компьютер друга, Cyber-Coffee...).

Наконец, как защитить свой сервер?

Это действительно сложно, и вы не можете создать идеальную защиту... Особенно, если вы следовали моим советам, но вы не дополнили мои знания собственным исследованием.

  • Корневой доступ

Это самая важная часть. Когда ламер пытается получить доступ к вашему серверу, он может просто попробовать простое соединение, такое как http / ssh / ftp. Если он может получить доступ к вашему жесткому диску, а вы не выбрали строгое ограничение, он может просто прочитать / изменить / удалить базу данных вашей игры. База данных содержит всю информацию о счетах.

  • Брандмауэр

Мы уже говорили о количестве соединений / вычислений, которые сервер должен обработать. В некоторых атаках ламеры пытаются создать большое количество соединений и не закрывают их. Мы называем это DOS (с 1 компьютером) или DDOS (более 1 компьютера). Таким образом, вам нужен хороший брандмауэр для: разрешите только порт вашего сервера, разрешите только X номеров подключений с уникального IP-адреса и разрешите только X номеров новых подключений каждую минуту.

  • Обновления

Это самая простая часть: обновлять операционную систему (и другие приложения).

  • Чем меньше тем лучше

Не устанавливайте много бесполезного программного обеспечения на свой сервер. Если программное обеспечение не импортируется для вашего сервера, вы не должны устанавливать его, потому что: во-первых, это может быть вирус. Во-вторых, вредоносная программа может использовать это программное обеспечение для установки вируса или кражи корневого доступа.

  • шифрование

Шифрование действительно важно для блокировки хакера. Например, с помощью протокола https вы можете защитить пароли пользователя от атаки MITM. А с помощью Bluefish/SHA/others вы можете зашифровать свою базу данных, чтобы защитить ее, даже если хакер сможет ее прочитать. Самое главное всегда блокировать право хакера на запись / изменение / удаление / выполнение (на самом деле, все клиенты вашей игры нуждаются в доступе для чтения).

  • Антивирусные?

В случае онлайн-игры антивирус не очень важен (но все же рекомендуется для всех операционных систем, в том числе для Linux/Unix).

  • Иметь хороший сервер

Если ваш сервер запрограммирован без заботы о безопасности, у вас могут возникнуть проблемы. Пример: атака переполнения буфера в C / C++.

If you need more informations about how work an MMO, I recommend you:

Подсказка - если вам интересно создать онлайн-игру, вам нужно провести много исследований, я не могу ответить на этот вопрос, потому что это не цель предмета. И эта тема слишком велика, чтобы написать новый ответ на каждый вопрос... Какое программное обеспечение используется для программирования игры? Как построить сокет? С чего началось? Но я уже отвечал на некоторые похожие вопросы. Даже если язык программирования иногда отличается, я даю вам ссылку, логика всегда одна и та же, поэтому она может вам помочь:

Большинство MMO имеют достаточное количество клиентской логики, поэтому серверу не нужно постоянно отправлять множество пакетов каждому игроку. Сервер не выполняет вычисления для всех игроков, клиент выполняет тяжелую работу, а сервер взаимодействует с клиентами и состоянием виртуального мира в базе данных.

Например, ваш клиент и сервер могут иметь одну и ту же модель мира. Таким образом, ваш игрок может перемещаться по миру, а клиентский код сообщает серверу с достаточным интервалом курса (скажем, сотни мсек).

Как правило, вы хотите, чтобы ваши клиенты обновляли себя до сервера, и чтобы ответ сервера отвечал за синхронизацию клиентов.

ММО также используют несколько серверов в своих фермах, от десятков до сотен. Эти серверы обычно взаимодействуют с большой высокопроизводительной базой данных - в основном состояние виртуального мира находится в базе данных, а серверы находятся между обновлением базы данных и связью с клиентскими приложениями.

Другие вопросы по тегам