Passa al contenuto principale

4. Gestione della tabella dinamica (Dynamic Table Management)

Per limitare i requisiti di memoria sul lato del decodificatore, la dimensione della tabella dinamica è vincolata.

4.1. Calcolo della dimensione della tabella (Calculating Table Size)

La dimensione della tabella dinamica è la somma delle dimensioni delle sue voci.

La dimensione di una voce è la somma della lunghezza del suo nome in ottetti (come definito nella sezione 5.2), della lunghezza del suo valore in ottetti, e di 32.

La dimensione di una voce è calcolata utilizzando la lunghezza del suo nome e del suo valore senza alcuna codifica Huffman applicata.

Nota: I 32 ottetti aggiuntivi rappresentano un overhead stimato associato a una voce. Ad esempio, una struttura di voce che utilizza due puntatori a 64 bit per fare riferimento al nome e al valore della voce e due interi a 64 bit per contare il numero di riferimenti al nome e al valore avrebbe 32 ottetti di overhead.

4.2. Dimensione massima della tabella (Maximum Table Size)

I protocolli che utilizzano HPACK determinano la dimensione massima che il codificatore è autorizzato a utilizzare per la tabella dinamica. In HTTP/2, questo valore è determinato dal parametro SETTINGS_HEADER_TABLE_SIZE (vedere sezione 6.5.2 di [HTTP2]).

Un codificatore può scegliere di utilizzare meno capacità di questa dimensione massima (vedere sezione 6.3), ma la dimensione scelta DEVE (MUST) rimanere inferiore o uguale al massimo definito dal protocollo.

Un cambiamento della dimensione massima della tabella dinamica viene segnalato tramite un aggiornamento della dimensione della tabella dinamica (vedere sezione 6.3). Questo aggiornamento della dimensione della tabella dinamica DEVE (MUST) avvenire all'inizio del primo blocco di intestazioni successivo al cambiamento della dimensione della tabella dinamica. In HTTP/2, questo segue un riconoscimento delle impostazioni (vedere sezione 6.5.3 di [HTTP2]).

Più aggiornamenti della dimensione massima della tabella possono verificarsi tra la trasmissione di due blocchi di intestazioni. Nel caso in cui questa dimensione venga modificata più di una volta in questo intervallo, la dimensione massima della tabella più piccola che si verifica in questo intervallo DEVE (MUST) essere segnalata in un aggiornamento della dimensione della tabella dinamica. La dimensione massima finale viene sempre segnalata, dando al massimo due aggiornamenti della dimensione della tabella dinamica. Questo garantisce che il decodificatore sia in grado di eseguire l'evizione basata sulle riduzioni della dimensione della tabella dinamica (vedere sezione 4.3).

Questo meccanismo può essere utilizzato per svuotare completamente le voci dalla tabella dinamica impostando una dimensione massima di 0, che può poi essere ripristinata.

4.3. Evizione di voci quando cambia la dimensione della tabella dinamica (Entry Eviction When Dynamic Table Size Changes)

Ogni volta che la dimensione massima della tabella dinamica viene ridotta, le voci vengono evitte dalla fine della tabella dinamica fino a quando la dimensione della tabella dinamica non è inferiore o uguale alla dimensione massima.

4.4. Evizione di voci quando si aggiungono nuove voci (Entry Eviction When Adding New Entries)

Prima che una nuova voce venga aggiunta alla tabella dinamica, le voci vengono evitte dalla fine della tabella dinamica fino a quando la dimensione della tabella dinamica non è inferiore o uguale a (dimensione massima - dimensione della nuova voce) o fino a quando la tabella non è vuota.

Se la dimensione della nuova voce è inferiore o uguale alla dimensione massima, questa voce viene aggiunta alla tabella. Non è considerato un errore tentare di aggiungere una voce più grande della dimensione massima; un tentativo di aggiungere una voce più grande della dimensione massima comporta lo svuotamento della tabella di tutte le voci esistenti e risulta in una tabella vuota.

Una nuova voce può fare riferimento al nome di una voce nella tabella dinamica che verrà evitata durante l'aggiunta di questa nuova voce nella tabella dinamica. Le implementazioni devono fare attenzione a non eliminare il nome referenziato se la voce referenziata viene evitata dalla tabella dinamica prima di inserire la nuova voce.