Walk a client past several access points and watch when it scans, when it roams and when it clings to a weak AP. Then switch on 802.11k, 802.11v and 802.11r and see what each one changes.
In Wi-Fi it's the client, not the network, that decides when to roam. Most clients wait until the signal from their AP drops below a roam trigger, then scan for something better and move only if a candidate beats the current AP by a margin, the hysteresis, so they don't bounce back and forth. The network can help: 802.11k gives the client a list of neighbouring APs so it scans fewer channels, 802.11v lets the AP suggest a better AP, and 802.11r (fast BSS transition) makes the move itself quicker.
The well-designed baseline: four APs evenly spaced with good overlap. First compare the clients: the eager client roams about when it should, the typical phone a few seconds later, and the sticky laptop skips AP 2 altogether. Then look at what each roam costs: with Enterprise (802.1X) every roam needs a new login, about 135 ms cut off; Personal (PSK) takes about 12 ms, and 802.11r about 6 ms. Pick a roam in section 3 to see the frames.
A realistic office floor, and a lesson in sticky clients and 802.11v. With the default settings the phone roams 4 times, each one nudged by the AP. Switch 802.11v off and it roams later: its time on a much weaker AP more than doubles, and it never makes the last move back to AP 1. The sticky laptop ignores every suggestion and spends the whole walk on AP 1; AP 1 never drops below its −80 dBm trigger, so it never even scans. Only the eager client bothers with the centre AP.
Between 35 and 53 m the corridor runs through a lift and stair lobby. Each concrete wall with its fire door costs about 15 dB, so in there even the best AP is only about −74 to −83 dBm, and every scan finds nothing better. Switch 802.11k off and each of those scans becomes a full scan of every channel, about 2 s away from the AP just when the signal is weakest: the phone's time spent scanning jumps from 0.4 s to about 7 s. Drag scan again every to 2 s and it scans 7 times crossing the lobby; with 802.11v also off, 15 s means it roams only after it has left.
You pace 4 m back and forth halfway between two APs, hearing both at about −71 dBm. With each client's own hysteresis (5 to 12 dB) nobody bounces. Drag the hysteresis down to 2 or 3 dB and the phone and the eager client start flipping between the two; each bounce is marked ⇄. The sticky laptop never even looks: its trigger is −80 dBm.
Pick an event (or click its marker under the timeline) to see the frames exchanged and how long the client was cut off.
↗ opens a term's full entry in the Wi-Fi Glossary, which explains over 400 Wi-Fi terms with their IEEE 802.11 references.