Aller au contenu principal

6. Format binaire (Binary Format)

Cette section décrit le format binaire détaillé pour toutes les représentations décrites dans la section 2.4.

6.1. Représentation de champ d'en-tête indexé (Indexed Header Field Representation)

Une représentation de champ d'en-tête indexé identifie une entrée dans la table statique ou la table dynamique (voir section 2.3).

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

Figure 5 : Champ d'en-tête indexé

Un champ d'en-tête indexé commence par le motif à 1 bit '1', suivi de l'index du champ d'en-tête correspondant, représenté comme un entier avec un préfixe de 7 bits (voir section 5.1).

La valeur d'index 0 n'est pas utilisée. Elle DOIT (MUST) être traitée comme une erreur de décodage si elle est trouvée dans une représentation de champ d'en-tête indexé.

6.2. Représentation de champ d'en-tête littéral (Literal Header Field Representation)

Une représentation de champ d'en-tête littéral contient une valeur de champ d'en-tête littéral. Les noms de champs d'en-tête sont fournis soit sous forme littérale, soit par référence à une entrée de table existante, soit de la table statique, soit de la table dynamique (voir section 2.3).

Cette spécification définit trois formes de représentations de champs d'en-tête littéraux : avec indexation incrémentale, sans indexation et jamais indexé.

6.2.1. Champ d'en-tête littéral avec indexation incrémentale (Literal Header Field with Incremental Indexing)

Une représentation de champ d'en-tête littéral avec indexation incrémentale entraîne l'ajout d'un champ d'en-tête à la liste d'en-têtes décodée et son insertion en tant que nouvelle entrée dans la table dynamique.

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

Figure 6 : Champ d'en-tête littéral avec indexation incrémentale
-- Nom indexé
  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) |
+-------------------------------+

Figure 7 : Champ d'en-tête littéral avec indexation incrémentale
-- Nouveau nom

Une représentation de champ d'en-tête littéral avec indexation incrémentale commence par le motif à 2 bits '01'.

Si le nom du champ d'en-tête correspond au nom du champ d'en-tête d'une entrée stockée dans la table statique ou la table dynamique, le nom du champ d'en-tête peut être représenté en utilisant l'index de cette entrée. Dans ce cas, l'index de l'entrée est représenté comme un entier avec un préfixe de 6 bits (voir section 5.1). Cette valeur est toujours non nulle.

Sinon, le nom du champ d'en-tête est représenté comme un littéral de chaîne (voir section 5.2). Une valeur 0 est utilisée à la place de l'index à 6 bits, suivie du nom du champ d'en-tête.

L'une ou l'autre forme de représentation du nom de champ d'en-tête est suivie de la valeur du champ d'en-tête représentée comme un littéral de chaîne (voir section 5.2).

6.2.2. Champ d'en-tête littéral sans indexation (Literal Header Field without Indexing)

Une représentation de champ d'en-tête littéral sans indexation entraîne l'ajout d'un champ d'en-tête à la liste d'en-têtes décodée sans modifier la table dynamique.

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

Figure 8 : Champ d'en-tête littéral sans indexation
-- Nom indexé
  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) |
+-------------------------------+

Figure 9 : Champ d'en-tête littéral sans indexation
-- Nouveau nom

Une représentation de champ d'en-tête littéral sans indexation commence par le motif à 4 bits '0000'.

Si le nom du champ d'en-tête correspond au nom du champ d'en-tête d'une entrée stockée dans la table statique ou la table dynamique, le nom du champ d'en-tête peut être représenté en utilisant l'index de cette entrée. Dans ce cas, l'index de l'entrée est représenté comme un entier avec un préfixe de 4 bits (voir section 5.1). Cette valeur est toujours non nulle.

Sinon, le nom du champ d'en-tête est représenté comme un littéral de chaîne (voir section 5.2). Une valeur 0 est utilisée à la place de l'index à 4 bits, suivie du nom du champ d'en-tête.

L'une ou l'autre forme de représentation du nom de champ d'en-tête est suivie de la valeur du champ d'en-tête représentée comme un littéral de chaîne (voir section 5.2).

6.2.3. Champ d'en-tête littéral jamais indexé (Literal Header Field Never Indexed)

Une représentation de champ d'en-tête littéral jamais indexé entraîne l'ajout d'un champ d'en-tête à la liste d'en-têtes décodée sans modifier la table dynamique. Les intermédiaires DOIVENT (MUST) utiliser la même représentation pour encoder ce champ d'en-tête.

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

Figure 10 : Champ d'en-tête littéral jamais indexé
-- Nom indexé
  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) |
+-------------------------------+

Figure 11 : Champ d'en-tête littéral jamais indexé
-- Nouveau nom

Une représentation de champ d'en-tête littéral jamais indexé commence par le motif à 4 bits '0001'.

Lorsqu'un champ d'en-tête est représenté comme un champ d'en-tête littéral jamais indexé, il DOIT (MUST) toujours être encodé avec cette représentation littérale spécifique. En particulier, lorsqu'un pair envoie un champ d'en-tête qu'il a reçu représenté comme un champ d'en-tête littéral jamais indexé, il DOIT (MUST) utiliser la même représentation pour transférer ce champ d'en-tête.

Cette représentation est destinée à protéger les valeurs de champs d'en-tête qui ne doivent pas être mises en danger en les compressant (voir section 7.1 pour plus de détails).

L'encodage de la représentation est identique au champ d'en-tête littéral sans indexation (voir section 6.2.2).

6.3. Mise à jour de la taille de la table dynamique (Dynamic Table Size Update)

Une mise à jour de la taille de la table dynamique signale un changement de la taille de la table dynamique.

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

Figure 12 : Changement de taille maximale
de la table dynamique

Une mise à jour de la taille de la table dynamique commence par le motif à 3 bits '001', suivi de la nouvelle taille maximale, représentée comme un entier avec un préfixe de 5 bits (voir section 5.1).

La nouvelle taille maximale DOIT (MUST) être inférieure ou égale à la limite déterminée par le protocole utilisant HPACK. Une valeur qui dépasse cette limite DOIT (MUST) être traitée comme une erreur de décodage. Dans HTTP/2, cette limite est la dernière valeur du paramètre SETTINGS_HEADER_TABLE_SIZE (voir section 6.5.2 de [HTTP2]) reçue du décodeur et acquittée par l'encodeur (voir section 6.5.3 de [HTTP2]).

La réduction de la taille maximale de la table dynamique peut entraîner l'éviction d'entrées (voir section 4.3).