Открыть сервис

WebSocket API

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

История

Протокол WebSocket был стандартизирован в 2011 году организацией IETF (Internet Engineering Task Force) как RFC 6455. Идея создания протокола возникла из-за ограничений технологии Comet (long polling, server-sent events), которая позволяла имитировать «push»-уведомления, но требовала постоянных HTTP-запросов от клиента, что увеличивало задержку и нагрузку на сервер. Первоначальная спецификация была предложена инженерами Google, Microsoft и Mozilla.

В 2011 году консорциум W3C (World Wide Web Consortium) опубликовал API для JavaScript, который позволяет браузерам устанавливать WebSocket-соединения. С тех пор протокол стал частью стандарта HTML5 и поддерживается всеми современными браузерами, включая мобильные версии.

Архитектура и принцип работы

Установка соединения (Handshake)

WebSocket-соединение начинается с HTTP-запроса от клиента к серверу. Этот запрос содержит заголовок Upgrade: websocket, который сигнализирует серверу о желании перейти на новый протокол. Сервер, поддерживающий WebSocket, отвечает статусом 101 Switching Protocols и подтверждает переход. После этого TCP-соединение остаётся открытым, и данные передаются в кадрированном (framed) формате.

Пример запроса клиента: `` GET /chat HTTP/1.1 Host: example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Sec-WebSocket-Version: 13 ``

Пример ответа сервера: `` HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= ``

Формат кадра

Данные передаются в виде фреймов (кадров). Каждый фрейм состоит из заголовка (2–14 байт) и полезной нагрузки (payload). Заголовок содержит:

  • opcode (тип сообщения: текст, бинарные данные, закрытие, ping/pong);
  • mask (флаг маскирования — для клиентских сообщений обязательно);
  • length (длина данных).

Все сообщения от клиента к серверу маскируются (XOR-маска) для предотвращения кэширующих прокси-серверов от интерпретации трафика как HTTP.

Жизненный цикл соединения

  1. Открытие — клиент отправляет HTTP-запрос на апгрейд, сервер подтверждает.
  2. Обмен данными — обе стороны могут отправлять фреймы в любой момент.
  3. Закрытие — любая из сторон отправляет фрейм закрытия (opcode 8), после чего соединение разрывается.

API в JavaScript

WebSocket API в браузере представлен глобальным объектом WebSocket. Основные методы и события:

  • new WebSocket(url) — создаёт экземпляр и инициирует соединение.
  • ws.send(data) — отправляет данные (строка, Blob, ArrayBuffer).
  • ws.close() — инициирует закрытие.
  • События: open, message, error, close.

Пример кода на JavaScript: ```javascript const socket = new WebSocket('wss://example.com/ws');

socket.onopen = function(event) { console.log('Соединение установлено'); socket.send('Привет, сервер!'); };

socket.onmessage = function(event) { console.log('Получено сообщение:', event.data); };

socket.onclose = function(event) { console.log('Соединение закрыто'); }; ```

Применение

Веб-чаты и мессенджеры

WebSocket обеспечивает мгновенную доставку сообщений без задержек, характерных для HTTP-опросов. Крупные сервисы (например, Slack, Telegram Web) используют WebSocket для передачи текста, файлов и уведомлений.

Онлайн-игры

В многопользовательских браузерных играх (шахматы, шутеры, стратегии) WebSocket позволяет синхронизировать состояние игрового поля, передавать действия игроков и обновлять графику в реальном времени.

Финансовые котировки

Биржевые терминалы и трейдерские платформы (например, TradingView) используют WebSocket для получения цен акций, валют и криптовалют с минимальной задержкой.

Системы мониторинга

Панели управления (дашборды) для IoT-устройств, серверов или промышленного оборудования обновляют показатели (температура, нагрузка, статус) через WebSocket, обеспечивая актуальность данных без перезагрузки страницы.

Совместная работа

Редакторы кода (Visual Studio Code Live Share) и документов (Google Docs) используют WebSocket для синхронизации изменений между участниками.

Безопасность

WSS (WebSocket Secure)

Для шифрования трафика используется протокол wss:// (WebSocket over TLS). Он аналогичен HTTPS и защищает данные от перехвата. Использование ws:// (незащищённого) в производственных средах не рекомендуется.

Ограничения браузера

  • Политика одинакового источника (Same-Origin Policy) по умолчанию запрещает WebSocket-соединения с другими доменами. Для кросс-доменных запросов сервер должен возвращать заголовок Access-Control-Allow-Origin.
  • Браузеры не позволяют устанавливать WebSocket-соединения с небезопасных (http://) страниц на защищённые (wss://`) и наоборот.

Атаки

  • CSWSH (Cross-Site WebSocket Hijacking) — злоумышленник может заставить браузер жертвы установить WebSocket-соединение с сервером, если сервер не проверяет источник запроса. Защита: проверка заголовка Origin и использование токенов аутентификации.
  • Инъекции — сервер должен экранировать данные, полученные от клиента, чтобы избежать XSS-атак при отображении.

Сравнение с альтернативами

ТехнологияТип связиЗадержкаНагрузка на серверПоддержка браузерами
WebSocketДвусторонняя, постояннаяНизкаяСредняя (одно соединение)Все современные
HTTP Long PollingКлиент-сервер, запрос-ответВысокаяВысокая (много запросов)Все
Server-Sent Events (SSE)Сервер-клиент (односторонняя)НизкаяНизкаяВсе, кроме IE/Edge Legacy
WebRTCДвусторонняя, P2PОчень низкаяНизкая (без сервера)Все современные

Ограничения

  • Несовместимость с HTTP/2 — WebSocket не использует мультиплексирование HTTP/2, так как требует собственного соединения. В HTTP/3 (QUIC) эта проблема частично решена за счёт встроенной поддержки потоков.
  • Прокси-серверы и брандмауэры — некоторые корпоративные сети блокируют нестандартные порты или протоколы, что может препятствовать работе WebSocket.
  • Отсутствие встроенной обработки ошибок — при разрыве соединения клиент должен самостоятельно реализовать логику переподключения (reconnection) и восстановления состояния.

Реализации на стороне сервера

WebSocket API поддерживается большинством серверных языков и фреймворков:

  • Node.js — библиотеки ws, socket.io (надстройка над WebSocket с резервными каналами).
  • Pythonwebsockets, aiohttp, Django Channels.
  • Java — JSR 356 (Java API for WebSocket), Spring WebSocket.
  • Go — стандартная библиотека golang.org/x/net/websocket, библиотека gorilla/websocket.
  • PHPRatchet, ReactPHP.

Стандарты и спецификации

  • RFC 6455 — основной протокол WebSocket (2011).
  • RFC 7692 — сжатие данных (permessage-deflate).
  • W3C WebSocket API — интерфейс для JavaScript.
  • RFC 8441 — использование WebSocket поверх HTTP/2.

Источники

  1. RFC 6455 — The WebSocket Protocol (IETF, 2011).
  2. W3C WebSocket API Specification (W3C, 2012).
  3. «High Performance Browser Networking» by Ilya Grigorik (O'Reilly, 2013).
  4. MDN Web Docs: WebSocket API (Mozilla).
  5. «WebSocket: Lightweight Client-Server Communications» by Andrew Lombardi (O'Reilly, 2015).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →