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.
See it on the board
The same traffic runs on two boards. The simulator measured both when this page was built.
| 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
| Number | Value |
|---|---|
| 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 end | 90 ms |
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.