HTTP/2 and HTTP/3

HTTP/1.1 was the web's protocol for two decades. HTTP/2 (2015) and HTTP/3 (standardized 2022) brought significant changes — multiplexing, header compression, QUIC. The performance gains are real for typical web traffic.

This page covers what changed and the practical impact.

HTTP/1.1 limitations

The problems HTTP/2 was designed to solve:

Head-of-line blocking

HTTP/1.1 sends requests one at a time per connection. A slow request blocks subsequent ones.

Browser workaround: open 6 connections per origin in parallel. Better than 1, but each connection has its own TCP overhead.

Header overhead

Headers are repeated on every request. For APIs sending small JSON responses, headers dominate.

Plain text

Easy to debug; less efficient on the wire.

HTTP/2

The major changes:

Single connection, multiplexing

One TCP connection per origin. Multiple requests/responses in parallel over that connection.

```

Connection 1

├── Stream 1: GET /index.html

├── Stream 3: GET /style.css

├── Stream 5: GET /app.js

└── Stream 7: GET /image.png

```

Each stream is independent. Slow image doesn't block fast JS.

Header compression (HPACK)

Common headers are sent once and referenced by index. Big savings on header-heavy traffic.

Binary framing

The protocol is binary instead of text. More compact; less ambiguous.

Server push

Server can push resources the client will need. Largely deprecated — performance benefits didn't materialize; adds complexity.

Stream priority

Streams have priorities; servers can serve high-priority first. Helps render-blocking resources.

Limitations

The remaining problem: HTTP/2 multiplexes over one TCP connection. If TCP needs to retransmit a packet, all streams pause until retransmission. "TCP head-of-line blocking" — solved by HTTP/3.

HTTP/3 / QUIC

QUIC is a new transport protocol (UDP-based) that replaces TCP for HTTP/3.

Streams without TCP HOL blocking

QUIC has its own stream concept independent of underlying packets. A lost packet only affects its stream, not all of them.

Built-in encryption

TLS 1.3 is integrated; the handshake is faster than TLS over TCP.

Connection migration

A QUIC connection is identified by a connection ID, not by IP/port. Mobile clients switching networks (WiFi → cellular) keep the connection alive.

0-RTT resumption

Repeat connections can include data on the first packet, eliminating the handshake round-trip.

Practical impact

For typical web pages

HTTP/2 vs. HTTP/1.1: noticeable improvement for pages with many resources. Most sites use HTTP/2 today.

HTTP/3 vs. HTTP/2: marginal improvement for most pages. More benefit on lossy networks (mobile).

For APIs

HTTP/1.1 vs. HTTP/2: HTTP/2 wins if you make many parallel requests. For sequential request/response patterns, less benefit.

For HTTP/2 APIs, gRPC builds on HTTP/2 and benefits from multiplexing.

For real-time / streaming

HTTP/3's stream-isolation matters more. SSE, WebSocket-over-HTTP/3, and streaming use cases benefit.

For mobile / lossy networks

HTTP/3's resilience to packet loss is a real win. Mobile users on weak signals see better performance.

Adoption considerations

Server support

- Web servers: Nginx, Apache, Caddy support HTTP/2 well; HTTP/3 is more recent

- Application servers: depends; many add HTTP/2 via reverse proxy

- CDNs: CloudFront, Cloudflare, Fastly all support both

Client support

- Modern browsers: HTTP/2 universal; HTTP/3 widespread

- HTTP libraries: vary; check specific library

TLS requirement

HTTP/2 in browsers requires TLS. Plain HTTP/2 (no TLS) is allowed by spec but browsers don't implement it. So HTTPS is implicit for HTTP/2 web traffic.

HTTP/3 is always encrypted (TLS 1.3 baked in).

Operational considerations

- Debugging is harder: binary protocol, encrypted, harder to inspect

- Tooling exists (Wireshark with TLS keys, browser DevTools)

- Monitoring needs to be HTTP/2-aware for stream-level metrics

When old HTTP/1.1 still wins

- Internal services where simplicity wins

- Debugging with curl or telnet

- Specific tooling that doesn't support HTTP/2

For external-facing traffic, HTTP/2 is the default; HTTP/3 is increasing adoption. For internal traffic, HTTP/1.1 is fine.

Common failure patterns

- **Treating HTTP/2 as drop-in compatibility.** Mostly is, but server push and other features need explicit handling.

- **Server push enthusiasm.** Largely deprecated; don't build around it.

- **Single big stream blocking many small ones.** Stream priority helps but isn't always implemented well.

- **HTTP/3 without testing on lossy networks.** The benefits are most visible there.

- **Misconfiguring TLS for HTTP/2.** ALPN must offer h2.

Further Reading

- [TcpIpFundamentals](TcpIpFundamentals) — Below HTTP

- [Web Services and APIs Hub](WebServicesAndApisHub) — Application protocols

- [CdnArchitecture](CdnArchitecture) — CDNs handle HTTP/2 and HTTP/3

- [LoadBalancingStrategies](LoadBalancingStrategies) — Load balancers and HTTP/2

- [Networking Hub](NetworkingHub) — Cluster index