ws / wss ·
Handshake ·
Framing ·
Message Types ·
Ping/Pong ·
Subprotocols
WebSocket ermöglicht bidirektionale, persistente Verbindungen zwischen Client und Server – ideal für Echtzeit-Anwendungen wie Chats, Gaming, Live-Ticker und IoT.
WebSocket Handshake ist ein HTTP-basierter Upgrade-Prozess, der eine persistente Verbindung aufbaut. Der Client sendet einen Upgrade-Request, der Server bestätigt mit Status 101 Switching Protocols.
| Header | Beschreibung |
|---|---|
| Upgrade: websocket | Fordert Protokollwechsel an |
| Connection: Upgrade | Bestätigt den Upgrade |
| Sec-WebSocket-Key | Base64-codierter Zufallswert (16 Byte) |
| Sec-WebSocket-Version | WebSocket-Protokollversion (13 = RFC 6455) |
| Sec-WebSocket-Protocol | Gewünschtes Subprotokoll (z.B. chat, json, soap) |
| Sec-WebSocket-Extensions | Erweiterungen (z.B. permessage-deflate) |
Sec-WebSocket-Accept wird aus dem Sec-WebSocket-Key berechnet (Key + UUID "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" → SHA-1 → Base64). Dies dient als einfache Authentifizierung des Handshakes.
WebSocket Framing definiert die Struktur jedes Datenpakets. Jeder Frame enthält Steuerinformationen wie Opcode, Länge und optional einen Maskierungs-Key.
| Feld | Bits | Beschreibung |
|---|---|---|
| FIN | 1 | Letzter Frame einer Nachricht (1 = letzter) |
| RSV1-3 | 3 | Reserviert für Erweiterungen (0, wenn nicht genutzt) |
| Opcode | 4 | Typ des Frames (0x0-0xF) |
| Mask | 1 | Maskierung aktiv (Client → Server immer 1) |
| Payload Length | 7/16/64 | Länge der Nutzdaten (7 Bit, 16 Bit oder 64 Bit) |
| Masking Key | 32 | Maskierungsschlüssel (nur wenn Mask = 1) |
| Payload Data | var | Die eigentlichen Daten (nutzlast) |
Opcode definiert den Typ eines Frames. Daten-Frames übertragen Nutzdaten, Steuer-Frames verwalten die Verbindung (Ping/Pong, Close).
| Opcode | Typ | Beschreibung |
|---|---|---|
| 0x0 | Continuation | Fortsetzungsframe (mehrere Frames für eine Nachricht) |
| 0x1 | Text | UTF-8 Text-Nachricht |
| 0x2 | Binary | Binäre Daten |
| 0x3-0x7 | Reserviert | Für zukünftige Daten-Frames |
| 0x8 | Close | Verbindung schließen (mit Statuscode) |
| 0x9 | Ping | Keep-Alive (Client/Server kann Ping senden) |
| 0xA | Pong | Antwort auf Ping |
| 0xB-0xF | Reserviert | Für zukünftige Steuer-Frames |
Control Frames (Ping, Pong, Close) verwalten die Verbindung. Close Codes geben den Grund für das Schließen der Verbindung an.
| Code | Name | Beschreibung |
|---|---|---|
| 1000 | Normal Closure | Normales Schließen (kein Fehler) |
| 1001 | Going Away | Server/Client geht offline |
| 1002 | Protocol Error | Protokollfehler |
| 1003 | Unsupported Data | Daten-Typ nicht unterstützt |
| 1005 | No Status Received | Kein Statuscode empfangen (intern) |
| 1006 | Abnormal Closure | Abnormales Schließen (Verbindung abgebrochen) |
| 1007 | Invalid Frame Payload Data | Ungültige Nutzdaten |
| 1008 | Policy Violation | Verstoß gegen Richtlinien |
| 1009 | Message Too Big | Nachricht zu groß |
| 1010 | Mandatory Extension | Erweiterung erforderlich |
| 1011 | Internal Server Error | Interner Serverfehler |
| 1012 | Service Restart | Server wird neu gestartet |
| 1013 | Try Again Later | Service temporär nicht verfügbar |
Subprotocols definieren anwendungsspezifische Protokolle über WebSocket (z.B. JSON-RPC, SOAP, MQTT). Extensions erweitern die WebSocket-Funktionalität (z.B. Komprimierung).
| Subprotokoll | Beschreibung |
|---|---|
| json | JSON-basierte Nachrichten (häufig für APIs) |
| soap | SOAP-Protokoll über WebSocket |
| graphql-ws | GraphQL über WebSocket (Subscriptions) |
| mqtt | MQTT über WebSocket (IoT) |
| xmpp | XMPP (Chat) über WebSocket |
| stomp | STOMP (Messaging) über WebSocket |
| Extension | Beschreibung |
|---|---|
| permessage-deflate | Komprimierung der Nachrichten (RFC 7692) |
| permessage-deflate; server_no_context_takeover | Kein Kontext-Übernahme (für bessere Komprimierung) |
graphql-ws der Standard.
Sicherheitsmaßnahmen schützen WebSocket-Verbindungen vor Angriffen – durch Verschlüsselung, Origin-Prüfung, Authentifizierung und Ratenbegrenzung.
| Maßnahme | Beschreibung |
|---|---|
| wss:// (WSS) | Immer WSS (WebSocket Secure) über TLS verwenden – wie HTTPS |
| Origin-Check | Server prüft den Origin-Header auf erlaubte Domains |
| Authentifizierung | Token über Query-Parameter oder Subprotokolle |
| Rate Limiting | Begrenzung der Nachrichten pro Zeiteinheit pro Client |
| Message Size Limit | Maximale Nachrichtengröße festlegen |
| Ping/Pong Timeout | Regelmäßige Ping/Pong für Verbindungsüberwachung |
| Input Validation | Alle eingehenden Nachrichten validieren |
| Close Handling | Richtige Behandlung von Close-Frames (1000, 1001, etc.) |
Origin-Header, um Cross-Origin-Angriffe zu verhindern.
101
Framing
0x1
0x8
Subprotocol
wss
ws://example.com/ws ·
wss://example.com/ws ·
Upgrade: websocket