Your Website Is on HTTP/2, but TTFB Is Still High
You open the page, the loading spinner spins, and after two seconds the content appears. You open the browser console, check the protocol, and see h2 written. So where's the problem? You think HTTP/2 means speed, but the reality is that HTTP/2 has only gone halfway.
HTTP/3 is that second half. But not for everyone. The difference between these two protocols becomes noticeable under specific conditions, and if you don't know those conditions, you'll pay the migration cost and see no results. This article clarifies exactly that: where HTTP/3 wins, where it makes no difference, and how to enable it on your server.
How Multiplexing Works in HTTP/2 and Where It Breaks
HTTP/1.1 opened a separate TCP connection for each request. Browsers had to create 6 parallel connections, and each connection transferred one file at a time. HTTP/2 solved this with multiplexing: a single TCP connection with multiple simultaneous streams. Picture this: one large pipe carrying several small packets through it at the same time.
This solution has a breaking point. TCP guarantees that packets arrive in order. If packet number 3 is lost, packets 4, 5, and 6 that have already arrived stay in the buffer until packet 3 is retransmitted. Now imagine that in the same pipe, the stream for your CSS and the stream for your hero image are both stuck behind the lost packet. That's head-of-line blocking, and it's exactly what makes HTTP/2 slow on unstable networks.
Important note: on stable networks with near-zero packet loss, this rarely happens. In a data center or on high-quality urban fiber, HTTP/2 and HTTP/3 are nearly the same speed. The problem starts when a user connects from mobile with weak Wi-Fi or a fluctuating cellular network.
Here's Where They Go Wrong: Testing on a Stable Network
A developer enables HTTP/3 on the server, tests from a laptop connected to office fiber, and sees "no change." Then they conclude HTTP/3 is useless and disable it. This is a common mistake. The test should be done from a cellular network with a weak signal or with a network simulator like clumsy or tc netem that simulates real packet loss and latency. The following command on Linux adds 5% packet loss and 100ms latency:
sudo tc qdisc add dev eth0 root netem loss 5% delay 100ms
After testing, remove it:
sudo tc qdisc del dev eth0 root
What HTTP/3 Does Differently
HTTP/3 runs on UDP, not TCP. Its underlying protocol is QUIC, designed by Google and now RFC 9000. QUIC does three fundamental things that TCP cannot:
- Eliminates head-of-line blocking at the connection level: Each stream in QUIC is independent. If a packet is lost in stream number 1, streams 2 and 3 continue without delay.
- Reduces initial connection time: TCP requires one round-trip for the handshake, and TLS adds another round-trip. QUIC combines both into a single round-trip. On new connections, that's a saving of one RTT; on repeat connections with session resumption, that number drops to zero.
- Changing IP addresses without dropping the connection: When your phone switches from Wi-Fi to 4G, the QUIC connection continues using the Connection ID. TCP doesn't do this; the connection drops and you have to handshake again from scratch.
The result of these three items is a concrete number: on a network with 2% packet loss, page loading with HTTP/3 is typically 15 to 30 percent faster than HTTP/2. On a stable network, that number drops to 2 to 5 percent. You'll see this in Cloudflare and Fastly reports, and you should see it in your own tests too.
When the HTTP/3 Difference Is Noticeable
Not all websites benefit from HTTP/3. Three conditions must be met:
- Your users are on cellular networks. If your analytics show that more than 40% of traffic is mobile, HTTP/3 matters for you.
- Your page has more than 50 separate requests. The more simultaneous streams there are, the higher the chance of hitting head-of-line blocking.
- Your files are served from multiple domains or separate CDNs. Each separate domain means a separate TCP connection and a separate opportunity for blocking.
If your site is a simple page with 10 requests and your users connect from urban fiber, HTTP/3 won't make a noticeable difference. Let's be honest about that. The activation cost is low, but don't expect miracles.
Direct Comparison: HTTP/2 vs. HTTP/3
| Feature | HTTP/2 | HTTP/3 (QUIC) |
|---|---|---|
| Transport protocol | TCP | UDP |
| New connection handshake | TCP + TLS = 2 RTT | QUIC = 1 RTT |
| Head-of-line blocking | Exists at the connection level | Only at the stream level |
| Mid-connection IP change | Connection drops | Continues with Connection ID |
| Browser support | Full | Chrome, Firefox, Safari 16.4+, Edge |
| CDN and server support | Full | NGINX 1.25+, Cloudflare, Fastly |
Another technical note: QUIC uses TLS 1.3 internally and doesn't allow older versions. If your server has TLS 1.2, HTTP/3 won't work. Enable TLS 1.3 first.
Enabling HTTP/3 on NGINX
From version 1.25.0 onward, NGINX has official HTTP/3 support. If your distribution has an older version, you'll need to use the official NGINX repository. The steps are as follows:
# In your server block, add these lines
listen 443 quic reuseport;
listen 443 ssl;
http2 on;
ssl_protocols TLSv1.3;
add_header Alt-Svc 'h3=":443"; ma=86400' always;
The Alt-Svc line tells the browser that HTTP/3 is available. Without this header, the browser won't try it even if the server supports QUIC. After applying the settings, test with the following command:
curl -I --http3 https://example.com
The output should include alt-svc: h3=":443". If you see the error --http3 is experimental, upgrade your curl version. Version 8.0 and above has full support.
An important note about UDP: some firewalls and data centers have port 443/UDP blocked. Before enabling it, make sure it's open:
nc -u -vz your-server-ip 443
If the port is closed, the browser will automatically fall back to HTTP/2, but your users will experience an extra RTT because the browser first attempts QUIC and then falls back to TCP after a timeout. This scenario is worse than not having HTTP/3 at all.
When Not to Enable HTTP/3
There's one case where I don't recommend enabling HTTP/3: if your infrastructure uses an older load balancer that doesn't pass QUIC through. In that case, UDP traffic reaches the load balancer and gets no response. The browser falls back to TCP after a few seconds, and your user experiences more latency than usual.
The intermediate solution: set the Alt-Svc header with the value ma=86400, and after 24 hours, if you don't see any errors in the logs, make it permanent. This is a safe gradual migration.
Also, if you're using shared hosting services where you don't have control over NGINX, HTTP/3 is usually not available. In that case, upgrading to an Iran VPS with full access to web server settings is the first practical step. Without access to the server configuration, the discussion about HTTP/3 remains purely theoretical.
HTTP/3's Impact on SEO and Core Web Vitals
Google has officially stated that HTTP/3 is not a ranking signal. But that doesn't mean it has no effect. LCP (Largest Contentful Paint), which is a core Core Web Vitals metric, is directly tied to how fast the largest element on the page is delivered. If that element is served from a separate stream and another stream has lost a packet, your LCP goes up. HTTP/3 eliminates that dependency.
In practice, sites that have migrated to HTTP/3 report a 5 to 15 percent improvement in LCP. That number is enough to indirectly affect mobile rankings, because Google uses user engagement as a signal, and a faster user has better engagement.
Measurement and Monitoring Tools
After enabling it, you need to measure the difference. Three practical tools:
- HTTP/3 Check by KeyCDN: A simple page that takes your site's address and tells you whether HTTP/3 is active or not.
- WebPageTest: In the test settings, select the
HTTP/3option and compare the result with the normal state. - Chrome DevTools: In the Network tab, enable the Protocol column. The value
h3means the request went over QUIC.
For continuous monitoring, enable the quic_connections metric in NGINX stub status. If this number stays at zero, it means browsers aren't connecting via HTTP/3, and the problem is with the Alt-Svc header or the firewall.
Frequently Asked Questions
Does HTTP/3 work on all browsers?
No. Safari supports HTTP/3 from version 16.4 onward. Older browsers automatically fall back to HTTP/2, so don't worry about users with old browsers. The important thing is to make sure you add the Alt-Svc header so modern browsers know HTTP/3 exists.
Is HTTP/3 less secure than HTTP/2?
No. QUIC mandatorily uses TLS 1.3 and doesn't allow TLS 1.2 or lower. In practice, HTTP/3 is more secure than HTTP/2 because it has eliminated the weakest TLS version. The only security concern is UDP traffic, which some firewalls don't inspect properly.
How do I know if my site is currently on HTTP/3?
The simplest way: open Chrome console (F12), go to the Network tab, right-click on the table header, and enable the Protocol option. If you see the value h3, your site is being served over HTTP/3. If you see h2, you're still on HTTP/2.
Does HTTP/3 consume more bandwidth?
Yes, about 5 to 10 percent more. QUIC has larger headers than TCP and sends separate acknowledgment packets for each stream. If your bandwidth is limited and traffic costs matter to you, factor this number into your calculations. On unlimited plans, this difference is negligible.
Comments 0
No comments yet — be the first!