Passa al contenuto principale

9. Extensions (Estensioni)

Il protocollo WebSocket fornisce un meccanismo di estensione che consente di aggiungere funzionalità aggiuntive.

9.1 Negotiating Extensions (Negoziazione delle estensioni)

Le estensioni vengono negoziate tramite l'intestazione Sec-WebSocket-Extensions durante l'handshake.

Il client richiede l'estensione

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits

Risposta del server

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Extensions: permessage-deflate

Formato dell'estensione

extension = extension-token *( ";" extension-param )
extension-param = token [ "=" (token | quoted-string) ]

9.2 Known Extensions (Estensioni note)

permessage-deflate (RFC 7692)

L'estensione più comunemente utilizzata, che fornisce funzionalità di compressione dei messaggi.

Vantaggi:

  • Riduce l'utilizzo della larghezza di banda
  • Adatto per dati di testo

Svantaggi:

  • Aumenta l'overhead della CPU
  • Può aumentare la latenza

Esempio di utilizzo (Node.js):

const WebSocket = require('ws');

const wss = new WebSocket.Server({
port: 8080,
perMessageDeflate: {
zlibDeflateOptions: {
chunkSize: 1024,
memLevel: 7,
level: 3
},
zlibInflateOptions: {
chunkSize: 10 * 1024
},
clientNoContextTakeover: true,
serverNoContextTakeover: true,
serverMaxWindowBits: 10,
concurrencyLimit: 10,
threshold: 1024 // Comprimi solo messaggi superiori a 1KB
}
});

Altre estensioni

  • permessage-bzip2: Compressione Bzip2
  • multiplexing: Multiplexing (bozza)
  • Estensioni personalizzate

Sviluppo di estensioni

Quando si sviluppano estensioni personalizzate:

  1. Definire il nome dell'estensione
  2. Definire i parametri
  3. Specificare come modificare la struttura del frame
  4. Implementare la negoziazione dell'handshake
  5. Registrare l'estensione