RFC 6455 - The WebSocket Protocol (Il Protocollo WebSocket)
Data di pubblicazione: Dicembre 2011
Stato: Standards Track
Autori: I. Fette (Google Inc.), A. Melnikov (Isode Ltd.)
Sommario (Abstract)
Il protocollo WebSocket (WebSocket Protocol) abilita la comunicazione full-duplex (Full-Duplex Communication) tra un client e un server su una singola connessione TCP. Il protocollo WebSocket è progettato per essere implementato nei browser web e nei server web, ma può essere utilizzato da qualsiasi applicazione client o server.
Il protocollo WebSocket è un protocollo indipendente basato su TCP. La sua unica relazione con HTTP è che il suo handshake viene interpretato dai server HTTP come una richiesta di upgrade (Upgrade Request).
Indice (Table of Contents)
- 1. Introduction (Introduzione)
- 1.1 Background (Contesto)
- 1.2 Protocol Overview (Panoramica del protocollo)
- 1.3 Opening Handshake (Handshake di apertura)
- 1.4 Closing Handshake (Handshake di chiusura)
- 1.5 Design Philosophy (Filosofia di progettazione)
- 1.6 Security Model (Modello di sicurezza)
- 1.7 Relationship to TCP and HTTP (Relazione con TCP e HTTP)
- 1.8 Establishing a Connection (Stabilire una connessione)
- 1.9 Subprotocols and Extensions (Sottoprotocolli ed estensioni)
- 2. Conformance Requirements (Requisiti di conformità)
- 2.1 Terminology and Other Conventions (Terminologia e altre convenzioni)
- 3. WebSocket URIs
- 4. Opening Handshake (Handshake di apertura)
- 4.1 Client Requirements (Requisiti del client)
- 4.2 Server-Side Requirements (Requisiti lato server)
- 4.3 Collecting Extensions and Subprotocols (Raccolta di estensioni e sottoprotocolli)
- 4.4 Supporting Multiple Versions (Supporto di più versioni)
- 5. Data Framing (Frammentazione dei dati)
- 5.1 Overview (Panoramica)
- 5.2 Base Framing Protocol (Protocollo di framing di base)
- 5.3 Client-to-Server Masking (Mascheramento client-server)
- 5.4 Fragmentation (Frammentazione)
- 5.5 Control Frames (Frame di controllo)
- 5.6 Data Frames (Frame di dati)
- 5.7 Examples (Esempi)
- 5.8 Extensibility (Estensibilità)
- 6. Sending and Receiving Data (Invio e ricezione di dati)
- 6.1 Sending Data (Invio di dati)
- 6.2 Receiving Data (Ricezione di dati)
- 7. Closing the Connection (Chiusura della connessione)
- 7.1 Definitions (Definizioni)
- 7.2 Abnormal Closures (Chiusure anomale)
- 7.3 Normal Closure (Chiusura normale)
- 7.4 Status Codes (Codici di stato)
- 8. Error Handling (Gestione degli errori)
- 8.1 Handling Errors in UTF-8-Encoded Data (Gestione degli errori nei dati codificati UTF-8)
- 9. Extensions (Estensioni)
- 9.1 Negotiating Extensions (Negoziazione delle estensioni)
- 9.2 Known Extensions (Estensioni conosciute)
- 10. Security Considerations (Considerazioni sulla sicurezza)
- 10.1 Non-Browser Clients (Client non-browser)
- 10.2 Origin Considerations (Considerazioni sull'origine)
- 10.3 Attacks On Infrastructure (Attacchi all'infrastruttura)
- 10.4 Implementation-Specific Limits (Limiti specifici dell'implementazione)
- 10.5 WebSocket Client Authentication (Autenticazione del client WebSocket)
- 10.6 Connection Confidentiality and Integrity (Riservatezza e integrità della connessione)
- 10.7 Handling of Invalid Data (Gestione di dati non validi)
- 10.8 Use of SHA-1 (Uso di SHA-1)
- 11. IANA Considerations (Considerazioni IANA)
- 12. Using WebSocket Protocol from Other Specifications (Utilizzo del protocollo WebSocket da altre specifiche)
- 13. Acknowledgements (Ringraziamenti)
- 14. References (Riferimenti)
- 14.1 Normative References (Riferimenti normativi)
- 14.2 Informative References (Riferimenti informativi)
Risorse aggiuntive
- 📖 Guida all'implementazione: Guida all'implementazione del protocollo WebSocket - Documentazione tecnica dettagliata, esempi di codice e best practice
- 🔗 RFC ufficiale: RFC 6455
- 📋 DataTracker: RFC 6455 DataTracker
- 🐛 Errata: RFC Editor Errata
RFC correlati
- RFC 6455: The WebSocket Protocol ← Questo documento
- RFC 7692: WebSocket Compression Extensions (Estensioni di compressione WebSocket)
- RFC 8441: Bootstrapping WebSockets with HTTP/2 (Avvio di WebSocket con HTTP/2)
Riferimento rapido
Formato URI WebSocket
ws-URI = "ws:" "//" host [ ":" port ] path [ "?" query ]
wss-URI = "wss:" "//" host [ ":" port ] path [ "?" query ]
ws://- Connessione non crittografata (porta predefinita 80)wss://- Connessione crittografata TLS (porta predefinita 443, raccomandato per la produzione)
Esempio di handshake
Richiesta del client:
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
Risposta del server:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Tipi di frame (Opcode)
| Opcode | Tipo | Descrizione |
|---|---|---|
| 0x0 | Continuation | Frame di continuazione |
| 0x1 | Text | Frame di testo (UTF-8) |
| 0x2 | Binary | Frame binario |
| 0x8 | Close | Frame di chiusura |
| 0x9 | Ping | Frame Ping (heartbeat) |
| 0xA | Pong | Frame Pong (risposta heartbeat) |
Codici di stato di chiusura
| Codice | Nome | Descrizione |
|---|---|---|
| 1000 | Normal Closure | Chiusura normale |
| 1001 | Going Away | Endpoint in partenza (es. navigazione pagina) |
| 1002 | Protocol Error | Errore di protocollo |
| 1003 | Unsupported Data | Tipo di dati non supportato |
| 1006 | Abnormal Closure | Chiusura anomala (nessun frame Close inviato) |
| 1009 | Message Too Big | Messaggio troppo grande |
| 1011 | Internal Error | Errore interno del server |
Struttura del frame (Formato base)
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len | Extended payload length |
|I|S|S|S| (4) |A| (7) | (16/64) |
|N|V|V|V| |S| | (if payload len==126/127) |
| |1|2|3| |K| | |
+-+-+-+-+-------+-+-------------+-------------------------------+
| Extended payload length continued, if payload len == 127 |
+-------------------------------+-------------------------------+
| |Masking-key, if MASK set to 1 |
+-------------------------------+-------------------------------+
| Masking-key (continued) | Payload Data |
+-------------------------------+-------------------------------+
Punti chiave:
- FIN: 1=frame finale, 0=seguono altri frame
- MASK: deve essere 1 per client→server, deve essere 0 per server→client
- Opcode: Identificatore del tipo di frame
- Payload Length: Lunghezza dei dati (0-125 diretto, 126 usa 16-bit, 127 usa 64-bit)
Terminologia principale
| Termine inglese | Termine italiano | Descrizione |
|---|---|---|
| Full-Duplex Communication | Comunicazione full-duplex | Comunicazione bidirezionale simultanea |
| Opening Handshake | Handshake di apertura | Processo di upgrade da HTTP a WebSocket |
| Closing Handshake | Handshake di chiusura | Processo di chiusura elegante della connessione |
| Frame | Frame | Unità base di trasmissione dati |
| Message | Messaggio | Composto da uno o più frame |
| Masking | Mascheramento | I dati del client devono essere mascherati (meccanismo di sicurezza) |
| Fragmentation | Frammentazione | Messaggi grandi trasmessi in più frame |