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.