TCP Performance on 802.11ax vs 802.11ac: What Every Developer Should Know

TCP on 802.11ax vs 802.11ac

Here's the one-sentence version, free of charge: 802.11ax rewrites the airtime rulebook through OFDMA, resource unit scheduling and coordinated uplink access, so your TCP sessions behave far better in crowded, multi-client environments, but your single-stream peak numbers won't necessarily jump, and legacy fallback behavior will still bite you if you're not watching for it.

I spent decades teaching RF to students who wanted to skip straight to the sockets code. Fair enough. But you cannot write good networking software for Wi-Fi without understanding what happens below your socket API, down where electrons and radio waves do the actual carrying. So let's get into it.

Three things worth knowing before anything else

Link speed is a PHY number, not a TCP number. When your laptop reports "866 Mbps," that's MCS index, channel width and spatial stream count talking. Your actual TCP goodput will sit well below that, often by 40% to 60%, because of protocol overhead, contention, and retransmission cost.

Airtime is a shared, contested resource. Under legacy EDCA, one noisy or distant client with a terrible SNR can hog the medium for everyone else, because it takes longer to send the same bits. Your fast gigabit downlink pipe shrinks every time a neighbor's smart bulb decides to chat on channel 6.

Aggregation and retries decide your real-world throughput. A-MPDU and A-MSDU bundle frames together for efficiency, but lose one sub-frame in a big aggregate and you're retransmitting, sometimes triggering TCP-level retransmits on top of the MAC-layer retry. Head-of-line blocking at the Wi-Fi layer can masquerade as a TCP stall that has nothing to do with your congestion window.

What 802.11ax actually changes under the hood

This is where the real story lives, and it's worth slowing down for.

OFDMA splits a channel into Resource Units, letting the access point serve several clients simultaneously inside one transmission opportunity instead of handing the whole channel to one device at a time. For small packets and ACK traffic, this is enormous. Fewer clients are sitting around waiting their turn.

Uplink OFDMA and uplink MU-MIMO mean the AP can coordinate multiple clients sending data back at once, rather than every device fighting for the channel independently. TCP ACKs, which are small and frequent, finally get a fair shot instead of getting crushed in contention with everyone else's traffic.

BSS Coloring tags transmissions so nearby networks on the same channel can tell "this isn't for me" and reduce unnecessary deference. In apartment buildings and conference halls stuffed with overlapping SSIDs, this alone can cut interference-driven packet loss meaningfully.

1024-QAM and longer OFDM symbols push more bits through good conditions, assuming your SNR cooperates. The catch: this modulation scheme is finicky. Move toward the edge of your cell and the radio drops to a lower, hardier MCS fast, so range gains aren't guaranteed just because the standard supports fancier modulation.

Target Wake Time lets devices negotiate scheduled wake periods, wonderful for battery-powered IoT gadgets, but if misconfigured or poorly supported by the client's TCP stack, it can introduce latency spikes exactly when your application expected a quick round trip.

Where TCP actually feels all this

TCP doesn't know about Resource Units. It only sees timing and loss, and it draws conclusions, sometimes the wrong ones.

RTT jitter is the big one. When RU scheduling assigns your client a slot every few milliseconds instead of letting it transmit whenever it wants, your round-trip timing becomes less predictable in the short term, even as it becomes fairer in aggregate. Congestion control algorithms that assume a stable RTT baseline, looking at you, older CUBIC implementations, can misread this jitter as a sign to back off.

Then there's the eternal headache: TCP cannot tell the difference between a lost packet because of radio interference and a lost packet because of actual network congestion. On wireless, loss is frequently a fluke of propagation, not a signal to shrink your congestion window. Without help, TCP throttles itself for the wrong reason.

Big aggregates compound this. The bigger your A-MPDU, the more efficient your airtime usage when things go well, and the more painful a single lost sub-frame becomes when they don't. You've built a beautiful train, and now one broken car stalls the whole thing.

And don't forget bufferbloat. APs and drivers love stuffing large queues to keep throughput numbers looking shiny in marketing benchmarks. TCP, true to its nature, will happily fill that queue until it hurts, and suddenly your "500 Mbps" link carries 300ms of latency under load.

The honest performance picture

In dense, multi-client scenarios, 11ax wins, and it's not close. Coffee shops, stadiums, apartment complexes, offices with forty laptops on one AP. OFDMA scheduling and uplink coordination produce lower tail latency and far fairer behavior across clients.

On a single device with a clean, high-SNR link, 11ax and 11ac often look remarkably similar. Peak throughput is still mostly a function of spatial streams and channel width, not the new scheduling tricks. Don't expect a dramatic jump just from an AX sticker on the box.

Small-packet, ACK-heavy workloads, think IoT sensors, VoIP, game state updates, benefit disproportionately from 11ax's uplink scheduling. Fewer collisions on tiny frames translates into fewer of those maddening little stalls.

At the edge of coverage, the story sours a bit. Those high-order modulation schemes are delicate, and when SNR drops, the radio falls back to safer, slower rates, erasing much of the theoretical advantage. Spectral efficiency helps most where interference is the problem, not distance.

And here's the part vendors don't put on the box: much of this depends entirely on firmware and scheduler quality. One AP's OFDMA implementation might be excellent; another's might barely function. Don't assume uniform gains just because two products both wear the 802.11ax badge.

Quirks that will trip you up

Mixed-mode networks are the silent killer here. Plenty of APs quietly disable AX-specific features when legacy 11n or 11ac clients join the same SSID, meaning your shiny AX-capable laptop might be getting treated like it's still running last decade's standard.

And scheduler logic is proprietary and opaque on almost every commercial AP. You cannot see how airtime fairness gets decided, which clients get priority RU assignments, or why one phone in the corner seems to be starved while another sails along. This is a black box, and you have to test around it rather than reason your way through it.

Building a real test plan

Don't trust vendor datasheets. Build your own matrix: single connection versus many concurrent, uplink versus downlink, multiple channel widths, a mix of client types including some older devices to simulate real deployments.

Collect more than just raw throughput. You want retransmit counts, RTT distribution at p50/p95/p99 (the tail is where the pain lives), airtime utilization per flow, and if your AP exposes it, actual RU and MCS assignment data.

Use iperf3 for controlled load generation, paired with tcpdump or Wireshark captures on both client and AP sides. Vendor diagnostic logs, when available, often reveal HE-specific scheduling details that standard packet captures miss entirely.

Fix your variables. Lock the channel, disable auto channel-hopping, isolate from neighboring interference where you can, and record firmware and driver versions religiously. A test you cannot reproduce next week is a test that taught you nothing.

What to actually change in your code

Now for the part that matters to you as a developer, because RF theory is lovely but you need to ship something that works.

Lean toward BBR or paced CUBIC for congestion control when your traffic rides over Wi-Fi with variable RTT. Pacing smooths your sends so they land more gracefully into whatever RU slot the scheduler hands you, rather than bursting and immediately triggering a queue backlog.

Get your socket buffer sizing right, enable SACK, make sure window scaling is on, and genuinely think through TCP_NODELAY versus Nagle's algorithm based on your actual write patterns. Chatty small-write applications suffer badly from ACK-heavy exchanges on contested airtime.

Set your MSS sensibly so you're not fragmenting awkwardly inside aggregated frames, and watch out for TSO/GSO/GRO offloads distorting the RTT values you think you're measuring, they can make your diagnostics lie to you.

Avoid application patterns that generate a flurry of tiny writes creating ACK storms. Coalesce at the application layer where your latency budget allows it.

When debugging seriously, temporarily disable large segment offloads to get an honest view of retransmits and real packet timing. Production is not the place to experiment with AP scheduling settings, but your lab certainly is.

And push for fair queuing and AQM, FQ_CoDel in particular, on any gateway or AP you control. Bufferbloat is still one of the ugliest, most underappreciated sources of latency spikes in TCP over Wi-Fi, and it has nothing to do with which 802.11 generation you're running.

The bold version, one more time

For crowded, multi-client environments, 802.11ax is a genuine leap forward for TCP behavior, lower latency variance, fairer airtime, better aggregate numbers, but go measure your specific vendor's implementation before you trust the marketing.

And for developers everywhere: a Wi-Fi standard upgrade is not a substitute for careful socket tuning. Test under real RF conditions, with real interference, real distance and real client mixes. That's the only way to close the gap between the radio signal and the bytes landing in your application buffer.

← Back to the blog