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

«Что такое WebSocket и чем он отличается от HTTP?» — вопрос из категории Архитектура, который задают на 25% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Ключевые отличия от HTTP:

Аспект HTTP WebSocket
Модель связи Запрос-ответ (Request-Response). Клиент всегда инициатор. Двусторонняя (Full-Duplex). Сервер может отправлять данные без запроса.
Соединение Непостоянное. Создаётся для каждого запроса и закрывается после ответа. Постоянное. Устанавливается один раз и остаётся открытым.
Накладные расходы (Overhead) Высокие. Каждый запрос/ответ содержит полные заголовки. Низкие. После рукопожатия данные передаются в виде легких фреймов.
Инициация данных Только клиентом. Клиентом и сервером.

Установка соединения (Handshake):

  1. Клиент отправляет специальный HTTP-запрос с заголовком Upgrade: websocket.
  2. Сервер отвечает с кодом 101 Switching Protocols, подтверждая переход на протокол WebSocket.
  3. Далее общение идёт по протоколу WebSocket.

Пример клиентского кода на JavaScript:

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

// Обработчики событий
socket.onopen = (event) => {
    console.log('Соединение установлено');
    socket.send(JSON.stringify({ type: 'subscribe', channel: 'notifications' }));
};

socket.onmessage = (event) => {
    const message = JSON.parse(event.data);
    console.log('Получено с сервера:', message);
    // Обновление UI в реальном времени
};

socket.onerror = (error) => {
    console.error('Ошибка WebSocket:', error);
};

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

Сценарии использования в тестировании:

  • Автоматизация проверки real-time функциональности: Чат, уведомления, биржевые тикеры, онлайн-игры.
  • Тестирование стабильности соединения: Проверка повторного подключения, обработка разрывов.
  • Валидация данных: Проверка формата и последовательности сообщений, отправляемых сервером.
  • Нагрузочное тестирование: Моделирование тысяч одновременных WebSocket-соединений для проверки масштабируемости сервера.