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 взаимодействия.