WebSocket

Van Wikipedia, de gratis encyclopedie
Spring naar navigatie Spring naar zoeken
WebSocket-protocol
Familie: Internet protocol familie
Operatie gebied: bidirectionele verbinding tussen
een webtoepassing en een WebSocket-server
Haven: 80 / TCP, 443 / TCP
WebSocket in de TCP / IP-protocolstack :
gebruik maken van WebSocket
vervoer- TCP
internet IP ( IPv4 , IPv6 )
Netwerktoegang Ethernet token
bus
token
ring
FDDI ...
Normen: RFC 6455 (het WebSocket-protocol versie 13, 2011)

Het WebSocket-protocol is een op TCP gebaseerd netwerkprotocol dat is ontworpen om een bidirectionele verbinding tot stand te brengen tussen een webtoepassing en een WebSocket-server of een webserver die ook WebSockets ondersteunt.

Voordelen ten opzichte van pure HTTP

Terwijl bij een pure HTTP- verbinding elke actie van de server een voorafgaand verzoek van de client vereist, is het bij het WebSocket-protocol voldoende dat de client de verbinding opent. De server kan dan actief gebruik maken van deze open verbinding en nieuwe informatie aan de client leveren zonder te wachten op een nieuwe verbinding van de client. Bij een pure HTTP-verbinding is een door de server geïnitieerde transmissie alleen mogelijk door vertraagde reacties op een verzoek dat door de client is gestart ( long polling ). Sinds HTTP/2 kan de server ook pushberichten versturen. Bovendien hebben WebSockets niet de extra gegevens die worden veroorzaakt door de HTTP-header, die voor elk verzoek een paar honderd bytes kan bevatten. Technisch gezien start de client bij WebSocket, net als bij HTTP, een verzoek, met dit verschil dat nadat de gegevens zijn overgedragen om de verbinding tot stand te brengen, de onderliggende TCP- verbinding blijft bestaan ​​en asynchrone overdrachten in beide richtingen mogelijk maakt.

URI-schema

De WebSocket-protocolspecificatie definieert twee nieuwe URI- schema's, ws: voor niet-versleutelde verbindingen en wss: voor versleutelde verbindingen.

De handdruk van het WebSocket-protocol

Aan het begin van elke verbinding voeren server en client een zogenaamde handshake uit. Dit is vergelijkbaar met de HTTP-header en is er volledig achterwaarts compatibel mee, wat het gebruik van de standaard HTTP-poort "80" voor normale HTTP-communicatie en voor gebruik van de websocket mogelijk maakt. De handshake bevat ook verdere informatie (bijvoorbeeld de gebruikte protocolversie).

Verzoek van de klant

Een voorbeeld van een handdruk van het zeventiende conceptprotocol ( draft-ietf-hybi-thewebsocketprotocol-17 ) wordt hieronder getoond en toegelicht: [1]

Let op: oudere protocolconcepten kunnen sterk verschillen van deze versie van het protocol, omdat het vanwege veiligheidsredenen opnieuw is ontworpen. Dit geldt in het bijzonder voor de concepten vóór draft-ietf-hybi-thewebsocketprotocol-04 .

 GET / chat HTTP / 1.1
 Host: server.voorbeeld.com
 Upgrade: websocket
 Verbinding: upgrade
 Sec-WebSocket-sleutel: dGhlIHNhbXBsZSBub25jZQ ==
 Oorsprong: http://example.com
 Sec-WebSocket-Protocol: chat, superchat
 Sec-WebSocket-versie: 13

Net als in het HTTP-protocol specificeert de client tot welke bron (hier: / chat ) en tot welke host (hier: server.voorbeeld.com ) hij toegang wil hebben. De client vraagt ​​ook om een ​​upgrade naar het websocket-protocol. De willekeurig gegenereerde "Sec-WebSocket-Key" wordt gebruikt om te controleren of de server het verzoek daadwerkelijk heeft gelezen en begrepen ( zie paragraaf Reactie van de server ). Onder “Sec-WebSocket-Protocol” heeft de klant de mogelijkheid om protocollen op te geven op basis van het Websocket-protocol dat de client-applicatie ondersteunt (hier: een chatprotocol). De gebruikte protocolversie moet worden gespecificeerd onder "Sec-WebSocket-Version".

Reactie van de server

Een websocket-server kan bijvoorbeeld als volgt op de bovenstaande voorbeeldquery reageren:

 HTTP / 1.1 101 Schakelprotocollen
 Upgrade: websocket
 Verbinding: upgrade
 Sec-WebSocket-Accepteren: s3pPLMBiTxaQ9kYGzzhZRbK + xOo =
 Sec-WebSocket-Protocol: chat

Met de HTTP-statuscode 101 en de volgende twee regels verklaart de server akkoord te gaan met de protocolwijziging. Vanaf dat moment gebruiken ze allebei een binair protocol dat niet langer HTTP-compatibel is. Het wordt opgedeeld in pakketten die zijn gemarkeerd als binair of tekst, als ping of pong, of als het einde van de verbinding, waarbij de lengte van de inhoud wordt gespecificeerd. [2]

De sleutel die wordt teruggestuurd onder "Sec-WebSocket-Accept" wordt gebruikt om te controleren of de server het verzoek van de client heeft gelezen. Het wordt als volgt gemaakt: De Globally Unique Identifier 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 toegevoegd aan de bovengenoemde Base64- gecodeerde string die de client verzendt ("Sec-WebSocket-Key"). Vervolgens wordt een SHA1-hash van de resulterende sleutel gemaakt en met Base64 gecodeerd. Hierbij moet worden opgemerkt dat de oorspronkelijk ontvangen sleutel Base64-gecodeerd is, maar op geen enkel moment wordt gedecodeerd.

In dit voorbeeld geeft de server ook aan het gevraagde protocol "chat" ("Sec-WebSocket-Protocol") te kennen.

voorbeeld

WebSocket-client in JavaScript

 var socket = nieuwe WebSocket ( urlToWebsocketServer );

// callback-functie wordt aangeroepen wanneer de verbinding tot stand is gebracht
stopcontact . onopen = functie () {
console . log ( "Verbinding is succesvol tot stand gebracht" );
};

// callback-functie wordt aangeroepen wanneer een nieuw websocket-bericht binnenkomt
stopcontact . onmessage = functie ( messageEvent ) {
console . log ( messageEvent . data );
};

// callback-functie wordt aangeroepen wanneer er een fout optreedt
stopcontact . onerror = functie ( errorEvent ) {
console . log ( "Fout! De verbinding is onverwacht verbroken" );
};

stopcontact . onclose = functie ( closeEvent ) {
console . log ( 'De verbinding is verbroken --- Code:' + closeEvent . code + '--- Reden:' + closeEvent . reden );
};

Extensies

De specificatie maakt het mogelijk om het websocket-protocol uit te breiden met gedefinieerde "extensies". Deze worden onderhandeld tussen client en server. Voorbeelden:

Browserondersteuning

literatuur

  • Peter Leo Gorski, Luigi Lo Iacono, Hoai Viet Nguyen: WebSockets - Ontwikkeling van moderne HTML5 real-time applicaties , Hanser, München en Wenen 2015, ISBN 978-3-446-44371-6

web links

Individueel bewijs

  1. Deze voorbeeldhanddruk komt uit de zeventiende versie van het WebSocket Protocol Draft van de IETF
  2. Basisframingprotocol in RFC 6455
  3. https://developer.mozilla.org/de/docs/WebSockets