Каковы ключевые особенности протокола WebSocket?

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

Ответ

WebSocket — это протокол для установления постоянного, двунаправленного (full-duplex) соединения между клиентом и сервером поверх одного TCP-соединения.

Основные особенности:

  • Полнодуплексная связь (Full-Duplex): данные могут передаваться в обоих направлениях одновременно по одному соединению, в отличие от HTTP-запросов/ответов.
  • Низкие задержки: после рукопожатия (handshake) соединение остается открытым, что устраняет накладные расходы на повторное установление соединения для каждого сообщения.
  • Поддержка различных данных: передача как текстовых, так и бинарных данных.
  • Контроль соединения: встроенный механизм ping/pong для проверки активности соединения.
  • Основан на HTTP: первоначальное рукопожатие использует HTTP(S), что упрощает работу с существующей инфраструктурой (порты, прокси).

Пример использования (JavaScript):

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

// Обработчики событий
socket.onopen = function(event) {
    console.log('Соединение установлено');
    socket.send(JSON.stringify({ type: 'greeting', data: 'Hello Server!' }));
};

socket.onmessage = function(event) {
    console.log('Получено сообщение:', event.data);
};

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

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

Практические нюансы и ограничения:

  1. Обработка ошибок и восстановление: необходимо реализовывать логику повторного подключения при разрыве.
  2. Проблемы с прокси и брандмауэрами: некоторые старые или строго настроенные прокси могут блокировать долгоживущие WebSocket-соединения.
  3. Масштабирование на сервере: поддержка большого количества одновременных постоянных соединений требует специальных подходов (например, использование брокеров сообщений).
  4. Безопасность: важно использовать wss:// (WebSocket Secure) для шифрования и проверять происхождение запросов, чтобы избежать атак.