WebSocket este un protocol de comunicare printr-o conexiune TCP conceput pentru a schimba mesaje între un browser și un server web folosind o conexiune persistentă.
În prezent , W3C standardizează API-ul Web Sockets. Proiectul de standard pentru acest protocol a fost aprobat de IETF .
WebSocket este conceput pentru a fi implementat în browsere web și servere web, dar poate fi utilizat pentru orice aplicație client sau server. Protocolul WebSocket este un protocol independent bazat pe protocolul TCP. Permite o interacțiune mai strânsă între browser și site-ul web, facilitând distribuirea conținutului interactiv și crearea de aplicații în timp real.
Clientul și serverul folosesc un protocol similar cu HTTP pentru a stabili o conexiune WebSocket . Clientul generează o cerere HTTP specială, la care serverul răspunde într-un anumit mod.
Înainte de revizuirea proiectului de protocol numărul 75 , copie de arhivă din 8 iunie 2010, inclusiv la Wayback Machine , conexiunea WebSocket a fost stabilită după cum urmează. Solicitarea clientului:
GET /demo HTTP/1.1 Upgrade: WebSocket Conexiune: Upgrade gazdă: example.com Origine: http://example.com Protocol WebSocket: exempluRăspunsul serverului care confirmă trecerea la WebSocket:
HTTP/1.1 101 Web Socket Protocol Handshake Upgrade: WebSocket Conexiune: Upgrade WebSocket-Origin: http://example.com Locație WebSocket: ws://example.com/demo Protocol WebSocket: exempluImediat după trimiterea răspunsului, conexiunea WebSocket este considerată stabilită, clientul și serverul pot începe mesageria bidirecțională prin aceeași conexiune TCP . Pentru a trimite un mesaj text (în codificare UTF-8 ), trebuie să trimiteți un octet nul înaintea acestuia, iar după el, un octet cu valoarea 255.
La 2 iunie 2010, protocolul WebSocket a fost modificat pentru a schimba procedura de stabilire a unei conexiuni WebSocket fără a menține compatibilitatea inversă. At 76 Arhivat 19 aprilie 2012. proiectul de revizuire a protocolului WebSocket a adăugat protecție împotriva solicitărilor falsificate. Un client care acceptă noua schemă trimite următoarea solicitare:
GET /demo HTTP/1.1 Upgrade: WebSocket Conexiune: Upgrade Sec-WebSocket-Key2: 4 @1 46546xW%0l 1 5 gazdă: example.com Sec-WebSocket-Key1: 12998 5 Y3 1 .P00 Origine: http://example.com Protocol WebSocket: exemplu ^n:ds[4UNoile anteturi „Sec-WebSocket-Key1” și „Sec-WebSocket-Key2” și un corp de solicitare de 8 octeți au fost adăugate la cerere. Toate sunt generate aleator de către client.
Răspunsul serverului care confirmă trecerea la WebSocket:
HTTP/1.1 101 Web Socket Protocol Handshake Upgrade: WebSocket Conexiune: Upgrade Sec-WebSocket-Origin: http://example.com Sec-WebSocket-Location: ws://example.com/demo Sec-WebSocket-Protocol: eșantion 8jKS'y:G*Co,Wxa-Răspunsul conține nume de antet noi ("Sec-WebSocket-Origin", "Sec-WebSocket-Location", "Sec-WebSocket-Protocol" în loc de "WebSocket-Origin", "WebSocket-Location", "WebSocket-Protocol") și corp de răspuns de 16 octeți, evaluat după cum urmează:
Note.
În ciuda „asemănării” noilor solicitări și răspunsuri la solicitări și răspunsuri ale protocolului HTTP , acestea nu sunt. De exemplu, cererea are un corp, dar câmpul „Lungimea conținutului” lipsește din anteturi (ceea ce încalcă convențiile HTTP ).
Backend-ul TREBUIE să accepte ambele tipuri de clienți și să distingă între ei prin prezența sau absența antetelor Sec-WebSocket-Key1 și Sec-WebSocket-Key2 în cerere.
La versiunea 07 Arhivat 19 aprilie 2012. au fost modificate proiectul de protocol din 22 aprilie 2011.
Spre deosebire de protocolul 76, conform căruia datele sunt transmise fără criptare [1] , fiecare octet de date transmis de la client (browser) către server în această versiune a protocolului este în mod necesar mascat cu o mască de 4 octeți [2] . Este creat din nou pentru fiecare mesaj.
Mesajul trimis are acum un antet care conține date precum:
Interacțiunea dintre client și server începe cu o solicitare din partea clientului:
GET /chat HTTP/1.1 Gazdă: server.example.com Upgrade: websocket Conexiune: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Sec-WebSocket-Origin: http://example.com Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Versiune: 7Răspunsul serverului arată astfel:
HTTP/1.1 101 Protocoale de comutare Upgrade: websocket Conexiune: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= Sec-WebSocket-Protocol: chatRăspunsul conține un antet Sec-WebSocket-Protocol cu un singur protocol ales de server (chat) dintre toate suportate de client (chat, superchat). Antetul Sec-WebSocket-Accept este format după cum urmează:
Un exemplu de implementare a algoritmului de mai sus în PHP :
<?php echo base64_encode ( SHA1 ( "dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11" , true )); ?>La 11 decembrie 2011, protocolul a dobândit statutul RFC .
Antetul Sec-WebSocket-Origin este acum doar Origin .
Protocolul Web Socket definește două scheme URI , ws: (conexiune necriptată) și wss: (conexiune criptată).
Pentru a stabili o conexiune, scriptul client creează un obiect WebSocket, transmite parametrul URI WebSocket constructorului său și definește funcții de apel invers pentru conectare, primire a unui mesaj și deconectare.
< html > < head > < script > const webSocket = new WebSocket ( 'ws://localhost/echo' ); webSocket . onopen = eveniment => { alertă ( 'onopen' ); webSocket . trimite ( "Salut Web Socket!" ); }; webSocket . onmessage = event => { alert ( 'onmessage, ' + event . data ); }; webSocket . onclose = eveniment => { alertă ( 'onclose' ); }; </ script > </ head > < body > </ body > </ html >WebSocket este acceptat în prezent în următoarele browsere:
Puteți verifica dacă browserul dvs. acceptă WebSocket urmând linkul: http://caniuse.com/#feat=websockets Arhivat 8 aprilie 2017 la Wayback Machine .
La sfârșitul lunii noiembrie 2010, Adam Barth a publicat rezultatele unui studiu privind fiabilitatea protocolului utilizat [3] . Conform rezultatelor sale, s-a dovedit că, în cazul utilizării de servere proxy transparente, este posibilă înlocuirea cache-ului datelor transmise, astfel încât în loc de date reale, utilizatorii să primească o versiune a datelor de la un atacator. Problema s-a dovedit a fi suficient de gravă încât dezvoltatorii Firefox și Opera au anunțat pe Wayback Machine Arhivat pe 11 ianuarie 2011 că în versiunile viitoare ale browserelor lor, suportul pentru socket-urile web va fi dezactivat implicit până când nesiguranța acestui protocol va fi remediată ( deși rămâne posibil să le pornească).