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
| Frame | Flusso di controllo | Flusso di richiesta | Flusso push | Sezione |
|---|---|---|---|---|
| DATA | No | Sì | Sì | 7.2.1 |
| HEADERS | No | Sì | Sì | 7.2.2 |
| CANCEL_PUSH | Sì | No | No | 7.2.3 |
| SETTINGS | Sì (1) | No | No | 7.2.4 |
| PUSH_PROMISE | No | Sì | No | 7.2.5 |
| GOAWAY | Sì | No | No | 7.2.6 |
| MAX_PUSH_ID | Sì | No | No | 7.2.7 |
| Riservato | Sì | Sì | Sì | 7.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.