WebSocket — протокол полнодуплексной связи, обеспечивающий постоянное соединение между клиентом и сервером для обмена данными в реальном времени. В отличие от традиционных HTTP-запросов, этот протокол устанавливает одно соединение и использует его для двусторонней передачи без повторных handshake. По данным Mozilla Developer Network (2025), WebSocket снижает задержки до 50% по сравнению с HTTP polling в real-time приложениях.
Главное
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 состоит из двух этапов: handshake и передача данных. На этапе handshake клиент отправляет HTTP-запрос с заголовком Upgrade: websocket, а сервер подтверждает переключение протокола статусом 101 Switching Protocols. После этого соединение переходит в режим полнодуплексной передачи.
Каждое сообщение в WebSocket разбивается на фреймы. Фрейм содержит opcode (текст, бинарные данные, закрытие, ping/pong), длину payload и маскировочный ключ для данных от клиента. Фрейм может быть фрагментирован — контрольные фреймы (ping/pong) могут передаваться между фрагментами сообщения, что предотвращает разрыв соединения при длительной передаче.
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 и HTTP заключается в модели взаимодействия. HTTP работает по схеме запрос-ответ: клиент инициирует запрос, сервер возвращает ответ, соединение закрывается. WebSocket же устанавливает постоянный канал, по которому обе стороны могут инициировать передачу в любой момент.
Для приложений, где требуется низкая задержка и постоянный поток данных, WebSocket значительно эффективнее. HTTP Long Polling — альтернатива, при которой сервер удерживает запрос открытым до появления данных — создаёт избыточную нагрузку на сервер и увеличивает потребление памяти из-за множества одновременных соединений.
| Параметр | WebSocket | HTTP |
|---|---|---|
| Модель | Полнодуплексная | Запрос-ответ |
| Заголовок | 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 стал стандартом де-факто для чат-приложений. Такие платформы, как Slack, Telegram Web и WhatsApp Web, используют WebSocket для мгновенной доставки сообщений. Протокол позволяет отправлять как текстовые сообщения, так и файлы через единый канал, а механизм ping/pong поддерживает соединение активным даже при отсутствии активности.
Многопользовательские браузерные и мобильные игры требуют минимальной задержки для синхронизации состояния игроков. WebSocket передаёт координаты, действия и события в реальном времени без задержек HTTP-запросов. Фреймворки вроде Socket.IO и Colyseus абстрагируют низкоуровневую работу с протоколом, добавляя автоматическое переподключение и комнаты.
Биржевые терминалы и трейдинговые платформы используют WebSocket для получения котировок в реальном времени. Задержка в несколько миллисекунд может стоить миллионы долларов, поэтому финансовые API — например, Binance WebSocket Streams, Coinbase Pro — предоставляют именно WebSocket-интерфейсы для рыночных данных.
В мобильной разработке WebSocket используется через нативные API: URLSessionWebSocketTask на iOS и OkHttp WebSocket на Android. Для Flutter существует библиотека web_socket_channel, а для React Native — react-native-websocket. IoT-устройства применяют WebSocket для передачи телеметрии и получения команд управления, так как протокол потребляет меньше энергии, чем постоянный HTTP-polling.
Рассмотрим пример серверной части на Node.js с библиотекой ws — наиболее популярной реализацией WebSocket для JavaScript. Сервер принимает подключения, обрабатывает сообщения и транслирует их всем подключённым клиентам.
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 и автоматическое переподключение.
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 использует один TCP-канал и заголовки всего 2–14 байт, что кардинально снижает задержки.
WebSocket использует порт 80 для незащищённых соединений (ws://) и порт 443 для защищённых (wss://). Это позволяет проходить через большинство прокси-серверов и корпоративных firewalls без дополнительной настройки. Порт 443 рекомендуется для production-сред из-за шифрования TLS.
Да, WebSocket поддерживается на всех мобильных платформах. В iOS нативный класс URLSessionWebSocketTask доступен с iOS 13. В Android — класс OkHttp WebSocket и стандартный java.net.WebSocket. Для React Native существует библиотека react-native-websocket.
WebSocket Secure — защищённая версия протокола, работающая поверх TLS. Все данные шифруются так же, как в HTTPS. WSS обязателен для production-приложений, особенно при передаче аутентификационных токенов или персональных данных через WebSocket.
Основные альтернативы: HTTP Long Polling (сервер удерживает запрос открытым), Server-Sent Events (однонаправленный поток от сервера), и WebRTC Data Channel (пиринговая связь). Server-Sent Events проще в реализации, но не поддерживает отправку от клиента к серверу.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также