Annexe B. Exemples d'Encodage et de Décodage
Cette annexe fournit des exemples d'opérations d'encodage et de décodage QPACK, illustrant comment l'encodeur et le décodeur interagissent via leurs flux respectifs et comment la table dynamique évolue.
B.1 Ligne de Champ Littérale avec Référence de Nom
Cet exemple montre l'encodage d'une ligne de champ avec un nom qui existe dans la table statique. L'encodeur utilise une représentation littérale avec une référence de nom statique.
Encodage
Ligne de champ à encoder:
custom-key: custom-value
En supposant que "custom-key" est à l'index 15 de la table statique, l'encodeur produit:
Section de Champ Encodée:
0x00 0x00 # Nombre d'Insertions Requis = 0, Base = 0
0x50 0x0c 0x63 0x75 0x73 0x74 0x6f 0x6d 0x2d 0x76 0x61 0x6c 0x75 0x65
# Littéral avec référence de nom statique, index 15, valeur "custom-value"
Décodage
Le décodeur reçoit la section de champ encodée et la traite:
- Lit Nombre d'Insertions Requis = 0 (aucune entrée de table dynamique nécessaire)
- Lit Base = 0
- Décode la représentation de ligne de champ littérale
- Produit la ligne de champ:
custom-key: custom-value
B.2 Insertions dans la Table Dynamique
Cet exemple démontre l'insertion d'entrées dans la table dynamique et leur référence dans les sections de champ suivantes.
Étape 1: L'Encodeur Insère une Entrée
L'encodeur décide d'insérer une nouvelle ligne de champ dans la table dynamique:
Flux d'Encodeur:
0xc0 0x0c 0x63 0x75 0x73 0x74 0x6f 0x6d 0x2d 0x76 0x61 0x6c 0x75 0x65
# Insertion avec référence de nom (index statique 15), valeur "custom-value"
État de la Table Dynamique (après insertion):
[0] custom-key: custom-value
Nombre d'Insertions: 1
Étape 2: L'Encodeur Référence l'Entrée Dynamique
Maintenant, l'encodeur peut référencer cette entrée dans une section de champ:
Section de Champ Encodée:
0x02 0x00 # Nombre d'Insertions Requis = 1, Base = 0
0x80 # Ligne de Champ Indexée, index de table dynamique 0
Étape 3: Le Décodeur Traite
Le décodeur:
- Reçoit l'instruction du flux d'encodeur et insère l'entrée
- Reçoit la section de champ encodée
- Vérifie Nombre d'Insertions Requis = 1 (nécessite l'entrée à l'index absolu 0)
- Décode la ligne de champ indexée depuis l'index 0 de la table dynamique
- Produit:
custom-key: custom-value
Étape 4: Le Décodeur Accuse Réception
Flux de Décodeur:
0x80 # Accusé de Réception de Section (ID de flux encodé)
Cela informe l'encodeur que le décodeur a traité la section de champ référençant l'entrée 0 de la table dynamique.
B.3 Insertion Spéculative
Cet exemple montre l'encodeur insérant une entrée dans la table dynamique avant qu'elle ne soit réellement utilisée, anticipant une utilisation future.
Étape 1: L'Encodeur Insère de Manière Spéculative
Flux d'Encodeur:
0x4a 0x63 0x75 0x73 0x74 0x6f 0x6d 0x2d 0x6b 0x65 0x79
0x0c 0x63 0x75 0x73 0x74 0x6f 0x6d 0x2d 0x76 0x61 0x6c 0x75 0x65
# Insertion avec nom littéral "custom-key", valeur "custom-value"
État de la Table Dynamique:
[0] custom-key: custom-value
Nombre d'Insertions: 1
Étape 2: L'Encodeur Utilise l'Entrée Plus Tard
Dans une section de champ suivante:
Section de Champ Encodée:
0x02 0x00 # Nombre d'Insertions Requis = 1, Base = 0
0x80 # Ligne de Champ Indexée, index de table dynamique 0
B.4 Instruction de Duplication
Cet exemple démontre l'instruction de duplication, qui copie une entrée de table dynamique existante au début de la table.
État Initial de la Table Dynamique
[0] custom-key: custom-value
[1] another-key: another-value
Nombre d'Insertions: 2
L'Encodeur Duplique une Entrée
Flux d'Encodeur:
0x01 # Duplication, index relatif 1
État de la Table Dynamique (après duplication):
[0] another-key: another-value # Entrée dupliquée
[1] custom-key: custom-value
[2] another-key: another-value # Entrée originale
Nombre d'Insertions: 3
L'entrée dupliquée devient l'entrée la plus récente (index absolu 2, index relatif 0).
B.5 Indexation Post-Base
Cet exemple illustre l'indexation Post-Base, où l'encodeur référence des entrées insérées après la valeur Base.
Étape 1: L'Encodeur Définit Base
L'encodeur commence à encoder une section de champ avec Base = 0:
Préfixe de Section de Champ Encodée:
0x02 0x80 # Nombre d'Insertions Requis = 1, Base = 0, Signe = 1 (delta négatif)
Cela indique Nombre d'Insertions Requis = 1, mais Base = 0, ce qui signifie que la section de champ référencera l'entrée à l'index absolu 0.
Étape 2: L'Encodeur Insère et Référence
Pendant l'encodage, l'encodeur insère une nouvelle entrée:
Flux d'Encodeur:
0xc0 0x0c 0x63 0x75 0x73 0x74 0x6f 0x6d 0x2d 0x76 0x61 0x6c 0x75 0x65
# Insertion avec référence de nom (index statique 15), valeur "custom-value"
État de la Table Dynamique:
[0] custom-key: custom-value
Nombre d'Insertions: 1
Section de Champ Encodée (suite):
0x10 # Ligne de Champ Indexée Post-Base, Index Post-Base = 0
Cela référence l'entrée à l'index absolu 0 (Base + Index Post-Base = 0 + 0 = 0).
Étape 3: Le Décodeur Traite
Le décodeur:
- Reçoit l'instruction du flux d'encodeur
- Insère l'entrée dans la table dynamique
- Reçoit la section de champ avec référence Post-Base
- Attend si nécessaire jusqu'à ce que l'entrée requise soit disponible
- Décode la ligne de champ
B.6 Annulation de Flux
Cet exemple montre le décodeur annulant un flux, informant l'encodeur qu'une section de champ ne sera pas traitée.
Scénario
Le décodeur reçoit une section de champ sur le flux 4 mais le flux est réinitialisé avant la fin du traitement.
Flux de Décodeur:
0x40 0x04 # Annulation de Flux, ID de flux = 4
Cela informe l'encodeur que:
- La section de champ sur le flux 4 n'a pas été traitée
- L'encodeur ne doit pas attendre d'accusé de réception
- Toutes les entrées de table dynamique référencées uniquement par cette section de champ peuvent être évincées plus tôt
B.7 Incrément du Nombre d'Insertions
Cet exemple démontre l'instruction d'Incrément du Nombre d'Insertions, utilisée par le décodeur pour accuser réception de plusieurs insertions sans les référencer dans les sections de champ.
Scénario
L'encodeur a inséré 5 entrées, mais le décodeur n'en a accusé réception que de 2 via les Accusés de Réception de Section.
Flux de Décodeur:
0x03 # Incrément du Nombre d'Insertions, incrément = 3
Cela informe l'encodeur que le décodeur a reçu et traité 3 insertions de table dynamique supplémentaires au-delà de celles déjà accusées réception.
B.8 Exemple Complet: Plusieurs Sections de Champ
Cet exemple complet montre un échange complet avec plusieurs sections de champ.
État Initial
L'encodeur et le décodeur commencent tous deux avec des tables dynamiques vides.
Échange 1: Première Requête
Flux d'Encodeur:
0xc0 0x0c 0x63 0x75 0x73 0x74 0x6f 0x6d 0x2d 0x76 0x61 0x6c 0x75 0x65
# Insertion: custom-key: custom-value
Section de Champ Encodée (Flux 0):
0x02 0x00 # Nombre d'Insertions Requis = 1, Base = 0
0x80 # Indexé, index dynamique 0
0x51 0x04 0x74 0x65 0x73 0x74 # Littéral avec nom statique, valeur "test"
État de la Table Dynamique:
[0] custom-key: custom-value
Nombre d'Insertions: 1
Lignes de Champ Décodées:
custom-key: custom-value
another-key: test
Flux de Décodeur:
0x80 # Accusé de Réception de Section pour le flux 0
Échange 2: Deuxième Requête
Section de Champ Encodée (Flux 4):
0x02 0x00 # Nombre d'Insertions Requis = 1, Base = 0
0x80 # Indexé, index dynamique 0
Lignes de Champ Décodées:
custom-key: custom-value
Flux de Décodeur:
0x84 # Accusé de Réception de Section pour le flux 4
Échange 3: Éviction
Après avoir reçu les accusés de réception, l'encodeur peut évincer en toute sécurité l'entrée si nécessaire pour de nouvelles insertions.
Résumé
Ces exemples démontrent:
- Représentations Littérales: Encodage de lignes de champ sans table dynamique
- Gestion de la Table Dynamique: Insertion, référence et duplication d'entrées
- Synchronisation: Accusés de réception du décodeur et suivi de l'encodeur
- Indexation Post-Base: Référence d'entrées récemment insérées
- Récupération d'Erreur: Annulation de flux pour traitement incomplet
- Accusé de Réception Efficace: Incrément du Nombre d'Insertions pour accusé de réception en masse
L'interaction entre les flux d'encodeur et de décodeur assure une synchronisation appropriée tout en permettant une livraison hors ordre et une compression efficace.