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

Ответ

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-соединений для проверки масштабируемости сервера.

Ответ 18+ 🔞

Давай разберём эту штуку, которая всех так бесит, но без неё сейчас нихуя не работает. WebSocket, блядь. Представь, что ты звонишь другу по телефону (это WebSocket), а не пишешь ему в мессенджер, где каждый твой чих — это отдельное сообщение, и ты ждёшь, пока он его прочитает и ответит (это ёбаный HTTP).

В чём, сука, соль?

Это протокол, который поверх обычного интернета (TCP) делает полнодуплексный канал. Это как труба между браузером и сервером: открыл — и лей туда-сюда что хочешь, асинхронно и в реальном времени. Сервер может тебе нахамить первым, без твоего запроса.

Чем он не похож на своего деда HTTP?

Штука HTTP (старичок) WebSocket (шустрик)
Как общаются Как на допросе: ты спросил — он ответил. Инициатива только от тебя. Как в баре: оба могут нести хуйню одновременно.
Связь Одноразовый шприц. Для каждого чиха — новое соединение. Постоянная игла в жопе. Открыл один раз и висит, пока не отвалится.
Лишняя движуха Овердохуища. Каждый запрос тащит на себе целую папку с заголовками. Почти ничего. Пожали руки один раз, а дальше летят только голые данные в лёгких фреймах.
Кто начинает Только клиент. Кто угодно. Сервер может внезапно прислать тебе котика, просто потому что может.

Как это, блядь, завести? (Handshake)

  1. Клиент подходит к серверу с рожей как у хорошего мальчика и говорит HTTP-запросом: «Можно на WebSocket переключиться?» (Upgrade: websocket).
  2. Сервер, если не мудак, отвечает: «Ага, давай, поехали!» (101 Switching Protocols).
  3. Всё, привет, обычный HTTP! Дальше начинается магия — общаются по своим, быстрым правилам.

Вот как это выглядит в коде, если ты фронтендер:

// Открываем эту самую трубу
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);
    // Тут бы интерфейс обновить, пока пользователь не уснул
};

socket.onerror = (error) => {
    console.error('Ой, всё! WebSocket сломался:', error); // Волнение ебать
};

socket.onclose = (event) => {
    console.log('Трубу перекрыли', event.code, event.reason); // Наверное, за долги
};

А зачем это всё тестировщику, спросишь?

  • Автоматизировать проверку real-time фич: Чаты, уведомления, биржевые графики, онлайн-игры — везде, где надо ловить летящие в тебя данные.
  • Проверить, не развалится ли связь: Как поведёт себя система, если соединение ебнуть? Восстановится ли? Это ж не HTTP, где для каждой кнопки новый запрос.
  • Убедиться, что данные не кривые: Прилетает ли с сервера то, что ожидаешь, в правильном формате и последовательности?
  • Устроить серверу ад: Создать овердохуища одновременных WebSocket-соединений и посмотреть, не накроется ли он медным тазом. Нагрузочное тестирование, ёпта!