Part 8 · 2 chapters · ~12 min

HTTP from 1.1 to 3

HTTP semantics (RFC 9110) separated from the wire, HTTP/1.1 keep-alive and pipelining, HTTP/2 framing, streams and HPACK, HTTP/3 over QUIC, server push and why it died, caching headers, compression, and where each version is terminated in real deployments.

16

Three wires, one meaning

code
curl -sI --http1.1 https://example.com | head -1     # HTTP/1.1 200
curl -sI --http2   https://example.com | head -1     # HTTP/2 200
curl -sI --http3   https://example.com | head -1     # HTTP/3 200 (curl built with HTTP/3 support)
HTTP/1.1, HTTP/2, HTTP/3
the same semantics over three generations of transport
HTTP/1.1text, one request at a time per connectionHTTP/2binary frames, multiplexed streams, HPACKHTTP/3over QUIC, independent streamssemanticsmethods, status, headers, caching: unchanged
swipe the figure sideways, or tap expand for full screen
1/4
HTTP/1.1
Text requests and responses, keep-alive connections, but one outstanding request per connection in practice. Browsers open about six connections per host to parallelise; domain sharding and bundling were workarounds.
one request at a time per connectionsix connections per host
17

Where versions are terminated

In most production systems: browsers speak HTTP/3 or HTTP/2 to the CDN edge; the edge speaks HTTP/2 or HTTP/1.1 to the load balancer; the load balancer often speaks HTTP/1.1 to application pods (or HTTP/2 for gRPC). Server push (HTTP/2) was removed from browsers because it rarely beat preload hints and caching; 103 Early Hints replaced its main use.