Was ist ein Websocket?
Ein Websocket ist ein Verfahren, das Webapplikationen schneller und effizienter machen kann. Damit können Sie eine Webapplikation ähnlich nutzen wie ein Anwenderprogramm auf Ihrem Desktop. Realisiert wird das Websocket durch die Herstellung einer dauerhaften Verbindung zwischen Ihrem Browser als Client und einem Webserver. Über diese Verbindung können Sie dann in beide Richtungen ohne neuen Verbindungsaufbau Daten übertragen.
Die Schwächen des HTTP-Protokolls
Ursprünglich war das World Wide Web dafür gedacht, gleichbleibende Dateien von Webservern an Clients zu liefern. Der Client kann also Daten anfordern, der Server reagiert auf diese Anforderung und schließt dann die Verbindung.
Jede solche HTTP-Verbindung besteht also aus einer Anfrage und ihrer Beantwortung durch den Server. Das Protokoll ist zustandslos und das bedeutet, dass von einem solchen Datenaustausch keine Informationen gespeichert werden. Es muss also für jede Anfrage eine Verbindung neu aufgebaut werden. Für jeden solchen Aufbau fallen mehrere hundert Bytes an Overhead an und deshalb ist dieses Modell für dynamische Webanwendungen nur eingeschränkt geeignet.
Was benötigen Sie für schnelle Webapplikationen?
Dafür sind Reaktionen des Servers mit minimaler Verzögerung erforderlich. Beispiele für solche Anwendungen sind dynamische Webseiten, Börsenhandel online oder Spiele mit mehreren Teilnehmern. Verzögerungen sind bei solchen Webapplikationen nicht nur für Sie als Nutzer irritierend, sie können die gesamte Anwendung sinnlos machen, etwa wenn Sie aufgrund von Verzögerungen einen Trade nicht schnell genug abschließen können oder wenn Sie ein Spiel verlieren, weil Ihre Eingabe zu wenig schnell übertragen wurde.
Bis zur Einführung von Websockets wurden Behelfslösungen zu diesem Zweck eingesetzt. Beispielsweise kann der Client in kurzen Abständen Verbindungsanfragen an den Server schicken. Der Server kann dann bei jeder diese Anfragen entscheiden, ob er gerade Daten als Antwort zu übertragen hat oder nicht. Gerade hier ist aber der beträchtliche Overhead deutlich erkennbar. Mehrere Hundert Bytes fallen nämlich bei jeder Anfrage an, gleich ob der Server sie beantwortet oder nicht. Wenn länger keine Informationen vom Server an den Client zur Übertragung anstehen, werden alle diese Daten zum Verbindungsaufbau völlig überflüssigerweise übertragen.
Ein Websocket als Lösung für Echtzeitprobleme in Webapplikationen
Unter einem Websocket versteht man ein Netzwerkprotokoll zusammen mit einem Client-API, das dem Programmierer der Webapplikation zur Verfügung steht.
Die Grundidee des Websockets besteht darin, durch den Client eine dauerhafte Verbindung zum Server aufzubauen. Die so eingerichtete TCP-Verbindung bleibt bestehen und kann zur Übertragung von Daten in beide Richtungen verwendet werden. Der Client besitzt mit einem Websocket also eine Art Standleitung zum Webserver.
Diese Art der Übertragung ist wesentlich effizienter als eine Reihe schnell aufeinanderfolgender neuer HTTP-Verbindungen. Für ein einzelnes Datenpaket fällt nur ein Overhead von genau zwei Bytes an, nämlich eines am Anfang und eines am Ende des Pakets.
Eine dauerhafte Verbindung ist mit einem Websocket ohne Hacks und ineffiziente Behelfslösungen realisierbar. Das Websocket-Protokoll wird von den meisten Browsern unterstützt. Der Server Nginx kann seit 2013 auf Websocket-Anfragen reagieren.
Einige technische Details des Websockets
Das Websocket ist ein Anwendungsprotokoll auf derselben ISO-Ebene wie HTTP und baut also auf TCP auf.
Insbesondere ist das Websocket abwärtskompatibel mit HTTP. Eine Verbindungsaufnahme oder Handshake ist als GET-Request in HTTP formuliert und kann deshalb über dieselben Ports geschickt werden wie HTTP-Datenpakete selbst. Auch Firewalls und Proxys sind kein Problem durch diese Kompatibilität.
Der Handshake selbst enthält eine Anforderung des Clients zur Umstellung auf das Websocket-Protokoll. Neben dem geforderten Protokoll enthält die Anforderung einen zufällig gewählten Schlüssel, der vom Webserver aufgenommen, verarbeitet und zurückgeschickt werden muss. So wird dem Client bestätigt, dass der Server auf das Websocket umstellen kann und diese Anweisung auch verarbeitet hat.
Nach der Umstellung auf das Websocket-Protokoll stellen Client und Server auf eine binäre Datenübertragung um, die effizienter als das HTTP-Protokoll, aber nicht mit diesem kompatibel ist. Es steht dann eine full-duplex Verbindung zwischen Client und Server zur Verfügung.
Sicherheit des Websocket-Protokolls
Für die Übertragung selbst steht auf Port 80 eine ungesicherte und auf Port 443 eine verschlüsselte Übermittlung zur Verfügung. Für den Aufbau der Verbindung sollten Sie beachten, dass solche Anfragen nicht der same-origin-policy unterliegen. Das bedeutet, dass Skripts nicht nur auf Daten von Webseiten derselben Herkunft wie das Skript selbst zugreifen können. Das stellt ein potentielles Sicherheitsrisiko dar, das auch bereits ausgenutzt wurde. Ein solcher Angriff wird als Cross-Site Websocket Hijacking bezeichnet und weist Ähnlichkeiten zur Cross-Site Request Forgery auf. Als Lösung sollte eine eigene Authentifizierung von Websocket-Verbindungen innerhalb der Anwendung zum Einsatz kommen.
- Über den Autor
- Aktuelle Beiträge
Daniel Faust ist Redakteur im Content-Team der Biteno und betreut den Blog der Biteno GmbH.