HTTP pipelining
HTTP |
---|
Begär metoder |
Rubrikfält |
Svarsstatuskoder |
Säkerhetsåtkomstkontrollmetoder |
Säkerhetssårbarheter |
HTTP-pipelining är en funktion i HTTP/1.1 som gör att flera HTTP- förfrågningar kan skickas över en enda TCP- anslutning utan att vänta på motsvarande svar. HTTP/1.1 kräver att servrar svarar på pipelinerade förfrågningar korrekt, med icke-pipelinerade men giltiga svar även om servern inte stöder HTTP-pipelining. Trots detta krav stöder många äldre HTTP/1.1-servrar inte pipelining korrekt, vilket tvingar de flesta HTTP-klienter att inte använda HTTP-pipelining.
Tekniken ersattes av multiplexering via HTTP/2 , som stöds av de flesta moderna webbläsare .
I HTTP/3 sker multiplexering via QUIC som ersätter TCP . Detta minskar laddningstiden ytterligare, eftersom det inte finns någon head-of-line blockering även om vissa paket går förlorade.
Motivation och begränsningar
Pipelining av förfrågningar resulterar i en dramatisk förbättring av laddningstiderna för HTML-sidor, särskilt över anslutningar med hög latens , såsom satellitanslutningar till Internet . Hastigheten är mindre påtaglig på bredbandsanslutningar, eftersom begränsningen för HTTP 1.1 fortfarande gäller: servern måste skicka sina svar i samma ordning som förfrågningarna togs emot - så hela anslutningen förblir först-in-först-ut och HOL - blockering kan inträffa.
Den asynkrona driften av HTTP/2 och SPDY är lösningar för detta. År 2017 stödde de flesta webbläsare HTTP/2 som standard som använder multiplexering istället.
Icke- idempotenta förfrågningar som POST
bör inte skickas i pipeline. Läsförfrågningar som GET
och HEAD
kan alltid skickas i pipeline. En sekvens av andra idempotenta förfrågningar som PUT
och DELETE
kan pipelineras eller inte beroende på om förfrågningar i sekvensen beror på effekten av andra.
HTTP-pipelining kräver att både klienten och servern stöder det. HTTP/1.1- kompatibla servrar krävs för att producera giltiga svar på förfrågningar i pipeline, men kanske inte faktiskt behandlar förfrågningar samtidigt.
De flesta pipeliningproblem inträffar i HTTP-mellannoder (hop-by-hop), dvs i proxyservrar , speciellt i transparenta proxyservrar (om en av dem längs HTTP-kedjan inte hanterar pipeline-förfrågningar på rätt sätt fungerar ingenting som det ska).
Att använda pipelining med HTTP-proxyservrar rekommenderas vanligtvis inte heller eftersom HOL-blockeringsproblemet verkligen kan sakta ner proxyserversvaren (eftersom serversvaren måste vara i samma ordning som de mottagna förfrågningarna).
Exempel : om en klient skickar fyra pipelinerade GET-förfrågningar till en proxy via en enda anslutning och den första inte finns i dess cache måste proxyn vidarebefordra den begäran till destinationswebbservern; om följande tre förfrågningar istället hittas i dess cache, måste proxyn vänta på webbserverns svar, sedan måste den skicka det till klienten och först då kan den också skicka de tre cachade svaren.
Om istället en klient öppnar 4 anslutningar till en proxy och skickar 1 GET-begäran per anslutning (utan att använda pipelining) kan proxyn skicka de tre cachade svaren till klienten parallellt innan svaret från servern tas emot, vilket minskar den totala slutförandetiden (eftersom begäranden serveras parallellt utan problem med head-of-line blockering). Samma fördel finns i multiplexade HTTP/2-strömmar.
Implementeringsstatus
Pipelining introducerades i HTTP/1.1 och fanns inte i HTTP/1.0.
Det har alltid förekommit klagomål på att webbläsare, proxyservrar, etc. inte fungerar bra när man använder pipelinerade förfrågningar/svar, upp till den punkt som i många år (åtminstone fram till 2011) mjukvaruutvecklare, ingenjörer, webbexperter, etc. försökte sammanfatta de olika typerna av problem de noterade, för att fixa saker och ge råd om hur man hanterar pipelining på den öppna webben.
Implementering i webbläsare
Av alla större webbläsare var det bara Opera som hade en fullt fungerande implementering som var aktiverad som standard. I andra webbläsare var HTTP-pipelining inaktiverad eller inte implementerad.
- Internet Explorer 8 stöder inte pipeline-förfrågningar, på grund av oro angående buggy-proxyer och head-of-line-blockering .
- Internet Explorer 11 stöder inte pipelining.
- Mozilla-webbläsare (som Mozilla Firefox , SeaMonkey och Camino ) stödjer pipelining; den är dock inaktiverad som standard. Pipelining är inaktiverat som standard för att undvika problem med servrar som inte beter sig. När pipelining är aktiverat använder Mozilla-webbläsare viss heuristik, särskilt för att stänga av pipelining för äldre IIS -servrar. Stöd för H1 Pipeline togs bort från Mozilla Firefox i version 54.
- Konqueror 2.0 stöder pipelining, men det är inaktiverat som standard.
- Google Chrome stödde tidigare pipelining, men det har inaktiverats på grund av buggar och problem med dåligt fungerande servrar.
- Pale Moon (webbläsare) stöder pipelining och är aktiverat som standard.
Implementering i webbproxyservrar
De flesta HTTP-proxyer skickar inte utgående förfrågningar.
Vissa HTTP-proxyer, inklusive transparenta HTTP-proxyer, kan hantera pipelineförfrågningar mycket dåligt (t.ex. genom att blanda ihop ordningen på pipelinerade svar).
Vissa versioner av Squid web proxy kommer att pipeline upp till två utgående förfrågningar. Den här funktionen har inaktiverats som standard och måste aktiveras manuellt av "bandbreddshantering och åtkomstloggningsskäl". Squid stöder flera förfrågningar från kunder.
Polipo proxy skickar utgående förfrågningar .
Tempesta FW, en applikationsleveranskontroller med öppen källkod , pipelines också förfrågningar till backend-servrar.
Andra implementeringar
Libwww- biblioteket som skapats av World Wide Web Consortium (W3C), stöder pipelining sedan version 5.1 släpptes den 18 februari 1997.
Andra applikationsutvecklingsbibliotek som stöder HTTP-pipelining inkluderar:
- Perl-moduler som tillhandahåller klientstöd för HTTP-pipelining är HTTP::Async och LWPng-biblioteket ( libwww-perl New Generation).
- Microsoft .NET Framework 3.5 stöder HTTP-pipelining i modulen
System.Net.HttpWebRequest
. -
Qt -klass
QNetworkRequest
, introducerad i 4.4.
Några andra applikationer som för närvarande utnyttjar pipelining är:
- IceBreak applikationsserver sedan BUILD389
- phttpget från FreeBSD (en minimalistisk pipelined HTTP-klient)
- libcurl hade tidigare begränsat stöd för pipelining med alternativet CURLMOPT_PIPELINING, men detta stöd togs bort i version 7.65.0
- portsnap (ett FreeBSD- ports-träddistributionssystem )
- Advanced Packaging Tool (APT) stöder pipelining. [ citat behövs ]
- Subversion (SVN) har valfritt stöd för HTTP-pipelining med serf WebDAV-åtkomstmodulen (standardmodulen, neon, har inte pipelining-stöd).
- Microsoft Message Queuing på Windows Server 2003 använder pipelining på HTTP som standard och kan konfigureras för att använda det på HTTPS.
- IBM CICS 3.1 stöder HTTP-pipelining inom sin klient.
Testverktyg som stöder HTTP-pipelining inkluderar:
Se även
externa länkar
-
RFC 7230 Fielding, R.; Reschke, J. (2014). Fielding, R; Reschke, J (red.). "Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing" . ietf.org. doi : 10.17487/RFC7230 . Hämtad 2014-07-24 .
{{ citera journal }}
: Citera journal kräver|journal=
( hjälp ) - Vanliga frågor om HTTP/1.1 Pipelining på mozilla.org
- "Nätverksprestandaeffekter av HTTP/1.1, CSS1 och PNG" på w3.org
- Artikel "Optimera sidladdningstider".
- phttpget
- serf C-bibliotek