1. Introduzione (Introduction)
In HTTP/1.1 (vedi [RFC7230]), i campi di intestazione (Header Field) non sono compressi. Man mano che le pagine Web sono cresciute fino a richiedere decine o centinaia di richieste, i campi di intestazione ridondanti in queste richieste consumano inutilmente larghezza di banda e aumentano significativamente la latenza.
SPDY [SPDY] ha inizialmente affrontato questa ridondanza comprimendo i campi di intestazione utilizzando il formato DEFLATE [DEFLATE], che si è dimostrato molto efficace nel rappresentare i campi di intestazione ridondanti. Tuttavia, questo approccio ha esposto un rischio per la sicurezza come dimostrato dall'attacco CRIME (Compression Ratio Info-leak Made Easy) (vedi [CRIME]).
Questa specifica definisce HPACK, un nuovo schema di compressione che elimina i campi di intestazione ridondanti, limita la vulnerabilità agli attacchi di sicurezza noti e ha requisiti di memoria limitati per l'uso in ambienti vincolati. Le preoccupazioni potenziali sulla sicurezza riguardanti HPACK sono descritte nella Sezione 7.
Il formato HPACK è deliberatamente semplice e inflessibile. Entrambe le caratteristiche riducono il rischio di problemi di interoperabilità o sicurezza dovuti a errori di implementazione. Non è definito alcun meccanismo di estensione. Le modifiche al formato sono possibili solo definendo una sostituzione completa.
1.1. Panoramica (Overview)
Il formato definito in questa specifica tratta una lista di campi di intestazione come una raccolta ordinata di coppie nome-valore che possono includere coppie duplicate. I nomi e i valori sono considerati come sequenze di byte opache e l'ordine dei campi di intestazione viene preservato dopo la compressione e la decompressione.
La codifica (Encoding) è informata da una tabella di campi di intestazione (Header Field Table) che mappa i campi di intestazione ai valori di indice (Index Value). Queste tabelle di campi di intestazione possono essere aggiornate in modo incrementale quando vengono codificati o decodificati nuovi campi di intestazione.
Nel formato codificato, un campo di intestazione è rappresentato come un letterale (Literal) o come un riferimento a un campo di intestazione in una delle tabelle di campi di intestazione. Pertanto, una lista di campi di intestazione può essere codificata utilizzando un mix di riferimenti e valori letterali.
I valori letterali sono codificati direttamente o utilizzando un codice di Huffman statico (Static Huffman Code).
L'encoder (Encoder) è responsabile di decidere quali campi di intestazione inserire come nuove voci nella tabella di campi di intestazione. Il decoder (Decoder) esegue le modifiche alla tabella di campi di intestazione prescritte dall'encoder, ricostruendo così la lista di campi di intestazione nel processo. Ciò consente ai decoder di rimanere semplici e interoperabili con una varietà di encoder.
Esempi che illustrano l'uso di questi diversi meccanismi per rappresentare i campi di intestazione sono disponibili nell'Appendice C.
1.2. Convenzioni (Conventions)
Le parole chiave "DEVE" (MUST), "NON DEVE" (MUST NOT), "RICHIESTO" (REQUIRED), "DOVRÀ" (SHALL), "NON DOVRÀ" (SHALL NOT), "DOVREBBE" (SHOULD), "NON DOVREBBE" (SHOULD NOT), "RACCOMANDATO" (RECOMMENDED), "PUÒ" (MAY) e "OPZIONALE" (OPTIONAL) in questo documento devono essere interpretate come descritto nella RFC 2119 [RFC2119].
Tutti i valori numerici sono in ordine di byte di rete. I valori sono senza segno salvo indicazione contraria. I valori letterali sono forniti in notazione decimale o esadecimale secondo necessità.
1.3. Terminologia (Terminology)
Questa specifica utilizza i seguenti termini:
Campo di intestazione (Header Field): Una coppia nome-valore. Sia il nome che il valore sono trattati come sequenze di byte opache.
Tabella dinamica (Dynamic Table): La tabella dinamica (vedi Sezione 2.3.2) è una tabella che associa i campi di intestazione memorizzati a valori di indice. Questa tabella è dinamica e specifica per un contesto di codifica o decodifica.
Tabella statica (Static Table): La tabella statica (vedi Sezione 2.3.1) è una tabella che associa staticamente i campi di intestazione frequentemente incontrati a un valore di indice. Questa tabella è ordinata, di sola lettura, sempre accessibile e può essere condivisa tra tutti i contesti di codifica o decodifica.
Lista di intestazioni (Header List): Una lista di intestazioni è una raccolta ordinata di campi di intestazione che sono codificati congiuntamente e possono contenere campi di intestazione duplicati. La lista completa dei campi di intestazione contenuta in un blocco di intestazioni HTTP/2 è una lista di intestazioni.
Rappresentazione del campo di intestazione (Header Field Representation): Un campo di intestazione può essere rappresentato in forma codificata come un letterale o come un indice (vedi Sezione 2.4).
Blocco di intestazioni (Header Block): Una lista ordinata di rappresentazioni di campi di intestazione che, una volta decodificata, produce una lista di intestazioni completa.