Что такое 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.