3. Tables de référence (Reference Tables)
Contrairement à HPACK, QPACK utilise deux tables pour référencer les lignes de champ : une table statique et une table dynamique.
3.1 Table statique (Static Table)
La table statique consiste en une liste prédéfinie de lignes de champ, dont chacune a une valeur fixe et immuable, potentiellement vide. Sa définition complète est donnée dans l'Annexe A. Les entrées dans la table statique ne changent jamais.
La table statique peut être référencée en utilisant un index statique.
Comme la table statique est définie dans cette spécification, et l'ensemble des lignes de champ est relativement petit et stable, une implémentation efficace peut être réalisée en utilisant des métadonnées parfaites ou d'autres techniques pour localiser les entrées.
3.2 Table dynamique (Dynamic Table)
La table dynamique consiste en une liste ordonnée de lignes de champ maintenues en premier entré premier sorti (First In First Out, FIFO) dans l'ordre où elles ont été insérées. Comme la table statique, une entrée de la table dynamique est une ligne de champ avec un nom et une valeur.
La table dynamique peut être référencée en utilisant un index dynamique. La table dynamique est initialement vide. Les entrées sont ajoutées lorsque des instructions d'insertion sont reçues sur le flux d'encodeur (voir la section 4.3).
La table dynamique peut contenir des lignes de champ en double (c'est-à-dire, une entrée avec un nom et une valeur identiques à ceux d'une autre entrée). Par conséquent, les lignes de champs en double DOIVENT PAS être traitées comme une erreur par le décodeur.
3.2.1 Taille de la table dynamique (Dynamic Table Size)
La taille de la table dynamique est la somme de la taille de ses entrées.
La taille d'une entrée est la somme de la longueur en octets de son nom (comme défini dans la section 4.1.2), de la longueur en octets de sa valeur (définie dans la section 4.1.2), et de 32.
La taille de l'entrée est calculée par :
taille = longueur(nom) + longueur(valeur) + 32
La taille d'une entrée est supérieure à la taille de la ligne de champ par une surcharge fixe. La surcharge comprend un montant d'allocation de surcharge estimé à 32 octets. Cela pourrait inclure la structure de données suspendue ou approximative pour référencer l'entrée dans une structure de hachage, des tampons de chaîne, ou d'autres données structurelles. Une implémentation peut choisir d'utiliser différentes structures de données ou avoir un montant différent de surcharge ; cela ne change pas le calcul de taille appliqué par l'encodeur et le décodeur.
3.2.2 Capacité de la table dynamique (Dynamic Table Capacity)
La capacité de la table dynamique est fixée par le décodeur et communiquée à l'encodeur ; voir la section 3.2.3.
Un encodeur DOIT s'assurer que la taille de la table dynamique est inférieure ou égale à la capacité de la table dynamique.
Dans HTTP/3, la capacité est déterminée par la valeur du paramètre SETTINGS_QPACK_MAX_TABLE_CAPACITY (voir la section 5) que l'encodeur reçoit du décodeur. L'encodeur DOIT définir la capacité à la valeur du paramètre lorsqu'il le reçoit. Dans HTTP/3, l'encodeur DOIT interpréter la réception de ce paramètre comme une autorisation à utiliser la table dynamique.
Si un encodeur n'a pas reçu de valeur pour ce paramètre, il DOIT utiliser la valeur par défaut de 0. Une capacité de 0 signifie que la table dynamique n'est pas utilisée, et aucune entrée ne peut être ajoutée.
3.2.3 Éviction de la table dynamique (Eviction from the Dynamic Table)
Avant qu'une nouvelle entrée ne soit ajoutée à la table dynamique, les entrées sont évincées du bout de la table dynamique jusqu'à ce que la taille de la table dynamique soit inférieure ou égale à (capacité de la table dynamique - nouvelle taille de l'entrée) ou jusqu'à ce que la table soit vide.
L'encodeur DOIT PAS provoquer l'éviction d'une entrée de table dynamique à moins que :
-
L'entrée n'est plus présente dans un groupe de comptage d'insertions requis en cours de traitement sur un flux bloqué connu de l'encodeur, ou
-
L'encodeur a reçu un accusé de réception de section (voir la section 4.4.1) faisant référence au comptage d'insertions requis le plus récent où l'entrée était incluse.
Lorsque l'entrée la plus ancienne de la table dynamique est évincée, son index est réutilisé pour référencer la nouvelle entrée.
3.2.4 Index absolu et relatif (Absolute Indexing)
Chaque entrée possède un index absolu unique et immuable qui est affecté lorsqu'une entrée est insérée dans la table dynamique ; voir la section 4.3.1. La première entrée insérée dans la table dynamique se voit attribuer l'index absolu 0.
Notez que la valeur absolue de l'index pour une entrée donnée peut être supérieure au nombre d'entrées actuellement dans la table. Par conséquent, elle ne peut pas être utilisée comme un index de tableau dans une implémentation.
3.2.5 Index relatif (Relative Indexing)
Les instructions du flux d'encodeur (voir la section 4.3) et les représentations de lignes de champ (voir la section 4.5) utilisant l'indexation relative font référence aux entrées en précisant la valeur d'un index relatif.
L'index relatif d'une entrée est la différence entre l'index absolu de l'entrée et le plus grand index absolu de l'ensemble référençable. Le plus grand index absolu est égal au comptage d'insertions nécessaires moins un ou à la valeur de la Base, selon le contexte.
Pour les instructions du flux d'encodeur, les plus grands index absolus font référence à l'entrée la plus récemment insérée :
plus_grand_index_absolu = comptage_insertions - 1
Pour les représentations de lignes de champs, le plus grand index absolu fait référence à la Base dans la section de champ encodée ; voir la section 4.5.1.
plus_grand_index_absolu = Base
L'entrée avec le plus grand index absolu a un index relatif de 0. Le premier élément inséré a un index relatif de (comptage d'insertions - 1), qui n'augmente qu'avec chaque nouvelle insertion.
3.2.6 Index post-Base (Post-Base Indexing)
Les représentations de lignes de champ dans des sections de champ encodées (voir la section 4.5) peuvent utiliser l'indexation post-Base pour faire référence à des entrées ajoutées après la valeur de la Base, en commençant à zéro. L'encodeur peut décider de référencer des entrées récemment insérées qui ne sont pas encore disponibles dans la table dynamique du décodeur. La détermination de l'indice absolu de ces entrées utilise la valeur de Base de la section de champ encodée et l'index post-Base de l'entrée comme suit :
index_absolu = Base + index_post_Base
Un encodeur DOIT s'assurer que l'index absolu calculé de cette manière fait référence à une entrée post-Base, et un décodeur DOIT traiter une référence à une entrée qui n'est pas une entrée post-Base comme une erreur de flux de type QPACK_DECOMPRESSION_FAILED.