Přejít k obsahu
BeoHosting
BeoHosting
Technické

Co jsou WebSockets a jak fungují

BeoHosting Team··9 min čtení čtení
Co jsou WebSockets a jak fungují

Úvod do protokolu WebSocket

WebSocket je komunikační protokol, který umožňuje obousměrnou (full-duplex) komunikaci mezi webovým prohlížečem a serverem přes jediné TCP spojení. Na rozdíl od klasického protokolu HTTP, kde klient musí odeslat požadavek, aby obdržel odpověď, WebSocket umožňuje serveru odesílat data klientovi vždy, když má něco nového k doručení, bez čekání na požadavek. To je revoluční pro webové aplikace, které vyžadují aktualizace v reálném čase.

Před WebSocketem vývojáři používali techniky jako polling, kdy prohlížeč periodicky odesílá požadavky na server, například každé 2 sekundy se ptá, zda jsou nová data, nebo long polling, kdy server drží spojení otevřené, dokud nezíská nová data. Obě techniky jsou neefektivní, protože plýtvají šířkou pásma na HTTP hlavičky a zatěžují server zbytečnými požadavky. WebSocket tyto problémy řeší navázáním trvalého spojení s minimální režií.

Jak WebSocket funguje

Proces handshake

WebSocket spojení začíná jako běžné HTTP spojení procesem známým jako handshake. Klient odešle HTTP požadavek se speciálními hlavičkami Connection Upgrade a Upgrade websocket, které serveru signalizují přání přejít na protokol WebSocket. Server odpoví stavovým kódem 101 Switching Protocols, pokud WebSocket podporuje, a povýší HTTP spojení na WebSocket. Od tohoto okamžiku mohou obě strany volně odesílat data bez HTTP režie.

Framing a přenos dat

Po navázání spojení se data vyměňují prostřednictvím WebSocket framů, které jsou výrazně menší než HTTP pakety. Každý frame obsahuje pouze 2 až 14 bajtů režie ve srovnání se stovkami bajtů v HTTP hlavičkách. WebSocket podporuje textové zprávy ve formátu UTF-8 i binární data. Zprávy lze fragmentovat do více framů pro přenos velkých objemů dat. Řídicí framy jako ping a pong slouží ke kontrole, zda je spojení stále aktivní.

Ukončení spojení

Kterákoli strana může zahájit ukončení WebSocket spojení odesláním close framu. Proces uzavírání zahrnuje výměnu close framů, kdy strana, která obdrží close frame, odpoví vlastním close framem, a poté se TCP spojení uzavře. Klientská strana obvykle implementuje automatické opětovné připojení pro případ neočekávaného přerušení spojení s exponenciálním backoffem mezi pokusy, aby server nebyl zahlcen.

Využití WebSocketu v praxi

Chatovací aplikace

Chat je nejzjevnějším využitím WebSocketu. Když uživatel odešle zprávu, okamžitě se zobrazí všem účastníkům konverzace bez obnovení stránky. Moderní chatovací aplikace jako Slack, Discord a Facebook Messenger používají WebSocket pro doručování zpráv v reálném čase. Kromě textu WebSocket umožňuje odesílat indikátory psaní, stav přečtení, stav uživatele online a offline a notifikace o nových zprávách. Implementace chatu pomocí pollingu by vyžadovala tisíce HTTP požadavků za minutu, zatímco WebSocket to zvládne s jediným otevřeným spojením.

Notifikace v reálném čase

Notifikační systémy na platformách jako GitHub, Trello nebo projektové nástroje používají WebSocket k doručování notifikací uživatelům, jakmile nastane relevantní aktivita. Když někdo okomentuje váš pull request, WebSocket okamžitě doručí notifikaci do prohlížeče, aniž byste museli stránku obnovovat. To je obzvláště důležité pro nástroje pro spolupráci, kde více uživatelů pracuje na stejném projektu současně, protože každá změna musí být v reálném čase viditelná pro všechny účastníky.

Živé dashboardy a monitoring

Dashboardy zobrazující metriky v reálném čase, jako je sledování návštěvnosti webu, monitoring serverů, finanční data nebo IoT senzory, používají WebSocket pro průběžnou aktualizaci grafů a hodnot. Místo aby dashboard obnovoval celou stránku každých 5 sekund, WebSocket doručuje pouze změněná data, což výrazně snižuje zátěž serveru i spotřebu šířky pásma. Nástroje jako Grafana a Kibana používají WebSocket pro živé streamování metrik.

Společná editace

Google Docs, Figma a podobné nástroje umožňují více uživatelům upravovat tentýž dokument současně právě díky WebSocketu. Každá změna jednoho uživatele se okamžitě propaguje ke všem ostatním uživatelům. To vyžaduje sofistikované algoritmy pro řešení konfliktů jako Operational Transformation nebo CRDT algoritmy, které zajišťují konzistenci dokumentu i tehdy, když dva uživatelé současně upravují stejnou část textu.

WebSocket v různých programovacích jazycích

JavaScript a Node.js

V prohlížeči je WebSocket API vestavěné a používá se přímo bez dalších knihoven. Vytvoření spojení je jednoduché pomocí konstruktoru new WebSocket, který přijímá URL serveru. Na straně serveru patří mezi populární knihovny pro Node.js ws, která je minimalistická a rychlá, a Socket.IO, jež přidává automatický fallback na polling, pokud WebSocket není dostupný, plus místnosti (rooms) pro skupinové zprávy a automatické opětovné připojení. Socket.IO je nejpopulárnější volbou pro JavaScript projekty, protože abstrahuje složitost a spolehlivě funguje i v sítích s restriktivními firewally.

Python a PHP

Vývojáři v Pythonu používají knihovny jako websockets pro asynchronní přístup nebo Django Channels, které přidávají podporu WebSocketu do frameworku Django. Flask-SocketIO je populární volbou pro Flask aplikace. PHP tradičně není ideální pro WebSocket, protože je navrženo pro model požadavek-odpověď, ale knihovna Ratchet a rozšíření Swoole umožňují provoz WebSocket serverů v PHP. Laravel používá Laravel Echo s Pusherem nebo Socket.IO pro funkcionalitu v reálném čase, přičemž Laravel Reverb je řešení provozované na vlastním serveru.

Hostingové požadavky pro WebSocket aplikace

Konfigurace serveru

WebSocket aplikace mají specifické hostingové požadavky. Sdílený hosting obvykle WebSocket nepodporuje, protože ten vyžaduje dlouhotrvající spojení, která sdílené prostředí nedokáže efektivně spravovat. Hosting na virtuálním serveru nebo dedikovaný server je minimem pro produkci. Webový server musí být nakonfigurován pro WebSocket proxy – Nginx používá proxy_pass s upgrade hlavičkami, Apache používá mod_proxy_wstunnel. Firewall musí povolit WebSocket provoz, který obvykle používá port 80 pro protokol ws a port 443 pro protokol wss.

Škálování WebSocket aplikací

Škálování WebSocketu je složitější než škálování HTTP aplikací, protože každé spojení spotřebovává paměť na serveru. Jeden server dokáže udržet kdekoli od 10 000 do 100 000 současných WebSocket spojení v závislosti na hardwaru a aplikaci. Pro větší počet uživatelů se používá horizontální škálování s Redis pub/sub nebo podobným message brokerem pro synchronizaci zpráv mezi instancemi serveru. Load balancer musí podporovat sticky sessions nebo IP hash, aby WebSocket spojení zůstalo na stejném backendovém serveru.

Bezpečnost WebSocketu

Šifrování WSS

Stejně jako má HTTP svou variantu HTTPS, WebSocket má WSS (WebSocket Secure), který používá TLS šifrování. V produkci vždy používejte WSS, protože nešifrovaná WebSocket spojení mohou být odposlechnuta. Většina moderních prohlížečů blokuje ws spojení ze stránek načtených přes HTTPS, takže WSS je prakticky povinné. SSL certifikát, který používáte pro HTTPS, automaticky pokrývá i WSS spojení na téže doméně.

Autentizace a autorizace

WebSocket po počátečním handshake nepodporuje HTTP hlavičky, takže autentizace se obvykle řeší odesláním tokenu jako query parametru při navazování spojení nebo odesláním autentizační zprávy ihned po připojení. JWT tokeny jsou populární volbou, protože server může ověřit identitu uživatele bez dotazu do databáze. Autorizace určuje, které kanály nebo místnosti může uživatel poslouchat a jaké zprávy může odesílat. Na BeoHosting VPS plánech máte plnou kontrolu nad konfigurací serveru, což umožňuje optimální nastavení WebSocket aplikace se správnou bezpečností i výkonem.

Závěr

Protokol WebSocket je základní technologií pro moderní webové aplikace, které vyžadují komunikaci v reálném čase. Od chatovacích systémů a notifikací po nástroje pro spolupráci a živé dashboardy WebSocket umožňuje zážitky, které klasické HTTP jednoduše nedokáže poskytnout. Pochopení toho, jak WebSocket funguje, kdy jej použít a jak jej správně implementovat, je klíčovou dovedností každého webového vývojáře, který chce vytvářet dynamické a interaktivní aplikace.

BeoHosting Team

10+ let zkušeností — Specialisté na webhosting a infrastrukturu

  • Web Hosting
  • WordPress Hosting
  • VPS
  • Dedicated Serveri
  • Domeni
  • SSL
  • cPanel
  • LiteSpeed
  • Linux administracija
  • DNS

Naposledy aktualizováno: