A WebSocket egy TCP -kapcsolaton keresztüli kommunikációs protokoll, amelyet állandó kapcsolaton keresztül a böngésző és a webszerver közötti üzenetváltásra terveztek.
A W3C jelenleg szabványosítja a Web Sockets API-t. A protokoll szabványtervezetét az IETF jóváhagyta .
A WebSocket webböngészőkben és webszerverekben való megvalósításra készült, de bármely kliens- vagy szerveralkalmazáshoz használható. A WebSocket protokoll a TCP protokollon alapuló független protokoll. Szorosabb interakciót tesz lehetővé a böngésző és a weboldal között, megkönnyítve az interaktív tartalmak terjesztését és a valós idejű alkalmazások létrehozását.
Az ügyfél és a kiszolgáló a HTTP -hez hasonló protokollt használ a WebSocket kapcsolat létrehozásához . A kliens egy speciális HTTP kérést generál, amelyre a szerver meghatározott módon válaszol.
A 75. számú protokolltervezet 2010. június 8-án kelt, a Wayback Machine -nál történt archív példányának felülvizsgálata előtt a WebSocket kapcsolat az alábbiak szerint jött létre. Ügyfél kérése:
GET /demo HTTP/1.1 Frissítés: WebSocket Csatlakozás: Frissítés host: example.com Származási hely: http://example.com WebSocket Protokoll: mintaSzerver válasza, amely megerősíti a WebSocketre váltást:
HTTP/1.1 101 Web Socket Protocol Handshake Frissítés: WebSocket Csatlakozás: Frissítés WebSocket-Origin: http://example.com WebSocket helye: ws://example.com/demo WebSocket Protokoll: mintaA válasz elküldése után a WebSocket kapcsolat azonnal létrejöttnek minősül, a kliens és a szerver megkezdheti a kétirányú üzenetküldést ugyanazon a TCP - kapcsolaton keresztül. Szöveges üzenet küldéséhez ( UTF-8 kódolásban ) egy null byte-ot kell küldenie előtte, és utána egy 255 értékű bájtot.
2010. június 2-án módosították a WebSocket protokollt, amely megváltoztatta a WebSocket kapcsolat létrehozásának eljárását a visszamenőleges kompatibilitás fenntartása nélkül. 76 - nál Archiválva : 2012. április 19. A WebSocket protokoll felülvizsgálatának tervezete védelmet nyújtott a hamisított kérések ellen. Az új sémát támogató ügyfél a következő kérést küldi:
GET /demo HTTP/1.1 Frissítés: WebSocket Csatlakozás: Frissítés Sec-WebSocket-Key2: 4 @1 46546xW%0l 1 5 host: example.com Sec-WebSocket-Key1: 12998 5 Y3 1 .P00 Származási hely: http://example.com WebSocket Protokoll: minta ^n:ds[4UA kérelemhez új "Sec-WebSocket-Key1" és "Sec-WebSocket-Key2" fejlécek és egy 8 bájtos kéréstörzs került. Mindegyiket véletlenszerűen generálja az ügyfél.
Szerver válasza, amely megerősíti a WebSocketre váltást:
HTTP/1.1 101 Web Socket Protocol Handshake Frissítés: WebSocket Csatlakozás: Frissítés Sec-WebSocket-Origin: http://example.com Sec-WebSocket-Location: ws://example.com/demo Sec-WebSocket-Protocol: minta 8jKS'y:G*Co,Wxa-A válasz új fejlécneveket tartalmaz ("Sec-WebSocket-Origin", "Sec-WebSocket-Location", "Sec-WebSocket-Protocol" a "WebSocket-Origin", "WebSocket-Location", "WebSocket-Protocol" helyett) és 16 bájtos választörzs, a következőképpen értékelve:
Megjegyzések.
Annak ellenére, hogy az új kérések és válaszok a HTTP-protokoll kéréseire és válaszaira "hasonlóak", nem. Például a kérésnek van törzse, de a „Tartalom hossza” mező hiányzik a fejlécekből (ami sérti a HTTP -konvenciókat ).
A háttérrendszernek támogatnia KELL mindkét típusú klienst, és különbséget KELL tenni közöttük a Sec-WebSocket-Key1 és a Sec-WebSocket-Key2 fejlécek megléte vagy hiánya alapján a kérésben.
A 07-es verzióhoz Archiválva : 2012. április 19. 2011. április 22-én kelt jegyzőkönyv-tervezetet módosították.
A 76-os protokolltól eltérően, amely szerint az adatok továbbítása titkosítás nélkül [1] történik, a klienstől (böngészőtől) a szerverhez továbbított adatok minden egyes bájtja a protokoll ezen verziójában szükségszerűen 4 bájtos maszkkal van maszkolva [2] . Minden üzenethez újból jön létre.
A most elküldött üzenetnek van egy fejléce, amely olyan adatokat tartalmaz, mint:
A kliens és a szerver közötti interakció a kliens kérésével kezdődik:
Szerezze be a /chat HTTP/1.1-et Gazda: server.example.com Frissítés: websocket Csatlakozás: Frissítés Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Sec-WebSocket-Origin: http://example.com Sec-WebSocket-Protocol: chat, szupercsevegés Sec-WebSocket-verzió: 7A szerver válasza így néz ki:
HTTP/1.1 101 Switching Protocols Frissítés: websocket Csatlakozás: Frissítés Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= Sec-WebSocket-Protocol: chatA válasz egy Sec-WebSocket-Protocol fejlécet tartalmaz, amely egyetlen, a szerver által kiválasztott protokollt (csevegés) tartalmaz az ügyfél által támogatott összes (csevegés, szupercsevegés) közül. A Sec-WebSocket-Accept fejléc a következőképpen alakul:
Példa a fenti algoritmus megvalósítására PHP -ben :
<?php echo base64_encode ( SHA1 ( "dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11" , igaz )); ?>2011. december 11-én a protokoll RFC státuszt kapott .
A Sec-WebSocket-Origin fejléc mostantól csak Origin .
A Web Socket protokoll két URI -sémát határoz meg : ws: (titkosítatlan kapcsolat) és wss: (titkosított kapcsolat).
A kapcsolat létrehozásához az ügyfélszkript létrehoz egy WebSocket objektumot, átadja a WebSocket URI paramétert a konstruktorának, és meghatározza a visszahívási funkciókat a csatlakozáshoz, az üzenet fogadásához és a leválasztáshoz.
< html > < fej > < script > const webSocket = new WebSocket ( 'ws://localhost/echo' ); webSocket . onopen = esemény => { alert ( 'onopen' ); webSocket . küld ( "Hello Web Socket!" ); }; webSocket . onmessage = event => { alert ( 'onmessage, ' + event . data ); }; webSocket . onclose = esemény => { alert ( 'onclose' ); }; </ script > </ head > < body > </ body > </ html >A WebSocket jelenleg a következő böngészőkben támogatott:
A következő linken ellenőrizheti, hogy böngészője támogatja-e a WebSocket szolgáltatást: http://caniuse.com/#feat=websockets Archiválva : 2017. április 8. a Wayback Machine -nél .
2010. november végén Adam Barth publikálta az alkalmazott protokoll megbízhatóságáról szóló tanulmány eredményeit [3] . Eredményei alapján kiderült, hogy transzparens proxyszerverek használata esetén lehetőség van a továbbított adatok gyorsítótárának cseréjére, így a felhasználók valós adatok helyett egy verziót kapnak az adatokból a támadótól. A probléma elég komolynak bizonyult ahhoz, hogy a Firefox és az Opera fejlesztői a 2011. január 11-én archivált Wayback Machine -n bejelentették , hogy a böngészőik jövőbeni verzióiban alapértelmezés szerint le lesz tiltva a webaljzatok támogatása mindaddig, amíg a protokoll bizonytalanságát ki nem javítják ( bár továbbra is lehetséges bekapcsolni őket).