Standard: | (HTTP/3 also uses the completed QUIC protocol described in RFC 9000 and related RFCs such as RFC 9001) |
Url: | https://www.rfc-editor.org/rfc/rfc9001.html |
Access-Date: | 2022-02-08[1] --> |
Developer: | IETF |
Introdate: | June 2022 |
HTTP/3 is the third major version of the Hypertext Transfer Protocol used to exchange information on the World Wide Web, complementing the widely-deployed HTTP/1.1 and HTTP/2. Unlike previous versions which relied on the well-established TCP (published in 1974), HTTP/3 uses QUIC (officially introduced in 2021), a multiplexed transport protocol built on UDP.[2]
HTTP/3 uses similar semantics compared to earlier revisions of the protocol, including the same request methods, status codes, and message fields, but encodes them and maintains session state differently. However, partially due to the protocol's adoption of QUIC, HTTP/3 has lower latency and loads more quickly in real-world usage when compared with previous versions: in some cases over four times as fast than with HTTP/1.1 (which, for many websites, is the only HTTP version deployed).[3] [4]
As of September 2024, HTTP/3 is supported by 95% of major web browsers (though not enabled for all Safari users) and 31% of the top 10 million websites.[5] It has been supported by Chromium (and derived projects including Google Chrome, Microsoft Edge, Samsung Internet, and Opera)[6] since April 2020 and by Mozilla Firefox since May 2021.[7] Safari 14 implemented the protocol but it remains disabled by default.[8]
rect 0 44 85 94 HTTP/1rect 0 95 85 137 Transport Layer Securityrect 0 138 85 189 Transmission Control Protocol
rect 126 44 210 94 HTTP/2rect 126 95 210 137 TLS 1.2rect 126 138 210 189 Transmission Control Protocol
rect 251 44 336 74 HTTP/3rect 255 90 328 121 TLS 1.3rect 251 125 336 158 QUICrect 251 159 336 189 User Datagram Protocol
rect 0 189 336 231 Internet Protocol
HTTP/3 originates from an Internet Draft adopted by the QUIC working group. The original proposal was named "HTTP/2 Semantics Using The QUIC Transport Protocol",[9] and later renamed "Hypertext Transfer Protocol (HTTP) over QUIC".[10]
On 28 October 2018 in a mailing list discussion, Mark Nottingham, Chair of the IETF HTTP and QUIC Working Groups, proposed renaming HTTP-over-QUIC to HTTP/3, to "clearly identify it as another binding of HTTP semantics to the wire protocol [...] so people understand its separation from QUIC".[11] Nottingham's proposal was accepted by fellow IETF members a few days later. The HTTP working group was chartered to assist the QUIC working group during the design of HTTP/3, then assume responsibility for maintenance after publication.[12]
Support for HTTP/3 was added to Chrome (Canary build) in September 2019 and then eventually reached stable builds, but was disabled by a feature flag. It was enabled by default in April 2020.[6] Firefox added support for HTTP/3 in November 2019 through a feature flag[13] [14] [15] and started enabling it by default in April 2021 in Firefox 88. Experimental support for HTTP/3 was added to Safari Technology Preview on April 8, 2020[16] and was included with Safari 14 that ships with iOS 14 and macOS 11,[17] but it's still disabled by default as of Safari 16, on both macOS and iOS.
On 6 June 2022, IETF published HTTP/3 as a Proposed Standard in .
HTTP semantics are consistent across versions: the same request methods, status codes, and message fields are typically applicable to all versions. The differences are in the mapping of these semantics to underlying transports. Both HTTP/1.1 and HTTP/2 use TCP as their transport. HTTP/3 uses QUIC, a transport layer network protocol which uses user space congestion control over the User Datagram Protocol (UDP). The switch to QUIC aims to fix a major problem of HTTP/2 called "head-of-line blocking": because the parallel nature of HTTP/2's multiplexing is not visible to TCP's loss recovery mechanisms, a lost or reordered packet causes all active transactions to experience a stall regardless of whether that transaction was impacted by the lost packet. Because QUIC provides native multiplexing, lost packets only impact the streams where data has been lost.
Proposed DNS resource records SVCB (service binding) and HTTPS would allow connecting without first receiving the Alt-Svc header via previous HTTP versions, therefore removing the 1 RTT of handshaking of TCP.[18] [19] There is client support for HTTPS resource records since Firefox 92, iOS 14, reported Safari 14 support, and Chromium supports it behind a flag.[20] [21] [22]
Version shipped (enabled by default) | Comment | |||||
---|---|---|---|---|---|---|
Chrome | Stable build (79) | December 2019 | 87 | April 2020[23] | Earlier versions implemented other drafts of QUIC | |
Edge | Stable build (79) | December 2019 | 87 | April 2020 | Edge 79 was the first version based on Chromium | |
Firefox | Stable build (72.0.1) | January 2020 | 88 | April 2021[24] | ||
Safari | Stable build (14.0) | September 2020 | 16.4 | March 2023 | Apple is testing HTTP/3 support on some Safari users starting with Safari 16.4.[25] |
Open-source libraries that implement client or server logic for QUIC and HTTP/3 include[26]
lsquic | C | LiteSpeed | https://github.com/litespeedtech/lsquic | |||
nghttp3 | C | https://github.com/ngtcp2/nghttp3 | ||||
h2o | C | https://github.com/h2o/h2o | ||||
libcurl[27] [28] | C | https://github.com/curl/curl | ||||
MsQuic[29] | C | Microsoft | https://github.com/microsoft/msquic | |||
proxygen | C++ | https://github.com/facebook/proxygen#quic-and-http3 | ||||
Cronet | C++ | https://github.com/chromium/chromium/tree/main/net/quic | ||||
.NET[30] | C# (using MsQuic)[31] | Microsoft | https://github.com/dotnet | |||
quic-go | Go | https://github.com/quic-go/quic-go | ||||
http3 | Haskell | https://github.com/kazu-yamamoto/http3 | ||||
Kwik | Java | https://github.com/ptrd/kwik | ||||
Flupke | Java | https://bitbucket.org/pjtr/flupke | ||||
aioquic | Python | https://github.com/aiortc/aioquic | ||||
quiche | Rust | Cloudflare | https://github.com/cloudflare/quiche | |||
neqo | Rust | Mozilla | https://github.com/mozilla/neqo | |||
quinn | Rust | https://github.com/quinn-rs/quinn | ||||
s2n-quic | Rust | Amazon Web Services | https://github.com/aws/s2n-quic |