Постоянное подключение к серверу онлайн - PullRequest
0 голосов
/ 13 января 2019

Итак, я изучал онлайн-игры и мне было интересно, как им удалось установить такое быстрое, казалось бы, постоянное соединение с сервером. Я уже пытался просто отправить кучу XMLHttpRequest с, но они, как правило, медленные. Я также пытался исследовать, но большинство статей по этой теме говорят о таких вещах, как веб-сокеты, tcp и udp, концепции, которые я вообще не понимаю. Я также пытаюсь сделать все это без импорта кода из внешнего источника, чтобы я мог лучше понять, как все это работает. Пожалуйста, помоги, если можешь. Спасибо!

1 Ответ

0 голосов
/ 13 января 2019

Ваш вопрос слишком широк для этой платформы.

Я отвечу, что смогу, кратко.

AJAX / XMLHttpRequest

API XMLHttpRequest (часто) будет открывать новое соединение с хостом при каждой отправке данных. Это очень дорогая операция, которая снижает производительность.

Еще один момент, на который следует обратить внимание: XMLHttpRequest будет всегда отправлять аутентификацию и другие заголовки, тратя впустую и пропускную способность, и циклы ЦП как на клиенте, так и на сервере.

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

Наконец, AJAX / XMLHttpRequest будет использовать TCP / IP-соединение, что замечательно, если вы должны убедиться, что все данные получены в порядке, но происходит снижение производительности.

WebSockets

WebSockets - это протокол, который работает через потоковое соединение, такое как соединения TCP / IP (или каналы или сокеты unix).

Как только соединение установлено, оно является постоянным и позволяет осуществлять двустороннюю связь. Это позволяет и клиенту, и серверу инициировать обновление без опроса и без дополнительных затрат (заголовки, повторная аутентификация и т. Д.).

WebSockets по-прежнему находится через потоковый сокет, такой как сокет TCP / IP, который обеспечивает постоянную производительность в обмен на целостность данных (все данные поступают в порядке).

сокеты TCP / IP

TCP / IP - это потоковый протокол, а не протокол на основе сообщений. По этой причине он часто используется с другим протоколом (например, WebSockets или с пользовательским протоколом).

Поскольку WebSockets будет использовать TCP / IP в 99,9% случаев (если только не на том же компьютере или в особых случаях), здесь применимы те же проблемы, которые я описал для WebSockets.

Однако, используя собственный протокол с TCP / IP, можно добиться некоторой оптимизации производительности (по цене, связанной с сетевым подключением и промежуточными помехами).

UDP (датаграмма)

Многие игры не требуют целостности данных. Не имеет значения, потеряны ли некоторые пакеты, более важно, чтобы последняя информация поступала как можно быстрее.

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

По этим причинам в некоторых играх требуются сокеты UDP для быстрых обновлений, при этом все еще используется соединение TCP / IP для данных, которые должны безопасно доставляться.

...