Anche se HTTP può utilizzare più protocolli di trasporto, di fatto la maggior parte delle sue implementazioni esistenti utilizzano
TCP. Tuttavia quest'ultimo non è ottimizzato per connessioni di breve durata e con un piccolo scambio di dati, situazione abbastanza frequente in HTTP.
Inoltre
TCP richiede un
three-way handshake per stabilire la connessione e altri quattro pacchetti per chiuderla. Pertanto se un tipico messaggio HTTP è formato da 10 pacchetti, si avrà un totale di 17 pacchetti scambiati, di cui 7 sono di
overhead, circa il 41%.
Inoltre, i trasferimenti web non superano mai la fase
slow-start di
TCP, prima che la dimensione della finestra sia incrementata significativamente; difatti la connessione viene chiusa prima che ciò possa avvenire evitando così di sfruttare tutta la banda a disposizione.
Se consideriamo poi che un documento HTML è per lo più un contenitore di altri documenti identificati da URI, fare il download di un contenitore richiede numerose transazioni HTTP e di conseguenza numerose connessioni
TCP, senza contare poi che prima che il documento completo possa essere visualizzato, bisogna attendere la conclusione di tutte le connessioni.
Un modo per
ridurre la latenza è quello di aprire più connessioni HTTP parallele. Questo metodo venne introdotto da Netscape, che instaurava più connessioni per il download parallelo di più risorse. Un altro modo per risolvere il problema consiste nell'osservare che la connessione TCP, una volta stabilita, può restare aperta per più di un solo scambio di richiesta di risposta. Questa osservazione introduce il concetto di
connessioni persistenti di
HTTP 1.1.
L'idea alla base delle
connessioni persistenti è quella di
ridurre il numero di connessioni TCP gestite riducendo drasticamente la latenza percepita dall'utente, in quanto le connessioni successive non devono chiudere la connessione precedente e ripetere la fase
slow-start di
TCP.