ProvenRigReceipts
Bufferbloat fixes, tested

The lag fix everyone copies works. Here's the price your speed test won't show.

Tested September 14, 24 and 29, 2026

The fix comment sections keep recommending, turning off Windows' TCP receive-window auto-tuning, took my connection from an F to an A in every test I ran with it. An independent probe confirmed the lag spikes really shrank. The price: downloads that use a single connection got 13 to 21 times slower. So I switch it on to play and back off when I'm done.

43valid Waveform tests
9 of 9A grades with auto-tuning disabled
9,718independent probe packets timed
13–21×slower single-connection downloads
Run 40: stock settings (IPv6 on, auto-tuning normal). F, +491 ms.
Run 40: stock settings (IPv6 on, auto-tuning normal). F, +491 ms.
Run 43: same settings as Run 40, auto-tuning disabled. A, +8 ms.
Run 43: same settings as Run 40, auto-tuning disabled. A, +8 ms.

Test it yourself

  1. Run Waveform's bufferbloat test three times with nothing else downloading. Write down the grade and the Upload Active number each time.
  2. Open an admin terminal: right-click Start, then Terminal (Admin).
  3. Turn auto-tuning off:
    netsh int tcp set global autotuninglevel=disabled
  4. Run the test three more times. If it didn't help, change it back (step 5) and stop.
  5. When you're done playing, turn it back on. While it's off, single-connection downloads can be 13–21× slower.
    netsh int tcp set global autotuninglevel=normal
  6. Not sure which mode you're in? Run this and check "Receive Window Auto-Tuning Level":
    netsh int tcp show global

IPv6 isn't in these steps on purpose. Microsoft warns against turning it off; see the IPv6 card below before you try it.

The claims, one by one

Measured

A gigabit fiber line can still get an F

Before I changed anything, Waveform's free bufferbloat test gave my 1 Gig fiber connection an F. Sitting idle, it answered in 7 ms. While uploading, the delay went up by 492 ms, almost half a second. Waveform's own verdict: "Calls and games will struggle while anything downloads." The test measures how much extra delay piles up when the line is busy. It is not your ping to a game server.

Sep 14, before any change: F, +492 ms upload.
Sep 14, before any change: F, +492 ms upload.
Fell apart

Turning off Nagle's algorithm did nothing

A one-click "optimize network" button took me from F to C (+492 to +121 ms). One test before and one after isn't proof, so I switched just Nagle's algorithm (and delayed ACKs) on and off for seven more runs, the last after a full reboot. All seven were C. Tweak on averaged +139 ms (Runs 1-3), tweak off +131 ms (Runs 4-6), and the reboot run was the best of all at +87 ms. The run-to-run noise was bigger than any on/off difference. The button changed other settings too, and those stayed on, so this rules out Nagle, not the whole button.

Sep 14, after a one-click "optimize network" button: C, +121 ms.
Sep 14, after a one-click "optimize network" button: C, +121 ms.
Fell apart

Network card power saving wasn't it either

Resetting my network settings to Windows defaults brought the F straight back (Runs 8 and 10: +503 and +917 ms) and roughly halved my upload speed, from about 436 to about 225 Mbps. That let me put things back one at a time. First suspect: the network card's power saving. I turned off the 4 visible settings, then all 14 values plus a reboot. Four more F's (Runs 11-14, +404 to +606 ms). Run 9 graded A but is invalid; see the run table.

Held up

Turning off IPv6 moved it from F to C/D, on my line

The reset had also switched IPv6 back on (it had been switched off on my network card before). I unchecked it again: next test a C, and upload speed back near 400 Mbps. Then I flipped it back and forth. IPv6 on: 9 of 9 F, upload +404 to +917 ms. IPv6 off: 5 of 5 C or D, +129 to +285 ms. The two ranges never overlap. During the flip runs (17-22) a traffic logger confirmed which protocol each test actually used. Microsoft warns against this: "We don't recommend that you disable IPv6 or IPv6 components or unbind IPv6 from interfaces. If you do, some Windows components might not function." It's a non-standard setup, so test it and undo it if it doesn't help.

Source: Microsoft Learn: Configure IPv6 for advanced users

Didn't work

Microsoft's recommended alternative didn't fix it, in Chrome

Microsoft recommends setting Windows to prefer IPv4 instead of switching IPv6 off. I set it and confirmed it took effect after a reboot. Still an F (Run 23, +448 ms). Waveform's test runs against speed.cloudflare.com, which has both IPv4 and IPv6 addresses, and Chrome's connection log showed it connecting over IPv6 (2606:4700:7::da) anyway. Chrome picks its own address and didn't follow the Windows setting. Only one run under this setting is valid (Run 24 stalled), so the log carries this one: it shows why it failed, not just that it did. That traffic log isn't in the downloads below; its readings are summarized here.

Source: Microsoft Learn: Configure IPv6 for advanced users

Held up

Disabling TCP auto-tuning: an A in 9 of 9 runs

The fix that kept showing up in the comment sections, in 4 of the 8 I read: netsh int tcp set global autotuninglevel=disabled. I tested it the same way as everything else, alternating, three runs each. Normal: D, C, C (+83 to +201 ms). Disabled: A, A, A (+0 to +9 ms). In those runs Waveform's own download speed didn't drop (852 to 880 Mbps disabled vs. 712 to 791 normal). It swung more in later runs (381 to 836 Mbps disabled), and upload speed varied throughout. Counting every run I did with it disabled, IPv6 on or off: 9 of 9 A.

netsh int tcp set global autotuninglevel=disabled
Run 31: IPv6 off, auto-tuning normal. C, +121 ms.
Run 31: IPv6 off, auto-tuning normal. C, +121 ms.
Run 32: IPv6 off, auto-tuning disabled. A, +6 ms.
Run 32: IPv6 off, auto-tuning disabled. A, +6 ms.
Fell apart

The "keeps your speed" version, highlyrestricted, did nothing

Some commenters say to use highlyrestricted instead, because it supposedly keeps your speed. Three runs, three C's (+111 to +126 ms), right inside the normal setting's range. No better than doing nothing.

Held up

It's not the test being fooled

Waveform grades itself, so I ran my own check during 12 of the runs. A small probe on my PC sent tiny UDP DNS queries and pings to Cloudflare (1.1.1.1, or its IPv6 address with IPv6 on) about 4.5 times a second and timed every one. It goes through the same router queue. During the upload phase with IPv6 off and auto-tuning normal, packets typically picked up +48 to +62 ms, about 1 in 4 (68 of 292) got more than +100, and the worst got stuck for +310 to +435. With it disabled, typically +6 to +11, and out of 408 packets the very worst was +31. With IPv6 on, the worst packets on normal waited +764 to +960 ms, almost a full second; disabled, the worst of 417 was +36. Even the worst packet with the fix beat the typical packet without it, on both IPv6 settings. The typical (median) delay fell by 42 to 51 ms with IPv6 off. That's just under the 50 ms bar I set before testing in 2 of 3 pairs, so on the median alone the honest verdict is "couldn't tell." The spikes, which are what you feel as lag, are the clean result. The table also gives each run's 95th percentile (the 1-in-20 bad packet). Limitation: Cloudflare isn't a game server.

Upload-phase added delay for every probe packet, IPv6 off (Runs 34-39). Each dot is one packet. Solid line = median, dashed = 95th percentile. auto-tuning normal auto-tuning disabled (each column is also labeled)
0100200300400500msp95 +238Run 34normalp95 +15Run 35disabledp95 +241Run 36normalp95 +10Run 37disabledp95 +220Run 38normalp95 +11Run 39disabled
Upload-phase added delay for every probe packet, IPv6 on (Runs 40-45). Each dot is one packet. Solid line = median, dashed = 95th percentile. auto-tuning normal auto-tuning disabled (each column is also labeled)
02004006008001000msp95 +811Run 40normalp95 +30Run 41disabledp95 +618Run 42normalp95 +17Run 43disabledp95 +673Run 44normalp95 +22Run 45disabled
RunSettingMedianp95Worstn
IPv6 off (Runs 34-39)
Run 34normal+62+238+31089
Run 35disabled+11+15+21131
Run 36normal+52+241+435103
Run 37disabled+6+10+13138
Run 38normal+48+220+340100
Run 39disabled+6+11+31139
IPv6 on (Runs 40-45)
Run 40normal+243+811+83046
Run 41disabled+19+30+36155
Run 42normal+277+618+76447
Run 43disabled+6+17+30132
Run 44normal+375+673+96042
Run 45disabled+15+22+28130

Added delay in ms during the upload phase. p95 = the 1-in-20 bad packet. n = packets timed in that phase.

Measured

The price: single-connection downloads get 13 to 21 times slower

One of the videos I watched warns this command limits your bandwidth. I wanted to know which downloads, and by how much. So I downloaded a 100 MB file over a single connection with curl (20-second cap), auto-tuning normal and then disabled, alternating, from servers at three distances. Disabled caps every single-connection download, and the farther away the server, the lower the cap. Every pair repeated almost exactly. The full curl output wasn't saved; the speeds below are from the test log. A Cloudflare server was also tried and refused curl (HTTP 403), so it isn't counted.

One 100 MB download over a single connection, two tries each way.
Ashburn, VA ~40 ms away15.5–21.1× slower
normal420.3–571.2 Mbps
disabled27.1 Mbps
Hillsboro, OR ~100 ms away15.4–19.1× slower
normal113.8–139.1 Mbps
disabled7.3–7.4 Mbps
Falkenstein, Germany ~150 ms away12.7× slower
normal55.9 Mbps
disabled4.4 Mbps
Measured

Why your speed test doesn't show the price

During one Waveform run I logged Chrome's open connections every half second. The test held 6 to 7 connections at once to speed.cloudflare.com, 13 in total over about a minute. Spread across several connections to a nearby server, a per-connection cap barely shows. A lot of big downloads use just one connection, and that's where you pay.

Chrome's open connections to speed.cloudflare.com (162.159.140.220), sampled every 0.5 s. Peak 7 at once, 13 in total, 13:41:30 to 13:42:34.
02468any other host: never more than 313:41:2713:43:29
Measured

Do you need both fixes? For lag, no

Every valid run since the network reset, sorted by the two settings (the Nagle-era runs and the prefer-IPv4 and highlyrestricted runs are left out). Auto-tuning disabled alone took an IPv6-on F to an A. IPv6 off still matters when auto-tuning is back on normal: that's the difference between an F and a C or D. What I run now: auto-tuning disabled before I play, normal after, through two desktop shortcuts. Credit to a commenter under another bufferbloat video who suggested exactly this toggle; I just measured whether it's worth it. I don't know why a setting for incoming data fixes upload lag. I tested that it does, and I'm not going to make up a reason.

Every run

Every graded test I ran, in order, including the invalid ones and the ones that disproved my first theory. Delays are added on top of the idle ping, in ms; speeds are Waveform's, in Mbps. Each result link opens the original Waveform result page. Blank cells weren't logged.

Sep 14: the first test, and the button that seemed to fix it

One test before and one after a one-click "optimize network" button. The button changed several network settings at once.

RunTimeWhat changedIPv6Auto-tuningGradeIdle+Down+UpMbps ↓/↑Result
Sep 14 before11:56Before any change
IPv6 state wasn't recorded on Sep 14. A snapshot taken before the Sep 24 network reset shows it switched off by then; when it was switched off can't be dated.
Not recordednormalF7+16+492315.9 / 236.2Waveform
Sep 14 after12:13After the one-click buttonNot recordednormalC11+24+121609.7 / 432.2Waveform

Sep 24, Runs 1-7: Nagle's algorithm on vs. off

Only Nagle's algorithm and delayed ACKs were switched. The button's other changes stayed on. Run 7 came after a full reboot.

RunTimeWhat changedIPv6Auto-tuningGradeIdle+Down+UpMbps ↓/↑Result
Run 1Nagle off (tweak on)
Runs 1-6 were logged without times; result links matched by order.
OffnormalC+17+156Waveform
Run 2Nagle off (tweak on)OffnormalC+16+140Waveform
Run 3Nagle off (tweak on)OffnormalC+22+121Waveform
Run 4Nagle on (tweak off)OffnormalC+15+116Waveform
Run 5Nagle on (tweak off)OffnormalC+18+123Waveform
Run 6Nagle on (tweak off)OffnormalC+14+153Waveform
Run 713:51Nagle on (tweak off), after a full rebootOffnormalC+15+87– / 436Waveform

Sep 24, Runs 8-16: network reset, then one change at a time

A network reset put everything back to Windows defaults, which switched IPv6 back on. Network card power saving was restored first (Runs 11-14), then IPv6 was switched off (Runs 15-16).

RunTimeWhat changedIPv6Auto-tuningGradeIdle+Down+UpMbps ↓/↑Result
Run 814:08After network reset (IPv6 back on)OnnormalF10+18+503580.5 / 223.5Waveform
Run 914:11Same as Run 8
Invalid. Upload only reached 53.6 Mbps, about a tenth of normal, so the upload never loaded the line and there was no queue to measure. The A is an artifact.
OnnormalA11+13+0536.9 / 53.6Waveform
Run 1014:18Same as Run 8OnnormalF10+17+917338.8 / 229.1Waveform
Run 1114:22Card power saving off (4 visible settings)OnnormalF11+18+404520.1 / 234.1Waveform
Run 1214:24Card power saving off (4 visible settings)OnnormalF9+35+448516.1 / 254.1Waveform
Run 1314:31All 14 power-saving values off, after a rebootOnnormalF8+29+481455.9 / 201.6Waveform
Run 1414:34All 14 power-saving values offOnnormalF10+15+606423.3 / 248.1Waveform
Run 1514:43IPv6 switched off
Result link matched by time as "likely" (4 minutes before the logged time).
OffnormalC9+15+152453.1 / 394.6Waveform
Run 1614:46IPv6 offOffnormalD10+14+210429.9 / 424.4Waveform

Sep 24, Runs 17-24: IPv6 flipped on and off, then Microsoft's alternative

IPv6 on (17-19), off (20-22), then IPv6 on with Windows set to prefer IPv4, Microsoft's recommended alternative (23-24). A traffic logger recorded which protocol carried each test.

RunTimeWhat changedIPv6Auto-tuningGradeIdle+Down+UpMbps ↓/↑Result
Run 1715:02IPv6 on
Over 99% of test traffic was IPv6. The upload warm-up hung first and needed a page reload.
OnnormalF10+18+721283.4 / 158.5Waveform
Run 1815:07IPv6 on
Over 99% IPv6. The upload warm-up hung once and needed a reload.
OnnormalF9+17+578596.9 / 238Waveform
Run 1915:09IPv6 on
Over 99% IPv6.
OnnormalF9+37+477490.2 / 263.6Waveform
Run 2015:11IPv6 off
100% IPv4.
OffnormalC9+5+129298.1 / 459.6Waveform
Run 2115:14IPv6 off
100% IPv4.
OffnormalD9+15+285730.3 / 446.4Waveform
Run 2215:16IPv6 off
100% IPv4.
OffnormalD9+16+219748.1 / 452.5Waveform
Run 2315:22IPv6 on, Windows set to prefer IPv4
The upload phase ran essentially 100% over IPv6 despite the prefer-IPv4 setting.
On, prefer IPv4normalF9+22+448523.6 / 246.8Waveform
Run 2415:27IPv6 on, Windows set to prefer IPv4
Invalid. Upload stalled at 16.1 Mbps (the IPv6 warm-up hang), so the line was never loaded. Same failure as Run 9.
On, prefer IPv4normalA+0+0526.3 / 16.1Waveform

Sep 29, Runs 25-33: TCP auto-tuning, three settings, alternating

IPv6 off. Order fixed before testing: normal, disabled, highlyrestricted, three rounds. No stopping early, no added runs.

RunTimeWhat changedIPv6Auto-tuningGradeIdle+Down+UpMbps ↓/↑Result
Run 2511:53Auto-tuning normalOffnormalD10+16+201791.2 / 445.3Waveform
Run 2611:56Auto-tuning disabledOffdisabledA8+8+9852.2 / 734.6Waveform
Run 2711:58Auto-tuning highlyrestrictedOffhighlyrestrictedC8+17+124838.8 / 475.7Waveform
Run 2812:00Auto-tuning normalOffnormalC8+17+83771.4 / 421.6Waveform
Run 2912:04Auto-tuning disabledOffdisabledA9+9+0875.8 / 363.7Waveform
Run 3012:06Auto-tuning highlyrestrictedOffhighlyrestrictedC10+21+126775.4 / 461.9Waveform
Run 3112:08Auto-tuning normalOffnormalC8+16+121711.9 / 436.7Waveform
Run 3212:11Auto-tuning disabledOffdisabledA8+8+6879.8 / 797.1Waveform
Run 3312:13Auto-tuning highlyrestrictedOffhighlyrestrictedC8+16+111817.9 / 447.6Waveform

Sep 29, Runs 34-39: auto-tuning with an independent probe (IPv6 off)

Normal and disabled, alternating, while the probe timed small UDP and ping packets through the same router queue.

RunTimeWhat changedIPv6Auto-tuningGradeIdle+Down+UpMbps ↓/↑Result
Run 3412:22Auto-tuning normalOffnormalC9+17+124662.3 / 420.8Waveform
Run 3512:24Auto-tuning disabledOffdisabledA8+1+11389.5 / 913.7Waveform
Run 3612:27Auto-tuning normalOffnormalC8+16+149706.9 / 466.9Waveform
Run 3712:29Auto-tuning disabledOffdisabledA8+1+8380.7 / 776.5Waveform
Run 3812:32Auto-tuning normalOffnormalC8+27+122575.6 / 451.5Waveform
Run 3912:34Auto-tuning disabledOffdisabledA8+9+8836.4 / 737.8Waveform

Sep 29, Runs 40-45: auto-tuning with IPv6 on (stock Windows)

Same routine with IPv6 switched back on, the way most PCs ship. The probe ran over IPv6 and logged each run's protocol.

RunTimeWhat changedIPv6Auto-tuningGradeIdle+Down+UpMbps ↓/↑Result
Run 4013:12Auto-tuning normalOnnormalF9+17+491392.6 / 222.5Waveform
Run 4113:14Auto-tuning disabled
Waveform still flagged Low Latency Gaming at +21 ms despite the A. Run 45 cleared it at +16 ms.
OndisabledA9+0+21352.6 / 644.5Waveform
Run 4213:16Auto-tuning normalOnnormalF9+20+430606.8 / 243.4Waveform
Run 4313:18Auto-tuning disabledOndisabledA10+2+8318 / 215.5Waveform
Run 4413:27Auto-tuning normal
A separate test from Run 42; the identical download speed is a coincidence (different result links).
OnnormalF9+19+496606.8 / 247.1Waveform
Run 4513:29Auto-tuning disabledOndisabledA9+10+16688 / 600.6Waveform

Results that aren't counted

They exist, so they're listed.

Probe run windows

Each run's time window in its probe file, so anyone can rerun analyze.py and get the same numbers.

RunFileStartEnd
Run 342026-09-29-autotuning-probe-runs-34-39.csv12:19:3012:22:32
Run 352026-09-29-autotuning-probe-runs-34-39.csv12:22:4612:24:25
Run 362026-09-29-autotuning-probe-runs-34-39.csv12:24:4612:27:36
Run 372026-09-29-autotuning-probe-runs-34-39.csv12:27:4812:29:19
Run 382026-09-29-autotuning-probe-runs-34-39.csv12:29:3512:32:34
Run 392026-09-29-autotuning-probe-runs-34-39.csv12:32:4612:34:58
Run 402026-09-29-autotuning-ipv6-on-probe-runs-40-45.csv13:09:0013:12:14
Run 412026-09-29-autotuning-ipv6-on-probe-runs-40-45.csv13:12:2913:14:40
Run 422026-09-29-autotuning-ipv6-on-probe-runs-40-45.csv13:14:5913:16:41
Run 432026-09-29-autotuning-ipv6-on-probe-runs-40-45.csv13:16:5313:19:30
Run 442026-09-29-autotuning-ipv6-on-probe-runs-40-45.csv13:25:4113:27:25
Run 452026-09-29-autotuning-ipv6-on-probe-runs-40-45.csv13:27:4013:29:51

Method

Setup

Windows
Windows 11 Home 25H2, build 26200.9457
Browser
Chrome 153.0.8010.54 (Sep 24 runs), 154.0.8037.58 (Sep 29 runs)
Router
Google Nest Wifi Pro (G6ZUC), software 3.78.518349, read Sep 28 and again Sep 29. It auto-updates, so the Sep 24 version can't be confirmed.
Internet
Google Fiber, 1 Gig plan
Connection
PC wired to the router, 1 Gbps link
Sep 14 runs
May have been on an earlier Windows build

What I didn't test

Raw data

The files every number on this page is built from. Check my work. Each file opens as plain text; save it from your browser to keep a copy.

Probe samples, Runs 34-39 (IPv6 off)time, UDP DNS round trip to 1.1.1.1 (ms, -1 = timeout), ICMP ping (ms, -1 = lost), network card upload and download Mbps. About 4.5 samples per second.
Probe samples, Runs 40-45 (IPv6 on)Same columns, probing Cloudflare over IPv6, plus IPv4 and IPv6 packets per second, which proves each run's protocol.
Chrome connection log, one Waveform runChrome's open HTTPS connections every 0.5 s: time, remote address, local port.
probe.ps1The probe that produced the Runs 34-39 file. Read-only; it only measures.
probe6.ps1The IPv6 version of the probe (Runs 40-45).
conncount.ps1The connection logger. Read-only.
analyze.pyTurns a probe file into each run's idle baseline and upload/download added delay: python analyze.py <start> <end> <file>. The run windows are in the probe table below.