WebSocket: что это, протокол полнодуплексной связи и как работает

Автор: IT Sectr Опубликовано: 2026-03-06 Время чтения: 8 мин

WebSocket — протокол полнодуплексной связи, обеспечивающий постоянное соединение между клиентом и сервером для обмена данными в реальном времени. В отличие от традиционных HTTP-запросов, этот протокол устанавливает одно соединение и использует его для двусторонней передачи без повторных handshake. По данным Mozilla Developer Network (2025), WebSocket снижает задержки до 50% по сравнению с HTTP polling в real-time приложениях.

Главное

  • WebSocket — протокол полнодуплексной связи поверх TCP для обмена данными в реальном времени
  • Постоянное соединение устраняет накладные расходы на повторные HTTP-handshake при каждом запросе
  • Задержка снижается на 30–50% по сравнению с HTTP Long Polling за счёт отсутствия заголовков
  • Протокол поддерживается всеми современными браузерами и мобильными платформами через нативные API
  • Применение включает чаты, онлайн-игры, биржевые терминалы и IoT-устройства

Что такое WebSocket?

WebSocket — это протокол связи, работающий поверх TCP и обеспечивающий полнодуплексный канал между клиентом и сервером. Он стандартизирован организацией IETF как RFC 6455 в 2011 году и поддерживается всеми современными браузерами, мобильными платформами и серверными фреймворками.

В отличие от HTTP, где клиент инициирует запрос и получает ответ, WebSocket позволяет обеим сторонам отправлять сообщения в любой момент после установки соединения. Это делает его идеальным для сценариев, требующих мгновенной доставки данных: чаты, уведомления, совместное редактирование документов.

Протокол WebSocket использует HTTP-порт 80 или HTTPS-порт 443 для начального handshake, после чего переключается на собственный протокол с минимальным заголовком — всего 2 байта вместо 800+ байт в HTTP. Эта особенность даёт значительный выигрыш в производительности при большом количестве сообщений.

Ключевые характеристики протокола

Соединение WebSocket начинается с HTTP-запроса на обновление (Upgrade), после чего протокол переключается на двоичный фреймовый формат. Размер фрейма варьируется от 2 байт до 2^63 байт, что позволяет передавать как короткие текстовые сообщения, так и большие двоичные данные. Поддерживается фрагментация сообщений, маскирование данных от клиента к серверу и ping/pong для поддержания соединения.

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

Процесс установки соединения WebSocket состоит из двух этапов: handshake и передача данных. На этапе handshake клиент отправляет HTTP-запрос с заголовком Upgrade: websocket, а сервер подтверждает переключение протокола статусом 101 Switching Protocols. После этого соединение переходит в режим полнодуплексной передачи.

Каждое сообщение в WebSocket разбивается на фреймы. Фрейм содержит opcode (текст, бинарные данные, закрытие, ping/pong), длину payload и маскировочный ключ для данных от клиента. Фрейм может быть фрагментирован — контрольные фреймы (ping/pong) могут передаваться между фрагментами сообщения, что предотвращает разрыв соединения при длительной передаче.

js
const ws = new WebSocket('wss://example.com/chat')

ws.addEventListener('open', () => {
    console.log('Соединение установлено')
    ws.send('Привет, сервер!')
})

ws.addEventListener('message', (event) => {
    console.log('Получено:', event.data)
})

ws.addEventListener('close', () => {
    console.log('Соединение закрыто')
})

В приведённом примере клиент создаёт объект WebSocket, указывая защищённый URL wss://. После открытия соединения отправляется приветственное сообщение, а обработчик message принимает ответы от сервера. При закрытии срабатывает обработчик close — это важно для переподключения при обрыве сети.

WebSocket vs HTTP: сравнение

Основное отличие между WebSocket и HTTP заключается в модели взаимодействия. HTTP работает по схеме запрос-ответ: клиент инициирует запрос, сервер возвращает ответ, соединение закрывается. WebSocket же устанавливает постоянный канал, по которому обе стороны могут инициировать передачу в любой момент.

Для приложений, где требуется низкая задержка и постоянный поток данных, WebSocket значительно эффективнее. HTTP Long Polling — альтернатива, при которой сервер удерживает запрос открытым до появления данных — создаёт избыточную нагрузку на сервер и увеличивает потребление памяти из-за множества одновременных соединений.

ПараметрWebSocketHTTP
МодельПолнодуплекснаяЗапрос-ответ
Заголовок2–14 байт400–800 байт
Постоянное соединениеДа, одноНет, новое на запрос
ЛатентностьНизкая (1–5 мс)Высокая (50–200 мс)
Протоколws:// или wss://http:// или https://

По данным High Performance Browser Networking (Grigorik, O'Reilly), WebSocket сокращает сетевые задержки в real-time сценариях на 40–60% по сравнению с HTTP Long Polling, а нагрузка на сервер снижается в 3–5 раз за счёт устранения повторных handshake.

Где применяется WebSocket

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

Чаты и мессенджеры

WebSocket стал стандартом де-факто для чат-приложений. Такие платформы, как Slack, Telegram Web и WhatsApp Web, используют WebSocket для мгновенной доставки сообщений. Протокол позволяет отправлять как текстовые сообщения, так и файлы через единый канал, а механизм ping/pong поддерживает соединение активным даже при отсутствии активности.

Онлайн-игры

Многопользовательские браузерные и мобильные игры требуют минимальной задержки для синхронизации состояния игроков. WebSocket передаёт координаты, действия и события в реальном времени без задержек HTTP-запросов. Фреймворки вроде Socket.IO и Colyseus абстрагируют низкоуровневую работу с протоколом, добавляя автоматическое переподключение и комнаты.

Финансовые приложения

Биржевые терминалы и трейдинговые платформы используют WebSocket для получения котировок в реальном времени. Задержка в несколько миллисекунд может стоить миллионы долларов, поэтому финансовые API — например, Binance WebSocket Streams, Coinbase Pro — предоставляют именно WebSocket-интерфейсы для рыночных данных.

Мобильные приложения и IoT

В мобильной разработке WebSocket используется через нативные API: URLSessionWebSocketTask на iOS и OkHttp WebSocket на Android. Для Flutter существует библиотека web_socket_channel, а для React Native — react-native-websocket. IoT-устройства применяют WebSocket для передачи телеметрии и получения команд управления, так как протокол потребляет меньше энергии, чем постоянный HTTP-polling.

Примеры кода WebSocket

Рассмотрим пример серверной части на Node.js с библиотекой ws — наиболее популярной реализацией WebSocket для JavaScript. Сервер принимает подключения, обрабатывает сообщения и транслирует их всем подключённым клиентам.

js
const WebSocket = require('ws')
const wss = new WebSocket.Server({ port: 8080 })

wss.on('connection', (ws) => {
    console.log('Новый клиент подключён')

    ws.on('message', (data) => {
        console.log('Получено:', data.toString())
        ws.send('Сервер получил ваше сообщение')
    })

    ws.on('close', () => {
        console.log('Клиент отключён')
    })
})

console.log('WebSocket сервер запущен на порту 8080')

Сервер создаёт экземпляр WebSocket.Server на порту 8080 и ожидает подключения. Каждому новому клиенту назначается отдельный объект ws, через который сервер может отправлять сообщения индивидуально. Трансляция сообщений всем клиентам реализуется через массовый обход массива подключений. При большом количестве клиентов (более 1000) рекомендуется использовать библиотеки с поддержкой кластеризации, такие как Socket.IO, которые добавляют масштабирование через Redis и автоматическое переподключение.

Отправка сообщений всем клиентам

js
wss.clients.forEach((client) => {
    if (client.readyState === WebSocket.OPEN) {
        client.send('Сообщение для всех участников')
    }
})

Проверка readyState перед отправкой обязательна: если клиент уже отключился, вызов send выбросит ошибку. Флаг WebSocket.OPEN гарантирует, что соединение активно и сообщение будет доставлено.

Для мобильных iOS-приложений WebSocket реализуется через URLSessionWebSocketTask, доступный с iOS 13. Сессия создаёт задачу с URL протокола wss://, после чего вызываются методы send и receive. Получение сообщений можно организовать через непрерывную рекурсию receive, которая ожидает следующее сообщение после обработки предыдущего, что обеспечивает постоянный приём данных без повторного подключения. Для Android используется OkHttp WebSocket, который предоставляет аналогичный интерфейс с колбэками onOpen, onMessage, onClosing и onClosed, а также автоматическое переподключение при обрыве соединения.

При работе с WebSocket в мобильных приложениях важно учитывать управление жизненным циклом: при уходе приложения в фон соединение может быть разорвано системой. На iOS необходимо переустанавливать соединение при возврате в foreground через делегат sceneDidBecomeActive. На Android следует использовать Lifecycle-aware компоненты или Service для поддержания соединения. Дополнительно рекомендуется реализовать exponential backoff при переподключении — увеличивать интервал между попытками с 1 до 30 секунд, чтобы не создавать избыточную нагрузку на сервер при временных проблемах сети.

Часто задаваемые вопросы

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

WebSocket устанавливает постоянное полнодуплексное соединение, по которому обе стороны могут отправлять данные в любой момент. HTTP работает по схеме запрос-ответ, где каждый обмен требует нового соединения и полных заголовков. WebSocket использует один TCP-канал и заголовки всего 2–14 байт, что кардинально снижает задержки.

Какой порт использует WebSocket?

WebSocket использует порт 80 для незащищённых соединений (ws://) и порт 443 для защищённых (wss://). Это позволяет проходить через большинство прокси-серверов и корпоративных firewalls без дополнительной настройки. Порт 443 рекомендуется для production-сред из-за шифрования TLS.

Поддерживается ли WebSocket в мобильных приложениях?

Да, WebSocket поддерживается на всех мобильных платформах. В iOS нативный класс URLSessionWebSocketTask доступен с iOS 13. В Android — класс OkHttp WebSocket и стандартный java.net.WebSocket. Для React Native существует библиотека react-native-websocket.

Что такое WebSocket Secure (wss://)?

WebSocket Secure — защищённая версия протокола, работающая поверх TLS. Все данные шифруются так же, как в HTTPS. WSS обязателен для production-приложений, особенно при передаче аутентификационных токенов или персональных данных через WebSocket.

Какие альтернативы существуют у WebSocket?

Основные альтернативы: HTTP Long Polling (сервер удерживает запрос открытым), Server-Sent Events (однонаправленный поток от сервера), и WebRTC Data Channel (пиринговая связь). Server-Sent Events проще в реализации, но не поддерживает отправку от клиента к серверу.

Итоги

  • WebSocket — полнодуплексный протокол реального времени, работающий поверх TCP и стандартизированный как RFC 6455
  • Постоянное соединение устраняет накладные расходы HTTP handshake, снижая задержки до 1–5 мс
  • Фрейм WebSocket имеет заголовок всего 2–14 байт против 400–800 байт у HTTP
  • Применяется в чатах, онлайн-играх, биржевых терминалах, IoT и совместном редактировании
  • WSS обеспечивает шифрование TLS и рекомендуется для production-сред
  • Протокол поддерживается всеми браузерами, мобильными платформами и серверными языками
  • Используйте WebSocket для real-time функций и HTTP — для стандартных REST-запросов

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также