WebSocket

Введение

WebSocket – протокол связи по TCP, стандартизованный в RFC 6455 (2011 год). Обеспечивает полнодуплексный постоянный канал между клиентом (браузером) и сервером: обе стороны могут отправлять сообщения в любое время без инициирования нового соединения.

До WebSocket для real-time обновлений использовались неэффективные техники: long polling, Server-Sent Events, или постоянное переоткрытие HTTP-соединений. WebSocket решил эту проблему элегантно, оставаясь совместимым с существующей HTTP-инфраструктурой.

История и контекст

Протокол WebSocket разработан в рамках HTML5 инициативы. В 2009 году появились первые черновики, в 2011-м RFC 6455 стал стандартом IETF. Все современные браузеры поддерживают WebSocket начиная с 2012 года. В 2018-м RFC 8441 добавил поддержку WebSocket поверх HTTP/2.

Версия протокола – только 13 (с 2011 года, других актуальных версий нет). Порты по умолчанию: 80 для ws://, 443 для wss:// (зашифрованный через TLS).

Как это работает

Установка соединения (handshake): клиент отправляет обычный HTTP/1.1 GET-запрос с заголовками:

  • Upgrade: websocket – запрос смены протокола;
  • Connection: Upgrade – обязательный сопутствующий заголовок;
  • Sec-WebSocket-Key – случайный base64-ключ для верификации сервера;
  • Sec-WebSocket-Version: 13 – версия протокола.

Сервер отвечает статусом 101 Switching Protocols и заголовком Sec-WebSocket-Accept. После этого HTTP-соединение «переключается» в WebSocket-режим.

Передача данных: информация передаётся фреймами. Каждый фрейм содержит опкод (text, binary, ping, pong, close), длину и полезную нагрузку. Текстовые фреймы должны быть в кодировке UTF-8. Клиентские фреймы маскируются ключом для предотвращения атак на промежуточные узлы.

Где применяется

  • Чаты и мессенджеры – мгновенная доставка сообщений;
  • Финансовые терминалы – котировки акций и криптовалют в реальном времени;
  • Многопользовательские игры – синхронизация состояния игры;
  • Совместное редактирование документов (Google Docs-стиль);
  • Мониторинг и дашборды – live-метрики без перезагрузки страницы.

Преимущества и ограничения

Преимущества: значительно меньший overhead по сравнению с HTTP polling; полнодуплексность; низкая задержка; совместимость с HTTP-инфраструктурой (прокси, брандмауэры).

Ограничения: stateful-соединения сложнее масштабировать горизонтально (требуется sticky sessions или pub/sub брокер); не проходит через некоторые корпоративные прокси; нет встроенного механизма восстановления – требуется реализовывать reconnect с exponential backoff на клиенте.

Связь с другими понятиями

OpenAPI не поддерживает WebSocket – для описания event-driven протоколов используется AsyncAPI. Очередь сообщений (Kafka, RabbitMQ) решает схожую задачу асинхронного обмена, но на серверной стороне. Service Mesh (Istio) поддерживает балансировку WebSocket-трафика. WebSocket и gRPC – две современные альтернативы REST для real-time взаимодействия.