Passa al contenuto principale

7. Livello di framing HTTP (HTTP Framing Layer)

I frame HTTP sono trasportati sui flussi QUIC, come descritto nella Sezione 6. HTTP/3 definisce tre tipi di flusso: flusso di controllo, flusso di richiesta e flusso push. Questa sezione descrive i formati dei frame HTTP/3 e i loro tipi di flusso consentiti; vedere la Tabella 1 per una panoramica.

Tabella 1: Panoramica dei frame HTTP/3 e dei tipi di flusso

FrameFlusso di controlloFlusso di richiestaFlusso pushSezione
DATANo7.2.1
HEADERSNo7.2.2
CANCEL_PUSHNoNo7.2.3
SETTINGSSì (1)NoNo7.2.4
PUSH_PROMISENoNo7.2.5
GOAWAYNoNo7.2.6
MAX_PUSH_IDNoNo7.2.7
Riservato7.2.8

Il frame SETTINGS può verificarsi solo come primo frame di un flusso di controllo; questo è indicato nella Tabella 1 con (1).

Si noti che, a differenza dei frame QUIC, i frame HTTP/3 possono estendersi su più pacchetti.

7.1. Layout dei frame (Frame Layout)

Tutti i frame hanno il seguente formato:

HTTP/3 Frame Format {
Type (i),
Length (i),
Frame Payload (..),
}

Un frame include i seguenti campi:

  • Type (Tipo): Un intero a lunghezza variabile che identifica il tipo di frame
  • Length (Lunghezza): Un intero a lunghezza variabile che descrive la lunghezza in byte del payload del frame
  • Frame Payload (Payload del frame): Un payload la cui semantica è determinata dal campo Type

Il payload di ogni frame DEVE (MUST) contenere esattamente i campi identificati nella sua descrizione. Un payload di frame che contiene byte aggiuntivi o termina prematuramente DEVE (MUST) essere trattato come un errore di connessione di tipo H3_FRAME_ERROR.

7.2. Definizioni dei frame (Frame Definitions)

7.2.1. DATA

I frame DATA (type=0x00) trasmettono sequenze di byte arbitrarie a lunghezza variabile associate al contenuto della richiesta o risposta HTTP.

I frame DATA DEVONO (MUST) essere associati a una richiesta o risposta HTTP. Se un frame DATA viene ricevuto su un flusso di controllo, il destinatario DEVE (MUST) rispondere con un errore di connessione di tipo H3_FRAME_UNEXPECTED.

7.2.2. HEADERS

Il frame HEADERS (type=0x01) viene utilizzato per trasportare una sezione di campo HTTP codificata utilizzando QPACK.

I frame HEADERS possono essere inviati solo sui flussi di richiesta o sui flussi push. Se un frame HEADERS viene ricevuto su un flusso di controllo, il destinatario DEVE (MUST) rispondere con un errore di connessione di tipo H3_FRAME_UNEXPECTED.

7.2.3. CANCEL_PUSH

Il frame CANCEL_PUSH (type=0x03) viene utilizzato per richiedere la cancellazione di un push del server prima della ricezione del flusso push.

Quando un client invia un frame CANCEL_PUSH, indica che non desidera ricevere la risorsa promessa. Il server DOVREBBE (SHOULD) interrompere l'invio della risorsa.

I frame CANCEL_PUSH vengono inviati sul flusso di controllo. La ricezione di un frame CANCEL_PUSH su un flusso di richiesta o flusso push DEVE (MUST) essere trattata come un errore di connessione di tipo H3_FRAME_UNEXPECTED.

7.2.4. SETTINGS

Il frame SETTINGS (type=0x04) trasmette parametri di configurazione che influenzano il modo in cui gli endpoint comunicano.

I frame SETTINGS DEVONO (MUST) essere inviati come primo frame di ogni flusso di controllo. I frame SETTINGS NON DEVONO (MUST NOT) essere inviati su altri flussi.

Gli identificatori di impostazione definiti includono:

  • SETTINGS_MAX_FIELD_SECTION_SIZE (0x06): Dimensione massima della sezione di campo
  • SETTINGS_QPACK_MAX_TABLE_CAPACITY (0x01): Impostazione relativa a QPACK
  • SETTINGS_QPACK_BLOCKED_STREAMS (0x07): Impostazione relativa a QPACK

7.2.5. PUSH_PROMISE

Il frame PUSH_PROMISE (type=0x05) viene utilizzato per trasportare una sezione di campo di intestazione di richiesta promessa dal server al client su un flusso di richiesta.

I frame PUSH_PROMISE possono essere inviati solo sui flussi di richiesta. La ricezione di un frame PUSH_PROMISE su un flusso di controllo o flusso push DEVE (MUST) essere trattata come un errore di connessione di tipo H3_FRAME_UNEXPECTED.

7.2.6. GOAWAY

Il frame GOAWAY (type=0x07) viene utilizzato per avviare la chiusura graduale di una connessione.

I frame GOAWAY vengono sempre inviati sul flusso di controllo. La ricezione di un frame GOAWAY su un flusso di richiesta o flusso push DEVE (MUST) essere trattata come un errore di connessione di tipo H3_FRAME_UNEXPECTED.

7.2.7. MAX_PUSH_ID

Il frame MAX_PUSH_ID (type=0x0d) viene utilizzato dai client per controllare il numero di push del server che il server può avviare.

I frame MAX_PUSH_ID vengono sempre inviati sul flusso di controllo. Un server NON DEVE (MUST NOT) inviare un frame MAX_PUSH_ID.

7.2.8. Tipi di frame riservati (Reserved Frame Types)

I tipi di frame nel formato 0x1f * N + 0x21 per valori interi non negativi di N sono riservati per esercitare il requisito che i tipi sconosciuti vengano ignorati. Questi frame non hanno semantica e possono essere inviati su qualsiasi flusso.