Web-socket
WebSocket is een communicatieprotocol via een TCP - verbinding die is ontworpen om berichten uit te wisselen tussen een browser en een webserver met behulp van een permanente verbinding.
Het W3C is momenteel bezig met het standaardiseren van de Web Sockets API. De conceptstandaard voor dit protocol is goedgekeurd door de IETF .
WebSocket is ontworpen om te worden geïmplementeerd in webbrowsers en webservers, maar kan voor elke client- of servertoepassing worden gebruikt. Het WebSocket-protocol is een onafhankelijk protocol op basis van het TCP-protocol. Het maakt een nauwere interactie tussen de browser en de website mogelijk, waardoor de distributie van interactieve inhoud en het creëren van realtime-applicaties wordt vergemakkelijkt.
Een WebSocket-kanaal openen
De client en server gebruiken een protocol dat vergelijkbaar is met HTTP om een WebSocket-verbinding tot stand te brengen . De client genereert een speciaal HTTP-verzoek, waarop de server op een bepaalde manier reageert.
Protocol 75
Voorafgaand aan de herziening van conceptprotocol nummer 75 Archiefkopie gedateerd 8 juni 2010 op de Wayback Machine inclusief, werd de WebSocket-verbinding als volgt tot stand gebracht. Klant verzoek:
GET /demo HTTP/1.1
Upgrade: WebSocket
Verbinding: Upgrade
host: voorbeeld.com
Oorsprong: http://example.com
WebSocket-protocol: voorbeeld
Serverreactie die de overstap naar WebSocket bevestigt:
HTTP/1.1 101 Web Socket Protocol Handshake
Upgrade: WebSocket
Verbinding: Upgrade
WebSocket-oorsprong: http://example.com
WebSocket-locatie: ws://example.com/demo
WebSocket-protocol: voorbeeld
Onmiddellijk na het verzenden van het antwoord wordt de WebSocket-verbinding als tot stand gebracht, de client en de server kunnen bidirectionele berichten verzenden via dezelfde TCP - verbinding. Om een sms-bericht te verzenden (in UTF-8- codering ), moet u ervoor een null-byte verzenden en erna een byte met de waarde 255.
Protocol 76
Op 2 juni 2010 is het WebSocket-protocol gewijzigd om de procedure voor het tot stand brengen van een WebSocket-verbinding te wijzigen zonder achterwaartse compatibiliteit te behouden. Op 76 Gearchiveerd 19 april 2012. conceptrevisie van het WebSocket-protocol extra bescherming tegen vervalste verzoeken. Een client die het nieuwe schema ondersteunt, stuurt het volgende verzoek:
GET /demo HTTP/1.1
Upgrade: WebSocket
Verbinding: Upgrade
Sec-WebSocket-Key2: 4 @1 46546xW%0l 1 5
host: voorbeeld.com
Sec-WebSocket-Key1: 12998 5 Y3 1 .P00
Oorsprong: http://example.com
WebSocket-protocol: voorbeeld
^n:ds[4U
Nieuwe "Sec-WebSocket-Key1" en "Sec-WebSocket-Key2" headers en een 8-byte request body zijn toegevoegd aan de request. Ze worden allemaal willekeurig gegenereerd door de klant.
Serverreactie die de overstap naar WebSocket bevestigt:
HTTP/1.1 101 Web Socket Protocol Handshake
Upgrade: WebSocket
Verbinding: Upgrade
Sec-WebSocket-Origin: http://example.com
Sec-WebSocket-locatie: ws://example.com/demo
Sec-WebSocket-protocol: voorbeeld
8jKS'y:G*Co,Wxa-
Het antwoord bevat nieuwe headernamen ("Sec-WebSocket-Origin", "Sec-WebSocket-Location", "Sec-WebSocket-Protocol" in plaats van "WebSocket-Origin", "WebSocket-Location", "WebSocket-Protocol") en 16-byte responsbody, als volgt geëvalueerd:
- uit de string met de waarde van de Sec-WebSocket-Key1 verzoekheader, sluit alle tekens uit die geen cijfers zijn (die niet binnen het bereik '0'..'9' vallen);
- verander de resulterende string in een 64-bits geheel getal (voor het bovenstaande voorbeeld krijgen we 1299853100);
- deel het resulterende getal door een geheel getal te delen door het aantal spaties in de bronregel met de kopwaarde;
- representeer het resulterende getal als een 4-byte 32-bits getal in het big endian -formaat : de hoge byte wordt opgeslagen op de nulpuntverschuiving;
- doe hetzelfde met de Sec-WebSocket-Key2-header;
- het interpreteren van de getallen uit de punten 4) en 5) als 4-byte strings, voeg ze samen (voeg ze toe in één string) en voeg de request body toe als een string;
- bereken de MD5 -waarde uit de ontvangen string van 16 bytes en schrijf deze waarde naar de antwoordtekst "as is", zonder te converteren naar een representatie;
Opmerkingen.
Ondanks de "overeenkomst" van nieuwe verzoeken en reacties op verzoeken en reacties van het HTTP-protocol , zijn ze dat niet. Het verzoek heeft bijvoorbeeld een hoofdtekst, maar het veld "Content-Length" ontbreekt in de headers (wat in strijd is met de HTTP -conventies ).
De backend MOET beide soorten clients ondersteunen en onderscheid maken door de aanwezigheid of afwezigheid van de Sec-WebSocket-Key1 en Sec-WebSocket-Key2 headers in het verzoek.
Protocol 07
Naar versie 07 Gearchiveerd 19 april 2012. ontwerpprotocol van 22 april 2011 zijn gewijzigd.
In tegenstelling tot protocol 76, volgens welke gegevens zonder codering worden verzonden [1] , wordt elke byte aan gegevens die van de client (browser) naar de server wordt verzonden in deze versie van het protocol noodzakelijkerwijs gemaskeerd met een 4-byte-masker [2] . Het wordt voor elk bericht opnieuw gemaakt.
Het bericht dat nu wordt verzonden, heeft een koptekst die gegevens bevat zoals:
- of het bericht gefragmenteerd is;
- type verzonden gegevens;
- of het bericht gemaskeerd was;
- gegevensgrootte;
- masker;
- andere besturingsgegevens (ping, pong...).
De interactie tussen de client en de server begint met een verzoek van de client:
GET /chat HTTP/1.1
Host: server.voorbeeld.com
Upgrade: websocket
Verbinding: Upgrade
Sec-WebSocket-sleutel: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-versie: 7
De serverreactie ziet er als volgt uit:
HTTP/1.1 101 Schakelprotocollen
Upgrade: websocket
Verbinding: Upgrade
Sec-WebSocket-Accepteren: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat
Het antwoord bevat een Sec-WebSocket-Protocol-header met een enkel protocol gekozen door de server (chat) uit alle ondersteunde door de client (chat, superchat). De kop Sec-WebSocket-Accept wordt als volgt gevormd:
- neem de tekenreekswaarde uit de Sec-WebSocket-Key-header en voeg deze samen met de tekenreeks 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 (in het bovenstaande voorbeeld krijgen we dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85CAB11AB0DC
- bereken de SHA-1 binaire hash (een binaire reeks van 20 tekens) uit de reeks ontvangen in de eerste alinea
- codeer de hash in Base64 (s3pPLMBiTxaQ9kYGzzhZRbK+xOo=)
Een voorbeeld van de implementatie van het bovenstaande algoritme in PHP :
<?php
echo base64_encode ( SHA1 ( "dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11" , true ));
?>
Protocol RFC 6455 (hierna worden gegevens in frames verzonden met dit protocol)
Op 11 december 2011 kreeg het protocol de RFC -status .
De kop Sec-WebSocket-Origin is nu gewoon Origin .
URI-schema
Het Web Socket-protocol definieert twee URI - schema's, ws: (niet-versleutelde verbinding) en wss: (versleutelde verbinding).
WebSocket-implementatie in browsers
Om een verbinding tot stand te brengen, maakt het clientscript een WebSocket-object, geeft het de WebSocket URI-parameter door aan de constructor en definieert het callback-functies voor het verbinden, het ontvangen van een bericht en het verbreken van de verbinding.
< html >
< head >
< script >
const webSocket = nieuwe WebSocket ( 'ws://localhost/echo' );
webSocket . onopen = gebeurtenis => {
alert ( 'onopen' );
webSocket . verzenden ( "Hallo Web Socket!" );
};
webSocket . onmessage = event => {
alert ( 'onmessage,' + event . data );
};
webSocket . onclose = gebeurtenis => {
alert ( 'onclose' );
};
</ script >
</ head >
< body >
</ body >
</ html >
WebSocket wordt momenteel ondersteund in de volgende browsers:
- Google Chrome (vanaf versie 4.0.249.0);
- Apple Safari (sinds versie 5.0.7533.16);
- Mozilla Firefox (vanaf versie 4);
- Opera (sinds versie 10.70 9067);
- Internet Explorer (vanaf versie 10);
U kunt controleren of uw browser WebSocket ondersteunt door de link te volgen: http://caniuse.com/#feat=websockets Gearchiveerd op 8 april 2017 op de Wayback Machine .
Eind november 2010 publiceerde Adam Barth de resultaten van een onderzoek naar de betrouwbaarheid van het gebruikte protocol [3] . Volgens de resultaten bleek dat het in het geval van het gebruik van transparante proxyservers mogelijk is om de cache van verzonden gegevens te vervangen, zodat gebruikers in plaats van echte gegevens een versie van de gegevens van een aanvaller krijgen. Het probleem bleek ernstig genoeg te zijn dat de ontwikkelaars van Firefox en Opera op de Wayback Machine, gearchiveerd op 11 januari 2011 hebben aangekondigd dat in toekomstige versies van hun browsers de ondersteuning voor websockets standaard zal worden uitgeschakeld totdat de onveiligheid van dit protocol is verholpen ( hoewel het mogelijk blijft ze aan te zetten).
Opmerkingen
- ↑ Het WebSocket-protocol (draft-hixie-thewebsocketprotocol-76) . Ontvangen 20 september 2011. Gearchiveerd van het origineel op 19 april 2012.
- ↑ Het WebSocket-protocol (draft-ietf-hybi-thewebsocketprotocol-07) . Ontvangen 20 september 2011. Gearchiveerd van het origineel op 19 april 2012.
- ↑ Shestakov V. S., Sagidullin A. S. / TOEPASSING VAN WEBSOCKET-TECHNOLOGIE IN TECHNOLOGISCHE WEB-TOEPASSINGEN. — DOI 10.17586/0021-3454-2015-58-4-328-330 UDC 658.512.011.56. — Zhl Instrumentatie april 2015
Links
- RFC 6455 - Het WebSocket-protocol Gearchiveerd op 8 januari 2012 op de Wayback Machine , protocolstandaard
- HTML5 WebSocket API Gearchiveerd op 7 juni 2015 bij het ontwerp van de Wayback Machine W3C-specificatie
- WebSockets.org -site gewijd aan WebSocket (ondersteunt test-echo-server op WebSocket)
- WebSocketsTest.org Gearchiveerd op 7 oktober 2010 op de Wayback Machine , een site die WebSockets en Comet in uw browser test