Priza web

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 17 martie 2022; verificările necesită 2 modificări .

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.

Deschiderea unui canal WebSocket

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.

Protocolul 75

Î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: exemplu

Ră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: exemplu

Imediat 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.

Protocolul 76

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[4U

Noile 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ă:

  1. din șirul cu valoarea antetului cererii Sec-WebSocket-Key1, excludeți toate caracterele care nu sunt cifre (care nu se încadrează în intervalul '0'..'9');
  2. transformați șirul rezultat într-un număr întreg de 64 de biți (pentru exemplul de mai sus, obținem 1299853100);
  3. împărțiți numărul rezultat la împărțirea întregului la numărul de spații din linia sursă cu valoarea antetului;
  4. reprezintă numărul rezultat ca un număr de 4 octeți pe 32 de biți în format big endian : octetul mare este stocat la offset-ul zero;
  5. faceți același lucru cu antetul Sec-WebSocket-Key2;
  6. interpretarea numerelor de la punctele 4) și 5) ca șiruri de 4 octeți, concatenați-le (adăugați-le într-un șir) și adăugați corpul cererii ca șir;
  7. calculați valoarea MD5 din șirul de 16 octeți primit și scrieți această valoare în corpul răspunsului „ca atare”, fără a fi convertit la nicio reprezentare;

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.

Protocolul 07

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:

  • dacă mesajul este fragmentat;
  • tipul datelor transmise;
  • dacă mesajul a fost mascat;
  • dimensiunea datelor;
  • masca;
  • alte date de control (ping, pong...).

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: 7

Răspunsul serverului arată astfel:

HTTP/1.1 101 Protocoale de comutare Upgrade: websocket Conexiune: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= Sec-WebSocket-Protocol: chat

Ră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ă:

  1. luați valoarea șirului din antetul Sec-WebSocket-Key și concatenați-o cu șirul 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 (în exemplul de mai sus obținem dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-C914-C5914-C5B11)
  2. calculați hash-ul binar SHA-1 (un șir binar de 20 de caractere) din șirul primit în primul paragraf
  3. codificați hash-ul în Base64 (s3pPLMBiTxaQ9kYGzzhZRbK+xOo=)

Un exemplu de implementare a algoritmului de mai sus în PHP :

<?php echo base64_encode ( SHA1 ( "dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11" , true )); ?>

Protocolul RFC 6455 (în continuare datele sunt transmise în cadre folosind acest protocol)

La 11 decembrie 2011, protocolul a dobândit statutul RFC .

Antetul Sec-WebSocket-Origin este acum doar Origin .

Schema URI

Protocolul Web Socket definește două scheme URI , ws: (conexiune necriptată) și wss: (conexiune criptată).

Implementarea WebSocket în browsere

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ă).

Note

  1. Protocolul WebSocket (draft-hixie-thewebsocketprotocol-76) . Preluat la 20 septembrie 2011. Arhivat din original la 19 aprilie 2012.
  2. Protocolul WebSocket (draft-ietf-hybi-thewebsocketprotocol-07) . Preluat la 20 septembrie 2011. Arhivat din original la 19 aprilie 2012.
  3. Shestakov V. S., Sagidullin A. S. / APPLICATION OF WEBSOCKET TECHNOLOGY IN TECHNOLOGICAL WEB APPLICATIONS. — DOI 10.17586/0021-3454-2015-58-4-328-330 UDC 658.512.011.56. — Zh-l Instrumentation aprilie 2015

Link -uri