# HTTP/2

HTTP/2 (originariamente chiamato HTTP/2.0) è la nuova versione del protocollo di rete HTTP usato dal World Wide Web. È basato su SPDY. HTTP/2 è stato sviluppato dal Working Group Hypertext Transfer Protocol (httpbis) dell'Internet Engineering Task Force. HTTP/2 sarebbe la prima nuova versione del protocollo HTTP dalla nascita di HTTP 1.1, il quale è standard RFC 2616 nel 1999. Il Working Group ha presentato HTTP/2 allo IESG proponendolo come standard nel dicembre 2014.
Gli sforzi effettuati per la standardizzazione sono una risposta allo SPDY, un protocollo HTTP-compatibile sviluppato da Google e supportato in Chrome, Opera, Firefox, Internet Explorer 11, Safari, e Amazon Silk.

## Obiettivi

L'atto costitutivo del gruppo di lavoro cita diversi obiettivi e temi di interesse:
* Un meccanismo di negoziazione che consente ai client e server di utilizzare HTTP 1.1, 2.0, o potenzialmente altri protocolli non HTTP.
* Mantenere la compatibilità di alto livello con HTTP 1.1 (per esempio con i metodi, codici di stato, e URI, e la maggior parte campi di intestazione).
* Ridurre la latenza per migliorare la velocità di caricamento delle pagine nei browser web considerando:
** La compressione dei dati degli header HTTP
** Le tecnologie push lato server
** La pipeline delle richieste
** Soluzioni al problema del blocco head-of-line in HTTP 1
** il caricamento in parallelo degli elementi di una pagina su una singola connessione TCP
* Sostenere casi d'uso comuni di HTTP, come browser desktop, browser per cellulari, API web, server web a varie scale, server proxy, reverse server proxy, firewall e content delivery networks

## Differenze con HTTP 1.1

I cambiamenti proposti non richiedono nessuna modifica al modo di lavorare delle applicazioni web esistenti, ma le nuove applicazioni possono avvantaggiarsi delle novità introdotte per incrementare la velocità.
HTTP/2 mantiene ad alto livello la maggior parte della sintassi di HTTP 1.1 come metodi, codici di stato, campi degli header, URI. La differenza sta nel modo in cui è strutturato e trasportato il flusso dei dati tra il client e il server. I siti web efficienti minimizzano il numero di richieste necessarie per restituire una pagina con la tecnica del "minifying" o minimizzazione (riducendo le dimensioni del codice e impacchettando piccoli pezzi di codice in unità più grandi, senza intaccarne la funzionalità) applicata su risorse come immagini e script. Ad ogni modo la minimizzazione non è necessariamente conveniente né efficiente e può ancora richiedere connessioni HTTP distinte per ottenere la pagina e le risorse minimizzate.
HTTP/2 permette al server di inviare ("push") più dati di quelli richiesti dal client. Questo consente al server di fornire dati che sa essere necessari ad un web browser per completare la pagina, senza attendere che il browser esamini la prima risposta e senza l'overhead di un ciclo di richiesta addizionale.
Altri miglioramenti prestazionali nella prima stesura di HTTP/2 (che era una copia di SPDY) vengono dal multiplexing di richieste e risposte, allo scopo di evitare le problematiche di tipo HOLB (head-of-line blocking) note in HTTP/1.1 (anche quando viene utilizzata la tecnica dell'HTTP pipelining), compressione degli header, gestione delle richieste in base alla priorità delle stesse (prioritization).

## Genesi e successive differenze con SPDY

SPDY (si pronuncia "spidi") è un progetto di ricerca portato avanti da Google. Il protocollo derivato dal progetto SPDY, che porta lo stesso nome, è inteso per il trasporto di informazioni e altro contenuto sul web, con obiettivo principale la riduzione della latenza. SPDY si appoggia sempre sulla stessa pipe TCP, ma utilizza differenti protocolli per ottenere questa riduzione. Le modifiche di base apportate a HTTP/1.1 per creare SPDY includono: "vero pipelining delle richieste senza restrizioni FIFO, un meccanismo di framing dei messaggi per semplificare lo sviluppo di client e server, compressione obbligatoria (compresi gli header), gestione delle priorità e anche comunicazioni bi-direzionali." Il gruppo di lavoro httpbis prese in considerazione il protocollo SPDY di Google, l'HTTP Speed+Mobility proposal (basato su SPDY) di Microsoft e il Network-Friendly HTTP Upgrade. Nel luglio 2012 Facebook fornì un feedback su ciascuna delle proposte e raccomandò che HTTP/2 fosse basato su SPDY.
La bozza iniziale di HTTP/2 fu pubblicata a novembre 2012 ed era basata direttamente su una copia di SPDY.
La maggior differenza tra HTTP/1.1 e SPDY è che ad ogni azione di un utente in SPDY viene assegnato uno "stream ID", il che significa che un singolo canale TCP connette l'utente al server. SPDY suddivide le richieste in controllo o dati, che è un "semplice eseguire il parsing del protocollo binario con due tipi di frame".
SPDY ha mostrato un evidente miglioramento rispetto HTTP, con incrementi della velocità di caricamento di una pagina dall'11.81% fino al 47.7%. HTTP/2 usa SPDY come punto di partenza. In HTTP/2, comunque, viene utilizzato un algoritmo di compressione Huffman, di tipo code-based, anziché la compressione dinamica stream-based usata in SPDY. Questo aiuta a ridurre potenziali rischi di attacchi sul protocollo.
Il 9 febbraio 2015 Google ha annunciato di prevedere la rimozione del supporto per SPDY in Chrome entro i primi mesi del 2016, in favore del supporto a HTTP/2, iniziando da Chrome 40.

## Cifratura

Nonostante HTTP/2 sia stato progettato per supportare sia HTTP che HTTPS, di fatto tutte le implementazioni all'interno dei principali browser (Firefox, Chrome, Safari, Opera, IE, Edge) hanno deciso di supportare esclusivamente HTTP/2 attraverso TLS, rendendolo di fatto un requisito.

## Tappe fondamentali dello sviluppo

| Data | Tappa |
| 20 dicembre 2007 | Prima Internet Draft di revisione per HTTP1.1 |
| 23 gennaio 2008 | Prima Internet Draft sui requisiti di sicurezza per HTTP |
| inizio 2012 | Richiesta di proposte per HTTP 2.0 |

## I server HTTP/HTTPS

* Caddy
* nginx
* Apache 2 tramite il modulo mod_spdy