<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/http-2-and-http-3-what-changed-and-why-it-matters-kxd7rny7x" -->

---
title: HTTP/2 and HTTP/3: what changed and why it matters
description: A deep-dive tutorial walks through the evolution from HTTP/1.1 through HTTP/2 to HTTP/3, explaining binary framing, multiplexing, HPACK and QPACK header...
canonical: https://daily.dev/posts/http-2-and-http-3-what-changed-and-why-it-matters-kxd7rny7x
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: HTTP/2 and HTTP/3: what changed and why it matters | daily.dev
og:description: A deep-dive tutorial walks through the evolution from HTTP/1.1 through HTTP/2 to HTTP/3, explaining binary framing, multiplexing, HPACK and QPACK header...
og:url: https://daily.dev/posts/http-2-and-http-3-what-changed-and-why-it-matters-kxd7rny7x
og:image: https://api.daily.dev/og/posts/KxD7Rny7x.png
og:image:alt: HTTP/2 and HTTP/3: what changed and why it matters
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# HTTP/2 and HTTP/3: what changed and why it matters

**[Flavio Copes](https://daily.dev/sources/flaviocopes)** · 20 min read · 1 upvotes · 0 comments

## Summary

A deep-dive tutorial walks through the evolution from HTTP/1.1 through HTTP/2 to HTTP/3, explaining binary framing, multiplexing, HPACK and QPACK header compression, TCP head-of-line blocking, and how QUIC over UDP solves it. It covers connection negotiation via ALPN and Alt-Svc, 0-RTT setup, connection migration, why HTTP/2 server push was deprecated, and practical guidance for frontend and backend developers: stop domain sharding, avoid unnecessary bundling, keep caching strong, and let CDNs like Cloudflare handle protocol negotiation. Includes curl and DevTools commands for inspecting which protocol version is actually in use, plus a migration checklist and common misconceptions.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://flaviocopes.com/http2-http3>

## Questions this post answers

### Why did Chrome disable HTTP/2 server push?

Chrome disabled HTTP/2 server push by default starting in version 106 because deployments showed little use and no clear net performance gain, and unnecessary pushes could waste bandwidth by sending resources the browser already had cached. Chrome recommends using preload and 103 Early Hints as more practical alternatives instead of building new optimizations around server push.

_Developers deciding how to prioritize resource loading can track protocol-level guidance like this on daily.dev._

### Does HTTP/3 completely eliminate head-of-line blocking?

No, HTTP/3 only removes head-of-line blocking between independent QUIC streams, not within a single stream. Bytes inside one QUIC stream stay ordered, so a lost packet still delays that stream's own data, and congestion can still affect the entire connection. This differs from HTTP/2 over TCP, where one lost packet can stall every stream on the connection.

_Engineers debugging network stalls can follow transport-level nuances like this on daily.dev._

### How can I check whether my curl request actually used HTTP/3 instead of falling back to HTTP/2?

Use the --http3-only flag with curl instead of --http3, since --http3 will silently fall back to HTTP/2 if QUIC fails, making a successful request misleading. Run curl --http3-only -I https://example.com/ to force the test to fail rather than fall back, confirming whether QUIC actually worked. Also check curl --version for HTTP3 support since many system builds lack it.

_Developers verifying protocol negotiation can reference practical debugging steps like this on daily.dev._

## Similar posts on daily.dev

- [EP200: HTTP/2 over TCP vs HTTP/3 over QUIC](https://daily.dev/posts/ep200-http-2-over-tcp-vs-http-3-over-quic-o83jfjirb) · ByteByteGo · 10 upvotes · 0 comments
- [HTTP/3 explained](https://daily.dev/posts/http-3-explained-8t6mzys5z) · Hacker News · 1 upvotes · 0 comments
- [EP194: Evolution of HTTP](https://daily.dev/posts/ep194-evolution-of-http-rk0k8khxl) · ByteByteGo · 11 upvotes · 0 comments
- [Workshop Basel day two](https://daily.dev/posts/workshop-basel-day-two-txwbastce) · daniel.haxx.se · 0 upvotes · 0 comments

---

Tags: [#webdev](https://daily.dev/tags/webdev), [#networking](https://daily.dev/tags/networking)

[View this post on daily.dev](https://daily.dev/posts/http-2-and-http-3-what-changed-and-why-it-matters-kxd7rny7x)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"HTTP/2 and HTTP/3: what changed and why it matters","url":"https://daily.dev/posts/http-2-and-http-3-what-changed-and-why-it-matters-kxd7rny7x","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/http-2-and-http-3-what-changed-and-why-it-matters-kxd7rny7x"},"datePublished":"2026-08-15T05:53:06.851Z","dateModified":"2026-09-14T07:06:43.318Z","description":"A deep-dive tutorial walks through the evolution from HTTP/1.1 through HTTP/2 to HTTP/3, explaining binary framing, multiplexing, HPACK and QPACK header...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/cbd44a7e3fb490cfa52a883b534f2a42?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/cbd44a7e3fb490cfa52a883b534f2a42?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Flavio Copes","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Flavio Copes","logo":"https://media.daily.dev/image/upload/t_logo,f_auto/v1/logos/1f2dbd275797411bbd37bfdaaf0951a9","url":"https://daily.dev/sources/flaviocopes"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/http-2-and-http-3-what-changed-and-why-it-matters-kxd7rny7x","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":1},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"webdev,networking","timeRequired":"PT20M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Flavio Copes","item":"https://daily.dev/sources/flaviocopes"},{"@type":"ListItem","position":3,"name":"HTTP/2 and HTTP/3: what changed and why it matters"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/http-2-and-http-3-what-changed-and-why-it-matters-kxd7rny7x#faq","mainEntity":[{"@type":"Question","name":"Why did Chrome disable HTTP/2 server push?","acceptedAnswer":{"@type":"Answer","text":"Chrome disabled HTTP/2 server push by default starting in version 106 because deployments showed little use and no clear net performance gain, and unnecessary pushes could waste bandwidth by sending resources the browser already had cached. Chrome recommends using preload and 103 Early Hints as more practical alternatives instead of building new optimizations around server push. Developers deciding how to prioritize resource loading can track protocol-level guidance like this on daily.dev."}},{"@type":"Question","name":"Does HTTP/3 completely eliminate head-of-line blocking?","acceptedAnswer":{"@type":"Answer","text":"No, HTTP/3 only removes head-of-line blocking between independent QUIC streams, not within a single stream. Bytes inside one QUIC stream stay ordered, so a lost packet still delays that stream's own data, and congestion can still affect the entire connection. This differs from HTTP/2 over TCP, where one lost packet can stall every stream on the connection. Engineers debugging network stalls can follow transport-level nuances like this on daily.dev."}},{"@type":"Question","name":"How can I check whether my curl request actually used HTTP/3 instead of falling back to HTTP/2?","acceptedAnswer":{"@type":"Answer","text":"Use the --http3-only flag with curl instead of --http3, since --http3 will silently fall back to HTTP/2 if QUIC fails, making a successful request misleading. Run curl --http3-only -I https://example.com/ to force the test to fail rather than fall back, confirming whether QUIC actually worked. Also check curl --version for HTTP3 support since many system builds lack it. Developers verifying protocol negotiation can reference practical debugging steps like this on daily.dev."}}]}
```

