Passa al contenuto principale

2. HTTP/2 Protocol Overview (Panoramica del protocollo HTTP/2)

HTTP/2 fornisce un trasporto ottimizzato per la semantica HTTP. HTTP/2 supporta tutte le funzionalità principali di HTTP ma mira a essere più efficiente di HTTP/1.1.

HTTP/2 è un protocollo di livello applicazione orientato alla connessione (Connection-Oriented Application-Layer Protocol) che viene eseguito su una connessione TCP ([TCP]). Il client è l'iniziatore della connessione TCP.

L'unità di protocollo di base in HTTP/2 è un frame (Section 4.1). Ogni tipo di frame serve uno scopo diverso. Ad esempio, i frame HEADERS e DATA formano la base delle richieste e risposte HTTP (Section 8.1); altri tipi di frame come SETTINGS, WINDOW_UPDATE e PUSH_PROMISE sono utilizzati a supporto di altre funzionalità HTTP/2.

Il multiplexing delle richieste (Multiplexing of Requests) viene ottenuto associando ogni scambio richiesta/risposta HTTP al proprio stream (Section 5). Gli stream sono in gran parte indipendenti l'uno dall'altro, quindi una richiesta o risposta bloccata o in stallo non impedisce il progresso su altri stream.

L'uso efficace del multiplexing dipende dal controllo di flusso (Flow Control) e dalla prioritizzazione (Prioritization). Il controllo di flusso (Section 5.2) garantisce che sia possibile utilizzare in modo efficiente gli stream multiplexati limitando i dati trasmessi a ciò che il ricevitore è in grado di gestire. La prioritizzazione (Section 5.3) garantisce che le risorse limitate vengano utilizzate nel modo più efficace. Questa revisione di HTTP/2 depreca lo schema di segnalazione della priorità da [RFC7540].

Poiché i campi HTTP utilizzati in una connessione possono contenere grandi quantità di dati ridondanti, i frame che li contengono vengono compressi (Section 4.3). Ciò ha un impatto particolarmente vantaggioso sulle dimensioni delle richieste nel caso comune, consentendo di comprimere molte richieste in un unico pacchetto.

Infine, HTTP/2 aggiunge una nuova modalità di interazione opzionale in cui un server può spingere risposte a un client (Section 8.4). Questo ha lo scopo di consentire a un server di inviare in modo speculativo dati a un client che il server prevede il client avrà bisogno, scambiando un po' di utilizzo della rete contro un potenziale guadagno di latenza. Il server lo fa sintetizzando una richiesta, che invia come frame PUSH_PROMISE. Il server è quindi in grado di inviare una risposta alla richiesta sintetica su un stream separato.

2.1. Document Organization (Organizzazione del documento)

La specifica HTTP/2 è divisa in quattro parti:

  • Avvio di HTTP/2 (Starting HTTP/2, Section 3) copre come viene iniziata una connessione HTTP/2.

  • I livelli di frame (Frame Layer, Section 4) e stream (Stream Layer, Section 5) descrivono il modo in cui i frame HTTP/2 sono strutturati e formati in stream multiplexati.

  • Le definizioni di frame (Frame Definitions, Section 6) e di errore (Error Definitions, Section 7) includono dettagli sui tipi di frame ed errore utilizzati in HTTP/2.

  • Le mappature HTTP (HTTP Mappings, Section 8) e i requisiti aggiuntivi (Additional Requirements, Section 9) descrivono come la semantica HTTP viene espressa utilizzando frame e stream.

Sebbene alcuni concetti di livello frame e stream siano isolati da HTTP, questa specifica non definisce un livello di frame completamente generico. I livelli di frame e stream sono adattati alle esigenze di HTTP.

2.2. Conventions and Terminology (Convenzioni e terminologia)

Le parole chiave "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY" e "OPTIONAL" in questo documento devono essere interpretate come descritto in BCP 14 [RFC2119] [RFC8174] quando, e solo quando, appaiono in tutte maiuscole, come mostrato qui.

Tutti i valori numerici sono in ordine di byte di rete (Network Byte Order). I valori sono senza segno salvo diversa indicazione. I valori letterali sono forniti in decimale o esadecimale a seconda dei casi. I letterali esadecimali sono prefissati con "0x" per distinguerli dai letterali decimali.

Questa specifica descrive i formati binari utilizzando le convenzioni descritte nella sezione 1.3 di RFC 9000 [QUIC]. Si noti che questo formato utilizza l'ordine di byte di rete e che i bit di valore alto sono elencati prima dei bit di valore basso.

Vengono utilizzati i seguenti termini:

client: L'endpoint che inizia una connessione HTTP/2. I client inviano richieste HTTP e ricevono risposte HTTP.

connessione (connection): Una connessione di livello di trasporto tra due endpoint.

errore di connessione (connection error): Un errore che influisce sull'intera connessione HTTP/2.

endpoint: Il client o il server della connessione.

frame: La più piccola unità di comunicazione all'interno di una connessione HTTP/2, costituita da un'intestazione e da una sequenza di ottetti di lunghezza variabile strutturata in base al tipo di frame.

peer: Un endpoint. Quando si discute di un particolare endpoint, "peer" si riferisce all'endpoint remoto rispetto al soggetto principale della discussione.

ricevitore (receiver): Un endpoint che sta ricevendo frame.

mittente (sender): Un endpoint che sta trasmettendo frame.

server: L'endpoint che accetta una connessione HTTP/2. I server ricevono richieste HTTP e inviano risposte HTTP.

stream: Un flusso bidirezionale di frame all'interno della connessione HTTP/2.

errore di stream (stream error): Un errore sul singolo stream HTTP/2.

Infine, i termini "gateway", "intermediario (intermediary)", "proxy" e "tunnel" sono definiti nella sezione 3.7 di [HTTP]. Gli intermediari agiscono sia come client che come server in momenti diversi.

Il termine "contenuto (content)" come si applica ai corpi dei messaggi è definito nella sezione 6.4 di [HTTP].