Head-of-Line Blocking: HTTP/1.1 vs HTTP/2 vs HTTP/3

Learn what head-of-line blocking is, how it affects web performance across HTTP versions, and why HTTP/3 is the first version to fully eliminate it.

Core Differences

Detailed Explanation

Head-of-Line Blocking Across HTTP Versions

Head-of-line (HOL) blocking is one of the most important performance problems in web protocols. It occurs when a single slow or lost piece of data blocks all other data behind it in a queue.

HTTP/1.1: Double HOL Blocking

HTTP/1.1 suffers from HOL blocking at two levels:

HTTP-level HOL blocking: With persistent connections, only one request can be in-flight at a time per connection. If the server is slow to respond to one request, all subsequent requests on that connection must wait.

TCP-level HOL blocking: Even with HTTP pipelining (rarely used in practice), TCP delivers all bytes in strict order. A lost packet at the TCP level stalls all data until retransmitted.

Browsers work around this by opening 6-8 parallel TCP connections per origin, but this wastes resources and does not fully solve the problem.

HTTP/2: Half Solved

HTTP/2 introduced multiplexing, which completely eliminates HTTP-level HOL blocking. Multiple requests and responses are interleaved as frames on a single connection.

However, HTTP/2 still runs on TCP. If a single TCP packet is lost, all streams are blocked until that packet is retransmitted — even streams whose data was not in the lost packet. On networks with 1-2% packet loss, this TCP-level HOL blocking can negate much of HTTP/2's multiplexing benefit.

HTTP/3: Fully Eliminated

HTTP/3 runs on QUIC, where each stream has independent delivery. A lost packet on Stream 1 only blocks Stream 1. Streams 2, 3, and 4 continue receiving data immediately. This is the first HTTP version to completely solve HOL blocking at every layer.

Packet loss scenario (Stream A loses a packet):

HTTP/2 over TCP:  Stream A: [blocked]  Stream B: [blocked]  Stream C: [blocked]
HTTP/3 over QUIC: Stream A: [blocked]  Stream B: [flowing]  Stream C: [flowing]

Use Case

Understanding HOL blocking is essential when benchmarking HTTP/2 vs HTTP/3 on lossy networks. If your users are on mobile or in regions with unreliable connectivity, HTTP/3 can provide dramatic improvements precisely because it eliminates this bottleneck. This knowledge also helps explain why HTTP/2 sometimes performs worse than HTTP/1.1 under high packet loss.

Try It — HTTP/2 vs HTTP/3 Comparison

Open full tool