Networking · Wireless Networking

Rate Adaptation and How a Station Chooses Its MCS

How a transmitter infers channel quality it cannot measure, why the retry count is a noisy signal, and what the probe-then-fallback strategies cost.

The transmitter decides the modulation and coding scheme for every frame, and the receiver is the only party that knows how good the channel is at that moment. There is no in-band field in which the receiver can tell the transmitter what it measured, at least not in the original frame exchange. Rate selection is therefore an inference problem: the transmitter picks a rate, observes whether the frame was acknowledged, and updates its belief. Everything about the mechanism follows from the fact that the observation is one bit and it arrives late.

What an MCS specifies

A modulation and coding scheme names a modulation order and a coding rate together. The legacy 5 GHz PHY defines eight schemes, from binary phase-shift keying at rate 1/2, which carries 6 Mbit/s in a 20 MHz channel, to 64-quadrature amplitude modulation at rate 3/4, which carries 54 Mbit/s. The high-throughput amendment renumbers these as MCS indices 0 through 7 for a single spatial stream in a 20 MHz channel and extends the table to 31 by grouping eight indices per spatial stream; the high-efficiency amendment defines its own table of 12 schemes per stream, indexed 0 through 11.

The numbers matter because the step between adjacent schemes is not uniform in how much signal-to-noise ratio it demands. Going from 6 to 9 Mbit/s keeps BPSK and raises the coding rate from 1/2 to 3/4; going from 9 to 12 Mbit/s changes the modulation to QPSK at rate 1/2; going from 36 to 48 Mbit/s raises the modulation from 16-QAM to 64-QAM while lowering the coding rate from 3/4 to 2/3 — the tables are designed so that each step requires roughly 1 to 3 dB more signal-to-noise ratio at a given error rate. A rate controller that jumps several steps at once can overshoot into a region where the frame error rate is near one, and the cost of that mistake is a lost frame plus a contention window doubling.

The lowest rate in the basic rate set is special. Management frames, beacons, and the frames of the reservation handshake are sent at it, because every station in the cell must be able to decode them. It is also the rate a station falls back to when it has lost confidence in the channel.

The information a transmitter actually has

Four sources of evidence are available, and each is biased in a different way.

The acknowledgement is the primary signal. A frame that is acknowledged arrived intact; a frame that is not acknowledged either collided or was corrupted. The transmitter cannot distinguish the two, which is the central difficulty. In a busy cell, most losses are collisions, and treating them as channel degradation drives the rate down for no reason. In a quiet cell at long range, most losses are corruption, and treating them as collisions keeps the rate too high and wastes airtime on frames that never arrive.

The retry count is a coarse quantiser of that evidence. 802.11 allows a configurable retry limit, commonly 4 or 7 for a data frame. A frame that succeeds on the first attempt is a strong positive signal; one that succeeds on the third is ambiguous; one that exhausts the limit is a strong negative signal but arrives only after the airtime has been spent.

Request-to-send and clear-to-send frames provide a second channel estimate. The CTS is sent at the same rate as the RTS, so its successful reception says the reverse channel is at least good enough for that rate. Since the two directions of an indoor link are approximately reciprocal at the same frequency, this is genuinely informative. The handshake costs airtime, which is why using it purely as a probe is uncommon except at the highest rates.

Explicit feedback exists in later amendments. The high-throughput amendment defines a sounding exchange in which a station returns a compressed beamforming report describing the channel it observes, and later amendments add channel-quality reporting so that a station can state the margin it sees rather than leaving the transmitter to infer it from outcomes. Where feedback is available it converts inference into measurement; where it is not, the controller falls back to counting outcomes. In practice a station uses feedback when the AP solicits it and outcome counting otherwise, so both mechanisms coexist in one driver.

Probe, then fall back

The simplest effective strategy is to run at a rate slightly above what the evidence supports, and step down on failure. The reasoning is that the cost of a failed frame is one frame duration plus a backoff, while the benefit of the higher rate, if it works, is a shorter frame for every subsequent frame at that rate. If the channel is stable, probing occasionally costs little and finds the ceiling; if the channel is not stable, the controller spends its time oscillating.

The counter-strategy is to run below the ceiling and step up on a run of successes. That avoids losses, which matters for latency-sensitive traffic, but leaves capacity unused and, in a cell with several stations, hands airtime to competitors.

Most deployed controllers are hybrids with an explicit threshold. A typical shape: track a smoothed success ratio per rate; after ten consecutive successes at the current rate, attempt the next higher rate once; if that attempt fails, return and require a longer run before trying again; after two consecutive failures at the current rate, drop one step immediately. The constants differ between drivers, and none of them is in the standard.

/* A minimal rate controller: success-run probing with immediate fallback. */
struct rc {
    int mcs;            /* current index into the rate table */
    int max_mcs;
    int streak;         /* consecutive first-attempt successes */
    int penalty;        /* successes required before the next probe; start at 2 */
};

void rc_on_outcome(struct rc *r, int acked_first_attempt)
{
    if (!acked_first_attempt) {
        r->mcs = r->mcs > 0 ? r->mcs - 1 : 0;
        r->streak = 0;
        r->penalty = r->penalty < 32 ? r->penalty * 2 : 32;
        return;
    }
    if (++r->streak >= r->penalty && r->mcs < r->max_mcs) {
        r->mcs++;              /* probe upward; a failure doubles the wait */
        r->streak = 0;
    }
}

Two properties of this shape are worth naming. The downward step is unconditional and immediate, so the controller reacts to a real degradation within one frame. The upward step is rate-limited by a penalty that doubles on failure, so a rate that fails repeatedly is retried rarely, which bounds the airtime lost to probing. Neither property requires knowing why the frame failed.

The slow-client problem in reverse

A rate controller that reacts to lost acknowledgements cannot tell a collision from a fade, and in a dense cell it will misattribute. The result is a controller that lowers its rate under congestion, which lengthens its frames, which occupies more airtime, which raises the collision probability for everyone including itself. The feedback loop is unstable in the direction of low rates.

Access points often mitigate this by tracking per-station statistics and by using the retry count at the first attempt only, since a retry that succeeds at a lower rate says something about the channel while a retry that succeeds at the same rate says the collision was transient. Some controllers also consult the received signal strength reported for the station’s frames, which distinguishes a station at the edge of coverage from a station in the middle of a crowd. The former should run at a low rate; the latter should not.

The pathological case is the station whose rate is low, whose frames are long, and whose presence consumes a disproportionate share of the cell’s airtime. It is a scheduling problem as much as a rate problem, and it is treated in Airtime fairness and the slow-client problem.

Spatial streams and the width of the choice

Multiple-input multiple-output turns one rate decision into several. With two spatial streams a station can send two independent streams at the same MCS, or use a lower MCS on the second stream if the channel supports it unevenly. The number of streams is itself a choice, and it is constrained by what the receiver can separate, which depends on the rank of the channel matrix rather than on signal strength alone. A strong signal with a low-rank channel supports fewer streams than a weaker signal with a rich scattering environment.

The controller therefore chooses a triple: width, stream count, and MCS index. Width is usually decided by the association and by channel availability rather than per frame, because changing it mid-stream means changing the primary channel and renegotiating. Stream count and MCS are per-frame decisions in principle, and per-station in most implementations.

Why the standard does not specify the algorithm

802.11 defines the rate table and the feedback formats but leaves selection to the implementation. The reason is that the right trade depends on traffic: a bulk transfer wants the highest sustainable rate even at a few percent loss, while a voice call wants a rate at which the loss is near zero even if that rate is half. A single normative algorithm could not serve both, and the standard instead provides the signalling that lets an implementation measure.

The consequence for anyone operating a network is that two vendors’ stations in the same conditions can settle on different rates, and the difference is a policy choice rather than a fault. It also means that a link’s reported rate is a claim about the modulation used for the last frame, not a measurement of achievable throughput, which is why the quantity that matters for planning is airtime consumed rather than the number in a status display. Airtime is computed from frame duration, which depends on the rate and on the aggregation decisions described in A-MPDU aggregation and block acknowledgement.

References

  1. IEEE 802.11: Wireless LAN Medium Access Control (MAC) and Physical Layer (PHY) Specifications — IEEE
  2. IEEE 802.11n: Enhancements for Higher Throughput — IEEE
  3. IEEE 802.11ac: Enhancements for Very High Throughput for Operation in Bands below 6 GHz — IEEE
  4. 802.11 Wireless Networks: The Definitive Guide — Matthew Gast, O'Reilly