1. Introduzione (Introduction)
Il protocollo di trasferimento ipertestuale (Hypertext Transfer Protocol, HTTP) è un protocollo di grande successo. Tuttavia, il modo in cui HTTP/1.1 utilizza il trasporto sottostante ([RFC7230], Sezione 6) presenta diverse caratteristiche che hanno un effetto globale negativo sulle prestazioni delle applicazioni oggi.
In particolare, HTTP/1.0 consentiva solo una richiesta in sospeso alla volta su una determinata connessione TCP. HTTP/1.1 ha aggiunto il pipelining delle richieste (Request Pipelining), ma questo ha risolto solo parzialmente il problema della concorrenza delle richieste e soffre ancora del blocco head-of-line (Head-of-Line Blocking). Pertanto, i client HTTP/1.0 e HTTP/1.1 che devono effettuare molte richieste utilizzano più connessioni a un server per ottenere la concorrenza e quindi ridurre la latenza.
Inoltre, i campi di intestazione HTTP (HTTP Header Fields) sono spesso ripetitivi e verbosi, causando traffico di rete non necessario e riempiendo rapidamente la finestra di congestione TCP [TCP] iniziale. Ciò può comportare una latenza eccessiva quando vengono effettuate più richieste su una nuova connessione TCP.
HTTP/2 affronta questi problemi definendo un mappatura ottimizzata (Optimized Mapping) della semantica HTTP su una connessione sottostante. In particolare, consente l'interleaving (Interleaving) dei messaggi di richiesta e risposta sulla stessa connessione e utilizza una codifica efficiente per i campi di intestazione HTTP. Consente anche la prioritizzazione (Prioritization) delle richieste, consentendo alle richieste più importanti di completarsi più rapidamente, migliorando ulteriormente le prestazioni.
Il protocollo risultante è più adatto alla rete perché possono essere utilizzate meno connessioni TCP rispetto a HTTP/1.x. Ciò significa meno concorrenza con altri flussi e connessioni più durature, che a loro volta portano a una migliore utilizzo della capacità di rete disponibile.
Infine, HTTP/2 consente anche una elaborazione più efficiente dei messaggi attraverso l'uso del framing binario dei messaggi (Binary Message Framing).