WebSockets

Komunikacja pe艂nodupleksowa przez pojedyncze po艂膮czenie TCP dla aplikacji webowych.

Poza Modelem 呕膮danie-Odpowied藕: Potrzeba Komunikacji w Czasie Rzeczywistym

Przez lata sie膰 World Wide Web dzia艂a艂a niemal wy艂膮cznie w oparciu o model 偶膮danie-odpowied藕 protoko艂u HTTP. Klient (Twoja przegl膮darka) wysy艂a艂 偶膮danie do serwera, a serwer odsy艂a艂 odpowied藕. Ta komunikacja by艂a zawsze inicjowana przez klienta. Do przegl膮dania statycznych stron internetowych by艂o to w zupe艂no艣ci wystarczaj膮ce. Jednak w miar臋 ewolucji sieci w platform臋 dla dynamicznych, interaktywnych aplikacji, ten jednokierunkowy, sterowany przez klienta model zacz膮艂 wykazywa膰 swoje ograniczenia.

Rozwa偶my aplikacje wymagaj膮ce aktualizacji w czasie rzeczywistym: aplikacj臋 czatu na 偶ywo, panel gie艂dowy pokazuj膮cy zmieniaj膮ce si臋 ceny, wieloosobow膮 gr臋 online czy edytor dokument贸w do wsp贸艂pracy, taki jak Dokumenty Google. W 艣wiecie HTTP/1.1 osi膮gni臋cie tego by艂o trudne i nieefektywne. Deweloperzy uciekali si臋 do r贸偶nych technik, znanych jako , aby symulowa膰 komunikacj臋 w czasie rzeczywistym:

  • Kr贸tkie Odpytywanie (Short Polling): Klient wielokrotnie wysy艂a 偶膮dania do serwera w sta艂ych odst臋pach czasu (np. co 2 sekundy), pytaj膮c: "Czy masz co艣 nowego dla mnie?". Generuje to ogromny ruch sieciowy, poniewa偶 wi臋kszo艣膰 odpowiedzi jest pusta, i wprowadza zauwa偶alne op贸藕nienie.
  • D艂ugie Odpytywanie (Long Polling, Comet): Ulepszenie, w kt贸rym klient wysy艂a 偶膮danie, a serwer utrzymuje po艂膮czenie otwarte, dop贸ki nie b臋dzie mia艂 nowych danych do wys艂ania. Gdy dane zostan膮 wys艂ane, po艂膮czenie jest zamykane, a klient natychmiast otwiera nowe. Zmniejsza to liczb臋 pustych odpowiedzi, ale jest bardziej skomplikowane w implementacji i zu偶ywa zasoby serwera.

Te obej艣cia by艂y z艂o偶one, nieefektywne i dodawa艂y znaczne op贸藕nienia. Sie膰 potrzebowa艂a natywnego, standardowego sposobu, aby serwery mog艂y komunikowa膰 si臋 z klientami bez wcze艣niejszej pro艣by. To doprowadzi艂o do powstania protoko艂u WebSocket.

Czym jest WebSocket? Prawdziwa Dwukierunkowa Ulica

to technologia, kt贸ra umo偶liwia dwukierunkow膮, interaktywn膮 sesj臋 komunikacyjn膮 mi臋dzy przegl膮dark膮 u偶ytkownika a serwerem. Zapewnia trwa艂e, niskoopo藕nieniowe po艂膮czenie, kt贸re pozwala na wysy艂anie danych w obu kierunkach w dowolnym momencie. Jest to znane jako .

W przeciwie艅stwie do tradycyjnego modelu HTTP, kt贸ry otwiera po艂膮czenie, wysy艂a dane i je zamyka, WebSocket ustanawia jedno, d艂ugotrwa艂e po艂膮czenie TCP i utrzymuje je otwarte. Po jego ustanowieniu zar贸wno klient, jak i serwer mog膮 wysy艂a膰 do siebie wiadomo艣ci, kiedy tylko zajdzie taka potrzeba, bez narzutu zwi膮zanego z tworzeniem nowych po艂膮cze艅 czy wysy艂aniem powtarzalnych nag艂贸wk贸w HTTP przy ka偶dej wiadomo艣ci. Tworzy to autentyczny, trwa艂y kana艂 konwersacji, idealny dla aplikacji opieraj膮cych si臋 na wymianie danych w czasie rzeczywistym.

Uzgadnianie WebSocket: Ulepszanie Po艂膮czenia

Jednym z najsprytniejszych aspekt贸w protoko艂u WebSocket jest spos贸b, w jaki si臋 rozpoczyna. Zosta艂 on zaprojektowany tak, aby by艂 kompatybilny z istniej膮c膮 infrastruktur膮 sieciow膮, tak膮 jak serwery HTTP i proxy. Nie wymaga specjalnego portu; inicjuje swoje 偶ycie przez standardowe po艂膮czenie HTTP/1.1. Ten pocz膮tkowy proces jest znany jako uzgadnianie WebSocket (handshake).

Jak Dzia艂a Uzgadnianie

  1. 呕膮danie Klienta (Uaktualnienie HTTP): Klient (przegl膮darka) inicjuje uzgadnianie, wysy艂aj膮c standardowe 偶膮danie HTTP GET do serwera. Jednak nie jest to zwyk艂e 偶膮danie GET. Zawiera ono specjalne nag艂贸wki, kt贸re sygnalizuj膮 zamiar klienta, aby "uaktualni膰" po艂膮czenie z HTTP do WebSocket.
    GET /czat HTTP/1.1
    Host: example.com
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
    Sec-WebSocket-Version: 13

    Kluczowe nag艂贸wki w tym 偶膮daniu to:

    • Connection: Upgrade oraz Upgrade: websocket: Te dwa nag艂贸wki s膮 oficjalnym sygna艂em dla serwera, 偶e klient chce zmieni膰 protok贸艂.
    • Sec-WebSocket-Key: Klient wysy艂a losowo wygenerowan膮 warto艣膰 zakodowan膮 w Base64. Ten klucz nie s艂u偶y do uwierzytelniania, ale jest cz臋艣ci膮 mechanizmu wyzwanie-odpowied藕, aby upewni膰 si臋, 偶e serwer jest faktycznie 艣wiadomy WebSocket, a nie 藕le skonfigurowanym serwerem HTTP/1.1.
  2. Odpowied藕 Serwera (Zmiana Protoko艂贸w): Serwer 艣wiadomy WebSocket, po otrzymaniu tego 偶膮dania o uaktualnienie, przetworzy je i ode艣le specjaln膮 odpowied藕 HTTP. Je艣li serwer zgadza si臋 na uaktualnienie, odpowie kodem statusu 101 Switching Protocols.
    HTTP/1.1 101 Switching Protocols
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

    Kluczowe elementy odpowiedzi to:

    • Kod Statusu 101101: Ten kod oficjalnie potwierdza, 偶e serwer prze艂膮cza si臋 z HTTP na protok贸艂 偶膮dany w nag艂贸wku `Upgrade`.
    • Sec-WebSocket-Accept: Aby udowodni膰, 偶e zrozumia艂 偶膮danie WebSocket, serwer bierze Sec-WebSocket-Key klienta, 艂膮czy go z globalnie unikalnym magicznym ci膮giem zdefiniowanym w specyfikacji protoko艂u, oblicza skr贸t SHA-1 wyniku, a nast臋pnie koduje go w Base64. Klient wykonuje te same obliczenia i weryfikuje, czy odpowied藕 serwera si臋 zgadza. To ko艅czy uzgadnianie i zapobiega b艂臋dnemu odtworzeniu odpowiedzi przez buforuj膮ce serwery proxy.

Gdy to uzgadnianie zostanie pomy艣lnie zako艅czone, pocz膮tkowe po艂膮czenie HTTP zostaje zast膮pione. Podstawowe po艂膮czenie TCP zostaje przej臋te przez protok贸艂 WebSocket. Od tego momentu klient i serwer mog膮 wymienia膰 dane za pomoc膮 protoko艂u ramek WebSocket, nie wysy艂aj膮c ju偶 nigdy nag艂贸wk贸w HTTP. Dwukierunkowa rozmowa zosta艂a rozpocz臋ta.

Schematy URI WebSocket: `ws` i `wss`

Podobnie jak HTTP ma sw贸j w艂asny schemat URI (`http://`), WebSocket definiuje w艂asne schematy do identyfikacji punkt贸w ko艅cowych WebSocket.

ws:// (WebSocket)
Jest to schemat dla nieszyfrowanych po艂膮cze艅 WebSocket. Zazwyczaj dzia艂a on na porcie TCP 80, tak samo jak standardowy HTTP, co pomaga mu przechodzi膰 przez zapory sieciowe. Poniewa偶 jest nieszyfrowany, jest podatny na pods艂uch i powinien by膰 u偶ywany tylko do danych niepoufnych w zaufanych sieciach.
wss:// (WebSocket Secure)
Jest to bezpieczna wersja protoko艂u, analogiczna do HTTPS. Po艂膮czenie `wss` to po艂膮czenie WebSocket, kt贸re jest szyfrowane za pomoc膮 TLS. Zazwyczaj dzia艂a na porcie TCP 443. Wszystkie nowoczesne aplikacje internetowe korzystaj膮ce z WebSockets powinny u偶ywa膰 schematu `wss`, aby zapewni膰 poufno艣膰 i integralno艣膰 wymienianych danych.
// Nieszyfrowane po艂膮czenie WebSocket
ws://czat.example.com/api

// Bezpieczne, szyfrowane po艂膮czenie WebSocket
wss://realtime.example.com/gielda

Ramki Danych WebSocket: Protok贸艂 Konwersacji

Po uzgadnianiu wszystkie dane s膮 wysy艂ane w jednostkach zwanych ramkami WebSocket. Jest to lekki protok贸艂 ramkowania, zaprojektowany w celu zminimalizowania narzutu. Ka偶da ramka zaczyna si臋 od ma艂ego nag艂贸wka, po kt贸rym nast臋puje 艂adunek zawieraj膮cy dane aplikacji. Nag艂贸wek zawiera metadane dotycz膮ce 艂adunku.

  • Bit FIN: Flaga wskazuj膮ca, czy jest to ostatnia ramka wiadomo艣ci. Pozwala to na fragmentacj臋 wiadomo艣ci na wiele ramek.
  • Opcode: 4-bitowe pole, kt贸re wskazuje, jakiego rodzaju dane zawiera 艂adunek ramki. Popularne kody operacji to:
    • `text`: 艁adunek to dane tekstowe UTF-8.
    • `binary`: 艁adunek to surowe dane binarne.
    • `close`: Specjalna ramka kontrolna do eleganckiego zamykania po艂膮czenia.
    • `ping`/`pong`: Ramki kontrolne u偶ywane do sprawdzania po艂膮czenia (keep-alive), aby wykry膰 zerwane po艂膮czenie.
  • Maskowanie: Ze wzgl臋d贸w bezpiecze艅stwa wszystkie ramki wysy艂ane od klienta do serwera musz膮 by膰 maskowane 32-bitowym kluczem maskuj膮cym. Pomaga to zapobiega膰 atakom zatruwania pami臋ci podr臋cznej (cache poisoning) na po艣rednicz膮cych serwerach proxy. Klucz maskuj膮cy jest zawarty w nag艂贸wku ramki.
  • D艂ugo艣膰 i dane 艂adunku: Nag艂贸wek zawiera r贸wnie偶 d艂ugo艣膰 艂adunku, po kt贸rej nast臋puj膮 same dane 艂adunku.

Ten protok贸艂 ramkowania jest znacznie bardziej wydajny ni偶 wysy艂anie pe艂nych 偶膮da艅 i odpowiedzi HTTP. Narzut na wiadomo艣膰 mo偶e wynosi膰 zaledwie 2 bajty, w por贸wnaniu do setek bajt贸w w przypadku nag艂贸wk贸w HTTP, co czyni WebSockets niezwykle dobrze przystosowanymi do przesy艂ania wiadomo艣ci o wysokiej cz臋stotliwo艣ci.

Zastosowania i Aplikacje WebSocket

Dwukierunkowa natura WebSocket, dzia艂aj膮ca w czasie rzeczywistym, umo偶liwi艂a powstanie nowej klasy aplikacji internetowych, kt贸re wcze艣niej by艂y niepraktyczne.

Aplikacje Czatowe

WebSockets s膮 idealn膮 technologi膮 do tworzenia pokoj贸w czatowych i aplikacji do przesy艂ania wiadomo艣ci. Kiedy jeden u偶ytkownik wysy艂a wiadomo艣膰, serwer mo偶e natychmiast j膮 wypchn膮膰 do wszystkich innych pod艂膮czonych klient贸w, bez potrzeby odpytywania o aktualizacje.

Wieloosobowe Gry Online

Gry wymagaj膮 komunikacji o bardzo niskim op贸藕nieniu do synchronizacji pozycji graczy, ich dzia艂a艅 i stanu gry. WebSockets zapewniaj膮 szybki, dwukierunkowy kana艂 komunikacji niezb臋dny do p艂ynnej rozgrywki bezpo艣rednio w przegl膮darce.

Transmisje Danych Finansowych na 呕ywo

Notowania gie艂dowe, gie艂dy kryptowalut i pulpity finansowe musz膮 wy艣wietla膰 aktualizacje cen w momencie ich wyst膮pienia. Serwery mog膮 u偶ywa膰 WebSockets do wypychania nowych notowa艅 do tysi臋cy klient贸w jednocze艣nie.

Wsp贸艂praca i Edycja w Czasie Rzeczywistym

Aplikacje takie jak Dokumenty Google czy edytory kodu do wsp贸艂pracy (np. VS Code Live Share) opieraj膮 si臋 na WebSockets, aby natychmiast przesy艂a膰 naci艣ni臋cia klawiszy i ruchy kursora od jednego u偶ytkownika do wszystkich pozosta艂ych uczestnik贸w sesji.

Powiadomienia w Czasie Rzeczywistym

Kiedy nadejdzie nowy e-mail, pojawi si臋 wzmianka w mediach spo艂eczno艣ciowych lub zako艅czy si臋 proces na serwerze, serwer mo偶e u偶y膰 WebSocket, aby natychmiast powiadomi膰 u偶ytkownika w jego przegl膮darce, zamiast czeka膰, a偶 u偶ytkownik od艣wie偶y stron臋.

Aktualizacje Sportowe na 呕ywo

Strony sportowe mog膮 wypycha膰 na 偶ywo wyniki, komentarze na bie偶膮co i statystyki do u偶ytkownik贸w w trakcie trwania akcji, zapewniaj膮c wci膮gaj膮ce do艣wiadczenie na drugim ekranie.

Podsumowanie: Nowoczesny Protok贸艂 dla Sieci Dzia艂aj膮cej w Czasie Rzeczywistym

Protok贸艂 WebSocket fundamentalnie zmieni艂 sie膰 z systemu do pobierania dokument贸w w pe艂noprawn膮 platform臋 dla interaktywnych aplikacji dzia艂aj膮cych w czasie rzeczywistym. Zapewniaj膮c trwa艂y, niskonak艂adowy, pe艂nodupleksowy kana艂 komunikacji przez pojedyncze po艂膮czenie TCP, elegancko rozwi膮za艂 nieefektywno艣ci starych modeli opartych na odpytywaniu przez klienta.

Dzi臋ki sprytnemu mechanizmowi uzgadniania poprzez uaktualnienie HTTP, WebSocket zachowuje kompatybilno艣膰 z istniej膮c膮 infrastruktur膮 sieciow膮, wprowadzaj膮c jednocze艣nie nowy paradygmat komunikacji inicjowanej przez serwer. Sta艂 si臋 niezb臋dnym narz臋dziem dla nowoczesnych deweloper贸w internetowych, nap臋dzaj膮c bogate, wsp贸艂pracuj膮ce i natychmiastowe do艣wiadczenia, kt贸rych u偶ytkownicy oczekuj膮 od dzisiejszych aplikacji.

    WebSockets | Teleinf Edu