4. Gestion de la table dynamique (Dynamic Table Management)
Pour limiter les besoins en mémoire du côté décodeur, la taille de la table dynamique est contrainte.
4.1. Calcul de la taille de la table (Calculating Table Size)
La taille de la table dynamique est la somme des tailles de ses entrées.
La taille d'une entrée est la somme de la longueur de son nom en octets (telle que définie dans la section 5.2), de la longueur de sa valeur en octets, et de 32.
La taille d'une entrée est calculée en utilisant la longueur de son nom et de sa valeur sans aucun encodage de Huffman appliqué.
Note : Les 32 octets supplémentaires représentent une surcharge estimée associée à une entrée. Par exemple, une structure d'entrée utilisant deux pointeurs de 64 bits pour référencer le nom et la valeur de l'entrée et deux entiers de 64 bits pour compter le nombre de références au nom et à la valeur aurait 32 octets de surcharge.
4.2. Taille maximale de la table (Maximum Table Size)
Les protocoles qui utilisent HPACK déterminent la taille maximale que l'encodeur est autorisé à utiliser pour la table dynamique. Dans HTTP/2, cette valeur est déterminée par le paramètre SETTINGS_HEADER_TABLE_SIZE (voir section 6.5.2 de [HTTP2]).
Un encodeur peut choisir d'utiliser moins de capacité que cette taille maximale (voir section 6.3), mais la taille choisie DOIT (MUST) rester inférieure ou égale au maximum défini par le protocole.
Un changement de la taille maximale de la table dynamique est signalé via une mise à jour de la taille de la table dynamique (voir section 6.3). Cette mise à jour de la taille de la table dynamique DOIT (MUST) se produire au début du premier bloc d'en-têtes suivant le changement de la taille de la table dynamique. Dans HTTP/2, cela suit un accusé de réception des paramètres (voir section 6.5.3 de [HTTP2]).
Plusieurs mises à jour de la taille maximale de la table peuvent se produire entre la transmission de deux blocs d'en-têtes. Dans le cas où cette taille est modifiée plus d'une fois dans cet intervalle, la plus petite taille maximale de table qui se produit dans cet intervalle DOIT (MUST) être signalée dans une mise à jour de la taille de la table dynamique. La taille maximale finale est toujours signalée, ce qui donne au maximum deux mises à jour de la taille de la table dynamique. Cela garantit que le décodeur est capable d'effectuer une éviction basée sur les réductions de la taille de la table dynamique (voir section 4.3).
Ce mécanisme peut être utilisé pour vider complètement les entrées de la table dynamique en définissant une taille maximale de 0, qui peut ensuite être restaurée.
4.3. Éviction d'entrées lors du changement de taille de la table dynamique (Entry Eviction When Dynamic Table Size Changes)
Chaque fois que la taille maximale de la table dynamique est réduite, des entrées sont évincées de la fin de la table dynamique jusqu'à ce que la taille de la table dynamique soit inférieure ou égale à la taille maximale.
4.4. Éviction d'entrées lors de l'ajout de nouvelles entrées (Entry Eviction When Adding New Entries)
Avant qu'une nouvelle entrée ne soit ajoutée à la table dynamique, des entrées sont évincées de la fin de la table dynamique jusqu'à ce que la taille de la table dynamique soit inférieure ou égale à (taille maximale - taille de la nouvelle entrée) ou jusqu'à ce que la table soit vide.
Si la taille de la nouvelle entrée est inférieure ou égale à la taille maximale, cette entrée est ajoutée à la table. Il n'est pas considéré comme une erreur de tenter d'ajouter une entrée plus grande que la taille maximale ; une tentative d'ajout d'une entrée plus grande que la taille maximale entraîne la vidange de la table de toutes les entrées existantes et aboutit à une table vide.
Une nouvelle entrée peut référencer le nom d'une entrée dans la table dynamique qui sera évincée lors de l'ajout de cette nouvelle entrée dans la table dynamique. Les implémentations doivent faire attention à ne pas supprimer le nom référencé si l'entrée référencée est évincée de la table dynamique avant d'insérer la nouvelle entrée.