Open main menu
Home
Random
Recent changes
Special pages
Community portal
Preferences
About Wikipedia
Disclaimers
Incubator escapee wiki
Search
User menu
Talk
Dark mode
Contributions
Create account
Log in
Editing
HTTP pipelining
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
{{Short description|Computer communication technique}} [[File:HTTP pipelining2.svg|thumb|right|300px|Time diagram of non-pipelined vs. pipelined connection]] {{HTTP}} '''HTTP pipelining''' is a feature of '''HTTP/1.1''', which allows multiple [[HTTP]] requests to be sent over a single [[Transmission Control Protocol|TCP]] connection without waiting for the corresponding responses.<ref name="HTTP/1.1-pipelining">{{cite journal|url=http://tools.ietf.org/html/rfc7230#section-6.3.2|title=Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing: Pipelining|year=2014 |publisher=ietf.org|doi=10.17487/RFC7230 |accessdate=2014-07-24|editor-last1=Fielding |editor-last2=Reschke |editor-first1=R. |editor-first2=J. |last1=Fielding |first1=R. |last2=Reschke |first2=J. |doi-access=free |url-access=subscription }}</ref> HTTP/1.1 requires servers to respond to pipelined requests correctly, with non-pipelined but valid responses even if server does not support HTTP pipelining. Despite this requirement, many legacy HTTP/1.1 servers do not support pipelining correctly, forcing most HTTP clients to not use HTTP pipelining. The technique was superseded by '''[[multiplexing]]''' via [[HTTP/2]],<ref name=":0">{{Cite web|url=https://developer.mozilla.org/en-US/docs/Web/HTTP/Connection_management_in_HTTP_1.x$revision/1330814|title=Revision 1330814 {{!}} Connection management in HTTP/1.x {{!}} MDN|website=MDN Web Docs|language=en-US|access-date=2018-03-19|archive-date=2018-03-19|archive-url=https://web.archive.org/web/20180319213834/https://developer.mozilla.org/en-US/docs/Web/HTTP/Connection_management_in_HTTP_1.x$revision/1330814|url-status=dead}}</ref> which is supported by most modern [[Web browser|browsers]].<ref name="browser_support">{{cite web|url=http://caniuse.com/#search=http2|title=HTTP2 browser support|accessdate=March 9, 2017}}</ref> In [[HTTP/3]], multiplexing is accomplished via [[QUIC]] which replaces [[Transmission Control Protocol|TCP]]. This further reduces loading time, as there is no [[head-of-line blocking]] even if some packets are lost. ==Motivation and limitations== The pipelining of requests results in a dramatic improvement<ref>{{cite web|url=http://www.w3.org/Protocols/HTTP/Performance/Pipeline.html|title=Network Performance Effects of HTTP/1.1, CSS1, and PNG|publisher=World Wide Web Consortium|accessdate=14 January 2010|date=24 June 1997|first1=Henrik Frystyk|last1=Nielsen|authorlink1=Henrik Frystyk Nielsen|first2=Jim|last2=Gettys|authorlink2=Jim Gettys|first3=Anselm|last3=Baird-Smith|first4=Eric|last4=Prud'hommeaux|first5=Håkon Wium|last5=Lie|authorlink5=Håkon Wium Lie|first6=Chris|last6=Lilley|authorlink6=Chris Lilley (computer scientist)}}</ref> in the loading times of HTML pages, especially over high [[Latency (engineering)|latency]] connections such as [[Satellite Internet|satellite Internet connection]]s. The speedup is less apparent on broadband connections, as the limitation of HTTP 1.1 still applies: the server must send its responses in the same order that the requests were received—so the entire connection remains [[FIFO and LIFO accounting|first-in-first-out]]<ref name="HTTP/1.1-pipelining" /> and [[Head-of-line blocking|HOL blocking]] can occur. The asynchronous operations of [[HTTP/2]] and [[SPDY]] are solution for this.<ref name="lwnspdy">{{cite web|url=https://lwn.net/Articles/362473/|title=Reducing HTTP latency with SPDY|first=Nathan|last=Willis|date=18 November 2009|publisher=[[LWN.net]]}}</ref> By 2017 most browsers supported HTTP/2 by default which uses multiplexing instead.<ref name=":0" /> Non-[[idempotence (computer science)#Examples|idempotent]] requests such as [[POST (HTTP)|<code>POST</code>]] should not be pipelined.<ref name="non-idempotent">{{cite web|url=http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html|title=Connections|publisher=[[w3.org]]}}</ref> Read requests like <code>GET</code> and <code>HEAD</code> can always be pipelined. A sequence of other idempotent requests like <code>PUT</code> and <code>DELETE</code> can be pipelined or not depending on whether requests in the sequence depend on the effect of others.<ref name="HTTP/1.1-pipelining"/> HTTP pipelining requires both the client and the server to support it. [[Hypertext Transfer Protocol|HTTP/1.1]] conforming servers are required to produce valid responses to pipelined requests, but may not actually process requests concurrently.<ref>{{cite web|url=https://www-archive.mozilla.org/projects/netlib/http/pipelining-faq.html|title=HTTP/1.1 Pipelining FAQ'}}</ref> {{Clear left}} Most pipelining problems happen in HTTP intermediate nodes (hop-by-hop), i.e. in [[proxy server]]s, especially in transparent proxy servers (if one of them along the HTTP chain does not handle pipelined requests properly then nothing works as it should).<ref name="make-pipelining-usable"/> Using pipelining with HTTP proxy servers is usually not recommended also because the HOL blocking problem may really slow down proxy server responses (as the server responses must be in the same order of the received requests).<ref name="HTTP/1.1-pipelining"/> <ref name="MSIE-8-chat-2008"/> '''Example''': if a client sends 4 pipelined GET requests to a proxy through a single connection and the first one is not in its cache then the proxy has to forward that request to the destination web server; if the following three requests are instead found in its cache, the proxy has to wait for the web server response, then it has to send it to the client and only then it can send the three [[Web cache|cached]] responses too. If instead a client opens 4 connections to a proxy and sends 1 GET request per connection (without using pipelining) the proxy can send the three cached responses to client in parallel before the response from server is received, decreasing the overall completion time (because requests are served in parallel with no head-of-line blocking problem).<ref name="HTTP/1.1-concurrency">{{cite journal|url=http://tools.ietf.org/html/rfc7230#section-6.4|title=Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing: Concurrency|year=2014 |publisher=ietf.org|doi=10.17487/RFC7230 |accessdate=2014-07-24|editor-last1=Fielding |editor-last2=Reschke |editor-first1=R. |editor-first2=J. |last1=Fielding |first1=R. |last2=Reschke |first2=J. |doi-access=free |url-access=subscription }}</ref> The same advantage exists in HTTP/2 multiplexed streams. ==Implementation status== Pipelining was introduced in HTTP/1.1 and was not present in HTTP/1.0.<ref>{{Cite web |url=http://www8.org/w8-papers/5c-protocols/key/key.html |title=Key Differences between HTTP/1.0 and HTTP/1.1 |access-date=2016-04-16 |archive-url=https://web.archive.org/web/20160424204340/http://www8.org/w8-papers/5c-protocols/key/key.html |archive-date=2016-04-24 |url-status=dead }}</ref> There have always been complaints about browsers, proxy servers, etc. not working well when using pipelined requests / responses, up to the point that for many years (at least till 2011) software developers, engineers, web experts, etc. tried to summarize the various kind of problems they noted, to fix things and to give advices about how to deal with pipelining on the Open Web.<ref name="make-pipelining-usable">{{Cite web|url= https://www.ietf.org/archive/id/draft-nottingham-http-pipeline-01.html|title=Making HTTP Pipelining Usable on the Open Web|date=March 14, 2011|author=Mark Nottingham|accessdate= October 16, 2021}}</ref> ===Implementation in web browsers=== Of all the major browsers, only [[Opera (web browser)|Opera]] had a fully working implementation that was enabled by default. In other browsers HTTP pipelining was disabled or not implemented.<ref name="lwnspdy" /> *[[Internet Explorer 8]] does not support pipeline requests, due to concerns regarding buggy proxies and [[head-of-line blocking]].<ref name="MSIE-8-chat-2008">{{cite web|url=http://www.microsoft.com/windowsxp/expertzone/chats/transcripts/08_0814_ez_ie8.mspx|title=Wayback link of 'Windows Internet Explorer 8 Expert Zone Chat (August 14, 2008)'|date=August 14, 2008|publisher=[[Microsoft]]|accessdate=May 10, 2012|archive-url=https://web.archive.org/web/20101204053757/http://www.microsoft.com/windowsxp/expertzone/chats/transcripts/08_0814_ez_ie8.mspx|archive-date=December 4, 2010|url-status=dead}}</ref> *[[Internet Explorer 11]] does not support pipelining.<ref>{{Cite news|url=https://blogs.msdn.microsoft.com/ie/2005/04/11/internet-explorer-and-connection-limits/|title=Internet Explorer and Connection Limits|newspaper=IEBlog|access-date=2016-11-14}}</ref> *Mozilla browsers (such as [[Mozilla Firefox]], [[SeaMonkey]] and [[Camino (web browser)|Camino]]) used to support pipelining; however, it was removed in Firefox 54.<ref>[https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Releases/54 Firefox 54 Release Notes]</ref> When it was supported, pipelining was disabled by default to avoid issues with misbehaving servers.<ref>{{cite web|url= https://bugzilla.mozilla.org/show_bug.cgi?id=264354|title=Bug 264354: Enable HTTP pipelining by default|publisher=[[Mozilla]]|accessdate=September 16, 2011}}</ref> If pipelining was enabled by the user, Mozilla browsers used some heuristics, mostly to turn pipelining off for older [[Internet Information Services|Microsoft IIS]] servers.<ref>{{cite web|url=https://hg.mozilla.org/releases/mozilla-2.0/file/09565753ce5f/netwerk/protocol/http/src/nsHttpConnection.cpp#l251|title=Source code – nsHttpConnection.cpp|publisher=Mozilla|work=Firefox source code|date=May 7, 2010|accessdate=December 5, 2010}}</ref> The removal was eventually backported to SeaMonkey. *[[Konqueror]] 2.0 supports pipelining, but it is disabled by default.<ref>{{Cite book|url=https://books.google.com/books?id=J1gb2eb-NuEC&dq=pipelining+%22konqueror%22&pg=PA31|title=Internet Communication: Protocols and related subjects|author=Emir Arian|date=|access-date=2021-10-16|language=en|isbn=}}</ref> *[[Google Chrome]] previously supported pipelining, but it has been disabled due to bugs and problems with poorly behaving servers.<ref>[https://www.chromium.org/developers/design-documents/network-stack/http-pipelining HTTP Pipelining - The Chromium Projects]</ref> *[[Pale Moon (web browser)]] supports pipelining, and is enabled by default.<ref>{{Cite web|url=https://forum.palemoon.org/viewtopic.php?f=5&t=16869&p=123455|title=HTTP/1 Pipelining support has been removed in Firefox 54 - Pale Moon forum|website=forum.palemoon.org|language=en-us|access-date=2018-06-07}}</ref> ===Implementation in web proxy servers=== Most HTTP proxies do not pipeline outgoing requests.<ref>{{cite web|url= https://www.mnot.net/blog/2007/06/20/proxy_caching|title=The State of Proxy Caching|date=June 20, 2007|author=Mark Nottingham|accessdate= May 16, 2009}}</ref> Some HTTP proxies, including transparent HTTP proxies, may manage pipelined requests very badly (e.g. by mixing up the order of pipelined responses).<ref>{{cite web|url= https://www.mnot.net/blog/2011/07/11/what_proxies_must_do|title=What proxies must do|date=July 11, 2011|author=Mark Nottingham|accessdate= October 16, 2021}}</ref> Some versions of the [[Squid (software)|Squid]] web proxy will pipeline up to two outgoing requests. This functionality has been disabled by default and needs to be manually enabled for "bandwidth management and access logging reasons".<ref>{{cite web|url=http://www.squid-cache.org/Doc/config/pipeline_prefetch/|title=squid : pipeline_prefetch configuration directive|date=November 9, 2009|publisher=[[Squid (software)|Squid]]|accessdate=December 1, 2009}}</ref> Squid supports multiple requests from clients. The [[Polipo]] proxy pipelines outgoing requests.<ref>{{cite web|url= http://www.pps.jussieu.fr/~jch/software/polipo/|title=Polipo — a caching web proxy|date=September 18, 2009|publisher=Juliusz Chroboczek|accessdate=November 12, 2009}}</ref> Tempesta FW, an open source [[application delivery controller]],<ref>{{cite web|url= https://github.com/tempesta-tech/tempesta|title=Tempesta FW — a Linux Application Delivery Controller|publisher=GitHub|accessdate=March 29, 2018}}</ref> also pipelines requests to backend servers.<ref>{{cite web|url= https://github.com/tempesta-tech/tempesta/wiki/Servers:-Tempesta's-side|title=Servers: Tempesta's side - tempesta-tech/tempesta Wiki|date=August 1, 2017|publisher=Tempesta Technologies INC|accessdate=March 29, 2018}}</ref> ===Other implementations=== The [[libwww]] [[library (computing)|library]] made by the [[World Wide Web Consortium]] (W3C), supports pipelining since version 5.1 released at 18 February 1997.<ref>{{cite web|last=Kahan|first=José|title=Change History of libwww|url=http://www.w3.org/Library/User/History.html |publisher=[[World Wide Web Consortium]]|accessdate=August 3, 2010|date= June 7, 2002}}</ref> Other application development libraries that support HTTP pipelining include: *Perl modules providing client support for HTTP pipelining are HTTP::Async and the LWPng ([[libwww-perl]] New Generation) library.<ref>{{Cite web |url=http://miltonkeynes.pm.org/talks/2010/02/colin_bradford_http_async.pdf |title=Using HTTP::Async for Parallel HTTP Requests (Colin Bradford) |access-date=2010-08-03 |archive-url=https://web.archive.org/web/20120310042434/http://miltonkeynes.pm.org/talks/2010/02/colin_bradford_http_async.pdf |archive-date=2012-03-10 |url-status=dead }}</ref> *The Microsoft [[.NET Framework]] 3.5 supports HTTP pipelining in the module <code>System.Net.HttpWebRequest</code>.<ref>[http://blogs.msdn.com/b/mflasko/archive/2006/07/17/669293.aspx System.Net.HttpWebRequest & pipelining]</ref> *[[Qt (framework)|Qt]] class <code>QNetworkRequest</code>, introduced in 4.4.<ref>[http://doc.qt.nokia.com/4.6/qnetworkrequest.html QNetworkRequest Class Reference] {{webarchive|url=https://web.archive.org/web/20091222054207/http://doc.qt.nokia.com/4.6/qnetworkrequest.html |date=2009-12-22 }}, Nokia QT documentation</ref> Some other applications currently exploiting pipelining are: *IceBreak application server since BUILD389 *phttpget from [[FreeBSD]] (a minimalist pipelined HTTP client)<ref>[http://www.daemonology.net/phttpget/ Pipelined HTTP GET utility]</ref> *[[libcurl]] previously had limited support for pipelining using the CURLMOPT_PIPELINING option,<ref>[http://curl.haxx.se/dev/readme-pipelining.html Curl pipelining explanation] {{webarchive|url=https://web.archive.org/web/20120627181619/http://curl.haxx.se/dev/readme-pipelining.html|date=2012-06-27}}, Curl developer documentation</ref> but this support was removed in version 7.65.0<ref>[https://daniel.haxx.se/blog/2019/04/06/curl-says-bye-bye-to-pipelining/ Curl pipelining removal announcement]{{webarchive|url=https://web.archive.org/web/20210205184800/https://daniel.haxx.se/blog/2019/04/06/curl-says-bye-bye-to-pipelining/|date=2021-02-05}}</ref> *[[portsnap]] (a [[FreeBSD]] [[FreeBSD Ports|ports tree]] distribution system) *[[APT (software)|Advanced Packaging Tool]] (APT) supports pipelining.{{Citation needed|date=August 2010}} *[[Apache Subversion|Subversion]] (SVN) has optional support for HTTP pipelining with the serf WebDAV access module (the default module, neon, does not have pipelining support).<ref>{{cite book | title = Version Control with Subversion|author1=C. Michael Pilato |author2=Ben Collins-Sussman |author3=Brian W. Fitzpatrick |page=238|publisher=[[O'Reilly Media]]|year=2008|isbn=978-0-596-51033-6}}</ref><ref>{{cite web|url=http://www.erenkrantz.com/oscon/OSCON%202007%20Subversion%20New%20Toys.pdf|title=Subversion: Powerful New Toys|author=Justin R. Erenkrantz|year=2007}}</ref> *[[Microsoft Message Queuing]] on [[Windows Server 2003]] utilises pipelining on HTTP by default, and can be configured to use it on HTTPS.<ref>{{cite web|url= https://technet.microsoft.com/en-us/library/cc737394%28WS.10%29.aspx|title= HTTP/HTTPS messages|publisher=[[Microsoft TechNet]]|date=January 21, 2005}}</ref> *IBM [[CICS]] 3.1 supports HTTP pipelining within its client.<ref>[http://publib.boulder.ibm.com/infocenter/cicsts/v3r1/index.jsp?topic=/com.ibm.cics.ts31.doc/dfhtl/topics/dfhtl_cwspipelining.htm How CICS Web support handles pipelining]</ref> Testing tools which support HTTP pipelining include: *[[httperf]]<ref>{{Cite web |url=http://www.hpl.hp.com/research/linux/httperf/ |title=HTTP Website |access-date=2010-10-01 |archive-url=https://web.archive.org/web/20120608143409/http://www.hpl.hp.com/research/linux/httperf/ |archive-date=2012-06-08 |url-status=dead }}</ref> *[[Nmap]] supports pipelining requests with the Nmap Scripting Engine (NSE)<ref>{{Cite web |url=https://nmap.org/nsedoc/lib/http.html |title=Library http |access-date=2024-11-12}}</ref> ==See also== *[[HTTP persistent connection]] *[[WebSocket]] *[[SPDY]] ==References== {{Reflist}} ==External links== *RFC 7230 {{cite journal|url=http://tools.ietf.org/html/rfc7230#section-6.3.2|title=Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing|year=2014 |publisher=ietf.org|doi=10.17487/RFC7230 |accessdate=2014-07-24|editor-last1=Fielding |editor-last2=Reschke |editor-first1=R |editor-first2=J |last1=Fielding |first1=R. |last2=Reschke |first2=J. |doi-access=free |url-access=subscription }} *[https://www.mozilla.org/projects/netlib/http/pipelining-faq.html HTTP/1.1 Pipelining FAQ at mozilla.org] *[https://www.w3.org/Protocols/HTTP/Performance/Pipeline.html "Network Performance Effects of HTTP/1.1, CSS1, and PNG" at w3.org] *[https://www.die.net/musings/page_load_time/ "Optimizing Page Load Times" article] *[https://www.daemonology.net/phttpget/ phttpget] *[https://code.google.com/p/serf/ serf] C library {{DEFAULTSORT:Http Pipelining}} [[Category:Hypertext Transfer Protocol]]
Edit summary
(Briefly describe your changes)
By publishing changes, you agree to the
Terms of Use
, and you irrevocably agree to release your contribution under the
CC BY-SA 4.0 License
and the
GFDL
. You agree that a hyperlink or URL is sufficient attribution under the Creative Commons license.
Cancel
Editing help
(opens in new window)
Pages transcluded onto the current version of this page
(
help
)
:
Template:Citation needed
(
edit
)
Template:Cite book
(
edit
)
Template:Cite journal
(
edit
)
Template:Cite news
(
edit
)
Template:Cite web
(
edit
)
Template:Clear left
(
edit
)
Template:HTTP
(
edit
)
Template:Reflist
(
edit
)
Template:Short description
(
edit
)
Template:Webarchive
(
edit
)