<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Peakhour.IO - HTTP/3</title><link href="https://www.peakhour.io/" rel="alternate"></link><link href="https://www.peakhour.io/feeds/tag/http3.atom.xml" rel="self"></link><id>https://www.peakhour.io/</id><updated>2026-07-29T00:00:00+10:00</updated><entry><title>How Browsers Decide Whether to Use HTTP/3</title><link href="https://www.peakhour.io/blog/how-browsers-decide-to-use-http3/" rel="alternate"></link><published>2026-07-29T00:00:00+10:00</published><updated>2026-07-29T00:00:00+10:00</updated><author><name>AC</name></author><id>tag:www.peakhour.io,2026-07-29:/blog/how-browsers-decide-to-use-http3/</id><summary type="html">&lt;p&gt;HTTP/3 discovery is standardised. The decision to wait, race QUIC against TCP, remember a failure, or fall back is still browser policy.&lt;/p&gt;</summary><content type="html">&lt;p&gt;There is no HTTP/3 switch inside the TLS handshake.&lt;/p&gt;
&lt;p&gt;HTTP/1.1 and HTTP/2 both run over TCP. A browser can open TCP port 443, start TLS and use ALPN to choose between &lt;code&gt;http/1.1&lt;/code&gt; and &lt;code&gt;h2&lt;/code&gt;. HTTP/3 runs over QUIC, which uses UDP. By the time a normal TLS-over-TCP handshake begins, the browser has already chosen the wrong transport for HTTP/3.&lt;/p&gt;
&lt;p&gt;It has to learn that a QUIC endpoint exists first. Then it has to decide whether that information is worth acting on.&lt;/p&gt;
&lt;p&gt;Those are separate problems. The discovery mechanisms are covered by standards. The exact decision to wait for DNS, start TCP, race QUIC, abandon a slow attempt or remember a failure is not.&lt;/p&gt;
&lt;p&gt;That distinction explains why two browsers can visit the same site from the same network and use different HTTP versions without either one being broken.&lt;/p&gt;
&lt;h2&gt;Two ways to advertise HTTP/3&lt;/h2&gt;
&lt;p&gt;The older and more common route is an &lt;code&gt;Alt-Svc&lt;/code&gt; response header:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;Alt-Svc: h3=&amp;quot;:443&amp;quot;; ma=86400&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://www.rfc-editor.org/rfc/rfc9114.html#section-3.1.1"&gt;RFC 9114, the HTTP/3 specification&lt;/a&gt;, says an origin can advertise an equivalent HTTP/3 endpoint this way. The browser receives the header over an existing HTTP/1.1 or HTTP/2 connection, stores the alternative service and may try QUIC.&lt;/p&gt;
&lt;p&gt;The catch is in the sequence. On a first visit, the browser needs an HTTP response before it sees the header. That first connection is already on TCP. A later request can use the cached HTTP/3 alternative.&lt;/p&gt;
&lt;p&gt;DNS can provide the information earlier. &lt;a href="https://www.rfc-editor.org/rfc/rfc9460.html"&gt;RFC 9460&lt;/a&gt; defines SVCB and HTTPS resource records. An HTTPS record can advertise ALPN protocols, ports, address hints and alternative endpoints:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;example.com. 300 IN HTTPS 1 . alpn=&amp;quot;h3,h2&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A browser that receives this record in time can attempt HTTP/3 on the first visit. It does not need to make an HTTP/2 request just to discover that HTTP/3 exists.&lt;/p&gt;
&lt;p&gt;Neither advertisement proves that QUIC will work. UDP 443 may be blocked by a firewall, filtered by a corporate network or mishandled somewhere between the user and the edge. The certificate and authority still need to check out. The browser eventually has to test the path.&lt;/p&gt;
&lt;h2&gt;The standard stops before the interesting bit&lt;/h2&gt;
&lt;p&gt;RFC 9114 permits a client to try an advertised HTTP/3 service. If QUIC cannot be established, it recommends trying a TCP-based HTTP version. It does not set the browser's race timer or say how long a failed endpoint should remain suspect.&lt;/p&gt;
&lt;p&gt;RFC 9460 is similarly careful. It gives the client a set of service endpoints and parameters. It allows TCP and QUIC attempts when the advertised ALPN set supports both. It does not prescribe one universal ordering algorithm.&lt;/p&gt;
&lt;p&gt;So there is a standard for saying “HTTP/3 is available here”. There is no standard that says every browser must:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;wait the same amount of time for an HTTPS DNS answer;&lt;/li&gt;
&lt;li&gt;start QUIC before TCP;&lt;/li&gt;
&lt;li&gt;race both immediately;&lt;/li&gt;
&lt;li&gt;prefer the same IPv4 or IPv6 endpoint; or&lt;/li&gt;
&lt;li&gt;retry a failed QUIC path after the same interval.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Those choices belong to the implementation. They also change.&lt;/p&gt;
&lt;h2&gt;What Chromium currently does&lt;/h2&gt;
&lt;p&gt;Chromium source shows why a neat flowchart quickly becomes misleading.&lt;/p&gt;
&lt;p&gt;In its established connection path, Chromium can create separate jobs for the ordinary TCP route, a cached Alt-Svc alternative and an HTTP/3 endpoint learned through DNS. The &lt;a href="https://chromium.googlesource.com/chromium/src/+/refs/heads/main/net/http/http_stream_factory_job_controller.cc#907"&gt;HTTP stream job controller&lt;/a&gt; starts the alternative jobs and manages their competition with the main job.&lt;/p&gt;
&lt;p&gt;The Alt-Svc information is not rediscovered on every request. Chromium reads it from its stored &lt;a href="https://chromium.googlesource.com/chromium/src/+/refs/heads/main/net/http/http_stream_factory_job_controller.cc#1225"&gt;HTTP server properties&lt;/a&gt;, ignores alternatives already marked broken and can create a QUIC attempt from the remaining entry.&lt;/p&gt;
&lt;p&gt;That last part matters. If the TCP job succeeds while HTTP/3 fails, Chromium can &lt;a href="https://chromium.googlesource.com/chromium/src/+/refs/heads/main/net/http/http_stream_factory_job_controller.cc#1111"&gt;mark the alternative service as broken&lt;/a&gt;. Some failures are treated as specific to the current network and reconsidered after the default network changes. A failed QUIC attempt at the office does not have to poison HTTP/3 after the laptop moves to another network.&lt;/p&gt;
&lt;p&gt;DNS discovery is conditional too. The legacy path checks that HTTPS-record ALPN support and QUIC are enabled, that the request is HTTPS, that the connection is direct rather than proxied, and that the DNS alternative is not already marked broken. Merely publishing &lt;code&gt;alpn="h3"&lt;/code&gt; does not force Chrome to use it.&lt;/p&gt;
&lt;p&gt;Current Chromium also contains a separate &lt;a href="https://chromium.googlesource.com/chromium/src/+/refs/heads/main/net/http/http_stream_factory_job_controller.cc#787"&gt;Happy Eyeballs v3 connection-pool path&lt;/a&gt;. When that path is enabled and eligible, the request leaves the older job-controller sequence. This is a useful warning for anyone interpreting packet captures: “Chrome races these three jobs in this order” may accurately describe one build and be wrong for another.&lt;/p&gt;
&lt;p&gt;The durable conclusion is narrower. Chromium gathers candidates, uses remembered success and failure, and is prepared to let TCP and QUIC compete. The timings and plumbing are implementation details.&lt;/p&gt;
&lt;h2&gt;Firefox makes different choices&lt;/h2&gt;
&lt;p&gt;Firefox also has explicit HTTP/3 fallback policy rather than a simple protocol preference.&lt;/p&gt;
&lt;p&gt;Mozilla's current preferences enable HTTP/3 and &lt;a href="https://searchfox.org/mozilla-central/source/modules/libpref/init/StaticPrefList.yaml"&gt;fallback to HTTP/2 on error&lt;/a&gt;. Its networking code can consume Alt-Svc advertisements and use a DNS HTTPS record as an Alt-Svc-like input.&lt;/p&gt;
&lt;p&gt;That DNS path has conditions. In &lt;a href="https://searchfox.org/mozilla-central/source/netwerk/protocol/http/nsHttpChannel.cpp"&gt;&lt;code&gt;nsHttpChannel&lt;/code&gt;&lt;/a&gt;, HTTPS-record use depends on such things as the DNS strategy, proxy use, Firefox's encrypted-DNS mode and whether the current network has been judged able to resolve HTTPS records. In some circumstances Firefox waits for the record; in others it proceeds without making the request hostage to that answer.&lt;/p&gt;
&lt;p&gt;When Firefox chooses an HTTP/3 endpoint learned from DNS, &lt;a href="https://searchfox.org/mozilla-central/source/netwerk/protocol/http/nsHttpTransaction.cpp"&gt;&lt;code&gt;nsHttpTransaction&lt;/code&gt;&lt;/a&gt; has a fast-fallback path to a backup connection. After a failed HTTP/3 attempt it can also remove H3-capable SVCB candidates before retrying. If Firefox already has a usable HTTP/3 connection, the connection manager tries to dispatch work there before HTTP/2.&lt;/p&gt;
&lt;p&gt;That is a real preference, but it is not a promise that every fresh Firefox connection starts with QUIC. Cached state, proxy configuration, DNS-over-HTTPS status and the current network all affect the choice.&lt;/p&gt;
&lt;h2&gt;What Apple documents, and what it does not&lt;/h2&gt;
&lt;p&gt;Apple's &lt;a href="https://developer.apple.com/documentation/technotes/tn3102-http3-in-your-app"&gt;HTTP/3 technote&lt;/a&gt; recommends an HTTPS DNS record with &lt;code&gt;alpn="h3,h2"&lt;/code&gt; for service discovery. It also supports Alt-Svc and explains the practical difference: DNS can make HTTP/3 available on the first transaction, while an Alt-Svc-only client may use HTTP/2 first and apply the remembered advertisement on a later request.&lt;/p&gt;
&lt;p&gt;Apple also documents fallback to HTTP/2 or HTTP/1.1 when HTTP/3 is unavailable on the server or network.&lt;/p&gt;
&lt;p&gt;That is good deployment guidance. It is not a published Safari endpoint-selection algorithm. WebKit is open source, but much of the Apple platform networking behaviour involved here sits below the rendering engine. We should not turn one Safari test on one release and operating system into a claim about every Apple device.&lt;/p&gt;
&lt;p&gt;If Safari on macOS and Safari on iPadOS behave differently in a lab, record the versions, resolver, network and cache state. The difference is evidence worth investigating, not a new browser law.&lt;/p&gt;
&lt;h2&gt;DNS timing can decide the winner&lt;/h2&gt;
&lt;p&gt;An HTTPS record is useful only if the browser receives and uses it soon enough.&lt;/p&gt;
&lt;p&gt;A, AAAA and HTTPS answers may arrive through different resolver paths and at different times. The browser can wait for more complete endpoint information or begin connecting with the address it already has. Waiting can produce a better candidate set. It can also add visible delay when the missing answer never arrives.&lt;/p&gt;
&lt;p&gt;This is one reason browser traces vary with the operating system and DNS configuration. Chrome and Firefox both have internal DNS behaviour, but either can be affected by platform resolver choices, encrypted-DNS settings, proxies, caches and experiment flags.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.rfc-editor.org/info/rfc10029"&gt;RFC 10029, DNS Multiple QTYPEs&lt;/a&gt;, was published in July 2026 to let a DNS client request additional record types alongside its primary query. A client could ask for A, AAAA and HTTPS information and receive a combined response instead of waiting for three independently timed answers.&lt;/p&gt;
&lt;p&gt;That removes one possible source of timing skew. Publication does not mean browsers, resolvers and authoritative servers support it yet. It also cannot make a blocked UDP path work.&lt;/p&gt;
&lt;h2&gt;Happy Eyeballs is growing beyond IPv4 versus IPv6&lt;/h2&gt;
&lt;p&gt;Happy Eyeballs originally dealt with a familiar failure: an IPv6 address exists, but the IPv6 path is slow or broken. Rather than make the user wait for a timeout, the client tries another candidate.&lt;/p&gt;
&lt;p&gt;The active &lt;a href="https://datatracker.ietf.org/doc/draft-ietf-happy-happyeyeballs-v3/"&gt;Happy Eyeballs Version 3 Internet-Draft&lt;/a&gt; generalises that work. Its candidate model can account for service endpoints, transport protocols and ALPN, not only IPv6 and IPv4 addresses.&lt;/p&gt;
&lt;p&gt;That is the right shape for HTTP/3. A browser may be choosing among:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTTP/3 over QUIC to an IPv6 address;&lt;/li&gt;
&lt;li&gt;HTTP/3 over QUIC to an IPv4 address;&lt;/li&gt;
&lt;li&gt;HTTP/2 over TLS and TCP to either address; and&lt;/li&gt;
&lt;li&gt;endpoints with different priorities or ports from an HTTPS record.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Version 3 is still an Internet-Draft, not a finished standard. Chromium having a feature called Happy Eyeballs v3 does not mean its current behaviour is the final IETF algorithm, and it does not mean other browsers use the same timers.&lt;/p&gt;
&lt;h2&gt;What operators should do&lt;/h2&gt;
&lt;p&gt;Advertise HTTP/3 with both DNS HTTPS records and Alt-Svc.&lt;/p&gt;
&lt;p&gt;The HTTPS record gives capable clients a chance to use QUIC on the first connection. Alt-Svc reaches clients that learn alternatives through HTTP responses and provides a second discovery path. Keep HTTP/2 working on TCP 443 because HTTP/3 is an additional path, not a safe replacement for fallback.&lt;/p&gt;
&lt;p&gt;Then measure the versions separately. At the edge, record the negotiated HTTP version, QUIC handshake success, fallback rate, network and browser family. Test from clean profiles as well as warm ones: cached Alt-Svc and remembered QUIC failures can completely change the result.&lt;/p&gt;
&lt;p&gt;When a test surprises you, capture more than the browser name. Record:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;browser and operating-system versions;&lt;/li&gt;
&lt;li&gt;whether the profile was new or had visited before;&lt;/li&gt;
&lt;li&gt;the A, AAAA and HTTPS answers actually returned;&lt;/li&gt;
&lt;li&gt;Alt-Svc value and cache lifetime;&lt;/li&gt;
&lt;li&gt;whether UDP 443 worked on that network; and&lt;/li&gt;
&lt;li&gt;whether a proxy, VPN or encrypted-DNS mode was active.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cloud Fellows' &lt;a href="https://sse-testcenter.org/protocol-negotiation.html"&gt;protocol-negotiation&lt;/a&gt; and &lt;a href="https://sse-testcenter.org/dns-https-alt-svc.html"&gt;DNS HTTPS versus Alt-Svc&lt;/a&gt; test notes are useful examples of why those details matter. Their observations should be read as measurements of named configurations, not a substitute for browser specifications.&lt;/p&gt;
&lt;p&gt;HTTP/3 discovery has standards. Browser connection strategy is still a moving piece of software. For operators, the sensible response is not to predict one universal race. Advertise both paths, preserve fallback and measure what clients actually do.&lt;/p&gt;</content><category term="Performance"></category><category term="HTTP/3"></category><category term="QUIC"></category><category term="DNS"></category><category term="HTTPS Records"></category><category term="Alt-Svc"></category><category term="Web Performance"></category></entry></feed>