Passa al contenuto principale

Appendice B. Esempi di Codifica e Decodifica

Questa appendice fornisce esempi di operazioni di codifica e decodifica QPACK, illustrando come l'encoder e il decoder interagiscono attraverso i rispettivi flussi e come evolve la tabella dinamica.

B.1 Riga di Campo Letterale con Riferimento al Nome

Questo esempio mostra la codifica di una riga di campo con un nome che esiste nella tabella statica. L'encoder utilizza una rappresentazione letterale con un riferimento al nome statico.

Codifica

Riga di campo da codificare:

custom-key: custom-value

Supponendo che "custom-key" sia all'indice 15 della tabella statica, l'encoder produce:

Sezione di Campo Codificata:

0x00 0x00  # Conteggio di Inserimento Richiesto = 0, Base = 0
0x50 0x0c 0x63 0x75 0x73 0x74 0x6f 0x6d 0x2d 0x76 0x61 0x6c 0x75 0x65
# Letterale con riferimento al nome statico, indice 15, valore "custom-value"

Decodifica

Il decoder riceve la sezione di campo codificata e la elabora:

  1. Legge Conteggio di Inserimento Richiesto = 0 (nessuna voce di tabella dinamica necessaria)
  2. Legge Base = 0
  3. Decodifica la rappresentazione della riga di campo letterale
  4. Produce la riga di campo: custom-key: custom-value

B.2 Inserimenti nella Tabella Dinamica

Questo esempio dimostra l'inserimento di voci nella tabella dinamica e il loro riferimento nelle sezioni di campo successive.

Passo 1: L'Encoder Inserisce una Voce

L'encoder decide di inserire una nuova riga di campo nella tabella dinamica:

Flusso dell'Encoder:

0xc0 0x0c 0x63 0x75 0x73 0x74 0x6f 0x6d 0x2d 0x76 0x61 0x6c 0x75 0x65
# Inserimento con riferimento al nome (indice statico 15), valore "custom-value"

Stato della Tabella Dinamica (dopo l'inserimento):

[0] custom-key: custom-value
Conteggio di Inserimento: 1

Passo 2: L'Encoder Riferisce la Voce Dinamica

Ora l'encoder può riferire questa voce in una sezione di campo:

Sezione di Campo Codificata:

0x02 0x00  # Conteggio di Inserimento Richiesto = 1, Base = 0
0x80 # Riga di Campo Indicizzata, indice di tabella dinamica 0

Passo 3: Il Decoder Elabora

Il decoder:

  1. Riceve l'istruzione del flusso dell'encoder e inserisce la voce
  2. Riceve la sezione di campo codificata
  3. Verifica Conteggio di Inserimento Richiesto = 1 (necessita della voce all'indice assoluto 0)
  4. Decodifica la riga di campo indicizzata dall'indice 0 della tabella dinamica
  5. Produce: custom-key: custom-value

Passo 4: Il Decoder Conferma

Flusso del Decoder:

0x80  # Conferma di Sezione (ID di flusso codificato)

Questo informa l'encoder che il decoder ha elaborato la sezione di campo che riferisce la voce 0 della tabella dinamica.

B.3 Inserimento Speculativo

Questo esempio mostra l'encoder che inserisce una voce nella tabella dinamica prima che venga effettivamente utilizzata, anticipando l'uso futuro.

Passo 1: L'Encoder Inserisce in Modo Speculativo

Flusso dell'Encoder:

0x4a 0x63 0x75 0x73 0x74 0x6f 0x6d 0x2d 0x6b 0x65 0x79
0x0c 0x63 0x75 0x73 0x74 0x6f 0x6d 0x2d 0x76 0x61 0x6c 0x75 0x65
# Inserimento con nome letterale "custom-key", valore "custom-value"

Stato della Tabella Dinamica:

[0] custom-key: custom-value
Conteggio di Inserimento: 1

Passo 2: L'Encoder Usa la Voce Successivamente

In una sezione di campo successiva:

Sezione di Campo Codificata:

0x02 0x00  # Conteggio di Inserimento Richiesto = 1, Base = 0
0x80 # Riga di Campo Indicizzata, indice di tabella dinamica 0

B.4 Istruzione di Duplicazione

Questo esempio dimostra l'istruzione di duplicazione, che copia una voce di tabella dinamica esistente all'inizio della tabella.

Stato Iniziale della Tabella Dinamica

[0] custom-key: custom-value
[1] another-key: another-value
Conteggio di Inserimento: 2

L'Encoder Duplica una Voce

Flusso dell'Encoder:

0x01  # Duplicazione, indice relativo 1

Stato della Tabella Dinamica (dopo la duplicazione):

[0] another-key: another-value  # Voce duplicata
[1] custom-key: custom-value
[2] another-key: another-value # Voce originale
Conteggio di Inserimento: 3

La voce duplicata diventa la voce più recente (indice assoluto 2, indice relativo 0).

B.5 Indicizzazione Post-Base

Questo esempio illustra l'indicizzazione Post-Base, dove l'encoder riferisce voci inserite dopo il valore Base.

Passo 1: L'Encoder Imposta Base

L'encoder inizia a codificare una sezione di campo con Base = 0:

Prefisso della Sezione di Campo Codificata:

0x02 0x80  # Conteggio di Inserimento Richiesto = 1, Base = 0, Segno = 1 (delta negativo)

Questo indica Conteggio di Inserimento Richiesto = 1, ma Base = 0, il che significa che la sezione di campo riferirà la voce all'indice assoluto 0.

Passo 2: L'Encoder Inserisce e Riferisce

Durante la codifica, l'encoder inserisce una nuova voce:

Flusso dell'Encoder:

0xc0 0x0c 0x63 0x75 0x73 0x74 0x6f 0x6d 0x2d 0x76 0x61 0x6c 0x75 0x65
# Inserimento con riferimento al nome (indice statico 15), valore "custom-value"

Stato della Tabella Dinamica:

[0] custom-key: custom-value
Conteggio di Inserimento: 1

Sezione di Campo Codificata (continuazione):

0x10  # Riga di Campo Indicizzata Post-Base, Indice Post-Base = 0

Questo riferisce la voce all'indice assoluto 0 (Base + Indice Post-Base = 0 + 0 = 0).

Passo 3: Il Decoder Elabora

Il decoder:

  1. Riceve l'istruzione del flusso dell'encoder
  2. Inserisce la voce nella tabella dinamica
  3. Riceve la sezione di campo con riferimento Post-Base
  4. Attende se necessario fino a quando la voce richiesta è disponibile
  5. Decodifica la riga di campo

B.6 Cancellazione del Flusso

Questo esempio mostra il decoder che cancella un flusso, informando l'encoder che una sezione di campo non verrà elaborata.

Scenario

Il decoder riceve una sezione di campo sul flusso 4 ma il flusso viene reimpostato prima del completamento dell'elaborazione.

Flusso del Decoder:

0x40 0x04  # Cancellazione del Flusso, ID di flusso = 4

Questo informa l'encoder che:

  • La sezione di campo sul flusso 4 non è stata elaborata
  • L'encoder non deve attendere la conferma
  • Tutte le voci di tabella dinamica riferite solo da quella sezione di campo possono essere rimosse prima

B.7 Incremento del Conteggio di Inserimento

Questo esempio dimostra l'istruzione di Incremento del Conteggio di Inserimento, utilizzata dal decoder per confermare più inserimenti senza riferirli nelle sezioni di campo.

Scenario

L'encoder ha inserito 5 voci, ma il decoder ne ha confermate solo 2 tramite Conferme di Sezione.

Flusso del Decoder:

0x03  # Incremento del Conteggio di Inserimento, incremento = 3

Questo informa l'encoder che il decoder ha ricevuto ed elaborato 3 inserimenti di tabella dinamica aggiuntivi oltre a quelli già confermati.

B.8 Esempio Completo: Più Sezioni di Campo

Questo esempio completo mostra uno scambio completo con più sezioni di campo.

Stato Iniziale

Sia l'encoder che il decoder iniziano con tabelle dinamiche vuote.

Scambio 1: Prima Richiesta

Flusso dell'Encoder:

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

Sezione di Campo Codificata (Flusso 0):

0x02 0x00  # Conteggio di Inserimento Richiesto = 1, Base = 0
0x80 # Indicizzato, indice dinamico 0
0x51 0x04 0x74 0x65 0x73 0x74 # Letterale con nome statico, valore "test"

Stato della Tabella Dinamica:

[0] custom-key: custom-value
Conteggio di Inserimento: 1

Righe di Campo Decodificate:

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

Flusso del Decoder:

0x80  # Conferma di Sezione per il flusso 0

Scambio 2: Seconda Richiesta

Sezione di Campo Codificata (Flusso 4):

0x02 0x00  # Conteggio di Inserimento Richiesto = 1, Base = 0
0x80 # Indicizzato, indice dinamico 0

Righe di Campo Decodificate:

custom-key: custom-value

Flusso del Decoder:

0x84  # Conferma di Sezione per il flusso 4

Scambio 3: Rimozione

Dopo aver ricevuto le conferme, l'encoder può rimuovere in sicurezza la voce se necessario per nuovi inserimenti.


Questi esempi dimostrano:

  1. Rappresentazioni Letterali: Codifica di righe di campo senza tabella dinamica
  2. Gestione della Tabella Dinamica: Inserimento, riferimento e duplicazione di voci
  3. Sincronizzazione: Conferme del decoder e tracciamento dell'encoder
  4. Indicizzazione Post-Base: Riferimento di voci inserite di recente
  5. Recupero degli Errori: Cancellazione del flusso per elaborazione incompleta
  6. Conferma Efficiente: Incremento del Conteggio di Inserimento per conferma in blocco

L'interazione tra i flussi dell'encoder e del decoder garantisce una sincronizzazione appropriata consentendo al contempo la consegna fuori ordine e la compressione efficiente.