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

Как передаются данные в веб сокет

1.7 Middle🔥 161 комментариев
#Клиент-серверная архитектура

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

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

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

Механизм передачи данных в WebSocket

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

Процесс установления соединения (Handshake)

Передача данных начинается с рукопожатия (handshake), которое инициируется клиентом через специальный HTTP-запрос с заголовком Upgrade.

GET /chat HTTP/1.1
Host: server.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, и базовый TCP-сокет остается открытым для обмена фреймами данных (data frames).

Структура и передача данных

Все данные передаются в виде последовательности фреймов. Кадр (фрейм) WebSocket имеет бинарную структуру и включает:

  • FIN бит: Указывает, является ли фрейм последним в сообщении.
  • Opcode (4 бита): Определяет тип передаваемых данных (например, 0x1 для текста, 0x2 для бинарных данных, 0x8 для закрытия соединения).
  • Mask бит (только от клиента к серверу): Указывает, "замаскированы" ли полезные данные. Маскировка — обязательное требование протокола для фреймов, отправляемых клиентом, как мера безопасности.
  • Длина полезной нагрузки (Payload length): Может занимать 7, 7+16 или 7+64 бита в зависимости от размера данных.
  • Маскировочный ключ (Masking-key, 32 бита, если есть): Присутствует, если установлен бит маски.
  • Полезные данные (Payload data): Непосредственно передаваемая информация (текст в UTF-8 или произвольные бинарные данные).
  • Данные расширений (Extension data): Опциональные данные, если используются расширения протокола.

Процесс передачи сообщения выглядит так:

  1. Приложение (клиентское или серверное) формирует сообщение (строку или бинарный буфер).
  2. Стек протокола WebSocket разбивает сообщение на один или несколько фреймов, добавляя служебные заголовки (opcode, длину, маску и т.д.).
  3. Фреймы отправляются по установленному TCP-соединению в виде потока байтов.
  4. Принимающая сторона собирает фреймы, проверяет целостность, при необходимости применяет маскировку, интерпретирует opcode и собирает из фреймов исходное сообщение, которое затем передает наверх, прикладному уровню.

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

  • Двунаправленность: После handshake сервер может самостоятельно инициировать отправку данных клиенту без ожидания запроса.
  • Низкие накладные расходы: Заголовок фрейма минимален (от 2 байт), особенно в сравнении с заголовками HTTP для каждого запроса.
  • Поддержка текстовых и бинарных данных: Нативна и эффективна.
  • Управляющие фреймы: Помимо данных, протокол определяет служебные фреймы: Ping/Pong (для проверки живучести соединения и поддержания его активности) и Close (для корректного завершения сеанса).
  • Основа поверх TCP: Это гарантирует доставку и порядок пакетов, но не защищает от задержек. Для безопасной передачи используется WSS (WebSocket Secure) — WebSocket поверх TLS, аналогично HTTPS.

Пример обмена на практике

В коде это выглядит очень абстрагированно, так как браузер или серверная библиотека скрывают работу с фреймами.

// Клиентский код (браузер)
const socket = new WebSocket('wss://example.com/chat');

// Отправка текстовых данных (преобразуется в фрейм с opcode=0x1)
socket.send('Привет, сервер!');

// Отправка бинарных данных (преобразуется в фрейм с opcode=0x2)
const buffer = new ArrayBuffer(1024);
socket.send(buffer);

// Получение данных (собраны из входящих фреймов)
socket.onmessage = function(event) {
    if (typeof event.data === 'string') {
        console.log('Текст получен:', event.data);
    } else {
        console.log('Бинарные данные получены:', event.data);
    }
};

Таким образом, передача данных в WebSocket — это эффективный процесс обмена структурированными фреймами по постоянному соединению, что делает протокол идеальным решением для чатов, онлайн-игр, биржевых тикеров, систем реального времени и live-уведомлений, где критически важна минимальная задержка и постоянный канал связи.

Как передаются данные в веб сокет | PrepBro