1. Overview (Panoramica)
QUIC è un protocollo di trasporto sicuro per uso generale. Questo documento definisce la versione 1 di QUIC, che è conforme alle proprietà indipendenti dalla versione (Version-Independent Properties) di QUIC definite in [QUIC-INVARIANTS].
QUIC è un protocollo orientato alla connessione (Connection-Oriented Protocol) che crea un'interazione con stato tra un client e un server.
L'handshake QUIC combina la negoziazione dei parametri crittografici e dei parametri di trasporto. QUIC integra l'handshake TLS [TLS13], sebbene utilizzi un framing personalizzato per proteggere i pacchetti. L'integrazione di TLS e QUIC è descritta più dettagliatamente in [QUIC-TLS]. La struttura dell'handshake è progettata per consentire lo scambio di dati applicativi il prima possibile. Ciò include un'opzione per i client di inviare dati immediatamente (0-RTT), che richiede una qualche forma di comunicazione o configurazione precedente per essere abilitata.
Gli endpoint comunicano in QUIC scambiando pacchetti QUIC (QUIC Packets). La maggior parte dei pacchetti contiene frame, che trasportano informazioni di controllo e dati applicativi tra gli endpoint. QUIC autentica l'intero contenuto di ogni pacchetto e crittografa quanto più possibile di ogni pacchetto. I pacchetti QUIC sono trasportati in datagrammi UDP [UDP] per facilitare meglio la distribuzione nei sistemi e nelle reti esistenti.
I protocolli applicativi scambiano informazioni su una connessione QUIC tramite stream, che sono sequenze ordinate di byte (Ordered Sequences of Bytes). Possono essere creati due tipi di stream: stream bidirezionali (Bidirectional Streams), che consentono a entrambi gli endpoint di inviare dati; e stream unidirezionali (Unidirectional Streams), che consentono a un singolo endpoint di inviare dati. Viene utilizzato uno schema basato su crediti (Credit-Based Scheme) per limitare la creazione di stream e per delimitare la quantità di dati che possono essere inviati.
QUIC fornisce il feedback necessario per implementare la consegna affidabile (Reliable Delivery) e il controllo della congestione (Congestion Control). Un algoritmo per rilevare e recuperare dalla perdita di dati è descritto nella Sezione 6 di [QUIC-RECOVERY]. QUIC dipende dal controllo della congestione per evitare la congestione della rete. Un algoritmo esemplificativo di controllo della congestione è descritto nella Sezione 7 di [QUIC-RECOVERY].
Le connessioni QUIC non sono strettamente vincolate a un singolo percorso di rete. La migrazione della connessione (Connection Migration) utilizza identificatori di connessione (Connection Identifiers) per consentire alle connessioni di trasferirsi su un nuovo percorso di rete. Solo i client possono migrare in questa versione di QUIC. Questo design consente anche alle connessioni di continuare dopo cambiamenti nella topologia di rete o nelle mappature degli indirizzi, come quelli che potrebbero essere causati dal rebinding NAT (NAT Rebinding).
Una volta stabilita, vengono fornite più opzioni per la terminazione della connessione. Le applicazioni possono gestire uno spegnimento graduale (Graceful Shutdown), gli endpoint possono negoziare un periodo di timeout, gli errori possono causare uno smantellamento immediato della connessione e un meccanismo senza stato fornisce la terminazione delle connessioni dopo che un endpoint ha perso lo stato.
1.1. Document Structure (Struttura del documento)
Questo documento descrive il protocollo QUIC di base ed è strutturato come segue:
Stream - L'astrazione di servizio di base fornita da QUIC
- Sezione 2: descrive i concetti fondamentali relativi agli stream
- Sezione 3: fornisce un modello di riferimento per gli stati degli stream
- Sezione 4: delinea il funzionamento del controllo di flusso
Connessioni (Connections) - Il contesto in cui gli endpoint QUIC comunicano
- Sezione 5: descrive i concetti fondamentali relativi alle connessioni
- Sezione 6: descrive la negoziazione della versione (Version Negotiation)
- Sezione 7: dettaglia il processo di stabilimento delle connessioni
- Sezione 8: descrive la validazione degli indirizzi e le mitigazioni critiche contro gli attacchi denial-of-service
- Sezione 9: descrive come gli endpoint migrano una connessione su un nuovo percorso di rete
- Sezione 10: elenca le opzioni per terminare una connessione aperta
- Sezione 11: fornisce indicazioni per la gestione degli errori di stream e connessione
Pacchetti e frame (Packets and Frames) - L'unità di base utilizzata da QUIC per comunicare
- Sezione 12: descrive i concetti relativi a pacchetti e frame
- Sezione 13: definisce i modelli per la trasmissione, ritrasmissione e riconoscimento dei dati
- Sezione 14: specifica le regole per la gestione della dimensione dei datagrammi che trasportano pacchetti QUIC
Dettagli di codifica (Encoding Details) - Dettagli di codifica degli elementi del protocollo QUIC
- Sezione 15: Versioni (Versions)
- Sezione 16: Codifica degli interi (Integer Encoding)
- Sezione 17: Intestazioni dei pacchetti (Packet Headers)
- Sezione 18: Parametri di trasporto (Transport Parameters)
- Sezione 19: Frame
- Sezione 20: Errori (Errors)
Documenti di accompagnamento
I documenti di accompagnamento descrivono il rilevamento delle perdite e il controllo della congestione di QUIC [QUIC-RECOVERY], nonché l'uso di TLS e altri meccanismi crittografici [QUIC-TLS].
Questo documento definisce QUIC versione 1, che è conforme agli invarianti del protocollo in [QUIC-INVARIANTS].
Nota sui riferimenti:
- Per fare riferimento a QUIC versione 1, citare questo documento
- Per fare riferimento all'insieme limitato di proprietà indipendenti dalla versione di QUIC, è possibile citare [QUIC-INVARIANTS]
1.2. Terms and Definitions (Termini e definizioni)
Le parole chiave "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY" e "OPTIONAL" in questo documento devono essere interpretate come descritto in BCP 14 [RFC2119] [RFC8174] quando, e solo quando, appaiono in maiuscolo, come mostrato qui.
I termini comunemente usati in questo documento sono descritti di seguito.
Termini fondamentali
QUIC
Il protocollo di trasporto descritto da questo documento. QUIC è un nome, non un acronimo.
Endpoint
Un'entità che può partecipare a una connessione QUIC generando, ricevendo ed elaborando pacchetti QUIC. Ci sono solo due tipi di endpoint in QUIC: client e server.
Client
L'endpoint che avvia una connessione QUIC.
Server
L'endpoint che accetta una connessione QUIC.
QUIC packet (Pacchetto QUIC)
Un'unità completa elaborabile di QUIC che può essere incapsulata in un datagramma UDP. Uno o più pacchetti QUIC possono essere incapsulati in un singolo datagramma UDP.
Ack-eliciting packet (Pacchetto che sollecita conferma)
Un pacchetto QUIC che contiene frame diversi da ACK, PADDING e CONNECTION_CLOSE. Questi pacchetti causano l'invio di una conferma da parte del destinatario; vedere la Sezione 13.2.1.
Frame
Un'unità di informazioni di protocollo strutturate. Esistono più tipi di frame, ciascuno dei quali trasporta informazioni diverse. I frame sono contenuti nei pacchetti QUIC.
Address (Indirizzo)
Quando usato senza qualificazione, la tupla di versione IP, indirizzo IP e numero di porta UDP che rappresenta un'estremità di un percorso di rete.
Connection ID (Identificatore di connessione)
Un identificatore utilizzato per identificare una connessione QUIC presso un endpoint. Ogni endpoint seleziona uno o più identificatori di connessione che il suo peer deve includere nei pacchetti inviati verso l'endpoint. Questo valore è opaco per il peer.
Stream
Un canale unidirezionale o bidirezionale di byte ordinati all'interno di una connessione QUIC. Una connessione QUIC può trasportare più stream simultanei.
Application (Applicazione)
Un'entità che utilizza QUIC per inviare e ricevere dati.
Termini di gerarchia del protocollo
Questo documento utilizza i termini "pacchetti QUIC", "datagrammi UDP" e "pacchetti IP" per riferirsi alle unità dei rispettivi protocolli. Cioè, uno o più pacchetti QUIC possono essere incapsulati in un datagramma UDP, che a sua volta è incapsulato in un pacchetto IP.
+------------------+
| IP Packet |
| +--------------+|
| | UDP Datagram ||
| | +----------+ ||
| | |QUIC Pkt 1| ||
| | +----------+ ||
| | +----------+ ||
| | |QUIC Pkt 2| ||
| | +----------+ ||
| +--------------+|
+------------------+
1.3. Notational Conventions (Convenzioni notazionali)
I diagrammi di pacchetti e frame in questo documento utilizzano un formato personalizzato. Lo scopo di questo formato è riassumere, non definire, gli elementi del protocollo. La prosa definisce la semantica completa e i dettagli delle strutture.
Regole di rappresentazione dei campi
I campi complessi vengono prima nominati e poi seguiti da un elenco di campi circondato da una coppia di parentesi graffe corrispondenti. Ogni campo in questo elenco è separato da virgole.
I singoli campi includono informazioni sulla lunghezza, oltre a indicazioni su valore fisso, opzionalità o ripetizioni. I singoli campi utilizzano le seguenti convenzioni notazionali, con tutte le lunghezze in bit:
x (A)
Indica che x è lungo A bit
x (i)
Indica che x contiene un valore intero utilizzando la codifica a lunghezza variabile descritta nella Sezione 16
x (A..B)
Indica che x può avere qualsiasi lunghezza da A a B; A può essere omesso per indicare un minimo di zero bit e B può essere omesso per indicare nessun limite superiore impostato; i valori in questo formato terminano sempre su un confine di byte
x (L) = C
Indica che x ha un valore fisso di C; la lunghezza di x è descritta da L, che può utilizzare una qualsiasi delle forme di lunghezza sopra indicate
x (L) = C..D
Indica che x ha un valore nell'intervallo da C a D, inclusi, con la lunghezza descritta da L, come sopra
[x (L)]
Indica che x è opzionale e ha una lunghezza di L
x (L) ...
Indica che x è ripetuto zero o più volte e che ogni istanza ha una lunghezza di L
Ordine dei byte e ordine dei bit
Questo documento utilizza valori in ordine dei byte di rete (Network Byte Order, cioè big-endian). I campi sono posizionati a partire dai bit di ordine superiore di ogni byte.
Per convenzione, i singoli campi fanno riferimento a un campo complesso utilizzando il nome del campo complesso.
Struttura di esempio
La Figura 1 fornisce un esempio:
Example Structure {
One-bit Field (1),
7-bit Field with Fixed Value (7) = 61,
Field with Variable-Length Integer (i),
Arbitrary-Length Field (..),
Variable-Length Field (8..24),
Field With Minimum Length (16..),
Field With Maximum Length (..128),
[Optional Field (64)],
Repeated Field (8) ...,
}
Figura 1: Formato di esempio
Quando un campo a bit singolo viene riferito in prosa, la posizione di quel campo può essere chiarita utilizzando il valore del byte che trasporta il campo con il valore del campo impostato. Ad esempio, il valore 0x80 potrebbe essere utilizzato per riferirsi al campo a bit singolo nel bit più significativo del byte, come One-bit Field nella Figura 1.
Capitolo successivo: 2. Streams (Stream) - Approfondire l'astrazione di stream di QUIC