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.