Wiki
Web / стек

WebSocket — что это простыми словами

WebSocket — протокол двунаправленной связи браузер↔сервер поверх TCP. Держит открытое соединение, вместо polling. Основа чатов, live-обновлений, торгов.

WebSocket (RFC 6455, 2011) — протокол постоянного дуплексного соединения между браузером и сервером. Начинается как обычный HTTP-запрос с заголовком `Upgrade: websocket`, после handshake переключается на бинарный/текстовый обмен фреймами. Обе стороны могут инициировать отправку.

Зачем нужен: раньше real-time веб делался через long polling (клиент ждёт ответа, сервер "держит" соединение до события) — неэффективно и хрупко. WebSocket даёт одно постоянное соединение с малым overhead: чат Slack, торговый терминал Binance, notification-канал GitHub — всё на WS.

Практическая типичка: nginx проксирует WS через `proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";`. Backend-стеки: Node.js (ws, socket.io), Go (gorilla/websocket, nhooyr.io), Python (websockets, django-channels), PHP — не годится (нет постоянного event loop; используйте Ratchet или Swoole).

Ограничения: WS "жрёт" file descriptors — тысяча активных клиентов = тысяча TCP-сокетов. Настройте `ulimit -n 65536` + nginx `worker_connections 65536`. При переходе на HTTP/2 — используйте "WebSocket over HTTP/2" (RFC 8441) или fallback SSE.

Частые вопросы

WebSocket vs SSE (Server-Sent Events)?
SSE — только server→client (полу-дуплекс), но проще (один HTTP-заголовок) и работает через прокси. WS — full-duplex, для чатов и торгов.
wss:// работает как https?
Да, wss = WebSocket + TLS. Тот же порт 443, тот же сертификат Let's Encrypt.