Junior
Parli delle versioni di HTTP e delle loro differenze.
sobes.tech AI
Risposta dell'AI
Versioni principali di HTTP:
- HTTP/0.9: Versione di base per la trasmissione di semplici documenti HTML. Supportava solo il metodo
GET, senza intestazioni o stati di risposta. - HTTP/1.0: Introdotta il supporto per intestazioni (Content-Type, User-Agent), metodi
POSTeHEAD, stati di risposta. La connessione veniva chiusa dopo ogni richiesta/risposta. - HTTP/1.1: Miglioramenti significativi:
- Connessioni persistenti - riutilizzo della connessione TCP per più richieste.
- Pipelining - invio di più richieste senza attendere la risposta precedente (mal implementato e poco usato).
- Host virtuali (intestazione Host).
- Richieste GET parziali (intestazione Range).
- Caching (Cache-Control, ETag, Last-Modified).
- Metodi PUT e DELETE.
- HTTP/2: Protocollo basato su SPDY di Google. Differenze principali:
- Protocollo binario invece di testo - parsing più efficiente.
- Multiplexing - trasmissione parallela di più richieste/risposte su una singola connessione TCP. Elimina il problema di "head-of-line blocking" in HTTP/1.1 pipelining.
- Compressione degli intestazioni (HPACK) - riduzione delle dimensioni dei dati trasmessi.
- Prioritizzazione (Server Push) - il server può inviare risorse che probabilmente saranno necessarie al client prima che le richieda.
- HTTP/3: Basato su UDP (con QUIC - Quick UDP Internet Connections) invece di TCP. Focalizzato sul miglioramento delle prestazioni, specialmente in reti instabili:
- Eliminazione del "head-of-line blocking" a livello di connessione TCP. Se un pacchetto viene perso in TCP, tutti i pacchetti successivi sono bloccati fino alla sua ritrasmissione. In QUIC (e HTTP/3), solo il flusso a cui appartiene il pacchetto perso viene bloccato.
- Stabilimento di connessione più rapido (0-RTT o 1-RTT).
- QUIC include i propri meccanismi di controllo del flusso e affidabilità.
Differenze principali nella tabella:
| Caratteristica | HTTP/1.0 | HTTP/1.1 | HTTP/2 | HTTP/3 |
|---|---|---|---|---|
| Protocollo | TCP | TCP | TCP | UDP (QUIC) |
| Formato | Testo | Testo | Binario | Binario |
| Connessione di default | Temporanea | Permanente | Permanente (multiplexing) | Permanente (Streams QUIC) |
| Multiplexing | No | Imitazione (Pipelining) | Sì | Sì |
| Compressione intestazioni | No | No | HPACK | QPACK (in QUIC) |
| Server Push | No | No | Sì | Sì |
| Blocco HOL (TCP) | Sì (a livello di richiesta) | Sì (a livello di richiesta) | Sì (a livello di connessione) | No (a livello di flusso) |
Esempio di richiesta in HTTP/1.1:
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: curl/7.64.1
Accept: */*
Esempio di richiesta in HTTP/2 (concettualmente, poiché è binario):
// Richiesta 1: Ottenere /index.html
// :method = GET
// :path = /index.html
// :authority = www.example.com
// Richiesta 2: Ottenere /style.css
// :method = GET
// :path = /style.css
// :authority = www.example.com
// ...trasmesse in parallelo su una singola connessione