Unit 4 · Networks · Lesson 6 of 10
Head-of-line blocking, QUIC and HTTP/3
Step 1: Learn the ideas
- Head-of-line blocking at the HTTP, transport and queue level
- QUIC streams and per-stream ordering
- Combined transport and TLS 1.3 handshake, and 0-RTT
- Connection IDs and connection migration
- Loss detection with monotonically increasing packet numbers
- HTTP/3 and QPACK
- User-space transport costs and middlebox ossification
Why it matters
"Why does HTTP/3 exist?" tests whether you understand layering rather than version numbers. The answer also shows where the network/application boundary sits and what it costs to move transport logic out of the kernel.
Core ideas
Blocking at each layer. In HTTP/1.1 a connection carries one response at a time, so a slow response delays the next one; pipelining did not solve this because responses must still return in request order. HTTP/2 multiplexes streams over one TCP connection, fixing the HTTP-level problem but exposing TCP's: TCP delivers a single ordered byte stream, so a lost segment holds back data for every stream until it is retransmitted, including data that has already arrived. The pattern recurs elsewhere: one slow item at the head of a shared queue delays everything behind it.
What QUIC changes. QUIC runs over UDP and provides many streams with ordering only within each stream, so a loss on one stream does not block the others. Packet numbers are never reused, so a retransmission travels in a new packet and RTT samples are unambiguous. TLS 1.3 is built in: a new connection usually needs one round trip before application data, and resumption allows 0-RTT with the same replay caveats as TLS. Nearly all header fields are encrypted, which limits middlebox interference and keeps the protocol evolvable. Connections are identified by connection IDs rather than the address four-tuple, so a client can migrate between networks; a load balancer that routes only by addresses breaks migration, so deployments either route by connection ID or tell clients not to migrate.
HTTP/3. HTTP semantics mapped onto QUIC streams, with QPACK header compression designed to avoid reintroducing blocking across streams.
The boundary moves. With TCP, the kernel owns reliability and congestion control and the application sees one byte stream. A QUIC stack usually ships as a library inside the application, so it can evolve with each release and expose stream-level events, but the application now owns pacing, loss recovery bugs and their CPU cost.
Costs. User-space stacks spend more CPU per byte than mature kernel TCP with hardware offloads, some networks block or throttle UDP (so clients keep a TCP fallback), and operators lose visibility that plaintext TCP headers used to give.
Common misconceptions
- "QUIC eliminates head-of-line blocking." It removes blocking across streams caused by transport loss; data within one stream is still delivered in order.
- "QUIC is unreliable because it uses UDP." UDP is only the substrate; QUIC implements reliability, flow control and congestion control.
- "HTTP/3 is always faster." Gains concentrate on lossy, high-latency or mobile paths and on connection setup; on clean networks the difference can be small and CPU cost higher.
- "QUIC does not need congestion control." It needs it just as TCP does, and implementations use the same families (Reno-like, CUBIC, BBR).
How to approach it
Explain blocking layer by layer with one concrete lost packet, then show what each protocol change fixes. For depth, read the stream and migration sections of RFC 9000 and the design discussion of the QUIC SIGCOMM paper, keeping its measurements tied to that deployment.
Suggested order
- 1Read HTTP/3 explained for the motivation and an overview of QUIC.
- 2Read RFC 9114 Section 1.1 (Prior Versions of HTTP) for a concise statement of the head-of-line problem HTTP/3 addresses.
- 3Read RFC 9000 Section 2 (Streams) and Section 9 (Connection Migration), and Section 5.2.3 on what simple load balancers must do.
- 4Read the QUIC SIGCOMM 2017 paper, separating design arguments from measurements of that deployment.
- 5Repeat the HTTPS packet-trace project over HTTP/3 if your client supports it.
Step 2: Check off what you can do
Tap each one you can genuinely do or explain. Each earns 10 XP.
Step 3: Go deeper
HTTP/3 explainedStart here
haxx.se (author site)Readable overview of why HTTP/3 and QUIC exist and how they differ from HTTP/2 over TCP.
Open(opens in a new tab)Link responded, 5 Oct 2026RFC 9000: QUIC: A UDP-Based Multiplexed and Secure TransportStart here
IETF (RFC Editor)Section: Section 2: Streams
Authoritative description of QUIC streams; continue with Section 9 on connection migration.
Open(opens in a new tab)Not checkable automatically, 5 Oct 2026RFC 9114: HTTP/3
IETF (RFC Editor)Section: Section 1.1: Prior Versions of HTTP
Short statement of the head-of-line blocking problem of HTTP/2 over TCP.
Open(opens in a new tab)Not checkable automatically, 5 Oct 2026The QUIC Transport Protocol: Design and Internet-Scale Deployment
Google ResearchDesign rationale and deployment experience; read the measurements as evidence from one deployment and version.
Open(opens in a new tab)Link responded, 5 Oct 2026
Step 4: Practice
Repeat the HTTPS packet-trace project over HTTP/3 if your curl build or browser supports it, decrypting with a TLS key log file, and identify the QUIC Initial and Handshake packets. Then add 1 to 2 percent random loss with tc netem on a test machine and fetch the same resource over HTTP/2 and HTTP/3 several times each; report medians and spread rather than a single run.
- Capture and annotate one HTTPS request end to end (DNS, TCP, TLS 1.3, HTTP)Open(opens in a new tab)Not attemptedHands-on project (Wireshark User's Guide as reference)
Record attempts on each problem’s page (+15 XP, +10 more when solved on your own).
Step 5: Test yourself
Answer each one out loud or on paper before you finish the lesson.
- Question 1With HTTP/2 over TCP, a packet carrying part of stream 5 is lost. What happens to stream 7?
- Question 2Why can QUIC measure RTT unambiguously after a retransmission?
- Question 3What does a QUIC connection ID allow that a TCP four-tuple does not?
- Question 4Why do HTTP/3 deployments keep a TCP fallback?
- Question 5Is data within a single QUIC stream ever delivered out of order to the application?
You’re done when you can
- Explain head-of-line blocking at three layers with one example each, in under three minutes.
- Explain QUIC connection migration and why it complicates load balancing.
- Name two situations where HTTP/3 is unlikely to beat HTTP/2, with reasons.


