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

Как работает websocket?

1.6 Junior🔥 214 комментариев
#Soft skills и карьера

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

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

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

Как работает WebSocket: протокол для полноценного двустороннего общения

WebSocket — это современный протокол связи поверх TCP, обеспечивающий полнодуплексный (full-duplex) канал между клиентом (чаще всего браузером) и сервером. В отличие от классического HTTP с его циклом «запрос-ответ», WebSocket позволяет после установки соединения передавать данные в любом направлении в любой момент, что делает его идеальным для чатов, онлайн-игр, биржевых тикеров в реальном времени и live-уведомлений.

Ключевые принципы работы

Протокол работает по модели клиент-сервер и состоит из двух основных фаз:

  1. Фаза «рукопожатия» (Handshake)
    Это начальная стадия, использующая обычный HTTP(S), чтобы «договориться» о переходе на протокол WebSocket. Клиент отправляет специальный HTTP-запрос с заголовком `Upgrade`.

```http
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
```
    Сервер, поддерживающий протокол, отвечает подтверждением с кодом **101 Switching Protocols**.
```http
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
```
    После этого соединение считается установленным, и общение продолжается уже по бинарному протоколу WebSocket.

  1. Фаза обмена данными (Data Framing)
    После рукопожатия связь переходит на уровень TCP-сокета, но с собственной структурой сообщений — **фреймами**. Каждый фрейм содержит минимальный заголовок и полезную нагрузку (payload). Это позволяет передавать данные маленькими порциями с минимальными накладными расходами (overhead), в отличие от тяжеловесных HTTP-заголовков.

Чем WebSocket лучше HTTP для real-time?

  • Низкая задержка (latency): Нет необходимости каждый раз устанавливать новое соединение (как в HTTP). Соединение одно и длительное (persistent).
  • Эффективность: Заголовки фрейма WebSocket занимают всего от 2 байт, против сотен байт в каждом HTTP-запросе/ответе.
  • Двунаправленность: Сервер может сам инициировать отправку данных клиенту, без ожидания запроса (в HTTP для этого используются костыли вроде long-polling).
  • Поддержка бинарных и текстовых данных: Можно передавать не только текст (JSON), но и бинарные данные (например, для аудио или файлов).

Простой пример кода (клиентская сторона, JavaScript)

// Создание WebSocket-соединения. Используется схема ws:// или wss:// (безопасная, как HTTPS)
const socket = new WebSocket('wss://example.com/socket');

// Обработчик открытия соединения (после успешного handshake)
socket.onopen = function(event) {
    console.log('Соединение установлено');
    // Отправка сообщения на сервер
    socket.send(JSON.stringify({type: 'greeting', message: 'Привет, сервер!'}));
};

// Обработчик входящих сообщений от сервера
socket.onmessage = function(event) {
    const data = JSON.parse(event.data);
    console.log('Получено от сервера:', data);
    // Обновляем интерфейс на основе данных...
};

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

// Обработчик закрытия соединения
socket.onclose = function(event) {
    if (event.wasClean) {
        console.log(`Соединение закрыто чисто, код=${event.code}`);
    } else {
        console.warn('Соединение разорвано (например, проблема с сетью)');
    }
};

// Закрытие соединения (например, при выходе пользователя)
// socket.close(1000, 'Работа завершена');

Роль QA инженера при тестировании WebSocket

Тестирование приложений, использующих WebSocket, требует особого подхода:

  1. Тестирование «рукопожатия»: Проверка корректного перехода с HTTP на WS, обработки неверных или устаревших ключей (Sec-WebSocket-Key).
  2. Устойчивость соединения (Resilience):
    *   Восстановление после обрыва сети (reconnect logic).
    *   Обработка таймаутов и «пингов» (Ping/Pong фреймы для проверки живости соединения).
  1. Тестирование нагрузки и стабильности:
    *   Поведение при отправке тысячи маленьких фреймов в секунду.
    *   Объем памяти на сервере при тысячах одновременно открытых соединений.
  1. Безопасность:
    *   Корректная валидация входящих данных на сервере (риск инъекций через WebSocket).
    *   Использование **wss://** для шифрования трафика.
    *   Проверка аутентификации и авторизации во время handshake или в самих сообщениях.
  1. Инструменты: QA часто используют не только браузер, но и клиенты типа wscat, специализированные прокси (Charles Proxy с поддержкой WS) или скрипты на Python с библиотекой websockets.

Итог: WebSocket — это не замена HTTP, а его мощное дополнение для сценариев, где критически важна низкая задержка и постоянный поток данных в реальном времени. Понимание его работы помогает QA-инженеру грамотно планировать тесты на производительность, стабильность и безопасность real-time функциональности приложения.

Как работает websocket? | PrepBro