연결과 로밍
설정에서 와이파이를 켜면 몇 초 뒤 목록이 뜨고, 이름을 누르면 1~2초 만에 연결된다. 그 사이 공중에서는 열 개가 넘는 프레임이 오간다. 거실에서 안방으로 걸어가면 휴대폰은 언젠가 더 가까운 공유기로 갈아탄다. 그런데 왜 꼭 신호가 나빠질 대로 나빠진 뒤에야 갈아탈까? 이 장은 실제 단말 소프트웨어(wpa_supplicant)의 코드를 근거로 그 과정을 따라간다.
- 수동 스캔과 능동 스캔의 차이, 전체 스캔에 몇 초가 걸리는 이유를 계산한다.
- 연결 과정(프로브 → 인증 → 연결 → 4단계 핸드셰이크 → DHCP)을 프레임 순서로 말할 수 있다.
- 단말이 로밍을 결정하는 규칙과 “끈적한 단말”이 생기는 이유를 안다.
- 802.11k·v·r이 로밍의 어느 단계를 줄이는지 구분한다.
스캔: 목록이 뜨기까지
단말이 주변 네트워크를 찾는 방법은 둘이다.
- 수동 스캔: 채널마다 머물며 비컨(102.4 ms마다)을 기다린다. 한 채널에 최소 100 ms 남짓 머물러야 한다.
- 능동 스캔: 채널에 가자마자 프로브 요청을 보내고 AP들의 프로브 응답을 기다린다. 훨씬 빠르지만, 먼저 전파를 내도 되는 채널에서만 쓸 수 있다. 레이더 보호가 필요한 DFS 채널(2장)에서는 비컨을 듣기 전까지 보낼 수 없어 수동 스캔을 한다.
6 GHz는 채널이 너무 많아 다른 길을 쓴다. AP가 2.4·5 GHz 비컨 안에 “나는 6 GHz 몇 번 채널에도 있다”는 RNR(Reduced Neighbor Report)을 넣어 알려 주고, 단말은 스캔할 때 PSC 15개 채널(2장)만 직접 살핀다.
처음 온 건물에서 회의에 들어가려면 층마다 다니며 문 앞 안내판(비컨)을 보거나, 복도에서 “여기 ○○ 회의 있어요?”라고 묻는다(프로브). 회의를 고르면 사회자에게 이름을 대고(인증·연결), 출입증을 받는다(4방향 핸드셰이크). 걸어 다니다 더 가까운 회의실로 옮기는 것이 로밍이다.
전체 스캔에 걸리는 시간
채널당 시간: Linux net/mac80211/scan.c의 IEEE80211_PROBE_DELAY = HZ / 33, IEEE80211_CHANNEL_TIME = HZ / 33, IEEE80211_PASSIVE_CHANNEL_TIME = HZ / 9 · PSC: 2장 계산(cfg80211_channel_is_psc())
연결 버튼을 누른 뒤
연결은 네 단계다. 이름은 헷갈리지만 각각 하는 일이 다르다.
- 인증(Authentication): 이름과 달리 WPA2에서는 형식뿐인 “열린 인증” 두 프레임이다. 진짜 비밀번호 확인은 뒤의 4단계 핸드셰이크에서 한다. WPA3-Personal은 여기서 SAE로 비밀번호를 직접 증명한다(10장).
- 연결(Association): 단말이 자기 능력(지원 속도, HT/VHT/HE, 보안 방식)을 알리고 AP가 연결 번호(AID)를 준다.
- 4단계 핸드셰이크: EAPOL-Key 프레임 네 개로 이번 연결에 쓸 암호 키를 만든다(10장). 회사 망(802.1X)은 그 전에 EAP로 사용자 인증을 한다.
- DHCP: 이제 데이터 프레임이 오갈 수 있으니 IP 주소를 받는다. 이것은 와이파이가 아니라 IP 계층의 일이다.
연결 과정 따라가기
상태 기계: wpa_supplicant wpa_supplicant/events.c, src/rsn_supp/wpa.c(4단계 핸드셰이크), src/rsn_supp/wpa_ft.c(FT) · 프레임 종류: 7장
로밍: 언제 갈아탈까
와이파이에서 로밍은 단말이 결정한다. AP는 “나가 줄래?”라고 권할 수는 있어도 붙잡거나 넘길 수 없다. 단말은 연결 중에 가끔 배경 스캔을 하고, 같은 SSID의 다른 BSS가 충분히 좋아 보이면 옮긴다. “충분히”가 어느 정도인지가 핵심이다. 리눅스와 안드로이드가 쓰는 wpa_supplicant의 규칙은 대략 이렇다.
- 지금 신호의 SNR이 25 dB보다 좋으면 옮기지 않는다(잡음 −95 dBm 기준 신호 −70 dBm보다 강함).
- 그렇지 않으면, 새 후보가 지금보다 몇 dB 이상 강해야 옮긴다. 그 기준은 지금 신호가 나쁠수록 작다: −70 dBm 이상이면 5 dB, −75까지 4 dB, −80까지 3 dB, −85까지 2 dB, 그보다 나쁘면 1 dB.
- 배경 스캔은 신호가 기준(예: −65 dBm)보다 나쁘면 짧은 간격(예: 30초), 좋으면 긴 간격(예: 300초)으로 한다.
규칙만 보면 합리적이지만, 걸어가며 신호가 서서히 나빠지는 상황에서는 결과가 기대와 다르다. 아래에서 직접 걸어 보자.
로밍 판단: wpa_supplicant wpa_supplicant/events.c의 wpa_supplicant_need_to_roam_within_ess()(min_diff 표, GREAT_SNR = 25는 scan.h) · 배경 스캔: wpa_supplicant/bgscan_simple.c, 설정 예 bgscan="simple:30:-45:300"(wpa_supplicant.conf)
복도를 걸으며 로밍하기
로밍을 빠르게: 802.11k·v·r
로밍은 세 부분으로 나뉜다. 어디로 갈지 찾기(스캔), 언제 갈지 정하기(판단), 옮겨 가기(재연결과 키 교환). 세 개정안이 하나씩 맡는다. 셋을 묶어 Wi-Fi Alliance는 “Voice-Enterprise”·“Agile Multiband” 같은 인증을 만들었다.
| 개정안 | 줄이는 것 | 방법 |
|---|---|---|
| 802.11k (무선 자원 측정) | 스캔 시간 | AP가 이웃 보고서(Neighbor Report)로 같은 ESS의 이웃 AP와 그 채널을 알려 준다. 단말은 전체 스캔(수 초) 대신 그 몇 채널만 본다. |
| 802.11v (무선 네트워크 관리) | 판단 지연 | AP가 BSS 전환 관리 요청(BTM Request)으로 “이 AP로 옮겨 달라”고 권한다. 따를지는 단말이 정한다. 위 시뮬레이터의 체크 상자. |
| 802.11r (빠른 BSS 전환, FT) | 옮기는 시간 | 처음 연결할 때 만든 키 계층을 같은 이동 도메인의 AP들이 나눠 가져, 옮길 때 인증·연결 프레임 안에서 키 교환을 끝낸다. 4단계 핸드셰이크와(엔터프라이즈라면) EAP가 빠진다. |
hostapd 설정: rrm_neighbor_report(11k), bss_transition(11v), mobility_domain·ieee80211r(11r) — hostapd/hostapd.conf · 단말의 BTM 처리: wpa_supplicant wnm_sta.c
메시 공유기 세 대를 설치했는데, 거실 휴대폰이 여전히 멀리 있는 현관 공유기에 붙어 있다. 공유기 앱에서 무엇을 켜면 가장 직접적인 도움이 될까?
단말이 “지금 신호도 그럭저럭 괜찮다”고 판단해 옮기지 않는 상황이다.
핵심 정리
- 능동 스캔(프로브)은 채널당 약 60 ms, DFS 채널의 수동 스캔은 약 110 ms. 모든 대역 전체 스캔은 수 초가 걸린다. 6 GHz는 RNR과 PSC로 찾는다.
- 연결 = 인증(WPA2는 형식, WPA3는 SAE) → 연결(능력·AID) → 4단계 핸드셰이크(키) → DHCP(IP).
- 로밍은 단말이 정한다. wpa_supplicant는 SNR 25 dB 이상이면 옮기지 않고, 그 아래에서는 신호가 나쁠수록 작은 차이(5 → 1 dB)로도 옮긴다.
- 배경 스캔 간격과 이 규칙 때문에 단말은 중간 지점을 지나서야 옮기기 쉽다(끈적한 단말).
- 11k(이웃 보고서) = 찾기, 11v(BTM) = 권하기, 11r(FT) = 빨리 옮기기.
확인 퀴즈
DFS 채널에서 단말이 프로브 요청을 바로 보낼 수 없는 이유는?
WPA2-Personal에서 비밀번호가 맞는지 실제로 확인되는 단계는?
지금 신호가 −68 dBm(잡음 −95 dBm)이다. 후보 AP가 −60 dBm으로 보인다. wpa_supplicant 규칙으로는?
802.11r(FT)이 줄이는 것은?