Skip to content

HTTP/2 multiplexes requests. Why can one lost packet stall them all?

The Connection Is More Than an IP · Part 5 of 6 · 6 min read

Read the worked explanation ↓

Interview question. A news application loads dozens of images and JSON responses over one HTTP/2 connection. During poor mobile reception, unrelated responses sometimes stall together. A developer argues that HTTP/2 multiplexing eliminated head-of-line blocking, so the cause must be slow backend handlers. Explain what each HTTP version changes and why HTTP/3 uses QUIC over UDP.

The developer has the right idea at the wrong layer. HTTP/2 allows multiple logical streams to share one connection. A slow application response on stream A does not ordinarily prevent the HTTP/2 framing layer from carrying data for stream B. That solves an important HTTP/1.1 limitation. But the usual HTTP/2 deployment rides over one TCP byte stream. TCP presents received bytes to the application in order. A missing TCP segment can therefore block delivery of later bytes that contain data for multiple HTTP/2 streams.

The word head-of-line hides at least two different phenomena. In HTTP/1.1, requests and responses on a connection are constrained by serial response ordering unless additional parallel connections or other strategies are used. HTTP/2 interleaves frames for independent streams, avoiding that HTTP application-layer serialization. Underneath, TCP still maintains ordered byte delivery for the whole connection. When the transport cannot deliver the next contiguous bytes, HTTP/2 cannot parse and dispatch later frames on that connection, even if they belong to a completely different logical request.

Three panels contrast HTTP/1.1 serial response ordering, HTTP/2 multiplexing over one ordered TCP stream, and QUIC stream-level recovery in HTTP/3.
Three panels contrast HTTP/1.1 serial response ordering, HTTP/2 multiplexing over one ordered TCP stream, and QUIC stream-level recovery in HTTP/3.
Think first

An image-heavy shopping app sees high p99 only on 2-percent packet-loss networks. The backend reports unchanged processing latency. Design a protocol comparison between HTTP/2 and HTTP/3 and explain which evidence would support transport-level head-of-line blocking.

Take a few minutes to form an approach, then compare it with the worked explanation.

Reveal the worked explanation

One lost packet, several logical streams

Imagine response A is sending a photograph while response B sends a small stock quote. Frames for A and B are interleaved into the TCP byte sequence. A network segment containing bytes from A is lost, while later segments containing B arrive. The operating system may buffer later bytes, but it cannot hand them to the HTTP/2 parser as a contiguous stream before recovery fills the gap. Stream B is independent in the HTTP/2 model, yet it waits behind missing bytes in the shared TCP model.

Loss recovery timing depends on RTT, acknowledgment behavior and the deployed TCP stack. It may be quick, and it need not imply a retransmission timeout every time. But the important coupling is real. The network impairment delays multiple streams because TCP orders the entire byte sequence, not each HTTP/2 stream separately.

HTTP/3 places HTTP streams onto separate QUIC streams. QUIC runs over UDP and implements its own reliable stream delivery, congestion control, loss detection and encryption integration. A missing packet carrying stream A data does not impose a transport-level ordered-byte gap on stream B. QUIC can deliver the complete data it has for stream B without waiting for stream A's lost bytes, assuming B's own required data has arrived.

That is a specific improvement, not a promise of zero interference. Streams still share a connection's congestion controller, path capacity, connection-level flow control and often the same server resources. If one lost packet causes the congestion controller to slow the whole connection, B's future delivery rate may also be affected. If a dynamic header block depends on unavailable QPACK state, header processing can still wait. QUIC removes TCP's cross-stream ordered-delivery blocking rather than every kind of shared bottleneck.

The upgrade is not an unconditional win

A mobile application might benefit from HTTP/3 over a lossy path, but actual results depend on implementation, packet loss pattern, radio behavior, CPU, middleboxes and cache design. Modern HTTP/2 stacks can perform very well on stable paths. Some enterprise networks restrict UDP, and a fallback to HTTP/2 over TCP remains operationally important. A team that enables HTTP/3 without observing negotiation and fallback may misread a rollout as successful because requests still work through the older protocol.

Clients can learn that an origin supports HTTP/3 through mechanisms such as an Alt-Svc advertisement or DNS HTTPS records, and negotiate h3 when making the appropriate secure transport connection. The site does not force every client to speak HTTP/3 the instant a server enables it. Cache state, client support, route reachability and policy influence what actually gets used. An origin advertising h3 must still have a functioning endpoint and valid origin authentication.

HTTP/2 is not the same thing as opening one TCP connection per object. It normally uses a shared connection per appropriate origin, reducing socket and handshake overhead. HTTP/1.1 browsers historically used multiple parallel connections to work around response serialization. HTTP/3 also multiplexes, but over QUIC streams. The relevant tradeoff is not simply counting TCP sockets, because connection establishment, flow control and concurrency limits differ.

An interview diagnosis

I would first compare client timings by negotiated protocol (http/1.1, h2, h3), network type, packet loss, RTT and whether requests share one connection. The key question is whether unrelated stream completion times become correlated with loss on a common transport. I would capture frame and packet evidence where permitted, without pretending an encrypted packet trace always exposes HTTP stream mapping. Server-side spans alone cannot reveal all the time clients spend waiting for ordered bytes.

A controlled experiment could route a small traffic slice through HTTP/2 and HTTP/3 while keeping endpoint placement and workload comparable. Track p50 and p99, request failures, radio bytes, CPU, handshake cost, protocol negotiation rates and fallback. If the gain appears only on lossy paths, that is useful evidence, not a failed rollout. If the bottleneck is a saturated database or shared origin queue, changing HTTP transports will not fix it.

The durable mental model is layered. HTTP/2 removes much of HTTP/1.1's request-level blocking, but its frames are carried by TCP's single ordered byte stream. HTTP/3 uses QUIC to give streams independent ordered delivery. Understanding exactly which boundary moved helps avoid both mistakes: dismissing network loss because HTTP/2 multiplexes, and assuming QUIC makes a congested connection magically independent for every request.

Go deeper

RFC 9113 describes HTTP/2 frames and streams, while RFC 9114 maps each HTTP/3 request to a client-initiated bidirectional QUIC stream. RFC 9000 specifies QUIC's reliable streams and shared congestion control. HTTP/3 header compression uses QPACK, designed to limit head-of-line problems but still involving blocked-stream rules when dynamic references are missing. HTTP/3 cannot eliminate application dependencies, shared server queues or loss of packets needed by the same QUIC stream. ALPN and Alt-Svc behavior is deployment and client dependent, not evidence that every request used the advertised protocol.

Check your reasoning

  • Identify HTTP/1.1 response serialization limits.
  • Explain multiplexed HTTP/2 streams over ordered TCP bytes.
  • Describe independent QUIC stream delivery and loss recovery.
  • Acknowledge shared congestion and header compression dependencies.
  • Plan representative negotiated-protocol and lossy-path measurements.

Common mistake: Multiplexing in HTTP/2 means one lost TCP segment cannot delay a different HTTP stream.

Unrelated HTTP/2 responses stall together on lossy mobile paths. Which investigation follows the transport-layer mechanism?

Read the answer explanation

Investigate TCP loss and correlated stream timing, compare HTTP/3 carefully — HTTP/2 removes HTTP-layer serialization but shares TCP ordered byte delivery.

Apply it elsewhere

A gRPC client multiplexes many unary calls over one HTTP/2 connection and experiences correlated stalls. Evaluate when opening more connections is a reasonable temporary mitigation and when it merely adds resource cost or hides a downstream bottleneck.

Compare your approach

Locate application versus transport head-of-line blocking, explain TCP ordered bytes, compare QUIC stream-level delivery, acknowledge shared congestion, and design a representative protocol rollout with fallback.

One more constraint

If QUIC loses a packet from stream A, can its shared connection congestion controller still affect future progress on stream B even when stream B has no byte gap?

Quick revision

HTTP/1.1 can serialize responses on a connection. HTTP/2 multiplexes independent HTTP streams but usually runs over one ordered TCP byte stream, so a missing TCP segment can delay unrelated streams. HTTP/3 maps requests onto independent QUIC streams, avoiding cross-stream transport-level byte gaps. QUIC streams still share congestion, connection flow control and server capacity. Measure negotiated protocols, packet loss, client p99 and fallback before assuming HTTP/3 solves the incident.

References