УДК 004

Описание и преимущества протокола WebSocket

Копылова Яна Антоновна – студент направления Прикладной информатики Российского технологического университета Института информационных технологий.

Матвеев Владимир Евгеньевич – студент направления Прикладной информатики Российского технологического университета Института информационных технологий.

Аннотация: В современном мире повсеместно используется сетевое взаимодействие различных устройств. Наиболее распространенным протоколом для связи клиента с сервером является протокол HTTP, однако он обладает рядом ограничений, которые в некоторых ситуациях могут быть критичны. Например, клиент не может узнать об изменении информации на сервере, не отправив для этого отдельный запрос. Для решения этой и других проблем был разработан протокол WebSocket, работающий по принципу постоянной двунаправленной связи. В данной статье будет рассмотрено общее устройство данного протокола, а также описан процесс взаимодействия устройств, использующих его.

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

Существует множество различных способов для связи приложений, в том числе по сети. Одним из таких вариантов является протокол WebSockets, работающий поверх TCP соединения. Основной особенностью данного протокола является критическое отличие от привычного построения сетевого взаимодействия. Данный протокол является надстройкой над HTTP протоколом, работающим по схеме “запрос-ответ”, и благодаря ему можно построить полностью асинхронное взаимодействие.

В концепции websockets все еще существуют роли клиент и сервер: клиент отправляет специальный запрос и если сервер поддерживает сокеты, то он отправляет соответствующий ответ. После этого настроенное TCP соединение не разрывается, в отличии от привычного алгоритма, а остается открытым, что позволяет клиенту и серверу обмениваться сообщениями.

Для установления соединения клиент отправляет серверу запрос об “улучшении” их связи до протокола WebSockets. Для этого в GET-запросе указываются специальные заголовки, такие как Connection со значением Upgrade и Sec-WebSocket-Key, содержащий зашифрованный ключ соединения. Итоговый формат запроса описан в Листинге 1.

Листинг 1 - Запрос от клиента для установления WebSocket соединения

GET ws://websocketexample.com:8181/ HTTP/1.1

Host: localhost:8181

Connection: Upgrade

Pragma: no-cache

Cache-Control: no-cache

Upgrade: websocket

Sec-WebSocket-Version: 13

Sec-WebSocket-Key: 3t4jhT32u46b7puRwrTYos==

Если сервер поддерживает данный протокол, то он отправляет специальный ответ, содержащий заголовок Sec-WebSocket-Accept, в котором находится фрагмент полученного сервером ключа. Такой подход необходим для корректной работы системы в случае, если WebSocket протокол не поддерживается на сервере. Заголовки ответа описаны в Листинге 2.

Листинг 2 - Ответ от сервера для установки соединения

HTTP/1.1 101 Switching Protocols

Upgrade: websocket

Connection: Upgrade

Sec-WebSocket-Accept: rG8abbamHTJ85lJgAE37TRTmcCE=

Данный протокол обладает своими преимуществами. Во-первых, используя такое подключение можно значительно повысить скорость взаимодействия между системами, так как время не тратится на установления соединения, подтверждение и переговоры, правда это накладывает свои ограничения, ведь размер TCP пакета сильно ограничен и слишком большое количество данных за один раз передать не удастся. Во-вторых, сокет соединение не имеет ограничений на время жизни и не тратит большого количества ресурсов для фоновой работы, что позволяет избавиться от различных систем для обновления соединения, которое может вызвать ряд затруднений. Наконец, одно из основных преимуществ, помимо тех, что были упомянуты выше - необязательность ролей в клиент-серверном взаимодействии. Это подразумевает под собой то, что оба участника соединения могут как генерировать сообщения, так и прослушивать их, упрощая взаимодействие и снимая нагрузку с подключения. Например, для частого обновления информации с сервера, клиенту не нужно отправлять десятки запросов каждую секунду, а достаточно лишь ожидать нужного сообщения от сервера и своевременно обновлять полученную информацию.

Помимо прочего вебсокеты имеют уже множество готовых библиотек для работы с ними на разных языках, причем эти библиотеки упрощают работу с протоколом еще сильнее. Так, частой практикой является введение системы каналов и событий: при отправке сообщения у него указывается также имя канала и/или события, в некотором роде имитируя привычные endpoint’ы. К такому подходу, например, прибегают в библиотеке socket.io, реализованной на множестве современных языков программирования. Данный подход накладывает и свои ограничения, так как чаще всего такие надстройки не стандартизированы, а значит либо необходимо использовать одну и ту же библиотеку как на клиенте, так и на сервере, либо вручную редактировать отправленные и прослушиваемые сообщения для соответствия настройкам на другом конце подключения.

Данный протокол уже реализован и используется во многих системах. Так, например, в видеомикшере OBS есть встроенный сервер websocket, позволяющий как управлять программой, так и прослушивать различные события, происходящие во время записи. Такой формат наиболее предпочтителен для данной программы, так как позволяет поддерживать двустороннюю связь, а также своевременно реагировать на события в связи с постоянным подключением.

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

Рисунок1

Рисунок 1. Стандартное клиент-серверное взаимодействие

Что касается использования протокола websockets, он позволяет единожды установить соединение и получить сообщение на клиенте в тот момент, в который оно появилось на сервере (см. Рисунок 2)

Рисунок2

Рисунок 2. Взаимодействие при помощи протокола WebSockets

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

Список литературы

  1. Что такое веб-сокеты и как они вообще работают – Текст : электронный // Hexlet: [сайт]/ – 2023. – URL: https://ru.hexlet.io/blog/posts/chto-takoe-websocket-i-kak-oni-voobsche-rabotayut (дата обращения: 29.12.2023).
  2. The WebSocket Protocol – Текст : электронный // RFC-Editor: [сайт]/ – 201 – URL: https://www.rfc-editor.org/rfc/rfc6455 (дата обращения: 30.12.2023).
  3. WebSocket: что это, когда следует использовать и какие преимущества дает – Текст : электронный // CloudVK: [сайт]/ – 2021. – URL: https://cloud.vk.com/blog/websocket-kogda-sleduet-ispolzovat-i-preimushhestva (дата обращения: 30.12.2023).
  4. WebSockets – Текст : электронный // WhatWG: [сайт]/ – 2023. – URL: https://websockets.spec.whatwg.org (дата обращения: 02.01.2024).
  5. WebSocket – Текст : электронный // Learn JavaScript: [сайт]/ – 2022. – URL: https://learn.javascript.ru/websockets (дата обращения: 03.01.2024).