Постоянное подключение к серверу онлайн
Итак, я изучал онлайн-игры и мне было интересно, как им удалось установить такое быстрое, казалось бы, постоянное соединение с сервером. Я уже пытался просто отправить кучу XMLHttpRequest
с, но они, как правило, медленные. Я также пытался исследовать, но большинство статей по этой теме говорят о таких вещах, как веб-сокеты, tcp и udp, концепции, которые я вообще не понимаю. Я также пытаюсь сделать все это без импорта кода из внешнего источника, чтобы я мог лучше понять, как все это работает. Пожалуйста, помоги, если можешь. Спасибо!
1 ответ
Ваш вопрос, безусловно, слишком широк для этой платформы.
Я отвечу, что могу, вкратце.
AJAX / XMLHttpRequest
XMLHttpRequest
API (часто) будет открывать новое соединение с хостом при каждой отправке данных. Это очень дорогая операция, которая ухудшит производительность.
Еще один момент, который следует учитывать, это то, что 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 для данных, которые должны безопасно передаваться.