HTTP/1.1 required a dedicated TCP connection for every active request. Browsers hardcoded a limit (typically 6) on the number of concurrent connections per domain. This led to hacks like domain sharding.

Binary Framing

HTTP/2 introduced a binary framing layer. Instead of plain text, headers and payloads are split into binary frames. This allows multiple requests to be multiplexed over a single TCP connection simultaneously.

While HTTP/2 solved application-layer blocking, it suffered heavily from TCP Head-of-Line blocking on lossy networks, paving the way for HTTP/3.