Passa al contenuto principale

1. Introduction (Introduzione)

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 consiste in un handshake di apertura (Opening Handshake) seguito da un framing di messaggi di base (Message Framing), sovrapposto a TCP.

L'obiettivo di questa specifica è fornire un meccanismo per le applicazioni basate su browser che necessitano di comunicazione bidirezionale con i server senza fare affidamento sull'apertura di più connessioni HTTP (ad esempio, utilizzando XMLHttpRequest o <iframe> e long polling).

1.1 Background (Contesto)

Storicamente, la creazione di applicazioni web che richiedono comunicazione bidirezionale tra un client e un server (ad esempio, applicazioni di messaggistica istantanea e gaming) ha richiesto un abuso di HTTP per interrogare il server per gli aggiornamenti inviando notifiche upstream come chiamate HTTP distinte.

Questo comporta vari problemi:

  • Il server è costretto a utilizzare un numero di diverse connessioni TCP sottostanti per ogni client: una per inviare informazioni al client e una nuova per ogni messaggio in arrivo
  • Il protocollo wire (Wire Protocol) ha un alto overhead, con ogni messaggio client-server che ha un header HTTP
  • Lo script lato client è costretto a mantenere una mappatura dalle connessioni in uscita alla connessione in entrata per tracciare le risposte

Una soluzione più semplice sarebbe utilizzare una singola connessione TCP per il traffico in entrambe le direzioni. Questo è ciò che fornisce il protocollo WebSocket. Combinato con l'API WebSocket, fornisce un'alternativa al polling HTTP per la comunicazione bidirezionale da una pagina web a un server remoto.

1.2 Protocol Overview (Panoramica del protocollo)

Il protocollo ha due parti: un handshake e il trasferimento dati (Data Transfer).

L'handshake dal client appare come segue:

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13

L'handshake dal server appare come segue:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat

Punti chiave dell'handshake:

  • La richiesta del client è una richiesta HTTP Upgrade valida
  • Vengono aggiunti più header specifici di WebSocket
  • Il server risponde con il codice di stato 101

Una volta stabilita la connessione, il client e il server possono inviare dati avanti e indietro in entrambe le direzioni in qualsiasi momento.

1.3 Design Philosophy (Filosofia di progettazione)

Il protocollo WebSocket è progettato sulla base dei seguenti principi:

  1. Protocollo basato su frame anziché su stream: Un protocollo basato su frame (Frame-based Protocol) consente di associare metadati a ogni frame e permette al protocollo di preservare i limiti dei messaggi (Message Boundaries) fino al livello applicazione
  2. Modello di origine: Utilizza il modello di origine del browser (Origin Model) per garantire la sicurezza
  3. Singola connessione TCP: Per funzionare sulle porte HTTP 80 e 443
  4. Indipendente da HTTP: Sebbene l'handshake venga interpretato dai server HTTP come una richiesta di upgrade, il protocollo stesso è indipendente
  5. Estensibilità: Supporta estensioni future attraverso meccanismi di estensione e sottoprotocollo

1.4 Security Model (Modello di sicurezza)

Il protocollo WebSocket utilizza il modello di origine (Origin Model) comunemente usato dai browser web. Il protocollo include un campo header di origine (Origin Header Field) che il server può utilizzare per decidere se accettare una connessione WebSocket da una determinata origine.

Inoltre:

  • Sono raccomandate connessioni crittografate TLS (wss://)
  • I frame dal client al server devono essere mascherati (Masking)
  • Il protocollo include tipi di frame, opcode (Opcode), ecc., per prevenire l'avvelenamento della cache (Cache Poisoning)