Aller au contenu principal

1. Introduction

Dans HTTP/1.1 (voir [RFC7230]), les champs d'en-tête (Header Field) ne sont pas compressés. À mesure que les pages Web ont évolué pour nécessiter des dizaines à des centaines de requêtes, les champs d'en-tête redondants dans ces requêtes consomment inutilement de la bande passante et augmentent considérablement la latence.

SPDY [SPDY] a initialement abordé cette redondance en compressant les champs d'en-tête en utilisant le format DEFLATE [DEFLATE], ce qui s'est avéré très efficace pour représenter les champs d'en-tête redondants. Cependant, cette approche a exposé un risque de sécurité tel que démontré par l'attaque CRIME (Compression Ratio Info-leak Made Easy) (voir [CRIME]).

Cette spécification définit HPACK, un nouveau schéma de compression qui élimine les champs d'en-tête redondants, limite la vulnérabilité aux attaques de sécurité connues et possède des exigences de mémoire limitées pour une utilisation dans des environnements contraints. Les préoccupations de sécurité potentielles concernant HPACK sont décrites dans la section 7.

Le format HPACK est délibérément simple et inflexible. Les deux caractéristiques réduisent le risque de problèmes d'interopérabilité ou de sécurité dus à des erreurs d'implémentation. Aucun mécanisme d'extension n'est défini. Les modifications du format ne sont possibles qu'en définissant un remplacement complet.

1.1. Aperçu (Overview)

Le format défini dans cette spécification traite une liste de champs d'en-tête comme une collection ordonnée de paires nom-valeur qui peuvent inclure des paires dupliquées. Les noms et les valeurs sont considérés comme des séquences d'octets opaques, et l'ordre des champs d'en-tête est préservé après compression et décompression.

L'encodage (Encoding) est informé par une table de champs d'en-tête (Header Field Table) qui mappe les champs d'en-tête aux valeurs d'index (Index Value). Ces tables de champs d'en-tête peuvent être mises à jour de manière incrémentale lorsque de nouveaux champs d'en-tête sont encodés ou décodés.

Dans le format encodé, un champ d'en-tête est représenté soit sous forme littérale (Literal), soit sous forme de référence à un champ d'en-tête dans l'une des tables de champs d'en-tête. Par conséquent, une liste de champs d'en-tête peut être encodée en utilisant un mélange de références et de valeurs littérales.

Les valeurs littérales sont soit encodées directement, soit en utilisant un code de Huffman statique (Static Huffman Code).

L'encodeur (Encoder) est responsable de décider quels champs d'en-tête insérer en tant que nouvelles entrées dans la table de champs d'en-tête. Le décodeur (Decoder) exécute les modifications de la table de champs d'en-tête prescrites par l'encodeur, reconstruisant ainsi la liste de champs d'en-tête dans le processus. Cela permet aux décodeurs de rester simples et interopérables avec une grande variété d'encodeurs.

Des exemples illustrant l'utilisation de ces différents mécanismes pour représenter les champs d'en-tête sont disponibles dans l'annexe C.

1.2. Conventions

Les mots-clés « DOIT » (MUST), « NE DOIT PAS » (MUST NOT), « REQUIS » (REQUIRED), « DEVRA » (SHALL), « NE DEVRA PAS » (SHALL NOT), « DEVRAIT » (SHOULD), « NE DEVRAIT PAS » (SHOULD NOT), « RECOMMANDÉ » (RECOMMENDED), « PEUT » (MAY) et « OPTIONNEL » (OPTIONAL) dans ce document doivent être interprétés comme décrit dans la RFC 2119 [RFC2119].

Toutes les valeurs numériques sont dans l'ordre d'octets du réseau. Les valeurs sont non signées sauf indication contraire. Les valeurs littérales sont fournies en notation décimale ou hexadécimale selon les besoins.

1.3. Terminologie (Terminology)

Cette spécification utilise les termes suivants :

Champ d'en-tête (Header Field) : Une paire nom-valeur. Le nom et la valeur sont traités comme des séquences d'octets opaques.

Table dynamique (Dynamic Table) : La table dynamique (voir section 2.3.2) est une table qui associe les champs d'en-tête stockés à des valeurs d'index. Cette table est dynamique et spécifique à un contexte d'encodage ou de décodage.

Table statique (Static Table) : La table statique (voir section 2.3.1) est une table qui associe statiquement les champs d'en-tête fréquemment rencontrés à une valeur d'index. Cette table est ordonnée, en lecture seule, toujours accessible et peut être partagée entre tous les contextes d'encodage ou de décodage.

Liste d'en-têtes (Header List) : Une liste d'en-têtes est une collection ordonnée de champs d'en-tête qui sont encodés conjointement et qui peuvent contenir des champs d'en-tête en double. La liste complète des champs d'en-tête contenue dans un bloc d'en-têtes HTTP/2 est une liste d'en-têtes.

Représentation de champ d'en-tête (Header Field Representation) : Un champ d'en-tête peut être représenté sous forme encodée soit en tant que littéral, soit en tant qu'index (voir section 2.4).

Bloc d'en-têtes (Header Block) : Une liste ordonnée de représentations de champs d'en-tête qui, une fois décodée, produit une liste d'en-têtes complète.