WebSocket: Annäherung an Echtzeit im Web

Seite 2: Duplexe Kommunikation

Inhaltsverzeichnis

WebSocket ist ein bidirektionaler und (voll-)duplexer Kommunikationsstandard und besteht aus einer Client-API und einem Netzwerkprotokoll.

Das W3C (World Wide Web Consortium) hat die JavaScript-API definiert, die IETF (Internet Engineering Taskforce) spezifizierte das WebSocket-Protokoll. Die Arbeiten zu beiden Spezifikationen begannen im Jahr 2009, eingeleitet durch die Firma Google. Weitere, wie Mozilla, Kaazing oder Opera, sind ebenfalls an der Diskussion beteiligt.

In dem Wort "vollduplex" steckt der große Vorteil von WebSocket. Die bidirektionale Kommunikation zwischen Server und Client läuft über genau einen Kommunikationskanal ab. Sobald die WebSocket-Verbindung aufgebaut ist, können Server und Client gleichzeitig miteinander kommunizieren. In einer frühen Version der Spezifikation wurde WebSocket auch als "TCP für das Web" bezeichnet. Es verwendet die Standard-HTTP-Ports 80 und 443 für TLS, sodass der Verbindungsaufbau auch durch Firewalls hinweg funktioniert. Proxy-Server stellen ebenfalls kein Problem dar, weil im Fall einer solchen Installation automatisch ein Tunnel geöffnet wird: Nutzt der Browser einen Proxy-Server, wird das clientseitig festgestellt und der Proxy-Server wird mit der HTTP-CONNECT-Methode angewiesen, über TCP/IP eine Verbindung zu einem bestimmten Host zu öffnen. Zudem lässt sich WebSocket mit bestehenden Authentifizierungs- und Autorisierungs-Frameworks, wie Kerberos, nutzten.

Der Verbindungsaufbau zwischen Client und Server erfolgt mit dem WebSocket Protocol Handshake:

GET /chatService HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 8
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: superchat

Abb. 3: Der WebSocket Handshake

Zunächst sendet der Browser eine normale HTTP GET-Anfrage an eine Ressource (/chatService). Zudem gibt er an, dass er ein Upgrade auf das WebSocket-Protokoll durchführen möchte. Zusätzlich werden beim Verbindungsaufbau verschiedene Key-Value-Pärchen zum Server geschickt. Der Sec-WebSocket-Key Header stellt eine Base64-enkodierte Zeichenkette dar, die der Server nutzt, um den Verbindungsaufbau zu akzeptieren. Optional kann der Browser weitere Header an den Server übermitteln. Beispielsweise kann er dem Server mitteilen, ob ein anwendungsspezifisches Protokoll über WebSocket genutzt werden soll, und von ihm unterstützte Protokollversion angeben.

Der WebSocket-Server antwortet mit dem HTTP-Statuscode 101 und signalisiert damit dem Client, dass er den Upgrade-Wunsch akzeptiert (Sec-WebSocket-Accept) und das Upgrade auf das WebSocket-Protokoll vornimmt. Zusätzlich gibt der Server an, dass er das "superchat"-Protokoll kennt. Das hat den Vorteil, dass die Browseranwendung direkt gegen dieses Protokoll beziehungsweise diese API geschrieben wird, statt gegen die WebSocket-API. Entwickler, die mit der Programmierschnittstelle beziehungsweise dem anwendungsspezifischen Protokoll vertraut sind, brauchen keine neue API erlernen, um WebSocket-Anwendungen zu erstellen. Die clientseitige Schnittstelle des "superchat"-Protokolls kapselt die eigentlich Kommunikation mit dem WebSocket-Server.