WebSocket
WebSocket – dwukierunkowy protokół komunikacji w warstwie aplikacji, działający na bazie protokołu TCP. Został opracowany w ramach standardu HTML5 i umożliwia utrzymanie stałego, pełno-dupleksowego połączenia pomiędzy przeglądarką internetową a serwerem, co pozwala na wymianę danych w czasie rzeczywistym przy minimalnym narzucie protokołowym.
Historia
Idea stałego połączenia przeglądarka‑serwer istniała już w latach 1999 w postaci technologii takich jak Comet czy Long Polling. Formalna specyfikacja WebSocket została przyjęta przez IETF w dokumencie RFC 6455 w 2011 roku, a wsparcie w przeglądarkach pojawiło się w latach 2012–2014.
Podstawy techniczne
Protokół i handshake
Połączenie rozpoczyna się od klasycznego żądania HTTP GET z nagłówkiem Upgrade: websocket. Serwer odpowiada kodem 101 Switching Protocols i po udanym handshake’u obie strony przechodzą na tryb binarny, w którym każdy komunikat jest otoczony ramką (frame) o minimalnym nagłówku.
Struktura ramki
- Bit FIN – oznacza koniec wiadomości.
- Opcode – definiuje typ danych (tekst, binaria, ping, pong, zamknięcie).
- Mask – w przypadku wiadomości od klienta dane są maskowane (obowiązkowo), co zwiększa bezpieczeństwo.
- Payload – właściwa treść przesyłana w ramce.
Warstwa transportowa
WebSocket działa na warstwie TCP, co zapewnia niezawodną, kolejnościową transmisję. Dzięki temu nie wymaga dodatkowych mechanizmów retransmisji, które są niezbędne w protokołach bezpołączeniowych, takich jak UDP.
Zastosowania
Technologia ta znajduje zastosowanie w wielu dziedzinach, m.in.:
- czatów internetowych i komunikatorów w przeglądarce,
- gier online w czasie rzeczywistym,
- powiadomień push w aplikacjach webowych,
- monitoringu systemów i dashboardów z danymi na żywo,
- interaktywnych aplikacji IoT (Internet of Things).
Bezpieczeństwo
Podobnie jak w tradycyjnym HTTPS, połączenia WebSocket mogą być szyfrowane przy użyciu TLS (w trybie wss://). Najważniejsze zagrożenia obejmują:
- Ataki XSS – niepoprawne walidowanie danych po stronie klienta.
- Ataki typu CSRF – można je ograniczyć poprzez wymuszanie połączeń z nagłówkiem
Origin. - Wstrzykiwanie niepożądanych ramek (frame injection) – wymaga weryfikacji i ograniczania rozmiaru payloadu.
Implementacje i biblioteki
Większość nowoczesnych przeglądarek (Chrome, Firefox, Safari, Edge) obsługuje natywnie API WebSocket w języku JavaScript:
let socket = new WebSocket('wss://example.com/socket');
socket.onopen = () => console.log('Połączono');
socket.onmessage = e => console.log('Odebrano:', e.data);
socket.send('Hello, server!');
Na serwerze dostępne są liczne biblioteki:
- Node.js – socket.io (nadbudowka na WebSocket), ws.
- Python – aiohttp, websockets.
- Java – javax.websocket, Netty.
- Go – gorilla/websocket.
Porównanie z innymi technologiami
| Cecha | WebSocket | HTTP/1.1 (Polling) | HTTP/2 Server‑Sent Events (SSE) | WebRTC DataChannel |
|---|---|---|---|---|
| Tryb komunikacji | Dwukierunkowy, pełno‑dupleksowy | Jednokierunkowy, wymaga wielokrotnego request/response | Jednokierunkowy (serwer → klient) | Dwukierunkowy, peer‑to‑peer |
| Nadmierny narzut | ~2 B nagłówka + ramka | Pełny nagłówek HTTP przy każdym zapytaniu | Mini‑nagłówek SSE | Składnia ICE, STUN/TURN – większy narzut |
| Wsparcie w przeglądarkach | Wszystkie współczesne | Wszechobecne | Wsparcie w większości | Wymaga HTTPS i dodatkowej negocjacji |
Patrz także
Bibliografia
- IETF, RFC 6455 – The WebSocket Protocol, 2011.
- W3C, HTML Living Standard – Section 7.4 WebSocket API, dostęp 2026‑07‑10.
- Mozilla Developer Network, WebSocket – MDN Web Docs, dostęp 2026‑07‑10.