Web socket

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 17. marts 2022; checks kræver 2 redigeringer .

WebSocket  er en kommunikationsprotokol over en TCP - forbindelse designet til at udveksle meddelelser mellem en browser og en webserver ved hjælp af en vedvarende forbindelse.

W3C standardiserer i øjeblikket Web Sockets API. Udkastet til standarden for denne protokol er blevet godkendt af IETF .

WebSocket er designet til at blive implementeret i webbrowsere og webservere, men det kan bruges til enhver klient- eller serverapplikation. WebSocket-protokollen er en uafhængig protokol baseret på TCP-protokollen. Det muliggør tættere interaktion mellem browseren og webstedet, hvilket letter distributionen af ​​interaktivt indhold og skabelsen af ​​realtidsapplikationer.

Åbning af en WebSocket-kanal

Klienten og serveren bruger en protokol, der ligner HTTP , til at etablere en WebSocket-forbindelse . Klienten genererer en speciel HTTP-anmodning, som serveren reagerer på på en bestemt måde.

Protokol 75

Forud for revisionen af ​​udkast til protokol nummer 75 Arkivkopi dateret 8. juni 2010 på Wayback Machine inklusive, blev WebSocket-forbindelsen etableret som følger. Kundeanmodning:

FÅ /demo HTTP/1.1 Opgradering: WebSocket Tilslutning: Opgradering vært: eksempel.com Oprindelse: http://example.com WebSocket-protokol: eksempel

Serversvar, der bekræfter skiftet til WebSocket:

HTTP/1.1 101 Web Socket Protocol Handshake Opgradering: WebSocket Tilslutning: Opgradering WebSocket-Origin: http://example.com WebSocket-placering: ws://example.com/demo WebSocket-protokol: eksempel

Umiddelbart efter afsendelse af svaret, anses WebSocket-forbindelsen for at være etableret, klienten og serveren kan starte tovejsmeddelelser over den samme TCP - forbindelse. For at sende en tekstbesked (i UTF-8- kodning ), skal du sende en null-byte før den og efter den en byte med værdien 255.

Protokol 76

Den 2. juni 2010 blev WebSocket-protokollen ændret for at ændre proceduren for etablering af en WebSocket-forbindelse uden at opretholde bagudkompatibilitet. På 76 Arkiveret 19. april 2012. udkast til revision af WebSocket-protokollen tilføjede beskyttelse mod forfalskede anmodninger. En klient, der understøtter det nye skema, sender følgende anmodning:

FÅ /demo HTTP/1.1 Opgradering: WebSocket Tilslutning: Opgradering Sec-WebSocket-Key2: 4 @1 46546xW%0l 1 5 vært: eksempel.com Sec-WebSocket-Key1: 12998 5 Y3 1 .P00 Oprindelse: http://example.com WebSocket-protokol: eksempel ^n:ds[4U

Nye "Sec-WebSocket-Key1" og "Sec-WebSocket-Key2" overskrifter og en 8-byte anmodningstekst er blevet tilføjet til anmodningen. Alle er tilfældigt genereret af klienten.

Serversvar, der bekræfter skiftet til WebSocket:

HTTP/1.1 101 Web Socket Protocol Handshake Opgradering: WebSocket Tilslutning: Opgradering Sec-WebSocket-Origin: http://example.com Sec-WebSocket-Location: ws://example.com/demo Sec-WebSocket-Protocol: prøve 8jKS'y:G*Co,Wxa-

Svaret indeholder nye headernavne ("Sec-WebSocket-Origin", "Sec-WebSocket-Location", "Sec-WebSocket-Protocol" i stedet for "WebSocket-Origin", "WebSocket-Location", "WebSocket-Protocol") og 16-byte svarlegeme, evalueret som følger:

  1. fra strengen med værdien af ​​Sec-WebSocket-Key1 anmodningsheaderen, udelad alle tegn, der ikke er cifre (ikke falder inden for området '0'..'9');
  2. drej den resulterende streng til et 64-bit heltal (for eksemplet ovenfor får vi 1299853100);
  3. dividere det resulterende tal med heltalsdivision med antallet af mellemrum i kildelinjen med overskriftsværdien;
  4. repræsentere det resulterende tal som et 4-byte 32-bit tal i big endian -formatet : den høje byte er lagret ved nulforskydningen;
  5. gør det samme med Sec-WebSocket-Key2 headeren;
  6. fortolkning af tallene fra punkt 4) og 5) som 4-byte strenge, sammenkæde dem (tilføj dem til én streng) og tilføj anmodningsteksten som en streng;
  7. beregne MD5 -værdien fra den modtagne 16-byte streng og skriv denne værdi til svarlegemet "som den er", uden at konvertere til nogen repræsentation;

Noter.

På trods af "ligheden" mellem nye anmodninger og svar på anmodninger og svar fra HTTP-protokollen , er de det ikke. Forespørgslen har f.eks. en body, men feltet "Content-Length" mangler i overskrifterne (hvilket overtræder HTTP -konventionerne ).

Backend'en SKAL understøtte begge typer klienter og skelne mellem dem ved tilstedeværelsen eller fraværet af Sec-WebSocket-Key1 og Sec-WebSocket-Key2 headerne i anmodningen.

Protokol 07

Til version 07 Arkiveret 19. april 2012. udkast til protokol af 22. april 2011 blev ændret.

I modsætning til protokol 76, ifølge hvilken data transmitteres uden kryptering [1] , er hver byte af data, der transmitteres fra klienten (browser) til serveren i denne version af protokollen, nødvendigvis maskeret med en 4-byte maske [2] . Den oprettes for hver besked på ny.

Beskeden, der sendes nu, har en overskrift, der indeholder data som:

  • om budskabet er fragmenteret;
  • type overførte data;
  • om beskeden var maskeret;
  • datastørrelse;
  • maske;
  • andre kontroldata (ping, pong...).

Interaktionen mellem klienten og serveren starter med en anmodning fra klienten:

FÅ /chat HTTP/1.1 Vært: server.example.com Opgradering: websocket Tilslutning: Opgradering Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Sec-WebSocket-Origin: http://example.com Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-version: 7

Serversvaret ser således ud:

HTTP/1.1 101 Skifteprotokoller Opgradering: websocket Tilslutning: Opgradering Sec-WebSocket-Accepter: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= Sec-WebSocket-Protocol: chat

Svaret indeholder en Sec-WebSocket-Protocol header med en enkelt protokol valgt af serveren (chat) blandt alle understøttet af klienten (chat, superchat). Sec-WebSocket-Accept-headeren er dannet som følger:

  1. tag strengværdien fra Sec-WebSocket-Key-headeren og sammenkæde den med strengen 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 (i ovenstående eksempel får vi dGhlIHNhbXBsZSBub25jZQ==258EAFA5-4C1DAA5-7B0DAB158EAFA5-7B0DAB1)
  2. beregn SHA-1 binær hash (en binær streng på 20 tegn) fra strengen modtaget i første afsnit
  3. indkode hashen i Base64 (s3pPLMBiTxaQ9kYGzzhZRbK+xOo=)

Et eksempel på implementeringen af ​​ovenstående algoritme i PHP :

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

Protokol RFC 6455 (herefter overføres data i rammer ved hjælp af denne protokol)

Den 11. december 2011 fik protokollen RFC -status .

Sec-WebSocket-Origin- headeren er nu kun Origin .

URI-skema

Web Socket-protokollen definerer to URI - skemaer, ws: (ukrypteret forbindelse) og wss: (krypteret forbindelse).

WebSocket-implementering i browsere

For at etablere en forbindelse opretter klientscriptet et WebSocket-objekt, sender WebSocket URI-parameteren til dets konstruktør og definerer tilbagekaldsfunktioner for tilslutning, modtagelse af en besked og afbrydelse af forbindelsen.

< html > < head > < script > const webSocket = new WebSocket ( 'ws://localhost/echo' ); webSocket . onopen = hændelse => { advarsel ( 'onopen' ); webSocket . send ( "Hej Web Socket!" ); }; webSocket . onmessage = hændelse => { alert ( 'onmessage, ' + hændelse . data ); }; webSocket . onclose = hændelse => { advarsel ( 'onclose' ); }; </ script > </ head > < body > </ body > </ html >

WebSocket understøttes i øjeblikket i følgende browsere:

Du kan tjekke om din browser understøtter WebSocket ved at følge linket: http://caniuse.com/#feat=websockets Arkiveret 8. april 2017 på Wayback Machine .

I slutningen af ​​november 2010 offentliggjorde Adam Barth resultaterne af en undersøgelse af pålideligheden af ​​den anvendte protokol [3] . Ifølge resultaterne viste det sig, at i tilfælde af at bruge gennemsigtige proxyservere, er det muligt at erstatte cachen for overførte data, så brugerne i stedet for rigtige data vil modtage en version af dataene fra en angriber. Problemet viste sig at være alvorligt nok til, at udviklerne af Firefox og Opera annoncerede på Wayback Machine Arkiveret 11. januar 2011 , at i fremtidige versioner af deres browsere vil understøttelse af web-sockets blive deaktiveret som standard, indtil usikkerheden i denne protokol er rettet ( selvom det stadig er muligt at tænde dem).

Noter

  1. WebSocket-protokollen (draft-hixie-thewebsocketprotocol-76) . Hentet 20. september 2011. Arkiveret fra originalen 19. april 2012.
  2. WebSocket-protokollen (draft-ietf-hybi-thewebsocketprotocol-07) . Hentet 20. september 2011. Arkiveret fra originalen 19. april 2012.
  3. Shestakov V. S., Sagidullin A. S. / ANVENDELSE AF WEBSOCKET TECHNOLOGY I TECHNOLOGICAL WEB APPLICATIONS. — DOI 10.17586/0021-3454-2015-58-4-328-330 UDC 658.512.011.56. — Zh-l Instrumentation april 2015

Links