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:
- Legge Conteggio di Inserimento Richiesto = 0 (nessuna voce di tabella dinamica necessaria)
- Legge Base = 0
- Decodifica la rappresentazione della riga di campo letterale
- 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:
- Riceve l'istruzione del flusso dell'encoder e inserisce la voce
- Riceve la sezione di campo codificata
- Verifica Conteggio di Inserimento Richiesto = 1 (necessita della voce all'indice assoluto 0)
- Decodifica la riga di campo indicizzata dall'indice 0 della tabella dinamica
- 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:
- Riceve l'istruzione del flusso dell'encoder
- Inserisce la voce nella tabella dinamica
- Riceve la sezione di campo con riferimento Post-Base
- Attende se necessario fino a quando la voce richiesta è disponibile
- 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.
Riepilogo
Questi esempi dimostrano:
- Rappresentazioni Letterali: Codifica di righe di campo senza tabella dinamica
- Gestione della Tabella Dinamica: Inserimento, riferimento e duplicazione di voci
- Sincronizzazione: Conferme del decoder e tracciamento dell'encoder
- Indicizzazione Post-Base: Riferimento di voci inserite di recente
- Recupero degli Errori: Cancellazione del flusso per elaborazione incompleta
- 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.