The HTTP protocol lets browsers and other applications request resources from a server on the internet to load web pages. HTTP/3 is the latest version of HTTP, published by the Internet Engineering Task Force (IETF) as the RFC 9114 standard.
HTTP3 aims to make websites faster and more secure by providing an application layer over QUIC, a next-generation transport protocol.
At a high level, HTTP3 provides the same functionalities as HTTP2, such as header compression and stream prioritization. However, under the hood, the QUIC transport protocol entirely changes the way we transfer data over the web.
In this article, we'll take an in-depth look at the new features and differences of HTTP3 vs QUIC, how they fit into the overall ecosystem of network protocols, how HTTP3 compares to the previous versions of HTTP, and the cons of the QUIC and HTTP3 protocols.
What Is HTTP3?
HTTP (Hypertext Transfer Protocol) is an application-layer network communication protocol of the Internet Protocol Suite, or according to its official website, the "core protocol of the World Wide Web".
It defines a request-response mechanism between client and server applications on the web that allows them to send and receive hypertext (HTML) documents and other text and media files.
HTTP3 was first known as 'HTTP-over-QUIC' because its main goal is to make the HTTP syntax and all the existing HTTP/2 functionality compatible with the QUIC transport protocol.
Thus, the new features of HTTP/3 are all coming from the QUIC layer, including built-in encryption, a new cryptographic handshake, zero round-trip time resumption on prior connections, the removal of the head-of-line blocking issue, connection migration to support mobile users on the go, and native multiplexing.
HTTP/2 is also referred to as H2 and HTTP/3 can be shortened to H3. Read our guide: HTTP/3 vs HTTP/2 Performance: Is the Upgrade Worth It?
HTTP3 vs QUIC in the TCP/IP Model
Delivering information over the internet is a complex operation that involves both the software and hardware level. One protocol cannot describe the entire communication flow due to the different characteristics of the devices, tools, and software used throughout the process.
As a result, network communication is based on a stack of communication protocols in which each layer serves a different purpose. Although there are various conceptual models that describe the structure of protocol layers, such as the seven-layer OSI Model, the internet is based on the four-layer TCP/IP model, also known as the Internet Protocol Suite. It's defined in the RFC 1122 specification as follows:
"To communicate using the Internet system, a host must implement the layered set of protocols comprising the Internet protocol suite. A host typically must implement at least one protocol from each layer."
Here is how the four layers of the TCP/IP model stack up, from top to bottom:
| Purpose | ID mechanism (examples) | Protocols (examples) | Devices/Tools (examples) | |
|---|---|---|---|---|
| LAYER 4: Application layer | process-to-process communication | application-level identification mechanisms | HTTP, DNS, TLS, FTP, SMTP, SSDP, etc. | web browsers and server applications, mail server and client applications, FTP server and client applications, etc. |
| LAYER 3: Transport layer | host-to-host communication for applications | port numbers (ports are either TCP or UDP ports; QUIC and DCCP use UDP ports) | TCP, UDP, QUIC, DCCP, etc. | network ports (each LAYER-4 protocol has its commonly used port number — e.g. HTTP uses port 80) |
| LAYER 2: Internet layer | routing (selecting a path for traffic in a network or across multiple networks) | IP addresses | IP (IPv4 and IPv6), IPsec, etc. | network interface controllers (NICs) — internal or external |
| LAYER 1: Link (network interface) layer | moving network packets between different hosts on the same local network | MAC (Media Access Control) addresses | IEEE 802 standards for LAN/MAN/PAN networks (Ethernet, Wi-Fi, etc.), PPP, etc. | device drivers for NICs — e.g. PHY chips for Wi-Fi, Ethernet devices, etc. |
As the above table shows, HTTP is an application-layer protocol that makes communication possible between two software applications: a web server and a web browser. HTTP messages (requests or responses) are delivered over the internet by a transport-layer protocol: either TCP (for HTTP/2 and HTTP/1.1 messages) or QUIC (for HTTP/3 messages) — we'll see how transport protocols work in detail later in the article.
HTTP Versions: From the Start to HTTP3 (Released in June 2022)
Like most communication protocols, H3 is defined in the RFC (Request for Comments) Series used for publishing, editing, and cataloging technical documents related to the internet.
HTTP/3 was released as RFC 9114 in June 2022. However, two previous versions of the protocol, HTTP/2 and HTTP/1.1 are still in active use.
Here's a brief summary of the evolution of the HTTP protocol:
| HTTP version | Release date | Specification | Status | Key features |
|---|---|---|---|---|
| HTTP/0.9 | 1991 | has no RFC number; see the original doc created by Tim Berners-Lee | historical (not in use) | only raw data transfer introduced the TCP/IP model and GET requests (also called the 'one-line protocol') |
| HTTP/1 | 1996 | RFC 1945 | historical (not in use) | introduced HTTP status codes, Content-Type, the POST and HEAD methods, and request headers |
| HTTP/1.1 | 1997 | RFC 9112 | Internet Standard | update to HTTP/1; introduces the Host header, the 100 Continue status, persistent connections, and new HTTP methods (PUT, PATCH, DELETE, CONNECT, TRACE, OPTIONS) |
| HTTP/2 | 2015 | RFC 9113 | Proposed Standard | introduces a new binary framing layer that's not compatible with HTTP/1.1 and request and response multiplexing, stream prioritization, automatic header compression (HPACK), connection reset, server push |
| HTTP/3 | 2022 | RFC 9114 | Proposed Standard | makes HTTP compatible with QUIC, moves from TCP to UDP transport |
See Cloudflare Radar for the current usage data of the three active versions of HTTP — 28% of Cloudflare's traffic is already transferred via HTTP/3 and QUIC.
While most requests on Cloudflare's global network still use HTTP/2, HTTP/3 traffic surpassed HTTP/1.1 in July 2022:

Image credit: Cloudflare Blog
The QUIC Protocol Explained
QUIC (not an acronym; pronounced as 'quick') is a general-purpose transport-layer protocol published as an IETF Proposed Standard in 2021 — one year before H3. It can be used with any compatible application-layer protocol, but HTTP/3 is its most frequent use case.
QUIC runs on top of another transport protocol called UDP, which is responsible for the physical delivery of application data (e.g. an H3 message) between the client and server machines. UDP is a quite simple and lightweight protocol, which means that it's fast, but on the other hand, it lacks many features essential for reliable and secure communication. QUIC implements these higher-level transport features, so the two protocols work together to optimize the delivery of HTTP data over the network.
UDP has been around for more than 40 years — it was standardized back in 1980. The acronym stands for User Datagram Protocol as UDP exchanges connectionless datagrams (basic transfer units) between two end machines.
This is what a datagram looks like — it doesn't include any data related to connection establishment or information about the success of delivery. It only includes a lightweight header and the message:

Image credit: The Network Encyclopedia
As you can see above, a UDP header is very lightweight: only 64 bits altogether (16 bits for the source port, 16 bits for the destination port, 16 bits for the length of the message, and 16 bits for the checksum). This makes pure UDP delivery very fast — however, QUIC makes delivery slower with the implementation of additional features.
With version 3, HTTP moves from TCP-based to UDP-based connections. As a result, the entire underlying structure of network communication changes.
The TCP vs UDP Protocols
Like UDP, TCP (Transmission Control Protocol) is not a new transport protocol. It was created by two DARPA scientists in 1974 (first documented as RFC 675; the current version is standardized as RFC 9293).
It uses a different, connection-oriented, reliable approach to data transport that's slower than the connectionless and fast but unreliable UDP. With UDP, we don't know whether the packet has been delivered as it has no built-in feedback mechanism while with TCP, every dropped packet is retransmitted.
The diagram below shows the structure of a TCP packet and a UDP datagram side by side. For more information, see this TCP vs UDP comparison table by GeeksforGeeks:

Image source: The Network Encyclopedia
As you can see in the diagrams above, a TCP packet includes all the information necessary for performing the SYN/SYN-ACK/ACK handshake that establishes a reliable connection between the client and server. On the other hand, a UDP datagram only consists of a 64-bit header and the message.
The main advantage of UDP is its connectionless nature — as there's no established connection between the client and server, network packets can use different delivery routes. In this way, each packet can use the most optimal path that's available at that moment.
However, unlike TCP, UDP doesn't guarantee delivery, which is its main shortcoming. As it has no loss detection mechanism, if a datagram doesn't reach its destination, it's simply dropped. Plus, as packets are delivered independently of each other, they arrive at their destination out of order.
What Is QUIC Used For?
QUIC was created to replace TCP with a more flexible transport protocol with fewer performance issues, built-in security, and a faster adoption rate (we'll see this feature in detail in the Resistance to Protocol Ossification section below). It needs UDP as a lower-level transport protocol primarily because most devices only support TCP and UDP port numbers.
In addition, QUIC leverages UDP's:
- connectionless nature that makes it possible to move multiplexing down to the transport layer and removes TCP's head-of-line blocking issue (we'll see this in detail later)
- simplicity that allows QUIC to re-implement TCP's reliability and bandwidth management features in its own way
QUIC transport is a unique solution. While it's connectionless at the lower level thanks to the underlying UDP layer, it's connection-oriented at the higher level thanks to its re-implementation of TCP's connection establishment and loss detection features that guarantee delivery. In other words, QUIC merges the advantages of both types of network transport.
It has another important purpose as well — implementing an advanced level of security at the transport layer. QUIC integrates most features of the TLS 1.3 security protocol and makes them compatible with its own delivery mechanism. In the HTTP/3 stack, encryption is not optional but a built-in feature.
Here's a recap of how the three transport-layer protocols, TCP, UDP, and QUIC, compare to each other:
| TCP | UDP | QUIC | |
|---|---|---|---|
| Layer in the TCP/IP model | transport | transport | transport |
| Place in the TCP/IP model | on top of IPv4 or IPv6 | on top of IPv4 or IPv6 | on top of UDP |
| Connection type | connection-oriented | connectionless | connection-oriented |
| Order of delivery | in-order delivery | out-of-order delivery | out-of-order delivery between streams, in-order delivery within streams |
| Guarantee of delivery | guaranteed (lost packets are retransmitted) | no guarantee of delivery | guaranteed (lost packets are retransmitted) |
| Handshake mechanism | non-cryptographic handshake | no handshake | cryptographic handshake |
| Security | unencrypted | unencrypted | encrypted |
| Data identification | knows nothing about the data it transports | knows nothing about the data it transports | uses stream IDs to identify the independent streams it transports |
HTTP/1.1 vs HTTP/2 vs HTTP/3 Protocol Stacks: Main Differences
Now that we looked into the differences and similarities of the TCP vs UDP vs QUIC transport protocols, let's see the main differences between the three HTTP stacks.
As discussed above, H3 comes with a new underlying protocol stack that brings UDP and QUIC to the transport layer. However, there's another important change. As you can see in the diagram below, some of the roles and features of the application and transport layers also change:
Image credit: Robin Marx: H3 Protocol Stack; GitHub
The most important differences between the HTTP/3-QUIC-UDP stack and the TCP-based versions of HTTP communication are as follows:
- QUIC integrates most features of the TLS 1.3 security protocol, so encryption moves down from the application layer to the transport layer (we'll discuss this in the next section in detail).
- HTTP/3 doesn't multiplex the connection between different streams as this feature is performed by QUIC at the transport layer — transport-layer multiplexing removes the head-of-line blocking issue present in HTTP/2 (HTTP/1.1 doesn't have this issue because it opens multiple TCP connections and offers the option of pipelining instead of multiplexing, which turned out to have serious implementation flaws and was replaced with application-layer multiplexing in HTTP/2).
- The UDP layer is more lightweight than the TCP layer because the latter has much more functionalities. In the HTTP/3 stack, QUIC is responsible for connection establishment, congestion control, and loss detection, which are handled by TCP in the two previous stacks.
- The QUIC layer has many responsibilities: it reimplements TCP's features, integrates the TLS security protocol, and adds some new features, e.g. connection migration, to the transport layer.


Run A Free Page Speed Test
Test Your Website:
- Automated Recommendations
- Detailed Request Waterfall
- Web Vitals Assessment
7 Best Features of HTTP/3 and QUIC
The new features in HTTP/3 and QUIC can help make server connections faster, more secure, and more reliable.
Even though the features below are frequently referred to as the features of H3, most of them come from the QUIC layer. As mentioned above, HTTP/3 simply provides the application layer on top of these transport-layer features.
Note that the following section only includes a selection of the features of HTTP/3 and QUIC. For the full feature list, consult RFC 8999, 9000, 9001, and 9002 for QUIC and RFC 9114, 9204, and 9218 for HTTP/3.
The features discussed in the HTTP3 specifications, such as the QPACK header, are not new features per se; they only make HTTP2's application-layer functionality compatible with the underlying QUIC transport.
1. The QUIC Handshake
HTTP2 needs at least two round-trips between the client and server to execute the handshake process: one for the TCP handshake for connection establishment and at least one for the TLS handshake for authentication (depending on the TLS version).
As QUIC combines these two handshakes into one, HTTP3 only needs one round-trip to establish a secure connection between the client and server. The result is faster connection setup and lower latency.
QUIC integrates most features of TLS 1.3, the latest version of the Transport Layer Security protocol, which means that:
- The encryption of HTTP/3 messages is not optional like with HTTP/2 and HTTP/1.1, but mandatory. With HTTP/3, all messages are sent via an encrypted connection by default.
- TLS 1.3 introduces an improved cryptographic handshake that requires just one round-trip between the client and server as opposed to TLS 1.2's two round-trips for authentication — (see the difference between a TLS 1.2 and a TLS 1.3 handshake).
- QUIC integrates this with its own handshake for connection establishment, which replaces the TCP handshake.
- As HTTP/3 messages are encrypted at the transport level, more information is secured than before:
- In the HTTP/1.1 and HTTP/2 stacks, TLS runs in the application layer, so only the HTTP data is encrypted while the TCP headers are sent as plain text, which comes with some security risks.
- In the HTTP/3 stack, TLS runs in the transport layer (inside QUIC), so not only the HTTP message is encrypted but most of the QUIC packet header too (except some flags and the connection ID — see later in the article).
In short, HTTP/3 uses a more secure transport mechanism than the previous, TCP-based versions of HTTP.
Here is how the structure of the TLS 1.3 handshake compares to the QUIC handshake:
As you can see in the diagram below, QUIC keeps TLS 1.3's content layer that includes the cryptographic keys but replaces the record layer (responsible for fragmenting the data into smaller blocks/records to prepare it for transmission) with its own transport functionality:
Image source: RFC 9001
2. 0-RTT on Prior Connections
On pre-existing connections, QUIC leverages the 0-RTT feature of TLS 1.3.
0-RTT stands for zero round-trip time resumption, which is a new performance feature of the TLS protocol, introduced in version 1.3.
With 0-RTT resumption, the client can send an HTTP request in the first round-trip on prior connections because the cryptographic keys between the client and server have already been negotiated — data sent on the first flight is called early data.
The diagram below shows how the H2 and H3 stacks compare in terms of connection setup:
- If you use HTTP2 with TLS 1.2, the client can send the first HTTP request in the fourth round-trip.
- With HTTP2 and TLS 1.3, the first request for application data can be sent in the third or second (on prior connections) round-trip.
- With HTTP3 and QUIC, which includes TLS 1.3 by default, the first HTTP request is sent in the second or first (on prior connections) round-trip.

3. Head-of-Line Blocking Removal
As the HTTP/3 protocol stack has a different structure than HTTP/2, it removes HTTP/2's biggest performance problem: head-of-line (HoL) blocking. This issue happens when a packet is dropped on an HTTP/2 connection. Until the lost packet is retransmitted, the entire data transfer process stops and all the packets have to wait on the network, which leads to longer page load times.
In HTTP/3, head-of-line blocking removal is made possible by native multiplexing, one of QUIC's most important features.
HoL blocking terminology
To understand what head-of-line blocking is and why QUIC only has non-blocking byte streams, let's see the most important concepts related to this phenomenon:
Byte stream
A byte stream (or just stream) is a sequence of bytes (units of eight binary digits/bits) sent over a network. Bytes are transported as packets of different sizes — e.g. the minimum size of an IPv4 packet is 20 bytes while its maximum size is 65,535 bytes (an IP packet can carry a UDP datagram or a TCP segment). A byte stream is essentially the physical manifestation of a single resource (file) sent over the network.
Multiplexing
Multiplexing makes it possible to deliver multiple byte streams over one connection, which means that the browser can load multiple files on the same connection simultaneously.
While HTTP/1.1 doesn't support multiplexing (it opens a new TCP connection for each byte stream), HTTP/2 introduces application-layer multiplexing (it opens just one TCP connection and sends all the byte streams over it), which results in head-of-line blocking.
Head-of-line blocking
Head-of-line blocking is a performance issue caused by TCP's byte stream abstraction. TCP doesn't have any knowledge about the data it transports and sees everything as a single byte stream. So when a packet is dropped anywhere on the network, all the other packets on the multiplexed connection stop delivering and wait until the lost one is re-transmitted — even if they belong to a different byte stream.
As TCP uses in-order delivery, the lost packet blocks the entire delivery process at the head of the line. At a higher rate of packet loss, this can significantly harm site speed. Even though multiplexing was introduced as a performance optimization feature to HTTP/2, at a 2% packet loss, HTTP/1.1 connections are usually faster (see more in the HTTP/3 Explained GitBook by Daniel Stenberg).
Native multiplexing
In the HTTP/3 protocol stack, multiplexing is moved down to the transport layer — this is called native multiplexing. QUIC identifies each byte stream with a stream ID, so it doesn't see black boxes like TCP but has some knowledge about the data it delivers (it only sees the stream IDs, but still doesn't know what files it delivers).
How does QUIC remove head-of-line blocking?
QUIC runs on UDP, which uses out-of-order delivery, so each byte stream is transported independently over the network (by finding the most optimal route available). However, for reliability, QUIC still ensures the in-order delivery of packets within the same byte stream so that the data related to the same request arrives in a consistent way.
As QUIC identifies each byte stream and streams are delivered on independent routes, if a packet gets lost, the unaffected byte streams don't have to wait for its re-transmission. These resources can keep downloading without being blocked by the lost packet at the head of the line.
Here's a diagram of how QUIC's native multiplexing compares to HTTP2's application-layer multiplexing:
Image credit: Devopedia "QUIC." Version 5, (CC BY-SA 4.0)
As you can see in the diagram above, both HTTP/2 and QUIC open just one connection between the client and server, but QUIC transports the byte streams independently, on different delivery routes so that they don't block each other.
Even though QUIC eliminates the HoL blocking issue of HTTP/2, out-of-order delivery also has a downside: byte streams will not necessarily arrive in the same order they were sent in. For example, it can happen that the least important resource arrives first, and the web page can't start loading.
This additional head-of-line blocking can be mitigated by resource prioritization on HTTP clients (e.g. the browser downloads render-blocking resources first). With priority hints, you can also assign a relative priority to resources to help browsers prioritize your resources.
4. QPACK Field Compression
QPACK is a field compression format for HTTP3 that makes HTTP2's HPACK header compression format compatible with the QUIC protocol ('header' and 'field' are used synonymously; they refer to the metadata sent in the header or trailer of an HTTP message).
Field compression eliminates redundant metadata by assigning indexes to fields that are used multiple times during the connection. At a high level, HPACK and QPACK have the same functionality: both reduce the bandwidth required to transmit HTTP headers over the network. However, they use partly different mechanisms to address the different needs of the underlying transport protocols: TCP (HPACK) vs QUIC (QPACK).
How Does HPACK Work?
To reduce the size of the header, HPACK uses two indexing tables that assign indexes to fields:
- A static table, which:
- is read-only
- includes pre-defined fields that frequently occur in every HTTP message
- A dynamic table, which:
- is empty initially
- is built up over the course of the connection and updated incrementally with every request
- includes the per-message changes either literally or as a reference to a field that was sent previously
To perform the header compression, both the client and server run an encoder and decoder. The HPACK header is encoded by the sender and decoded by the receiver application. As HTTP/2 sends and receives messages in order, HPACK can safely use references in the dynamic tables as they'll always refer to a field that has already arrived.
Why Is QPACK Needed?
As opposed to HTTP2, HTTP3 cannot use the HPACK format which was created for TCP and assumes that byte streams arrive in order. If HTTP/3 used HPACK compression, it would result in additional head-of-line blocking because HPACK relies on references to previous fields.
However, with HTTP3, byte streams don't arrive in order, so it can happen that the dynamic table includes a reference to a message that hasn't arrived yet — which would make the stream wait for the referenced one.
To solve this issue, QPACK introduces two unidirectional stream types: encoder and decoder streams. In addition to the bidirectional byte streams that deliver the HTTP3 messages (including the compressed QPACK headers that also use indexes from the static and dynamic tables), the client and server can open encoder and decoder streams that deliver instructions to the other endpoint.
An encoder stream includes the encoder's instructions for the decoder while a decoder stream includes the decoder's instructions for the encoder. Each HTTP endpoint (client or server) can open one encoder and one decoder stream at most, however, they don't necessarily have to do so — for instance, if they don't want to use the dynamic table, they can avoid starting an encoder stream.
As opposed to the main bidirectional byte stream, the encoder and decoder streams are unidirectional, which means that they only deliver data in one direction without waiting for the response of the other endpoint. These are critical streams that stay open during the lifetime of the main connection and cannot be closed.
QPACK's Performance Trade-Off
While adding extra (albeit lightweight) unidirectional byte streams to the communication comes with a performance overhead, it also mitigates the additional head-of-line blocking issue between independent byte streams arising from field compression.
The QPACK specification gives a fairly high level of freedom to client and server implementations to decide individually which one is more important and to what extent: head-of-line blocking mitigation or a higher level of field compression.
