WebSocket: provařené i méně známé partie
WebSocket
Provařené i méně známé partie
Ondřej Žára, @0ndras
O čem to bude?
- Mateřská škola (přehled)
- Základní škola (klientské API)
- Střední škola (komunikace, server)
- Vysoká škola (protokol)
- Zvláštní škola (potenciál)
Přehled technologie WebSocket
Technologie WebSocket
- Nástroj na pružnější client-server komunikaci
- Vlastní binární protokol nad TCP
- Triviální klientské JS API
Hlavní atributy
- Trvale otevřené spojení (vs. opakované XHR)
- Data posílaná z libovolné strany (vs. long poll)
- Vestavěná podpora pro UTF-8 a binární data
- Bezpečnostní model CORS
Klientské API
Klientské API – ukázka
var socket = new WebSocket("ws://server.cz/");
socket.addEventListener("open", /* ... */);
socket.addEventListener("message", /* ... */);
socket.addEventListener("close", /* ... */);
socket.send(data);
socket.close();
Klientské API – ostatní
- URL používá nové schéma ws či wss (TLS)
- Pokud není řečeno jinak, používá port 80
- Možnost specifikovat binární data jako
Blob
nebo ArrayBuffer
Komunikace, server
Komunikace se serverem
- Serverová implementace pro mnoho jazyků
- Zpravidla nadstavba nad existujícím HTTP serverem
- Klientem navazované spojení začíná HTTP požadavkem
Komunikace se serverem – handshake
GET /chat HTTP/1.1
Host: server.example.com
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Version: 13
Komunikace se serverem – odpověď
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Protokoly
- WebSocket podporuje techniku tzv. podprotokolů
- Klient specifickuje podprotokol v druhém parametru konstruktoru
- Hlavičky
Sec-WebSocket-Protocol
odpovídají požadavku a potvrzení podprotokolu
Serverové API
- ...žádné standardizované neexistuje!
- Server často jako middleware
- Delegování dat aplikacím na základě cesty a/nebo podprotokolu
Binární protokol
Binární protokol
- RFC 6455
- Protokol prošel několika verzemi, do verze 8 nebyl považován za bezpečný
Binární protokol – Framing
- WebSocket nabízí zasílání zpráv
- Zprávy jsou děleny do rámců (frames)
- Rámce existují zejména kvůli zprávám o neznámé velikosti
Binární protokol – Framing
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len | Extended payload length |
|I|S|S|S| (4) |A| (7) | (16/64) |
|N|V|V|V| |S| | (if payload len==126/127) |
| |1|2|3| |K| | |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
| Extended payload length continued, if payload len == 127 |
+ - - - - - - - - - - - - - - - +-------------------------------+
| |Masking-key, if MASK set to 1 |
+-------------------------------+-------------------------------+
| Masking-key (continued) | Payload Data |
+-------------------------------- - - - - - - - - - - - - - - - +
: Payload Data continued ... :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Payload Data continued ... |
+---------------------------------------------------------------+
Binární protokol – Rámec
- Opcode
- Maskovací klíč
- Délka rámce
- Data
Binární protokol – Maskování
- Všechna data od klienta musí být maskovaná
- Každý rámec obsahuje náhodné 32bitové číslo, kterým jsou data XORována
- Slouží jako ochrana před cache poisoning (obsah rámce nelze předvídat)
Binární protokol – Opcodes
- Text, binární data, pokračování předchozího rámce
- Ping, pong
- Uzavření spojení (2-way handshake)
Potenciál využití
Náhrada existujícího řešení
- Rychlejší odezva (HTTP overhead, existující spojení)
- Realtime aplikace (hry, chat, collaborative XYZ…)
- Stále nutnost serveru, tj. principiálně nic nového pod sluncem
Signalling
- Rodina technologií WebRTC
- Ještě v plenkách
- Peer-to-peer komunikace (přenos obrazu, zvuku, dat)
- Navázání spojení: zjistit konfiguraci sítě a předat ji protistraně
- Signalling (slepice vs. vejce) – WebSocket jako jedno z řešení
Prostor pro otázky