Pipeline HTTP - HTTP pipelining

Diagramma temporale della connessione non pipeline rispetto a quella pipeline

Il pipelining HTTP è una funzionalità di HTTP/1.1 che consente di inviare più richieste HTTP su una singola connessione TCP (protocollo di controllo della trasmissione) senza attendere le risposte corrispondenti. La specifica HTTP/1.1 richiede che i server rispondano correttamente alle richieste in pipeline, inviando risposte non in pipeline ma valide anche se il server non supporta il pipelining HTTP. Nonostante questo requisito, molti server HTTP/1.1 legacy non supportano correttamente il pipelining, costringendo la maggior parte dei client HTTP a non utilizzare il pipelining HTTP in pratica.

La tecnica è stata sostituita dal multiplexing tramite HTTP/2 , che è supportato dalla maggior parte dei browser moderni .

In HTTP/3 , il multiplexing viene eseguito tramite il nuovo protocollo di trasporto QUIC sottostante , che sostituisce TCP . Ciò riduce ulteriormente i tempi di caricamento, poiché non vi è più alcun blocco della testata .

Motivazione e limiti

Il pipelining delle richieste si traduce in un notevole miglioramento dei tempi di caricamento delle pagine HTML, in particolare su connessioni ad alta latenza come le connessioni Internet satellitari . L'accelerazione è meno evidente sulle connessioni a banda larga, poiché si applica ancora la limitazione di HTTP 1.1: il server deve inviare le sue risposte nello stesso ordine in cui sono state ricevute le richieste, quindi l'intera connessione rimane first-in-first-out e il blocco HOL può verificarsi.

L'operazione asincrona di HTTP/2 e SPDY sono soluzioni per questo. I browser alla fine non abilitavano il pipelining per impostazione predefinita e nel 2017 la maggior parte dei browser supportava HTTP/2 per impostazione predefinita, che utilizzava invece il multiplexing.

Le richieste non idempotenti , come quelle che utilizzano POST, non dovrebbero essere convogliate. Le sequenze GETe le HEADrichieste possono sempre essere convogliate. Una sequenza di altre richieste idempotenti come PUTe DELETEpuò essere convogliata o meno a seconda che le richieste nella sequenza dipendano dall'effetto di altre.

Il pipelining HTTP richiede sia il client che il server per supportarlo. I server conformi a HTTP/1.1 sono necessari per supportare il pipelining. Ciò non significa che i server siano tenuti a convogliare le risposte, ma che devono non fallire se un client sceglie di inoltrare le richieste.

La maggior parte dei problemi di pipelining può verificarsi nei nodi intermedi HTTP (hop-by-hop), cioè principalmente nei server proxy (proxy), specialmente nei server proxy trasparenti (perché vengono utilizzati comunque senza richiedere la configurazione del client utente, quindi se solo uno di essi, lungo la catena HTTP, non gestisce correttamente le richieste in pipeline, quindi nulla funziona come dovrebbe).

L'utilizzo del pipelining con i server proxy HTTP di solito non è consigliato anche perché il problema del blocco HOL può davvero rallentare molto le risposte del server proxy (poiché le risposte del server devono essere nello stesso ordine delle richieste ricevute).

Esempio : se un client invia 4 richieste GET pipelined a un proxy tramite una singola connessione e la prima non è nella sua cache, il proxy deve inoltrare tale richiesta al server web di destinazione; se invece le tre richieste successive vengono trovate nella sua cache, il proxy deve attendere la risposta del web server, poi deve inviarla al client e solo allora può inviare anche le tre risposte memorizzate nella cache.

Se invece un client apre 4 connessioni a un proxy e invia 1 richiesta GET per connessione (senza utilizzare pipelining) allora il proxy può inviare le tre risposte memorizzate nella cache al client in parallelo prima che venga ricevuta la risposta dal server, diminuendo notevolmente il tempo di completamento complessivo (perché le richieste vengono servite in parallelo senza problemi di blocco della testata). Lo stesso vantaggio, ma con maggiore velocità, si verifica nei flussi multiplex HTTP/2.

Stato di implementazione

Il pipelining è stato introdotto in HTTP/1.1 e non era presente in HTTP/1.0.

Sembra che fin dall'inizio, implementare correttamente il pipelining HTTP e/o distribuirlo non sia mai stato un compito facile per nessuno (ad eccezione degli sviluppatori di server web). Ci sono sempre state lamentele per browser, server proxy, ecc. che non funzionavano bene quando si utilizzavano richieste/risposte pipeline, fino al punto che per molti anni (almeno fino al 2011) sviluppatori di software, ingegneri, esperti web, ecc. hanno cercato di riassumere i vari tipi di problemi che hanno notato, per sistemare le cose e dare consigli su come affrontare il pipelining sull'Open Web.

Implementazione nei server web

L'implementazione del pipelining nei server Web è una questione relativamente semplice per assicurarsi che i buffer di rete non vengano eliminati tra le richieste. Per questo motivo, la maggior parte dei server Web moderni (che implementano completamente HTTP/1.1) gestiscono il pipelining senza alcun problema.

Implementazione nei browser web

Di tutti i principali browser, solo Opera basato sul motore di layout Presto aveva un'implementazione completamente funzionante che era abilitata per impostazione predefinita. In tutti gli altri browser il pipelining HTTP era disabilitato o non implementato.

  • Internet Explorer 8 non esegue il pipeline delle richieste, a causa di problemi relativi ai proxy difettosi e al blocco dell'head-of-line .
  • Internet Explorer 11 non supporta il pipelining.
  • I browser Mozilla (come Mozilla Firefox , SeaMonkey e Camino ) supportano il pipelining; tuttavia, è disabilitato per impostazione predefinita. Il pipelining è disabilitato per impostazione predefinita per evitare problemi con i server che si comportano in modo anomalo. Quando il pipelining è abilitato, i browser Mozilla utilizzano alcuni metodi euristici, in particolare per disattivare il pipelining per i server IIS meno recenti . Il supporto per H1 Pipeline è stato rimosso da Mozilla Firefox nella versione 54.
  • Konqueror 2.0 supporta il pipelining, ma è disabilitato per impostazione predefinita.
  • Google Chrome in precedenza supportava il pipelining, ma è stato disabilitato a causa di bug e problemi con i server che si comportano male.
  • Pale Moon (browser Web) supporta il pipelining ed è abilitato per impostazione predefinita.

Implementazione nei server proxy web

La maggior parte dei proxy HTTP non convoglia le richieste in uscita.

Alcuni proxy HTTP, inclusi i proxy HTTP trasparenti, possono gestire molto male le richieste in pipeline (cioè confondendo l'ordine delle risposte in pipeline, ecc.).

Alcune versioni del proxy web Squid convogliano fino a due richieste in uscita. Questa funzionalità è stata disabilitata per impostazione predefinita e deve essere abilitata manualmente per "motivi di gestione della larghezza di banda e registrazione degli accessi". Squid supporta più richieste dai client.

Il proxy Polipo convoglia le richieste in uscita.

Tempesta FW, un controller di distribuzione delle applicazioni open source , inoltra anche le richieste ai server di backend.

Altre implementazioni

La libreria libwww realizzata dal World Wide Web Consortium (W3C), supporta il pipelining dalla versione 5.1 rilasciata il 18 febbraio 1997.

Altre librerie di sviluppo di applicazioni che supportano il pipelining HTTP includono:

  • I moduli Perl che forniscono supporto client per il pipelining HTTP sono HTTP::Async e la libreria LWPng ( libwww-perl New Generation).
  • Microsoft .NET Framework 3.5 supporta il pipelining HTTP nel modulo System.Net.HttpWebRequest.
  • Classe QtQNetworkRequest , introdotta in 4.4.

Alcune altre applicazioni che attualmente sfruttano il pipelining sono:

  • Server applicativo IceBreak da BUILD389
  • phttpget da FreeBSD (un client HTTP con pipeline minimalista)
  • libcurl in precedenza aveva un supporto limitato per il pipelining utilizzando l'opzione CURLMOPT_PIPELINING, ma questo supporto è stato rimosso nella versione 7.65.0
  • portsnap (un sistema di distribuzione ad albero dei port di FreeBSD )
  • Advanced Packaging Tool (APT) supporta il pipelining.
  • Subversion (SVN) ha il supporto opzionale per il pipelining HTTP con il modulo di accesso serf WebDAV (il modulo predefinito, neon, non ha il supporto per il pipelining).
  • Microsoft Message Queuing su Windows Server 2003 utilizza il pipelining su HTTP per impostazione predefinita e può essere configurato per utilizzarlo su HTTPS.
  • IBM CICS 3.1 supporta il pipelining HTTP all'interno del suo client.

Gli strumenti di test che supportano il pipelining HTTP includono:

Guarda anche

Riferimenti

link esterno