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:
- HTTP-Methode: Muss GET sein
- HTTP-Version: Mindestens HTTP/1.1
- Erforderliche Header: Host, Upgrade, Connection, Sec-WebSocket-Key, Sec-WebSocket-Version müssen vorhanden sein
- 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:
- Den
Sec-WebSocket-Key-Wert des Clients nehmen - Mit der festen GUID-Zeichenfolge verketten:
258EAFA5-E914-47DA-95CA-C5AB0DC85B11 - SHA-1-Hash auf die verkettete Zeichenfolge anwenden
- 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
- Origin validieren: Server sollten den
Origin-Header validieren, um Cross-Site-Angriffe zu verhindern - TLS verwenden: wss:// in Produktionsumgebungen verwenden
- Alle Header validieren: Sicherstellen, dass alle erforderlichen Header vorhanden und korrekt formatiert sind
- Verbindungen begrenzen: Rate-Limiting implementieren, um DoS-Angriffe zu verhindern
Referenzlinks
- Vorheriges Kapitel: 3. WebSocket URIs
- Nächstes Kapitel: 5. Data Framing (Daten-Framing)
- Implementierungsbeispiel: Handshake-Schlüssel-Berechnung