Přejít k hlavnímu obsahu

WEBSOCKET - Internet v reálném čase

WEBSOCKET - Internet v reálném čase

Webové technologie se nepřetržitě vyvíjejí a všem nám otevírají stále bohatší možnosti. Jednou z poměrně zásadních inovací posledních let je specifikace protokolu Websocket, která umožňuje obousměrnou komunikaci se serverem.
   FREDERIK NIEMEYER 

Chaty, newsfeedy, liveticker, hry: Takové aplikace chceme spouštět přímo v prohlížeči, bez nutnosti vždy předtím instalovat potřebné plug-iny. Ideální situace vypadá tak, že aplikace běží v reálném čase a automaticky se aktualizuje. Návrh sítě však dříve s těmito moderními RIA (Rich Internet Application) vůbec nepočítal, a tak v průběhu času vývojáři čelili všemožným problémům. Byla třeba kompletní transformace ve způsobu komunikace mezi klientem a serverem. Jednosměrný provoz (dotaz->odpověď) HTTP nestačil, bylo třeba komunikovat zároveň oběma směry, a to v reálném čase. Právě to umožnil protokol WebSocket, přijatý v prosinci 2011 organizacemi W3C a IETF. Webové aplikace díky tomu již nepotřebují komplikované nadstavby HTTP, s WebSocket běží rychleji a snadněji se implementují.

HTTP jednosměrkou

V rámci odeslání nebo přijetí dat přes síť inicializuje klient připojení přes TCP (Transmission Control Protocol) k serveru. TCP spáruje IP adresy a porty koncových bodů a dále mezi nimi zajišťuje bezchybný přenos dat. Jelikož však informace nestačí jen poslat, ale je třeba jim i porozumět, běží nad komunikační vrstvou TCP ještě aplikační protokol. V případě webových stránek jde přitom povětšinou o HTTP (Hypertext transfer protocol). Ačkoli TCP podporuje obousměrný přenos dat (funguje jen jako transportní vrstva), HTTP toho nevyužívá. HTTP funguje poměrně jednoduše: klient zašle dotaz, server odpoví. Tato metoda je pomalá a nákladná. Aby se předešlo nutnosti neustálých manuálních aktualizací, existují způsoby, které programátoři využívají k zajištění živé komunikace přes HTTP. Nejsnadnější metodou je tzv. Polling. Skript v prohlížeči se táže serveru na nové události v předem daných intervalech. Pro každý takový požadavek je přitom inicializováno nové připojení, které server automaticky ukončí po zaslání odpovědi - ač to v praxi neobnáší žádné změny v reportu. Tento způsob je časově náročný a příliš zatěžuje síť častou inicializací TCP spojení. Jinou variantou pollingu je tzv. long-polling, který se liší v tom, že udržuje spojení do doby, než server poskytne v odpovědi nové události. To zkracuje latenci mezi událostí a odpovědí, zároveň však generuje nadbytečný síťový provoz a zahlcuje síť.
Nejlepší metodou je proto HTTP streamování: Spojení zůstává otevřené déle, aby server mohl zasílat data v libovolných intervalech. Negativem je nákladná implementace objektu v JavaScriptu - XMLHttpRequest -, který není stejný pro všechny prohlížeče. Kromě toho pro obousměrnou komunikaci v reálném čase potřebujete vždy dvojici připojení HTTP.

WebSocket - rychlý a efektivní

Protokol WebSocket řeší výše zmiňované problémy tak, že zavádí socket, který prostřednictvím konkrétní IP adresy a portu udržuje stálý kanál pro spojení se serverem. Takto mohou oba koncové body zasílat data simultánně přes jedno připojení. WebSocket využívá funkci v inicializaci připojení HTTP ke změně protokolu při aktualizaci. Tato možnost měla původně pomáhat kódovat nešifrovaná připojení přes port 80 skrz aktualizaci TLS, nebyla však využívána. WebSocket nyní využívá tohoto upgradu k nahrazení staršího protokolu novějším přes HTTP-Handshake. Implementace aplikačního programovacího rozhraní (API) WebSocket v prohlížeči běží přes javascriptový objekt. Aktivní připojení WebSocket rozpoznáme dle prefixu WS:// či WSS:// v adresním (URL) řádku. Aby bylo zajištěno, že spolu prostřednictvím WebSocketu komunikují jen povolené koncové body, implementovali vývojáři některé bezpečnostní mechanismy do hlavičky HTTP. Klient ve svém požadavku vygeneruje base-64-coded bezpečnostní klíč, který server dodá ve standardním řetězci, vytvoří z něj hašovací hodnotu SHA-1 (Secure Hash Algorithm) a pošle ji zpět klientovi. Takto je zajištěno, že oba koncové body využívají protokolu WebSocket. Originální specifikace v požadavku také chrání server WebSocket před nežádoucími útoky z neznámých zdrojů a spojení mohou navázat jen známí či podporovaní klienti.
Poslední důležitý ochranný mechanismus je spuštěn po inicializaci spojení HTTP (Handshake): Klient WebSocket musí šifrovat každý datový paket pomocí jednoduché šablony XOR tak, aby propojené proxy servery nezaměňovaly provoz WebSocket za požadavky HTTP. Bez šifrování datových paketů je možné, aby se škodlivé skripty zmocnily proxy serverů a jejich prostřednictvím napadly další uživatele. Jelikož však proxy servery nedokážou přečíst šifrovaný provoz, zkrátka jej jen přeposílají dál do určeného koncového bodu. V současnosti nepodporují všechny prohlížeče nejnovější protokol WebSocket. To by se však mělo v nadcházejících měsících změnit, neboť WebSocket nabízí nepopiratelné výhody: internetové aplikace jsou uživatelům blíž, fungují lépe a běží rychleji.


JEDNO PŘIPOJENÍ - DVA SMĚRY
WebSocket je, obdobně jako HTML, protokol, přičemž jeho prostřednictvím lze posílat data zároveň dvěma směry prostřednictvím jediného TCP připojení. To snižuje latenci a vytížení sítě. WebSocket jako takový staví na HTTP a nahrazuje jej po inicializaci připojení (handshake). Připojení WebSocket nejsou šifrovaná (opět analogie s HTTP) a běží na portu 80, případně v šifrované formě na portu 443. Na rozdíl od Flash/Java socketů lze tudíž protokol použít také bez plug-inů v prohlížeči i v prostředích chráněných firewallem. WebSocket využívá předpony ws:// pro klasické připojení bez šifrování a wss:// pro šifrovaná připojení - podobně jako http://, respektive https://.

VÝHODY WEBSOCKETU
*  obousměrná komunikace
*  reporty v reálném čase
*  menší zatížení sítě


1. HTTP-Handshake: klient
UPGRADE NA WEBSOCKET
Požadavek HTTP na upgrade na protokol WebSocket
BEZPEČNOSTNÍ DOTAZ
Bezpečnostní dotaz klienta na původ a klíč

2. HTTP-Handshake: SERVER
POTVRZENÍ UPGRADU
Potvrzení HTTP požadavku na upgrade na WebSocket
BEZPEČNOSTNÍ KLÍČ
Potvrzení serveru protokolem prostřednictvím separátního bezpečnostního klíče

3. PŘIPOJENÍ WEBSOCKET
OBOUSMĚRNÁ KOMUNIKACE
Klient a server mohou nyní odesílat data druhé straně simultánně. Klient musí z bezpečnostních důvodů šifrovat každý WebSocket paket.

TYTO PROHLÍŽEČE PODPORUJÍ WEBSOCKET
Pouze Firefox a Chrome disponují nativní podporou aktuálního protokolu WebSocket. Opera a Safari stále spoléhají na starší implementaci, jejíž podpora je navíc v opeře implicitně vypnutá.