5. Protokoły komunikacyjne

5.2. WebSocket

WebSocket to protokół komunikacyjny, który umożliwia dwukierunkową i ciągłą komunikację pomiędzy klientem (np. przeglądarką) a serwerem za pomocą pojedynczego, utrzymywanego w czasie rzeczywistym połączenia. WebSocket został zaprojektowany jako uzupełnienie protokołu HTTP i działa na porcie 80 (HTTP) lub 443 (HTTPS), co pozwala na łatwe pokonanie zapór sieciowych i serwerów proxy. WebSocket jest idealnym rozwiązaniem dla aplikacji wymagających komunikacji w czasie rzeczywistym, takich jak czaty, gry wieloosobowe, powiadomienia, systemy monitorowania czy aplikacje streamingowe.

Specyfikacja protokołu zawarta jest w dokumencie RFC6455: The WebSocket Protocol. Z formalnego punktu widzenia WebSocket stanowi odrębny, bazujący na TCP, protokół. Z protokołem HTTP wiąże go w zasadzie tylko sam początek zestawiania transmisji, czyli tzw. handshake interpretowany przez serwer jako żądanie "Upgrade". Domyślnie wykorzystywane są porty 80 (dla standardowej transmisji WebSocket) oraz 443 (dla transmisji tunelowanej przez protokół TLS).

Jak działa WebSocket?

1. Zestawianie połączenia (handshake)

  • Komunikacja WebSocket zaczyna się od wysłania żądania HTTP z nagłówkiem Upgrade, aby poprosić serwer o przełączenie z protokołu HTTP na WebSocket. Przykład:
    GET /chat HTTP/1.1
    Host: server.example.com
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
    Sec-WebSocket-Version: 13
  • Jeśli serwer obsługuje WebSocket, odpowiada pozytywnie:
    HTTP/1.1 101 Switching Protocols
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
2. Utrzymanie połączenia
  • Po nawiązaniu połączenia, klient i serwer mogą przesyłać dane w dowolnym kierunku bez konieczności wysyłania kolejnych żądań HTTP. Należy pamiętać, że protokół WebSocket udostępnia jedynie dwukierunkowy kanał komunikacyjny, natomiast sam sposób zorganizowania komunikacji leży po stronie programisty - należy zastosować specyficzny dla danej aplikacji, podprotokół. Można do tego celu wykorzystać inne znane protokoły lub zaimplementować własny.
3. Zakończenie połączenia
  • Połączenie może zostać zakończone przez klienta lub serwer, np. w wyniku normalnego zakończenia pracy aplikacji lub jako konsekwencja wystąpienia błędu.