Head-of-line blocking

Head-of-line blocking holds later data behind earlier data that is missing. On a 90 ms path, one lost packet adds 180 ms to every stream on a TCP connection. On QUIC it adds 90 ms to the one stream that lost the packet.

Play a level

See it on the board

The same traffic runs on two boards. The simulator measured both when this page was built.

Board to show
HTTP/2Mobile usersAPI server1 vCPU · 1 GB
HTTP/2Mobile usersAPI server1 vCPU · 1 GB
HTTP/2 on 20 TCP connections: misses a goal
HTTP/3Mobile usersAPI server1 vCPU · 1 GB
HTTP/3Mobile usersAPI server1 vCPU · 1 GB
HTTP/3 on QUIC streams: meets the goals
See it on the board
Measure Goal HTTP/2 on 20 TCP connections HTTP/3 on QUIC streams
p99 latency under 320 ms 392 ms Fail 182 ms Pass
Error rate under 1% 0% Pass 0% Pass
Monthly cost 4 USD/mo 4 USD/mo

Key numbers

Protocol values from the protocol table and the mobile round trip from the network table. The mini board adds 2 percent loss.
NumberValue
Round trips to open HTTP/2 (TCP and TLS)2 RTT
Round trips to open HTTP/3 (QUIC)1 RTT
Mobile 4G round trip, slow end90 ms
Connections and streamsDrag or use arrow keys to change the protocol

HTTP/1.1 · connections: 6 · 30 files in 7 round trips, 630 ms

How it works

TCP delivers bytes in order. When one packet is lost, the receiver keeps all later bytes in a buffer until the sender repeats the lost packet. HTTP/2 puts many streams on one TCP connection, so a loss in one stream stops all the others too. The wait is two round trips: one to notice the loss and one to get the repeat.

In the mini board the path has a 90 ms round trip and loses 2 percent of packets. Twenty TCP connections give enough throughput, but each loss still holds all streams on its connection for 180 ms. The p99 is 392 ms against a limit of 320 ms. With HTTP/3 it is 182 ms.

HTTP/3 runs on QUIC. QUIC recovers loss for each stream on its own. One lost packet costs one round trip on one stream, and the other streams go on. A QUIC connection also opens in 1 round trip.

More TCP connections give more throughput, but they do not make the loss delay shorter. They also add setup cost. On a clean wired link the difference is small, because few packets are lost.

In the levels you choose the protocol for a lossy path and compare p99 and errors.