[{"data":1,"prerenderedAt":991},["ShallowReactive",2],{"content:\u002Fnetwork-protocol-optimization\u002Fhttp2-http3-and-connection-management\u002Fmeasuring-real-world-http3-gains":3,"surroundings:\u002Fnetwork-protocol-optimization\u002Fhttp2-http3-and-connection-management\u002Fmeasuring-real-world-http3-gains":982},{"id":4,"title":5,"body":6,"description":961,"extension":962,"meta":963,"navigation":975,"path":976,"seo":977,"stem":980,"__hash__":981},"content\u002Fnetwork-protocol-optimization\u002Fhttp2-http3-and-connection-management\u002Fmeasuring-real-world-http3-gains\u002Findex.md","Measuring Real-World HTTP\u002F3 Gains",{"type":7,"value":8,"toc":943},"minimark",[9,14,34,37,144,149,190,194,200,206,212,218,222,226,466,470,473,477,480,484,487,631,635,638,642,645,649,655,715,719,722,726,752,756,762,768,774,783,787,809,818,830,839,848,857,866,875,884,893,902,906,928,933,936,939],[10,11,13],"h1",{"id":12},"how-to-measure-real-world-http3-gains","How to Measure Real-World HTTP\u002F3 Gains",[15,16,17,18,23,24,28,29,33],"p",{},"This guide is part of ",[19,20,22],"a",{"href":21},"\u002Fnetwork-protocol-optimization\u002Fhttp2-http3-and-connection-management\u002F","HTTP\u002F2, HTTP\u002F3 & Connection Management",", within ",[19,25,27],{"href":26},"\u002Fnetwork-protocol-optimization\u002F","Network & Server Response Optimization",". Enabling HTTP\u002F3 is often a single toggle at the CDN. Knowing whether it helped is harder. Lab tests on fast, clean connections show little difference. Field data is noisy, and naive comparisons of HTTP\u002F2 and HTTP\u002F3 users are biased: users who get HTTP\u002F3 tend to be repeat visitors (who have already received ",[30,31,32],"code",{},"Alt-Svc","), on networks that allow UDP, often with warmer caches — all of which make them faster regardless of protocol.",[15,35,36],{},"A sound measurement records the protocol per navigation, segments by network conditions where the benefit is expected, and compares like with like — ideally through a controlled rollout where the CDN enables HTTP\u002F3 for a random share of users or for a period, so the populations are comparable.",[15,38,39],{},[40,41,47,48,47,55,47,59,47,62,47,71,47,77,47,84,47,92,47,97,47,101,47,107,47,111,47,115,47,119,47,123,47,127,47,134,47,138,47],"svg",{"viewBox":42,"width":43,"role":44,"ariaLabel":45,"style":46},"0 0 760 220","100%","img","Bar chart showing that a naive h2 vs h3 comparison overstates the gain compared with a controlled rollout.","height:auto;max-width:760px;display:block;margin:1.75rem auto;font-family:inherit;color:var(--fp-svg-ink)"," ",[49,50],"rect",{"className":51,"x":53,"y":53,"width":43,"height":43,"fill":54},[52],"svg-canvas","0","#ffffff",[56,57,58],"title",{},"TTFB p75 by protocol, naive vs controlled comparison",[60,61,45],"desc",{},[49,63],{"x":64,"y":64,"width":65,"height":66,"rx":67,"fill":68,"stroke":69,"style":70},"1","758","218","10","none","currentColor","stroke-opacity:0.18",[72,73,58],"text",{"x":74,"y":75,"fill":69,"style":76},"28.0","34.0","font-size:16px;font-weight:700",[72,78,83],{"x":79,"y":80,"fill":69,"style":81,"textAnchor":82},"159.5","70.0","font-size:13px","end","Naive: h2 users",[49,85],{"x":86,"y":87,"width":88,"height":89,"rx":90,"fill":68,"stroke":69,"style":91},"171.5","56.0","496.5","19","3","fill-opacity:0.7;stroke-opacity:0.35",[72,93,96],{"x":94,"y":80,"fill":69,"style":95},"674.0","font-size:12px;font-weight:600","640ms",[72,98,100],{"x":79,"y":99,"fill":69,"style":81,"textAnchor":82},"101.0","Naive: h3 users",[49,102],{"x":86,"y":103,"width":104,"height":89,"rx":90,"fill":105,"stroke":105,"style":106},"87.0","318.1","#0466c8","fill-opacity:0.55;stroke-opacity:0.9",[72,108,110],{"x":109,"y":99,"fill":69,"style":95},"495.6","410ms",[72,112,114],{"x":79,"y":113,"fill":69,"style":81,"textAnchor":82},"132.0","Controlled: HTTP\u002F3 off",[49,116],{"x":86,"y":117,"width":118,"height":89,"rx":90,"fill":105,"stroke":105,"style":106},"118.0","434.4",[72,120,122],{"x":121,"y":113,"fill":69,"style":95},"611.9","560ms",[72,124,126],{"x":79,"y":125,"fill":69,"style":81,"textAnchor":82},"163.0","Controlled: HTTP\u002F3 on",[49,128],{"x":86,"y":129,"width":130,"height":89,"rx":90,"fill":131,"stroke":132,"style":133},"149.0","384.0","#ffc300","#b8860b","fill-opacity:0.7;stroke-opacity:0.9",[72,135,137],{"x":136,"y":125,"fill":69,"style":95},"561.5","495ms",[72,139,143],{"x":74,"y":140,"fill":141,"style":142},"198.0","#51617a","font-size:12.5px","The naive gap mixes protocol effects with repeat-visit and network effects.",[145,146,148],"h2",{"id":147},"rapid-diagnosis","Rapid Diagnosis",[150,151,152,164,174,184],"ul",{},[153,154,155,159,160,163],"li",{},[156,157,158],"strong",{},"Confirm HTTP\u002F3 is advertised",": check for ",[30,161,162],{},"alt-svc: h3=\":443\""," in responses, or an HTTPS DNS record.",[153,165,166,169,170,173],{},[156,167,168],{},"Check protocol in DevTools",": add the Protocol column in the Network panel; ",[30,171,172],{},"h3"," indicates HTTP\u002F3.",[153,175,176,179,180,183],{},[156,177,178],{},"Check RUM"," for ",[30,181,182],{},"nextHopProtocol"," on the navigation entry.",[153,185,186,189],{},[156,187,188],{},"Check the h3 share",": a low share may indicate discovery problems or UDP blocking.",[145,191,193],{"id":192},"root-cause-analysis-why-measurements-mislead","Root Cause Analysis: Why Measurements Mislead",[15,195,196,199],{},[156,197,198],{},"1. Discovery bias."," First visits typically use HTTP\u002F2; HTTP\u002F3 users are disproportionately repeat visitors.",[15,201,202,205],{},[156,203,204],{},"2. Network bias."," Networks that block UDP (some corporate networks) are excluded from h3.",[15,207,208,211],{},[156,209,210],{},"3. Small average effects."," Benefits concentrate in a subset of users, diluted in averages.",[15,213,214,217],{},[156,215,216],{},"4. Lab conditions."," Fast, lossless lab connections hide QUIC's main advantages.",[145,219,221],{"id":220},"step-by-step-resolution","Step-by-Step Resolution",[172,223,225],{"id":224},"_1-record-protocol-and-network-context-in-rum","1. Record protocol and network context in RUM",[227,228,233],"pre",{"className":229,"code":230,"language":231,"meta":232,"style":232},"language-javascript shiki shiki-themes github-light-high-contrast github-dark-high-contrast github-light-high-contrast","import { onTTFB, onLCP } from 'web-vitals';\nconst nav = performance.getEntriesByType('navigation')[0];\nconst ctx = {\n  protocol: nav.nextHopProtocol,                         \u002F\u002F 'h2', 'h3', 'http\u002F1.1'\n  rtt: navigator.connection?.rtt, ect: navigator.connection?.effectiveType,\n  repeat: nav.type === 'reload' || document.cookie.includes('seen=1'),\n};\nonTTFB((m) => navigator.sendBeacon('\u002Frum', JSON.stringify({ metric: 'TTFB', value: m.value, ...ctx })));\nonLCP((m) => navigator.sendBeacon('\u002Frum', JSON.stringify({ metric: 'LCP', value: m.value, ...ctx })));\n\u002F\u002F trade-off: Network Information API values are Chromium-only and coarse; use\n\u002F\u002F country and device class as additional segments for other browsers.\n","javascript","",[30,234,235,258,292,305,315,321,350,356,413,454,460],{"__ignoreMap":232},[236,237,240,244,248,251,255],"span",{"class":238,"line":239},"line",1,[236,241,243],{"class":242},"sPARh","import",[236,245,247],{"class":246},"saISM"," { onTTFB, onLCP } ",[236,249,250],{"class":242},"from",[236,252,254],{"class":253},"sZ8jY"," 'web-vitals'",[236,256,257],{"class":246},";\n",[236,259,261,264,268,271,274,278,281,284,287,289],{"class":238,"line":260},2,[236,262,263],{"class":242},"const",[236,265,267],{"class":266},"sPXB4"," nav",[236,269,270],{"class":242}," =",[236,272,273],{"class":246}," performance.",[236,275,277],{"class":276},"smZ65","getEntriesByType",[236,279,280],{"class":246},"(",[236,282,283],{"class":253},"'navigation'",[236,285,286],{"class":246},")[",[236,288,53],{"class":266},[236,290,291],{"class":246},"];\n",[236,293,295,297,300,302],{"class":238,"line":294},3,[236,296,263],{"class":242},[236,298,299],{"class":266}," ctx",[236,301,270],{"class":242},[236,303,304],{"class":246}," {\n",[236,306,308,311],{"class":238,"line":307},4,[236,309,310],{"class":246},"  protocol: nav.nextHopProtocol,                         ",[236,312,314],{"class":313},"sjfSM","\u002F\u002F 'h2', 'h3', 'http\u002F1.1'\n",[236,316,318],{"class":238,"line":317},5,[236,319,320],{"class":246},"  rtt: navigator.connection?.rtt, ect: navigator.connection?.effectiveType,\n",[236,322,324,327,330,333,336,339,342,344,347],{"class":238,"line":323},6,[236,325,326],{"class":246},"  repeat: nav.type ",[236,328,329],{"class":242},"===",[236,331,332],{"class":253}," 'reload'",[236,334,335],{"class":242}," ||",[236,337,338],{"class":246}," document.cookie.",[236,340,341],{"class":276},"includes",[236,343,280],{"class":246},[236,345,346],{"class":253},"'seen=1'",[236,348,349],{"class":246},"),\n",[236,351,353],{"class":238,"line":352},7,[236,354,355],{"class":246},"};\n",[236,357,359,362,365,369,372,375,378,381,383,386,389,392,395,398,401,404,407,410],{"class":238,"line":358},8,[236,360,361],{"class":276},"onTTFB",[236,363,364],{"class":246},"((",[236,366,368],{"class":367},"sQw3B","m",[236,370,371],{"class":246},") ",[236,373,374],{"class":242},"=>",[236,376,377],{"class":246}," navigator.",[236,379,380],{"class":276},"sendBeacon",[236,382,280],{"class":246},[236,384,385],{"class":253},"'\u002Frum'",[236,387,388],{"class":246},", ",[236,390,391],{"class":266},"JSON",[236,393,394],{"class":246},".",[236,396,397],{"class":276},"stringify",[236,399,400],{"class":246},"({ metric: ",[236,402,403],{"class":253},"'TTFB'",[236,405,406],{"class":246},", value: m.value, ",[236,408,409],{"class":242},"...",[236,411,412],{"class":246},"ctx })));\n",[236,414,416,419,421,423,425,427,429,431,433,435,437,439,441,443,445,448,450,452],{"class":238,"line":415},9,[236,417,418],{"class":276},"onLCP",[236,420,364],{"class":246},[236,422,368],{"class":367},[236,424,371],{"class":246},[236,426,374],{"class":242},[236,428,377],{"class":246},[236,430,380],{"class":276},[236,432,280],{"class":246},[236,434,385],{"class":253},[236,436,388],{"class":246},[236,438,391],{"class":266},[236,440,394],{"class":246},[236,442,397],{"class":276},[236,444,400],{"class":246},[236,446,447],{"class":253},"'LCP'",[236,449,406],{"class":246},[236,451,409],{"class":242},[236,453,412],{"class":246},[236,455,457],{"class":238,"line":456},10,[236,458,459],{"class":313},"\u002F\u002F trade-off: Network Information API values are Chromium-only and coarse; use\n",[236,461,463],{"class":238,"line":462},11,[236,464,465],{"class":313},"\u002F\u002F country and device class as additional segments for other browsers.\n",[172,467,469],{"id":468},"_2-segment-by-network-quality","2. Segment by network quality",[15,471,472],{},"Compare TTFB and LCP by protocol within segments: RTT buckets, effective connection type, country, device class, first vs repeat visit.",[172,474,476],{"id":475},"_3-run-a-controlled-rollout","3. Run a controlled rollout",[15,478,479],{},"Enable HTTP\u002F3 for a random share of traffic (some CDNs support percentage rollouts), or alternate weeks with it on and off, and compare the full populations rather than h2 versus h3 users.",[172,481,483],{"id":482},"_4-check-for-regressions","4. Check for regressions",[15,485,486],{},"Look for segments where HTTP\u002F3 performs worse (some networks handle UDP poorly) and confirm browsers fall back correctly.",[15,488,489],{},[40,490,47,493,47,496,47,499,47,501,47,518,47,521,47,523,47,529,47,536,47,540,47,545,47,549,47,557,47,563,47,567,47,572,47,576,47,580,47,583,47,586,47,588,47,591,47,595,47,598,47,601,47,605,47,607,47,610,47,613,47,616,47,620,47,623,47,627,47],{"viewBox":491,"width":43,"role":44,"ariaLabel":492,"style":46},"0 0 760 340","Decision sequence for interpreting HTTP\u002F3 measurement results.",[49,494],{"className":495,"x":53,"y":53,"width":43,"height":43,"fill":54},[52],[56,497,498],{},"Reading HTTP\u002F3 results",[60,500,492],{},[502,503,504],"defs",{},[505,506,513],"marker",{"id":507,"viewBox":508,"refX":509,"refY":510,"markerWidth":511,"markerHeight":511,"orient":512},"fa65789396","0 0 10 10","9","5","7","auto-start-reverse",[514,515],"path",{"d":516,"fill":69,"style":517},"M0 0 L10 5 L0 10 z","fill-opacity:0.7",[49,519],{"x":64,"y":64,"width":65,"height":520,"rx":67,"fill":68,"stroke":69,"style":70},"338",[72,522,498],{"x":74,"y":75,"fill":69,"style":76},[49,524],{"x":74,"y":87,"width":525,"height":526,"rx":527,"fill":69,"stroke":69,"style":528},"320.0","50.0","6","fill-opacity:0.06;stroke-opacity:0.4",[72,530,535],{"x":531,"y":532,"fill":69,"style":533,"textAnchor":534},"188.0","85.5","font-size:13px;font-weight:700","middle","Is the h3 share low (under ~30%)?",[49,537],{"x":538,"y":87,"width":525,"height":526,"rx":527,"fill":68,"stroke":69,"style":539},"412.0","stroke-opacity:0.35",[72,541,544],{"x":542,"y":543,"fill":69,"style":142,"textAnchor":534},"572.0","77.5","Check Alt-Svc, HTTPS DNS records and UDP",[72,546,548],{"x":542,"y":547,"fill":69,"style":142,"textAnchor":534},"93.5","reachability",[238,550],{"x1":551,"y1":552,"x2":553,"y2":552,"stroke":69,"strokeWidth":554,"style":555,"markerEnd":556},"348.0","81.0","410.0","1.5","stroke-opacity:0.6","url(#fa65789396)",[72,558,562],{"x":559,"y":560,"fill":105,"style":561,"textAnchor":534},"380.0","74.0","font-size:11.5px;font-weight:700","yes",[238,564],{"x1":531,"y1":565,"x2":531,"y2":566,"stroke":69,"strokeWidth":554,"style":555,"markerEnd":556},"106.0","140.0",[72,568,571],{"x":569,"y":570,"fill":141,"style":561},"196.0","128.0","no",[49,573],{"x":74,"y":574,"width":525,"height":575,"rx":527,"fill":69,"stroke":69,"style":528},"142.0","35.0",[72,577,579],{"x":531,"y":578,"fill":69,"style":533,"textAnchor":534},"164.0","Is the gain concentrated in high-RTT segments?",[49,581],{"x":538,"y":574,"width":525,"height":575,"rx":527,"fill":105,"stroke":105,"style":582},"fill-opacity:0.14;stroke-opacity:0.9",[72,584,585],{"x":542,"y":578,"fill":69,"style":142,"textAnchor":534},"Expected — report per segment",[238,587],{"x1":551,"y1":79,"x2":553,"y2":79,"stroke":69,"strokeWidth":554,"style":555,"markerEnd":556},[72,589,562],{"x":559,"y":590,"fill":105,"style":561,"textAnchor":534},"152.5",[238,592],{"x1":531,"y1":593,"x2":531,"y2":594,"stroke":69,"strokeWidth":554,"style":555,"markerEnd":556},"177.0","211.0",[72,596,571],{"x":569,"y":597,"fill":141,"style":561},"199.0",[49,599],{"x":74,"y":600,"width":525,"height":575,"rx":527,"fill":69,"stroke":69,"style":528},"213.0",[72,602,604],{"x":531,"y":603,"fill":69,"style":533,"textAnchor":534},"235.0","Is any segment slower with h3?",[49,606],{"x":538,"y":600,"width":525,"height":575,"rx":527,"fill":105,"stroke":105,"style":582},[72,608,609],{"x":542,"y":603,"fill":69,"style":142,"textAnchor":534},"Investigate network-specific issues",[238,611],{"x1":551,"y1":612,"x2":553,"y2":612,"stroke":69,"strokeWidth":554,"style":555,"markerEnd":556},"230.5",[72,614,562],{"x":559,"y":615,"fill":105,"style":561,"textAnchor":534},"223.5",[238,617],{"x1":531,"y1":618,"x2":531,"y2":619,"stroke":69,"strokeWidth":554,"style":555,"markerEnd":556},"248.0","282.0",[72,621,571],{"x":569,"y":622,"fill":141,"style":561},"270.0",[49,624],{"x":74,"y":625,"width":525,"height":75,"rx":527,"fill":131,"stroke":132,"style":626},"284.0","fill-opacity:0.24;stroke-opacity:0.9",[72,628,630],{"x":531,"y":629,"fill":69,"style":142,"textAnchor":534},"305.5","Report the controlled before\u002Fafter difference",[145,632,634],{"id":633},"verification","Verification",[15,636,637],{},"A credible result shows: a stable h3 share; TTFB and LCP improvements in high-RTT and lossy segments; little or no change for fast connections; and a controlled comparison that agrees in direction with segment analysis. Document the method alongside the result, since protocol gains are often questioned.",[145,639,641],{"id":640},"worked-example-a-global-news-publisher","Worked Example: A Global News Publisher",[15,643,644],{},"A publisher enabled HTTP\u002F3 at its CDN and initially reported a 36% TTFB improvement by comparing h3 and h2 sessions. A closer look showed that 82% of h3 sessions were repeat visits versus 41% of h2 sessions. The team ran a two-week alternating rollout (HTTP\u002F3 enabled on alternate days) and segmented by RTT. The controlled TTFB improvement was 11% overall: 3% for RTT under 50ms, 14% for 100–200ms, and 27% above 300ms. LCP p75 improved by 140ms in South Asia and Africa, and by about 20ms in Western Europe. HTTP\u002F3 stayed enabled, and the team added HTTPS DNS records to get HTTP\u002F3 on first visits.",[145,646,648],{"id":647},"first-visit-http3-with-https-dns-records","First-Visit HTTP\u002F3 with HTTPS DNS Records",[15,650,651,652,654],{},"Browsers normally learn about HTTP\u002F3 from ",[30,653,32],{}," in a previous response, so the very first connection uses HTTP\u002F2. DNS HTTPS records (type 65) let the browser discover HTTP\u002F3 support during the DNS lookup and connect with QUIC immediately. Many DNS providers and CDNs can publish them automatically. After adding them, first-visit h3 share should rise noticeably, which matters most for sites with many new visitors, such as news and search landing pages.",[15,656,657],{},[40,658,47,661,47,664,47,667,47,669,47,672,47,674,47,678,47,682,47,686,47,689,47,692,47,696,47,699,47,702,47,706,47,709,47,712,47],{"viewBox":659,"width":43,"role":44,"ariaLabel":660,"style":46},"0 0 760 194","Bar chart of the share of navigations using HTTP\u002F3 for first and repeat visits before and after adding HTTPS DNS records.",[49,662],{"className":663,"x":53,"y":53,"width":43,"height":43,"fill":54},[52],[56,665,666],{},"Share of navigations over HTTP\u002F3",[60,668,660],{},[49,670],{"x":64,"y":64,"width":65,"height":671,"rx":67,"fill":68,"stroke":69,"style":70},"192",[72,673,666],{"x":74,"y":75,"fill":69,"style":76},[72,675,677],{"x":676,"y":80,"fill":69,"style":81,"textAnchor":82},"235.1","First visits, Alt-Svc only",[49,679],{"x":680,"y":87,"width":681,"height":89,"rx":90,"fill":68,"stroke":69,"style":91},"247.1","45.5",[72,683,685],{"x":684,"y":80,"fill":69,"style":95},"298.6","8%",[72,687,688],{"x":676,"y":99,"fill":69,"style":81,"textAnchor":82},"Repeat visits, Alt-Svc only",[49,690],{"x":680,"y":103,"width":691,"height":89,"rx":90,"fill":105,"stroke":105,"style":106},"403.9",[72,693,695],{"x":694,"y":99,"fill":69,"style":95},"656.9","71%",[72,697,698],{"x":676,"y":113,"fill":69,"style":81,"textAnchor":82},"First visits, + HTTPS DNS record",[49,700],{"x":680,"y":117,"width":701,"height":89,"rx":90,"fill":131,"stroke":132,"style":133},"329.9",[72,703,705],{"x":704,"y":113,"fill":69,"style":95},"583.0","58%",[72,707,708],{"x":676,"y":125,"fill":69,"style":81,"textAnchor":82},"Repeat visits, + HTTPS DNS record",[49,710],{"x":680,"y":129,"width":711,"height":89,"rx":90,"fill":131,"stroke":132,"style":133},"420.9",[72,713,714],{"x":94,"y":125,"fill":69,"style":95},"74%",[145,716,718],{"id":717},"presenting-the-results","Presenting the Results",[15,720,721],{},"Protocol changes attract scepticism, so present results in a way that holds up. Show the controlled comparison first (HTTP\u002F3 on versus off for comparable populations), then the segment breakdown by RTT or region, then the h3 adoption share. Include confidence intervals or at least daily values, so readers can see the effect is consistent rather than a single noisy day. Note what the change cost: for CDN-hosted sites usually nothing, for self-hosted servers some CPU. A short write-up like this also documents why HTTP\u002F3 must stay enabled when someone later proposes disabling it to debug an unrelated problem.",[145,723,725],{"id":724},"common-mistakes","Common Mistakes",[150,727,728,734,740,746],{},[153,729,730,733],{},[156,731,732],{},"Comparing h2 and h3 users directly."," Mixes protocol effects with visit type and network.",[153,735,736,739],{},[156,737,738],{},"Reporting only averages."," Gains concentrate in high-latency segments.",[153,741,742,745],{},[156,743,744],{},"Testing only in the lab."," Clean connections hide QUIC's strengths.",[153,747,748,751],{},[156,749,750],{},"Ignoring fallback health."," Some networks need HTTP\u002F2 to work reliably.",[145,753,755],{"id":754},"edge-cases","Edge Cases",[15,757,758,761],{},[156,759,760],{},"Connection migration."," HTTP\u002F3 survives network changes; long sessions on mobile benefit, which page-load metrics do not capture.",[15,763,764,767],{},[156,765,766],{},"0-RTT resumption."," Repeat connections can send data immediately; it brings replay considerations for non-idempotent requests.",[15,769,770,773],{},[156,771,772],{},"Server CPU."," QUIC can use more CPU than TCP on servers; CDNs absorb this, self-hosted servers should monitor it.",[15,775,776,779,780,782],{},[156,777,778],{},"Firefox and Safari."," Both support HTTP\u002F3, but ",[30,781,182],{}," reporting and Network Information support differ; segment by browser.",[145,784,786],{"id":785},"faq","FAQ",[788,789,792,796],"details",{"className":790},[791],"faq-item",[793,794,795],"summary",{},"How do I check if my site uses HTTP\u002F3?",[15,797,798,799,802,803,805,806,808],{},"Look for ",[30,800,801],{},"alt-svc"," advertising ",[30,804,172],{}," in responses and the Protocol column showing ",[30,807,172],{}," in DevTools on repeat loads.",[788,810,812,815],{"className":811},[791],[793,813,814],{},"What improvement should I expect?",[15,816,817],{},"Little on fast networks; noticeable on high-latency and lossy ones. Overall TTFB improvements of 5–15% are common in global audiences.",[788,819,821,824],{"className":820},[791],[793,822,823],{},"Why do my first visits still use HTTP\u002F2?",[15,825,826,827,829],{},"Browsers learn about HTTP\u002F3 from ",[30,828,32],{}," after a first response. HTTPS DNS records enable HTTP\u002F3 on the first connection.",[788,831,833,836],{"className":832},[791],[793,834,835],{},"Can HTTP\u002F3 make things slower?",[15,837,838],{},"Occasionally, on networks that throttle or mishandle UDP. Browsers race or fall back to TCP, limiting the impact.",[788,840,842,845],{"className":841},[791],[793,843,844],{},"Should I measure LCP or TTFB?",[15,846,847],{},"Both. TTFB isolates connection and server effects; LCP shows whether users benefit visibly.",[788,849,851,854],{"className":850},[791],[793,852,853],{},"Does HTTP\u002F3 help API calls too?",[15,855,856],{},"Yes, especially on mobile networks. Subresources and fetch calls on the same origin reuse the QUIC connection.",[788,858,860,863],{"className":859},[791],[793,861,862],{},"Is CrUX enough to measure the gain?",[15,864,865],{},"CrUX does not segment by protocol, and it aggregates 28 days. Use your own RUM for protocol-specific analysis, and CrUX to confirm the overall trend.",[788,867,869,872],{"className":868},[791],[793,870,871],{},"How long should a controlled test run?",[15,873,874],{},"At least one to two weeks, with alternating periods or random assignment, so weekday patterns and traffic mix affect both groups equally.",[788,876,878,881],{"className":877},[791],[793,879,880],{},"Does HTTP\u002F3 change bandwidth usage?",[15,882,883],{},"Not meaningfully. Payload sizes are the same; QUIC has slightly different overhead, but compression and content dominate transfer size.",[788,885,887,890],{"className":886},[791],[793,888,889],{},"Which browsers support HTTP\u002F3?",[15,891,892],{},"All major browsers support HTTP\u002F3. Reporting of the protocol in Resource Timing varies slightly, so segment results by browser as a check.",[788,894,896,899],{"className":895},[791],[793,897,898],{},"Can I force HTTP\u002F3 in a lab test?",[15,900,901],{},"Chrome can be started with flags that force QUIC for specific origins, which is useful for controlled lab comparisons alongside field data.",[145,903,905],{"id":904},"related","Related",[150,907,908,914,921],{},[153,909,910,913],{},[19,911,912],{"href":21},"HTTP\u002F2, HTTP\u002F3 & connection management"," — the topic overview.",[153,915,916,920],{},[19,917,919],{"href":918},"\u002Fnetwork-protocol-optimization\u002Fhttp2-http3-and-connection-management\u002Fdiagnosing-head-of-line-blocking\u002F","Diagnosing head-of-line blocking"," — the problem HTTP\u002F3 solves.",[153,922,923,927],{},[19,924,926],{"href":925},"\u002Fnetwork-protocol-optimization\u002Ftime-to-first-byte-optimization\u002F","Time to First Byte (TTFB) optimization"," — connection time within TTFB.",[929,930,932],"script",{"type":931},"application\u002Fld+json","\n{\n  \"@context\": \"https:\u002F\u002Fschema.org\",\n  \"@type\": \"HowTo\",\n  \"name\": \"How to Measure Real-World HTTP\u002F3 Gains\",\n  \"description\": \"A method for measuring whether HTTP\u002F3 actually improves your users' experience, avoiding the common biases in protocol comparisons.\",\n  \"step\": [\n    {\n      \"@type\": \"HowToStep\",\n      \"position\": 1,\n      \"name\": \"Record protocol and network context in RUM\",\n      \"text\": \"Record protocol and network context in RUM\"\n    },\n    {\n      \"@type\": \"HowToStep\",\n      \"position\": 2,\n      \"name\": \"Segment by network quality\",\n      \"text\": \"Compare TTFB and LCP by protocol within segments: RTT buckets, effective connection type, country, device class, first vs repeat visit.\"\n    },\n    {\n      \"@type\": \"HowToStep\",\n      \"position\": 3,\n      \"name\": \"Run a controlled rollout\",\n      \"text\": \"Enable HTTP\u002F3 for a random share of traffic (some CDNs support percentage rollouts), or alternate weeks with it on and off, and compare the full populations rather than h2 versus h3 users.\"\n    },\n    {\n      \"@type\": \"HowToStep\",\n      \"position\": 4,\n      \"name\": \"Check for regressions\",\n      \"text\": \"Look for segments where HTTP\u002F3 performs worse (some networks handle UDP poorly) and confirm browsers fall back correctly.\"\n    }\n  ]\n}\n",[929,934,935],{"type":931},"\n{\n  \"@context\": \"https:\u002F\u002Fschema.org\",\n  \"@type\": \"TechArticle\",\n  \"headline\": \"How to Measure Real-World HTTP\u002F3 Gains\",\n  \"description\": \"A method for measuring whether HTTP\u002F3 actually improves your users' experience, avoiding the common biases in protocol comparisons.\",\n  \"datePublished\": \"2026-10-06\",\n  \"dateModified\": \"2026-10-06\",\n  \"author\": {\n    \"@type\": \"Organization\",\n    \"name\": \"frontend-performance.com\"\n  },\n  \"publisher\": {\n    \"@type\": \"Organization\",\n    \"name\": \"frontend-performance.com\"\n  },\n  \"mainEntityOfPage\": {\n    \"@type\": \"WebPage\",\n    \"@id\": \"https:\u002F\u002Ffrontend-performance.com\u002Fnetwork-protocol-optimization\u002Fhttp2-http3-and-connection-management\u002Fmeasuring-real-world-http3-gains\u002F\"\n  }\n}\n",[929,937,938],{"type":931},"\n{\n  \"@context\": \"https:\u002F\u002Fschema.org\",\n  \"@type\": \"BreadcrumbList\",\n  \"itemListElement\": [\n    {\n      \"@type\": \"ListItem\",\n      \"position\": 1,\n      \"name\": \"Home\",\n      \"item\": \"https:\u002F\u002Ffrontend-performance.com\u002F\"\n    },\n    {\n      \"@type\": \"ListItem\",\n      \"position\": 2,\n      \"name\": \"Network & Server Response Optimization\",\n      \"item\": \"https:\u002F\u002Ffrontend-performance.com\u002Fnetwork-protocol-optimization\u002F\"\n    },\n    {\n      \"@type\": \"ListItem\",\n      \"position\": 3,\n      \"name\": \"HTTP\u002F2, HTTP\u002F3 & Connection Management\",\n      \"item\": \"https:\u002F\u002Ffrontend-performance.com\u002Fnetwork-protocol-optimization\u002Fhttp2-http3-and-connection-management\u002F\"\n    },\n    {\n      \"@type\": \"ListItem\",\n      \"position\": 4,\n      \"name\": \"Measuring Real-World HTTP\u002F3 Gains\",\n      \"item\": \"https:\u002F\u002Ffrontend-performance.com\u002Fnetwork-protocol-optimization\u002Fhttp2-http3-and-connection-management\u002Fmeasuring-real-world-http3-gains\u002F\"\n    }\n  ]\n}\n",[940,941,942],"style",{},"html pre.shiki code .sPARh, html code.shiki .sPARh{--shiki-default:#A0111F;--shiki-dark:#FF9492;--shiki-light:#A0111F}html pre.shiki code .saISM, html code.shiki .saISM{--shiki-default:#0E1116;--shiki-dark:#F0F3F6;--shiki-light:#0E1116}html pre.shiki code .sZ8jY, html code.shiki .sZ8jY{--shiki-default:#032563;--shiki-dark:#ADDCFF;--shiki-light:#032563}html pre.shiki code .sPXB4, html code.shiki .sPXB4{--shiki-default:#023B95;--shiki-dark:#91CBFF;--shiki-light:#023B95}html pre.shiki code .smZ65, html code.shiki .smZ65{--shiki-default:#622CBC;--shiki-dark:#DBB7FF;--shiki-light:#622CBC}html pre.shiki code .sjfSM, html code.shiki .sjfSM{--shiki-default:#66707B;--shiki-dark:#BDC4CC;--shiki-light:#66707B}html pre.shiki code .sQw3B, html code.shiki .sQw3B{--shiki-default:#702C00;--shiki-dark:#FFB757;--shiki-light:#702C00}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}",{"title":232,"searchDepth":260,"depth":260,"links":944},[945,946,947,953,954,955,956,957,958,959,960],{"id":147,"depth":260,"text":148},{"id":192,"depth":260,"text":193},{"id":220,"depth":260,"text":221,"children":948},[949,950,951,952],{"id":224,"depth":294,"text":225},{"id":468,"depth":294,"text":469},{"id":475,"depth":294,"text":476},{"id":482,"depth":294,"text":483},{"id":633,"depth":260,"text":634},{"id":640,"depth":260,"text":641},{"id":647,"depth":260,"text":648},{"id":717,"depth":260,"text":718},{"id":724,"depth":260,"text":725},{"id":754,"depth":260,"text":755},{"id":785,"depth":260,"text":786},{"id":904,"depth":260,"text":905},"A method for measuring whether HTTP\u002F3 actually improves your users' experience, avoiding the common biases in protocol comparisons.","md",{"slug":964,"type":965,"breadcrumb":966,"datePublished":974,"dateModified":974},"measuring-real-world-http3-gains","article",[967,970,971,972],{"name":968,"url":969},"Home","\u002F",{"name":27,"url":26},{"name":22,"url":21},{"name":5,"url":973},"\u002Fnetwork-protocol-optimization\u002Fhttp2-http3-and-connection-management\u002Fmeasuring-real-world-http3-gains\u002F","2026-10-06",true,"\u002Fnetwork-protocol-optimization\u002Fhttp2-http3-and-connection-management\u002Fmeasuring-real-world-http3-gains",{"title":978,"description":979},"Measuring Real-World HTTP\u002F3 Performance Gains","Measure HTTP\u002F3’s effect with RUM: record nextHopProtocol, segment TTFB and LCP by network quality, avoid selection bias, and run controlled rollouts.","network-protocol-optimization\u002Fhttp2-http3-and-connection-management\u002Fmeasuring-real-world-http3-gains\u002Findex","29CFkcPFJ1379HHBsvILVjZaykKTOBGTvEqdoaLTbco",[983,987],{"title":984,"path":985,"stem":986,"children":-1},"Diagnosing Head-of-Line Blocking","\u002Fnetwork-protocol-optimization\u002Fhttp2-http3-and-connection-management\u002Fdiagnosing-head-of-line-blocking","network-protocol-optimization\u002Fhttp2-http3-and-connection-management\u002Fdiagnosing-head-of-line-blocking\u002Findex",{"title":988,"path":989,"stem":990,"children":-1},"Why Domain Sharding Hurts on HTTP\u002F2","\u002Fnetwork-protocol-optimization\u002Fhttp2-http3-and-connection-management\u002Fwhy-domain-sharding-hurts-on-http2","network-protocol-optimization\u002Fhttp2-http3-and-connection-management\u002Fwhy-domain-sharding-hurts-on-http2\u002Findex",1791308073476]