Gymterview
middle

Что такое WebSocket и чем он отличается от HTTP?

WebSocket — протокол прикладного уровня, обеспечивающий постоянное двунаправленное (full-duplex) соединение между клиентом и сервером поверх TCP. Определён в RFC 6455.

Аналогия из жизни: HTTP — это обмен письмами: вы отправляете вопрос, ждёте ответ. WebSocket — это телефонный звонок: связь установлена, и обе стороны могут говорить в любой момент, не дожидаясь друг друга.

Сравнение HTTP и WebSocket

Свойство HTTP WebSocket
Модель Запрос-ответ (request-response) Двунаправленный обмен (full-duplex)
Инициатор Только клиент отправляет запрос Обе стороны могут отправлять сообщения в любой момент
Соединение Создаётся на каждый запрос (или keep-alive с ограничениями) Постоянное, пока явно не закрыто
Заголовки В каждом запросе/ответе Только при установлении соединения (handshake)
Протокол http:// / https:// ws:// / wss:// (шифрованный)
Накладные расходы на сообщение Высокие (заголовки 200+ байт в каждом сообщении) Низкие (фрейм 2–14 байт)
Направление данных Сервер → клиент только в ответ на запрос Сервер может отправлять данные в любой момент (push)

Установление WebSocket-соединения (handshake)

WebSocket начинается как обычный HTTP-запрос с заголовком Upgrade:

Запрос клиента:

Пример
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=

После этого протокол переключается с HTTP на WebSocket, и обе стороны обмениваются лёгкими бинарными фреймами напрямую.

Когда использовать WebSocket

  • Чаты, мессенджеры
  • Уведомления в реальном времени (notifications, alerts)
  • Онлайн-игры
  • Биржевые котировки, live-данные (финансовые терминалы)
  • Collaborative editing (совместное редактирование документов)
  • IoT — потоковые данные с устройств

Когда НЕ использовать WebSocket

  • Обычные CRUD-операции — REST/HTTP достаточно и проще
  • Нечастые обновления — SSE (Server-Sent Events) проще для однонаправленного push от сервера к клиенту
  • Нет необходимости в двусторонней коммуникации — long polling может быть достаточен

Альтернативы WebSocket

Технология Направление Транспорт Когда использовать
WebSocket Двунаправленный TCP Чаты, игры, полный дуплекс
SSE (Server-Sent Events) Сервер → клиент HTTP Уведомления, ленты обновлений
Long Polling Запрос-ответ (имитация push) HTTP Простые случаи, совместимость
gRPC streaming Двунаправленный HTTP/2 Микросервисы, высокая производительность

Для Java-разработчика

  • Spring WebSocket@EnableWebSocket, WebSocketHandler — низкоуровневый API
  • Spring STOMP over WebSocket@MessageMapping, @SendTo — высокоуровневый pub/sub с поддержкой брокеров (RabbitMQ, ActiveMQ)
  • Jakarta WebSocket API@ServerEndpoint, @OnMessage — стандартный Java EE API
  • Spring поддерживает SockJS как fallback для браузеров без WebSocket

Вывод

WebSocket решает фундаментальное ограничение HTTP — невозможность сервера инициировать отправку данных клиенту. Он незаменим для приложений реального времени, но избыточен для обычных CRUD-операций.

На собеседовании: объясните, что WebSocket начинается как HTTP (Upgrade handshake), а затем переключается на собственный протокол. Покажите понимание, когда WebSocket нужен, а когда достаточно SSE или обычного HTTP. Часто спрашивают о практическом опыте с Spring WebSocket/STOMP.