Passa al contenuto principale

6. Formato binario (Binary Format)

Questa sezione descrive il formato binario dettagliato per tutte le rappresentazioni descritte nella sezione 2.4.

6.1. Rappresentazione di campo di intestazione indicizzato (Indexed Header Field Representation)

Una rappresentazione di campo di intestazione indicizzato identifica una voce nella tabella statica o nella tabella dinamica (vedere sezione 2.3).

  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
| 1 | Index (7+) |
+---+---------------------------+

Figura 5: Campo di intestazione indicizzato

Un campo di intestazione indicizzato inizia con il pattern a 1 bit '1', seguito dall'indice del campo di intestazione corrispondente, rappresentato come un intero con un prefisso a 7 bit (vedere sezione 5.1).

Il valore dell'indice 0 non è utilizzato. DEVE (MUST) essere trattato come un errore di decodifica se trovato in una rappresentazione di campo di intestazione indicizzato.

6.2. Rappresentazione di campo di intestazione letterale (Literal Header Field Representation)

Una rappresentazione di campo di intestazione letterale contiene un valore di campo di intestazione letterale. I nomi dei campi di intestazione sono forniti sia come letterale sia tramite riferimento a una voce di tabella esistente, dalla tabella statica o dalla tabella dinamica (vedere sezione 2.3).

Questa specifica definisce tre forme di rappresentazioni di campo di intestazione letterale: con indicizzazione incrementale, senza indicizzazione e mai indicizzato.

6.2.1. Campo di intestazione letterale con indicizzazione incrementale (Literal Header Field with Incremental Indexing)

Una rappresentazione di campo di intestazione letterale con indicizzazione incrementale comporta l'aggiunta di un campo di intestazione all'elenco di intestazioni decodificate e il suo inserimento come nuova voce nella tabella dinamica.

  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
| 0 | 1 | Index (6+) |
+---+---+-----------------------+
| H | Value Length (7+) |
+---+---------------------------+
| Value String (Length octets) |
+-------------------------------+

Figura 6: Campo di intestazione letterale con indicizzazione incrementale
-- Nome indicizzato
  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
| 0 | 1 | 0 |
+---+---+-----------------------+
| H | Name Length (7+) |
+---+---------------------------+
| Name String (Length octets) |
+---+---------------------------+
| H | Value Length (7+) |
+---+---------------------------+
| Value String (Length octets) |
+-------------------------------+

Figura 7: Campo di intestazione letterale con indicizzazione incrementale
-- Nuovo nome

Una rappresentazione di campo di intestazione letterale con indicizzazione incrementale inizia con il pattern a 2 bit '01'.

Se il nome del campo di intestazione corrisponde al nome del campo di intestazione di una voce memorizzata nella tabella statica o nella tabella dinamica, il nome del campo di intestazione può essere rappresentato utilizzando l'indice di quella voce. In questo caso, l'indice della voce è rappresentato come un intero con un prefisso a 6 bit (vedere sezione 5.1). Questo valore è sempre diverso da zero.

Altrimenti, il nome del campo di intestazione è rappresentato come un letterale di stringa (vedere sezione 5.2). Un valore 0 viene utilizzato al posto dell'indice a 6 bit, seguito dal nome del campo di intestazione.

Qualsiasi forma di rappresentazione del nome del campo di intestazione è seguita dal valore del campo di intestazione rappresentato come un letterale di stringa (vedere sezione 5.2).

6.2.2. Campo di intestazione letterale senza indicizzazione (Literal Header Field without Indexing)

Una rappresentazione di campo di intestazione letterale senza indicizzazione comporta l'aggiunta di un campo di intestazione all'elenco di intestazioni decodificate senza alterare la tabella dinamica.

  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
| 0 | 0 | 0 | 0 | Index (4+) |
+---+---+-----------------------+
| H | Value Length (7+) |
+---+---------------------------+
| Value String (Length octets) |
+-------------------------------+

Figura 8: Campo di intestazione letterale senza indicizzazione
-- Nome indicizzato
  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
| 0 | 0 | 0 | 0 | 0 |
+---+---+-----------------------+
| H | Name Length (7+) |
+---+---------------------------+
| Name String (Length octets) |
+---+---------------------------+
| H | Value Length (7+) |
+---+---------------------------+
| Value String (Length octets) |
+-------------------------------+

Figura 9: Campo di intestazione letterale senza indicizzazione
-- Nuovo nome

Una rappresentazione di campo di intestazione letterale senza indicizzazione inizia con il pattern a 4 bit '0000'.

Se il nome del campo di intestazione corrisponde al nome del campo di intestazione di una voce memorizzata nella tabella statica o nella tabella dinamica, il nome del campo di intestazione può essere rappresentato utilizzando l'indice di quella voce. In questo caso, l'indice della voce è rappresentato come un intero con un prefisso a 4 bit (vedere sezione 5.1). Questo valore è sempre diverso da zero.

Altrimenti, il nome del campo di intestazione è rappresentato come un letterale di stringa (vedere sezione 5.2). Un valore 0 viene utilizzato al posto dell'indice a 4 bit, seguito dal nome del campo di intestazione.

Qualsiasi forma di rappresentazione del nome del campo di intestazione è seguita dal valore del campo di intestazione rappresentato come un letterale di stringa (vedere sezione 5.2).

6.2.3. Campo di intestazione letterale mai indicizzato (Literal Header Field Never Indexed)

Una rappresentazione di campo di intestazione letterale mai indicizzato comporta l'aggiunta di un campo di intestazione all'elenco di intestazioni decodificate senza alterare la tabella dinamica. Gli intermediari DEVONO (MUST) utilizzare la stessa rappresentazione per codificare questo campo di intestazione.

  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
| 0 | 0 | 0 | 1 | Index (4+) |
+---+---+-----------------------+
| H | Value Length (7+) |
+---+---------------------------+
| Value String (Length octets) |
+-------------------------------+

Figura 10: Campo di intestazione letterale mai indicizzato
-- Nome indicizzato
  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
| 0 | 0 | 0 | 1 | 0 |
+---+---+-----------------------+
| H | Name Length (7+) |
+---+---------------------------+
| Name String (Length octets) |
+---+---------------------------+
| H | Value Length (7+) |
+---+---------------------------+
| Value String (Length octets) |
+-------------------------------+

Figura 11: Campo di intestazione letterale mai indicizzato
-- Nuovo nome

Una rappresentazione di campo di intestazione letterale mai indicizzato inizia con il pattern a 4 bit '0001'.

Quando un campo di intestazione è rappresentato come un campo di intestazione letterale mai indicizzato, DEVE (MUST) essere sempre codificato con questa rappresentazione letterale specifica. In particolare, quando un peer invia un campo di intestazione che ha ricevuto rappresentato come un campo di intestazione letterale mai indicizzato, DEVE utilizzare la stessa rappresentazione per inoltrare questo campo di intestazione.

Questa rappresentazione è destinata a proteggere i valori dei campi di intestazione che non devono essere messi a rischio comprimendoli (vedere sezione 7.1 per maggiori dettagli).

La codifica della rappresentazione è identica al campo di intestazione letterale senza indicizzazione (vedere sezione 6.2.2).

6.3. Aggiornamento della dimensione della tabella dinamica (Dynamic Table Size Update)

Un aggiornamento della dimensione della tabella dinamica segnala una modifica alla dimensione della tabella dinamica.

  0   1   2   3   4   5   6   7
+---+---+---+---+---+---+---+---+
| 0 | 0 | 1 | Max size (5+) |
+---+---------------------------+

Figura 12: Modifica della dimensione massima della tabella dinamica

Un aggiornamento della dimensione della tabella dinamica inizia con il pattern a 3 bit '001', seguito dalla nuova dimensione massima, rappresentata come un intero con un prefisso a 5 bit (vedere sezione 5.1).

La nuova dimensione massima DEVE (MUST) essere inferiore o uguale al limite determinato dal protocollo che utilizza HPACK. Un valore che supera questo limite DEVE essere trattato come un errore di decodifica. In HTTP/2, questo limite è l'ultimo valore del parametro SETTINGS_HEADER_TABLE_SIZE (vedere sezione 6.5.2 di [HTTP2]) ricevuto dal decodificatore e riconosciuto dal codificatore (vedere sezione 6.5.3 di [HTTP2]).

La riduzione della dimensione massima della tabella dinamica può causare l'evizione di voci (vedere sezione 4.3).