Passa al contenuto principale

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)


Risorse aggiuntive


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)

OpcodeTipoDescrizione
0x0ContinuationFrame di continuazione
0x1TextFrame di testo (UTF-8)
0x2BinaryFrame binario
0x8CloseFrame di chiusura
0x9PingFrame Ping (heartbeat)
0xAPongFrame Pong (risposta heartbeat)

Codici di stato di chiusura

CodiceNomeDescrizione
1000Normal ClosureChiusura normale
1001Going AwayEndpoint in partenza (es. navigazione pagina)
1002Protocol ErrorErrore di protocollo
1003Unsupported DataTipo di dati non supportato
1006Abnormal ClosureChiusura anomala (nessun frame Close inviato)
1009Message Too BigMessaggio troppo grande
1011Internal ErrorErrore 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 ingleseTermine italianoDescrizione
Full-Duplex CommunicationComunicazione full-duplexComunicazione bidirezionale simultanea
Opening HandshakeHandshake di aperturaProcesso di upgrade da HTTP a WebSocket
Closing HandshakeHandshake di chiusuraProcesso di chiusura elegante della connessione
FrameFrameUnità base di trasmissione dati
MessageMessaggioComposto da uno o più frame
MaskingMascheramentoI dati del client devono essere mascherati (meccanismo di sicurezza)
FragmentationFrammentazioneMessaggi grandi trasmessi in più frame