Zum Hauptinhalt springen

Anhang B. Kodierungs- und Dekodierungsbeispiele

Dieser Anhang bietet Beispiele für QPACK-Kodierungs- und Dekodierungsoperationen und veranschaulicht, wie Encoder und Decoder über ihre jeweiligen Streams interagieren und wie sich die dynamische Tabelle entwickelt.

B.1 Literale Feldzeile mit Namensreferenz

Dieses Beispiel zeigt die Kodierung einer Feldzeile mit einem Namen, der in der statischen Tabelle existiert. Der Encoder verwendet eine literale Darstellung mit einer statischen Namensreferenz.

Kodierung

Zu kodierende Feldzeile:

custom-key: custom-value

Angenommen, "custom-key" befindet sich am statischen Tabellenindex 15, erzeugt der Encoder:

Kodierter Feldabschnitt:

0x00 0x00  # Erforderliche Einfügungsanzahl = 0, Base = 0
0x50 0x0c 0x63 0x75 0x73 0x74 0x6f 0x6d 0x2d 0x76 0x61 0x6c 0x75 0x65
# Literal mit statischer Namensreferenz, Index 15, Wert "custom-value"

Dekodierung

Der Decoder empfängt den kodierten Feldabschnitt und verarbeitet ihn:

  1. Liest Erforderliche Einfügungsanzahl = 0 (keine dynamischen Tabelleneinträge erforderlich)
  2. Liest Base = 0
  3. Dekodiert die literale Feldzeilen-Darstellung
  4. Erzeugt die Feldzeile: custom-key: custom-value

B.2 Einfügungen in die Dynamische Tabelle

Dieses Beispiel demonstriert das Einfügen von Einträgen in die dynamische Tabelle und deren Referenzierung in nachfolgenden Feldabschnitten.

Schritt 1: Encoder Fügt Eintrag Ein

Der Encoder entscheidet sich, eine neue Feldzeile in die dynamische Tabelle einzufügen:

Encoder-Stream:

0xc0 0x0c 0x63 0x75 0x73 0x74 0x6f 0x6d 0x2d 0x76 0x61 0x6c 0x75 0x65
# Einfügung mit Namensreferenz (statischer Index 15), Wert "custom-value"

Zustand der Dynamischen Tabelle (nach Einfügung):

[0] custom-key: custom-value
Einfügungsanzahl: 1

Schritt 2: Encoder Referenziert Dynamischen Eintrag

Jetzt kann der Encoder diesen Eintrag in einem Feldabschnitt referenzieren:

Kodierter Feldabschnitt:

0x02 0x00  # Erforderliche Einfügungsanzahl = 1, Base = 0
0x80 # Indizierte Feldzeile, dynamischer Tabellenindex 0

Schritt 3: Decoder Verarbeitet

Der Decoder:

  1. Empfängt die Encoder-Stream-Anweisung und fügt den Eintrag ein
  2. Empfängt den kodierten Feldabschnitt
  3. Überprüft Erforderliche Einfügungsanzahl = 1 (benötigt Eintrag am absoluten Index 0)
  4. Dekodiert die indizierte Feldzeile vom dynamischen Tabellenindex 0
  5. Erzeugt: custom-key: custom-value

Schritt 4: Decoder Bestätigt

Decoder-Stream:

0x80  # Abschnittsbestätigung (Stream-ID kodiert)

Dies informiert den Encoder, dass der Decoder den Feldabschnitt verarbeitet hat, der den dynamischen Tabelleneintrag 0 referenziert.

B.3 Spekulative Einfügung

Dieses Beispiel zeigt, wie der Encoder einen Eintrag in die dynamische Tabelle einfügt, bevor er tatsächlich verwendet wird, in Erwartung zukünftiger Verwendung.

Schritt 1: Encoder Fügt Spekulativ Ein

Encoder-Stream:

0x4a 0x63 0x75 0x73 0x74 0x6f 0x6d 0x2d 0x6b 0x65 0x79
0x0c 0x63 0x75 0x73 0x74 0x6f 0x6d 0x2d 0x76 0x61 0x6c 0x75 0x65
# Einfügung mit literalem Namen "custom-key", Wert "custom-value"

Zustand der Dynamischen Tabelle:

[0] custom-key: custom-value
Einfügungsanzahl: 1

Schritt 2: Encoder Verwendet Eintrag Später

In einem nachfolgenden Feldabschnitt:

Kodierter Feldabschnitt:

0x02 0x00  # Erforderliche Einfügungsanzahl = 1, Base = 0
0x80 # Indizierte Feldzeile, dynamischer Tabellenindex 0

B.4 Duplikationsanweisung

Dieses Beispiel demonstriert die Duplikationsanweisung, die einen vorhandenen dynamischen Tabelleneintrag an den Anfang der Tabelle kopiert.

Anfangszustand der Dynamischen Tabelle

[0] custom-key: custom-value
[1] another-key: another-value
Einfügungsanzahl: 2

Encoder Dupliziert Eintrag

Encoder-Stream:

0x01  # Duplikation, relativer Index 1

Zustand der Dynamischen Tabelle (nach Duplikation):

[0] another-key: another-value  # Duplizierter Eintrag
[1] custom-key: custom-value
[2] another-key: another-value # Originaleintrag
Einfügungsanzahl: 3

Der duplizierte Eintrag wird zum neuesten Eintrag (absoluter Index 2, relativer Index 0).

B.5 Post-Base-Indexierung

Dieses Beispiel veranschaulicht die Post-Base-Indexierung, bei der der Encoder Einträge referenziert, die nach dem Base-Wert eingefügt wurden.

Schritt 1: Encoder Setzt Base

Der Encoder beginnt mit der Kodierung eines Feldabschnitts mit Base = 0:

Kodiertes Feldabschnittspräfix:

0x02 0x80  # Erforderliche Einfügungsanzahl = 1, Base = 0, Vorzeichen = 1 (negatives Delta)

Dies zeigt an, dass Erforderliche Einfügungsanzahl = 1, aber Base = 0, was bedeutet, dass der Feldabschnitt den Eintrag am absoluten Index 0 referenzieren wird.

Schritt 2: Encoder Fügt Ein und Referenziert

Während der Kodierung fügt der Encoder einen neuen Eintrag ein:

Encoder-Stream:

0xc0 0x0c 0x63 0x75 0x73 0x74 0x6f 0x6d 0x2d 0x76 0x61 0x6c 0x75 0x65
# Einfügung mit Namensreferenz (statischer Index 15), Wert "custom-value"

Zustand der Dynamischen Tabelle:

[0] custom-key: custom-value
Einfügungsanzahl: 1

Kodierter Feldabschnitt (Fortsetzung):

0x10  # Post-Base Indizierte Feldzeile, Post-Base Index = 0

Dies referenziert den Eintrag am absoluten Index 0 (Base + Post-Base Index = 0 + 0 = 0).

Schritt 3: Decoder Verarbeitet

Der Decoder:

  1. Empfängt die Encoder-Stream-Anweisung
  2. Fügt den Eintrag in die dynamische Tabelle ein
  3. Empfängt den Feldabschnitt mit Post-Base-Referenz
  4. Wartet bei Bedarf, bis der erforderliche Eintrag verfügbar ist
  5. Dekodiert die Feldzeile

B.6 Stream-Abbruch

Dieses Beispiel zeigt, wie der Decoder einen Stream abbricht und den Encoder informiert, dass ein Feldabschnitt nicht verarbeitet wird.

Szenario

Der Decoder empfängt einen Feldabschnitt auf Stream 4, aber der Stream wird zurückgesetzt, bevor die Verarbeitung abgeschlossen ist.

Decoder-Stream:

0x40 0x04  # Stream-Abbruch, Stream-ID = 4

Dies informiert den Encoder, dass:

  • Der Feldabschnitt auf Stream 4 nicht verarbeitet wurde
  • Der Encoder nicht auf eine Bestätigung warten sollte
  • Alle dynamischen Tabelleneinträge, die nur von diesem Feldabschnitt referenziert werden, früher entfernt werden können

B.7 Einfügungsanzahl-Inkrement

Dieses Beispiel demonstriert die Einfügungsanzahl-Inkrement-Anweisung, die vom Decoder verwendet wird, um mehrere Einfügungen zu bestätigen, ohne sie in Feldabschnitten zu referenzieren.

Szenario

Der Encoder hat 5 Einträge eingefügt, aber der Decoder hat nur 2 über Abschnittsbestätigungen bestätigt.

Decoder-Stream:

0x03  # Einfügungsanzahl-Inkrement, Inkrement = 3

Dies informiert den Encoder, dass der Decoder 3 zusätzliche dynamische Tabelleneinfügungen über die bereits bestätigten hinaus empfangen und verarbeitet hat.

B.8 Vollständiges Beispiel: Mehrere Feldabschnitte

Dieses umfassende Beispiel zeigt einen vollständigen Austausch mit mehreren Feldabschnitten.

Anfangszustand

Sowohl Encoder als auch Decoder beginnen mit leeren dynamischen Tabellen.

Austausch 1: Erste Anfrage

Encoder-Stream:

0xc0 0x0c 0x63 0x75 0x73 0x74 0x6f 0x6d 0x2d 0x76 0x61 0x6c 0x75 0x65
# Einfügung: custom-key: custom-value

Kodierter Feldabschnitt (Stream 0):

0x02 0x00  # Erforderliche Einfügungsanzahl = 1, Base = 0
0x80 # Indiziert, dynamischer Index 0
0x51 0x04 0x74 0x65 0x73 0x74 # Literal mit statischem Namen, Wert "test"

Zustand der Dynamischen Tabelle:

[0] custom-key: custom-value
Einfügungsanzahl: 1

Dekodierte Feldzeilen:

custom-key: custom-value
another-key: test

Decoder-Stream:

0x80  # Abschnittsbestätigung für Stream 0

Austausch 2: Zweite Anfrage

Kodierter Feldabschnitt (Stream 4):

0x02 0x00  # Erforderliche Einfügungsanzahl = 1, Base = 0
0x80 # Indiziert, dynamischer Index 0

Dekodierte Feldzeilen:

custom-key: custom-value

Decoder-Stream:

0x84  # Abschnittsbestätigung für Stream 4

Austausch 3: Entfernung

Nach Erhalt der Bestätigungen kann der Encoder den Eintrag bei Bedarf sicher für neue Einfügungen entfernen.


Zusammenfassung

Diese Beispiele demonstrieren:

  1. Literale Darstellungen: Kodierung von Feldzeilen ohne dynamische Tabelle
  2. Verwaltung der Dynamischen Tabelle: Einfügen, Referenzieren und Duplizieren von Einträgen
  3. Synchronisation: Decoder-Bestätigungen und Encoder-Verfolgung
  4. Post-Base-Indexierung: Referenzierung kürzlich eingefügter Einträge
  5. Fehlerwiederherstellung: Stream-Abbruch für unvollständige Verarbeitung
  6. Effiziente Bestätigung: Einfügungsanzahl-Inkrement für Massenbestätigung

Die Interaktion zwischen Encoder- und Decoder-Streams gewährleistet eine ordnungsgemäße Synchronisation bei gleichzeitiger Ermöglichung von Lieferung außerhalb der Reihenfolge und effizienter Kompression.