Home / Software y Cloud / HTTP/3: the connection that does not wait in line

HTTP/3: the connection that does not wait in line

For decades, a web connection leaned on an inseparable pair: TCP to open a reliable channel and HTTP to request and deliver resources. That scheme worked well until the web stopped being a collection of simple pages. Today, a single screen loads dozens of files in parallel, and the old pattern began to show its limits. The answer is called HTTP/3 and its key piece, the QUIC protocol.

This article explains why HTTP/3 is not the typical “slightly faster new version”, but a change of architecture that touches the transport layer (the layer where data travels), the encryption, and even the way a connection is identified. We will look at the problem it solves, how it solves it, and what lies beneath.

The invisible bottleneck: head-of-line blocking

To understand HTTP/3 you have to start with the flaw its predecessor carried. In HTTP/1.1, each request usually travelled over one connection and, if a resource was slow, the ones behind had to wait. The stopgap solution was to open several parallel connections, but each paid the cost of negotiating TCP and TLS (the encryption protocol), and browsers limited the number.

HTTP/2 attacked the problem by multiplexing many requests onto a single connection: several responses shared the same wire. Then a subtle enemy appeared called head-of-line blocking: if one packet was lost, TCP, which guarantees order, halted the entire flow until it resended it. Even if the other responses were ready, they had to wait for the lagging packet. A single failure delayed the whole page.

That behaviour is inherent to TCP, which was designed in the 1970s to deliver bytes in order, not to multiplex independent streams. The real fix was not patching the transport further, but replacing it.

QUIC: TCP and TLS in one step, over UDP

The core idea of QUIC is elegant: instead of keeping reliability and ordering in the transport layer (TCP) and encryption in another layer (TLS), QUIC does both by itself and runs directly over UDP, the connectionless protocol that just sends datagrams without guarantees.

The fact that it sounds like UDP does not mean it is “less reliable”: QUIC rebuilds on its own the ordered delivery and flow control that TCP used to do, but does so inside QUIC itself, where it can actually multiplex independent streams. If a packet is lost, only the stream it belonged to stops to retransmit; the rest keep moving. Head-of-line blocking disappears at the transport level.

Moreover, QUIC integrates encryption into the very connection negotiation. The HTTP/3 version is always encrypted end to end, and combines in a single handshake what used to require two round trips (one for TCP and one for TLS 1.3). The result is a connection that becomes ready in fewer network trips.

A lesser-known advantage is connection migration. TCP identifies a connection by the (IP, port) pair; if your phone switches from Wi-Fi to mobile data, that connection breaks and must be set up again. QUIC replaces that with a Connection ID, an identifier that does not change even when the IP address changes, so the connection survives the network switch without restarting.

0-RTT: asking before the handshake

Perhaps the most visible advantage is the 0-RTT resumption (“zero round-trip time”, zero round trips). Each round trip between your browser and the server costs time, especially on mobile networks. When a client has already talked to a server before, QUIC keeps the connection parameters and allows it to send data securely on the very first request, without waiting to complete the negotiation.

That noticeably reduces latency (the delay between asking and receiving), mostly on the first loads, which is exactly where slowness is felt most. It has its risk: because the data goes out before confirming the connection is completely new, 0-RTT resumptions are not idempotent by default and can open the door to replay attacks if not designed carefully. That is why they are used only for requests that are safe to repeat.

What a QUIC packet contains

The technical details confirm we are dealing with a different way of thinking. Each QUIC packet is structured in two layers of headers:

Long or short header
  ├── Flags (packet type, version)
  ├── Connection ID (connection identity)
  └── Packet number (for reordering and encryption)

Frame payload
  ├── Frame type (STREAM, ACK, PING...)
  └── Stream ID + that flow's data

The packet number is a delicate piece: it is encrypted because it helps distinguish old replayed packets (potentially malicious) from genuinely new ones. The streams carry identifiers that allow multiplexing hundreds of flows into a single packet, and flow control works within each stream, not over the whole block as in TCP.

The code uses a notable cryptographic quirk: packet numbers are encrypted with the same connection secret, which forces ordered processing and adds a layer that makes it harder for a third party to inject fake packets.

Adoption and real-world status

HTTP/3 is far from being a laboratory promise. The main browsers (Chrome, Firefox, Safari and Edge) have supported it for years, and the big services —Google, Cloudflare, Meta, Netflix— serve a significant share of their traffic over QUIC. CDNs (content delivery networks) broadly enabled support at their edge starting in 2021.

That said, let us be precise: most web traffic is negotiated over TCP/TLS first and “upgrades” to HTTP/3 when both ends support it, thanks to the Alt-Svc header. The server thus announces it also understands HTTP/3 without breaking older clients. It is an example of careful migration in a system where compatibility is sacred.

The jump from HTTP to HTTP/3 is not just another number on the version list. It is the result of twelve years of work to keep the web from queuing when a packet fails, and to bring encryption a step earlier in the journey. The next time a page loads at once even though someone else in the house is streaming video, you will know QUIC deserves part of the credit.