Протокол передачи данных WebSocket: как работает и когда использовать

Веб-сокеты — это передовая технология, при помощи которой вы можете создать соединение между клиентом и сервером (браузером и сервером), чтобы обеспечить обмен сообщениями в реальном времени. Главное отличие веб-сокетов заключается в том, что они позволяют получать данные без необходимости отправлять отдельный запрос, как, например, это происходит в HTTP. После установки соединения данные будут приходить сами, не требуя отправки запроса. В этом и есть преимущество использования веб-сокетов в тех же чатах и биржевых сводках, где нужно получать постоянно обновляемую информацию. После обновления соединения протокол переключается с HTTP на WebSocket.

вебсокет

WebSocket – протокол для общения между клиентом и сервером, предоставляющий двухсторонне общение сверх протокола TCP. Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию https://deveducation.com/ в соответствии с нашей Политикой в отношении файлов cookie. Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими условиями использования и подтверждаете, что прочитали и поняли наши политику конфиденциальности и нормы поведения.

Чтобы понять, что такое протокол WebSocket, давайте посмотрим, каким был интернет до него

Несмотря на «похожесть» новых запросов и ответов на запросы и ответы протокола HTTP, они таковыми не являются. Например, в запросе есть тело, но в заголовках поле «Content-Length» отсутствует (что нарушает соглашения HTTP). Если я правильно понял постановку, вам достаточно запустить обычный web-socket сервер, но заставить клиента при соединении к websoket серверу передавать не логин пароль, а JWT токен. Пропуск сообщений скорее всего из за того что сервер шлет данные в сокет а Вы уже открыли новый и ждете данные там.

WebSocket разработан для воплощения в веб-браузерах и веб-серверах, но он может быть использован для любого клиентского или серверного приложения. Протокол WebSocket — это независимый протокол, основанный на протоколе TCP. Он делает возможным более тесное взаимодействие между браузером и веб-сайтом, способствуя распространению интерактивного содержимого и созданию приложений реального времени. При работе по протоколу WebSocket вы будете использовать обычные сокеты для соединения. Так же как и при работе с другими протоколами будут использованы сокеты (и для работы с http, с ftp и др.). Существуют разные способы передачи данных от браузера или приложения к серверам и обратно.

Пример

В отличие от протокола 76, согласно которому данные передаются без шифрования[1], каждый байт передаваемых от клиента (браузера) серверу данных в этой версии протокола обязательно маскируется 4-байтовой маской[2]. Основные преимущества веб-сокетов связаны с их способностью одновременно вебсокет и независимо обрабатывать несколько передач данных без необходимости использования новых соединений или ресурсов сервера. Более того, накладные расходы на заголовок, связанные с протоколом Websocket, значительно ниже, чем с традиционным HTTP, что повышает эффективность сети.

вебсокет

Веб-сокеты являются одной из самых перспективных веб-технологий, которую уже сейчас используют многие разработчики. Она отлично подходит для взаимодействия в режиме реального времени, в том числе в онлайн-играх. Единственный минус — это несовместимость с некоторыми браузерами, но уже 95 % браузеров поддерживают веб-сокеты.

Пример браузерного кода

Такая хитрая схема нужна, чтобы минимизировать накладные расходы. Для сообщений длиной 125 байт и меньше хранение длины потребует всего 7 битов, для бóльших (до 65536) – 7 битов + 2 байта, ну а для ещё бóльших – 7 битов и 8 байт. Этого хватит для хранения длины сообщения размером в гигабайт и более. В обычном WebSocket равны 0, предназначены для расширений протокола. Одно сообщение, если оно очень длинное (вызовом send можно передать хоть целый файл), может состоять из множества фреймов («быть фрагментированным»). Сначала идёт бит FIN (вертикальная надпись на рисунке), затем биты RSV1, RSV2, RSV3 (их смысл раскрыт ниже), затем «опкод», «МАСКА» и, наконец, «Длина тела», которая занимает 7 бит.

  • Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
  • Протокол WebSocket — это независимый протокол, основанный на протоколе TCP.
  • Для сообщений длиной 125 байт и меньше хранение длины потребует всего 7 битов, для бóльших (до 65536) – 7 битов + 2 байта, ну а для ещё бóльших – 7 битов и 8 байт.
  • К таким сервисам можно приравнять ленту новостей в Twitter или информационную панель с котировками акций в режиме реального времени.

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

Как работает WebSocket и в чем его отличия от HTTP

Свойство socket.bufferedAmount хранит количество байт буферизованных данных на текущий момент, ожидающих отправки по сети. Вызов socket.send(body) принимает body в виде строки или любом бинарном формате включая Blob, ArrayBuffer и другие. Дополнительных настроек не требуется, просто отправляем в любом формате. Метод WebSocket .send() может отправлять и текстовые, и бинарные данные. Здесь Sec-WebSocket-Accept – это Sec-WebSocket-Key, перекодированный с помощью специального алгоритма. Браузер использует его, чтобы убедиться, что ответ соответствует запросу.

вебсокет

Наличие такого фрейма позволяет отличить «чистое закрытие» от обрыва связи. При закрытии соединения сторона, желающая это сделать (обе стороны в WebSocket равноправны) отправляет закрывающий фрейм (опкод 0x8), в теле которого указывает причину закрытия. Тот, кто хочет проверить соединение, отправляет фрейм PING с произвольным телом. Его получатель должен в разумное время ответить фреймом PONG с тем же телом. Например, идёт поиск в базе данных и что-то уже найдено, а что-то ещё может быть позже.

REST и REST-Over-Websocket в браузере

Обещанная ссылка на репозиторий с таск-лист приложением, в котором все действия можно выполнять и через HTTP, и через Websocket. Именно отсутствие каких-либо наворотов в протоколе WebSocket и дает ему возможность быстрой работы. Это абстрактное понятие, которое, в большинстве случаев, используется для коммуникации программ в сети (но не только). Вы также можете скачать его (верхняя правая кнопка в ифрейме) и запустить локально. Только не забудьте установить Node.js и выполнить команду npm install ws до запуска.

Веб-сокеты под капотом

Также не стоит использовать веб-сокеты в REST API, поскольку вам хватит таких HTTP-запросов, как GET, POST, DELETE и PUT. Если пользователю нужны статичные или медленно обновляемые данные, веб-сокеты не требуются. Например, информационная статья, каталог товаров на сайте не меняются в течение долгого времени.