← Назад к вопросам

Какой протокол в WebSocket?

2.2 Middle🔥 221 комментариев
#JavaScript Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI4 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Протокол WebSocket

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

Основной протокол и его спецификация

WebSocket работает по собственному протоколу, который формально называется The WebSocket Protocol. Этот протокол стандартизирован как RFC 6455 и работает над транспортным уровнем, чаще всего над TCP. Однако ключевой особенностью является то, что протокол WebSocket начинается как HTTP-запрос, а затем «переключается» (upgrades) на свой собственный протокол.

Процесс установления соединения выглядит следующим образом:

  1. Клиент отправляет обычный HTTP-запрос с специальными заголовками, указывающими желание открыть WebSocket-соединение.
  2. Сервер, если поддерживает протокол, отвечает подтверждением, после чего происходит «переключение протокола» (protocol upgrade).
  3. После успешного переключения дальнейшее общение происходит по протоколу WebSocket, используя собственный формат кадров (frames).

Пример начального HTTP-запроса от клиента:

GET /chat HTTP/1.1
Host: server.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=

После этого код 101 подтверждает успешное переключение, и базовый HTTP-коннектор превращается в канал для WebSocket.

Формат данных и кадры

После установления соединения данные передаются в виде кадров (frames). Кадры WebSocket имеют собственный бинарный формат, который включает:

  • Флаг FIN: указывает, является этот кадр конечным в последовательности.
  • Опкоды (opcodes): определяют тип кадра (текстовый данные, бинарные данные, закрытие соединения, ping/pong для проверки активности).
  • Маскировка (masking): применяется только к данным от клиента к серверу для безопасности.
  • Длина данных и сами данные.

Пример простого текстового сообщения в виде кадра (в концептуальном, не бинарном виде):

TEXT FRAME: opcode=1, data="Hello Server"

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

Ключевые преимущества и отличие от HTTP

  • Персистентное соединение: Одно соединение устанавливается и поддерживается долгое время, без необходимости повторных handshake.
  • Двусторонняя связь: Сервер может отправлять данные клиенту в любой момент без ожидания запроса.
  • Меньшие накладные расходы: После установления соединения каждый кадр имеет минимальные заголовки (в отличие от полноценных HTTP-заголовков в каждом запросе).
  • Поддержка суб-протоколов: Во время handshake клиент и сервер могут согласовать использование конкретного суб-протокола (например, soap, mqtt, wamp), который определяет структуру сообщений внутри WebSocket.

Использование в JavaScript (клиентская сторона)

В браузерном JavaScript WebSocket доступен через глобальный объект WebSocket. Пример создания соединения и обработки событий:

// Создание нового WebSocket-соединения
const socket = new WebSocket('wss://example.com/chat');

// Обработка открытия соединения
socket.onopen = function(event) {
  console.log('Соединение установлено');
  socket.send('Привет, сервер!'); // Отправка сообщения
};

// Обработка входящих сообщений от сервера
socket.onmessage = function(event) {
  console.log('Сообщение от сервера:', event.data);
};

// Обработка ошибок
socket.onerror = function(error) {
  console.error('Ошибка WebSocket:', error);
};

// Обработка закрытия соединения
socket.onclose = function(event) {
  console.log('Соединение закрыто', event.code, event.reason);
};

Протокол wss:// указывает на использование WebSocket over TLS, что аналогично HTTPS и обеспечивает безопасное шифрование соединения.

Роль в современных веб-приложениях

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

  • Чат-приложения и онлайн-коммуникации: мгновенная передача сообщений.
  • Финансовые платформы и биржи: реальное время для котировок и сделок.
  • Совместные редакторы и инструменты: одновременное редактирование документов несколькими пользователями.
  • Игры и интерактивные развлечения: постоянный поток событий и состояний игры.
  • Системы мониторинга и дашборды: динамическое обновление данных без перезагрузки страницы.

Таким образом, WebSocket представляет собой специализированный коммуникационный протокол, который устанавливается через HTTP handshake, но затем работает как самостоятельный, эффективный и двусторонний канал для реального времени, что делает его неотъемлемой частью современной веб-разработки.

Какой протокол в WebSocket? | PrepBro