Zum Hauptinhalt springen

4. Opening Handshake (Eröffnungs-Handshake)

Der Eröffnungs-Handshake (Opening Handshake) des WebSocket-Protokolls ist so konzipiert, dass er mit der bestehenden HTTP-Infrastruktur kompatibel ist. Der Handshake ist eine HTTP-Upgrade-Anfrage.

4.1 Client Requirements (Client-Anforderungen)​

Die vom Client gesendete Handshake-Anfrage muss eine gültige HTTP-Anfrage im folgenden Format sein:

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Extensions: permessage-deflate

Erforderliche Header-Felder​

Host

  • Enthält den Host und die Portnummer des Servers
  • Entspricht der HTTP/1.1-Spezifikation

Upgrade: websocket

  • muss (MUST) diesen Header enthalten
  • Der Wert ist "websocket" (Groß-/Kleinschreibung wird nicht beachtet)

Connection: Upgrade

  • muss (MUST) diesen Header enthalten
  • Zeigt an, dass dies eine Upgrade-Anfrage ist

Sec-WebSocket-Key

  • muss (MUST) diesen Header enthalten
  • Zufällig generierter 16-Byte-Wert, Base64-kodiert
  • Wird verwendet, um zu überprüfen, ob der Server das WebSocket-Protokoll versteht

Sec-WebSocket-Version: 13

  • muss (MUST) diesen Header enthalten
  • Die aktuelle Versionsnummer ist 13

Optionale Header-Felder​

Origin

  • Browser-Clients müssen (MUST) ihn einschließen
  • Nicht-Browser-Clients können (MAY) ihn einschließen
  • Wird für serverseitige Sicherheitsvalidierung verwendet

Sec-WebSocket-Protocol

  • optional (OPTIONAL)
  • Gibt die Liste der vom Client unterstützten Unterprotokolle an
  • Mehrere Werte werden durch Kommas getrennt

Sec-WebSocket-Extensions

  • optional (OPTIONAL)
  • Gibt die vom Client unterstützten Erweiterungen an
  • Format: extension-name [; parameter=value]*

4.2 Server-Side Requirements (Serverseitige Anforderungen)​

Der Server muss den Client-Handshake validieren und eine angemessene Antwort zurückgeben.

4.2.1 Reading the Client's Opening Handshake (Lesen des Client-Handshakes)​

Der Server muss (MUST) Folgendes validieren:

  1. HTTP-Methode: Muss GET sein
  2. HTTP-Version: Mindestens HTTP/1.1
  3. Erforderliche Header: Host, Upgrade, Connection, Sec-WebSocket-Key, Sec-WebSocket-Version müssen vorhanden sein
  4. Sec-WebSocket-Version: Muss 13 sein (oder eine vom Server unterstützte Version)

Wenn die Validierung fehlschlägt, sollte (SHOULD) der Server einen entsprechenden HTTP-Fehlerstatuscode zurückgeben.

4.2.2 Sending the Server's Opening Handshake (Senden des Server-Handshakes)​

Wenn die Validierung erfolgreich ist, muss (MUST) der Server eine Handshake-Antwort senden:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat

Berechnung von Sec-WebSocket-Accept​

Dies ist ein kritischer Teil des Handshakes. Der Server muss wie folgt berechnen:

  1. Den Sec-WebSocket-Key-Wert des Clients nehmen
  2. Mit der festen GUID-Zeichenfolge verketten: 258EAFA5-E914-47DA-95CA-C5AB0DC85B11
  3. SHA-1-Hash auf die verkettete Zeichenfolge anwenden
  4. Das Hash-Ergebnis Base64-kodieren

Algorithmus-Beispiel (JavaScript):

const crypto = require('crypto');

function generateAcceptKey(clientKey) {
const GUID = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
const concatenated = clientKey + GUID;
const hash = crypto.createHash('sha1').update(concatenated).digest();
return hash.toString('base64');
}

// Beispiel
const clientKey = 'dGhlIHNhbXBsZSBub25jZQ==';
const acceptKey = generateAcceptKey(clientKey);
console.log(acceptKey); // s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

4.3 Collecting Extensions and Subprotocols (Sammeln von Erweiterungen und Unterprotokollen)​

Unterprotokoll-Verhandlung​

Der Client kann mehrere Unterprotokolle im Sec-WebSocket-Protocol-Header auflisten:

Sec-WebSocket-Protocol: chat, superchat

Der Server muss (MUST) eines (oder keines) aus der Liste des Clients auswählen und es in der Antwort zurückgeben:

Sec-WebSocket-Protocol: chat

Wenn der Server keines der vom Client angeforderten Unterprotokolle unterstützt, kann er den Sec-WebSocket-Protocol-Header weglassen.

Erweiterungs-Verhandlung​

Die Erweiterungs-Verhandlung erfolgt über den Sec-WebSocket-Extensions-Header:

Client-Anfrage:

Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits

Server-Antwort:

Sec-WebSocket-Extensions: permessage-deflate

Der Server kann Erweiterungen akzeptieren, Parameter ändern oder ablehnen.

4.4 Supporting Multiple Versions (Unterstützung mehrerer Versionen)​

Wenn der Server die vom Client angeforderte Version nicht unterstützt, sollte (SHOULD) er HTTP 426 Upgrade Required zurückgeben und einen Sec-WebSocket-Version-Header mit den unterstützten Versionen einschließen:

HTTP/1.1 426 Upgrade Required
Sec-WebSocket-Version: 13, 8, 7

Vollständige Handshake-Beispiele​

Erfolgreicher Handshake​

Client → Server:

GET /chat HTTP/1.1
Host: example.com:8000
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat
Sec-WebSocket-Version: 13
Origin: http://example.com

Server → Client:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat

Beispiele für fehlgeschlagene Handshakes​

Nicht unterstützte Version:

HTTP/1.1 426 Upgrade Required
Sec-WebSocket-Version: 13

Origin nicht akzeptiert:

HTTP/1.1 403 Forbidden

Sicherheitsüberlegungen​

  1. Origin validieren: Server sollten den Origin-Header validieren, um Cross-Site-Angriffe zu verhindern
  2. TLS verwenden: wss:// in Produktionsumgebungen verwenden
  3. Alle Header validieren: Sicherstellen, dass alle erforderlichen Header vorhanden und korrekt formatiert sind
  4. Verbindungen begrenzen: Rate-Limiting implementieren, um DoS-Angriffe zu verhindern