프레임 해부
와이어샤크로 와이파이를 잡아 보면 데이터보다 “데이터가 아닌 것”이 훨씬 많이 보인다. 비컨, 프로브, ACK, RTS, 블록 ACK… 이 장에서는 와이파이 프레임을 바이트 단위로 뜯어보며, 이더넷 프레임에는 없는 칸들이 왜 필요한지 하나씩 확인한다.
- 관리·제어·데이터 세 종류의 프레임과 대표 하위 종류를 구별한다.
- Frame Control 2바이트의 비트를 읽고, 그 비트가 머리말 길이를 어떻게 바꾸는지 안다.
- ToDS·FromDS에 따라 주소 칸 네 개의 의미가 어떻게 바뀌는지 설명한다.
- 비컨 안의 정보 요소(TLV)를 읽고, 비컨이 채널 시간을 얼마나 쓰는지 계산한다.
- 시퀀스 번호·Retry 비트와 FCS가 오류와 중복을 어떻게 걸러내는지 안다.
세 종류의 프레임
이더넷 프레임은 사실상 한 종류(데이터)다. 와이파이는 공기라는 불안정한 매체 위에서 연결을 맺고, 차례를 정하고, 확인 응답까지 해야 해서 세 종류가 있다.
| 종류(type) | 하는 일 | 대표 하위 종류(subtype) |
|---|---|---|
| 관리(management, 0) | 네트워크를 알리고 찾고 연결을 맺고 끊는다 | 비컨, 프로브 요청/응답, 인증, 연결 요청/응답, 연결 해제(Deauth·Disassoc), 액션 |
| 제어(control, 1) | 매체 사용을 돕는다. 몸통이 없거나 아주 짧다 | ACK, RTS, CTS, 블록 ACK 요청/블록 ACK, PS-Poll, 트리거(Wi-Fi 6) |
| 데이터(data, 2) | 위 계층(IP) 패킷을 나른다 | QoS 데이터(오늘날 거의 전부), Null·QoS Null(데이터 없이 절전 상태만 알림) |
종류·하위 종류 값과 Frame Control 비트 위치: Linux include/linux/ieee80211.h의 IEEE80211_FTYPE_*, IEEE80211_STYPE_*, IEEE80211_FCTL_*
머리말: 가변 길이의 이유
802.11 프레임은 Frame Control(2) · Duration(2) · 주소 1~3(각 6) · Sequence Control(2)로 시작하고, 상황에 따라 주소 4(6), QoS Control(2), HT Control(4)가 붙은 뒤 몸통과 FCS(4)가 온다. 기본 24바이트에서 최대 36바이트까지 바뀌고, ACK·CTS는 10바이트뿐이다. 어떤 칸이 있는지는 맨 앞 Frame Control이 알려 준다.
- Frame Control: 버전(2비트), 종류(2), 하위 종류(4), 그리고 플래그 8개: ToDS, FromDS, More Fragments, Retry(재전송), Power Management(이 프레임 뒤 절전에 들어감, 11장), More Data(AP에 아직 쌓인 데이터가 있음), Protected(몸통이 암호화됨, 10장), +HTC/Order(HT Control 칸이 있음).
- Duration: 이 프레임 뒤 교환이 끝날 때까지 남은 µs. 들은 기기는 NAV를 설정한다(6장).
- Sequence Control: 12비트 시퀀스 번호 + 4비트 조각 번호. 받는 쪽은 Retry가 켜진 프레임의 번호가 이미 받은 것이면 버린다. ACK가 사라져 보낸 쪽이 다시 보냈을 때 같은 패킷이 두 번 올라가지 않게 하는 장치다.
- QoS Control: 트래픽 종류(TID 0~7 → 6장의 네 범주)와 ACK 방식(즉시 ACK, 블록 ACK).
- FCS: 프레임 전체에 대한 CRC-32. 하나라도 틀리면 받는 쪽은 조용히 버리고 ACK를 보내지 않는다. 보낸 쪽은 ACK가 없으니 다시 보낸다.
회의실에서 오가는 쪽지에는 정해진 양식이 있다. 맨 위에 쪽지 종류(관리·제어·데이터), 보내는 사람과 받는 사람, 거쳐 가는 사회자가 적히고, 끝에 틀린 글자를 찾는 검산 칸(FCS)이 붙는다. 짧은 확인 쪽지(ACK)는 받는 사람만 적어 짧게 만든다. 머리말이 가변 길이인 이유다.
프레임 해부 도구
ieee80211_hdrlen()을 옮긴 것이다.주소가 네 개인 이유
이더넷 프레임에는 주소가 둘(목적지, 출발지)이다. 와이파이 프레임은 공중에서 “지금 이 전파를 보내는 기기(TA)와 받는 기기(RA)”가 최종 출발지(SA)·목적지(DA)와 다를 수 있다. 휴대폰이 인터넷 공유기 너머의 서버로 보내는 프레임은 공중에서는 휴대폰 → AP지만, 최종 목적지는 유선 쪽 게이트웨이다. 그래서 ToDS·FromDS 두 비트로 주소 칸의 의미를 정한다.
| ToDS | FromDS | 상황 | 주소 1 | 주소 2 | 주소 3 | 주소 4 |
|---|---|---|---|---|---|---|
| 0 | 0 | 관리·제어 프레임, 단말끼리 직접 | DA (= RA) | SA (= TA) | BSSID | — |
| 1 | 0 | 단말 → AP → 유선 | BSSID (= RA) | SA (= TA) | DA | — |
| 0 | 1 | 유선 → AP → 단말 | DA (= RA) | BSSID (= TA) | SA | — |
| 1 | 1 | AP ↔ AP 무선 중계(메시 백홀, WDS) | RA | TA | DA | SA |
SA·DA를 고르는 규칙: Linux ieee80211_get_SA()(주소 4가 있으면 주소 4, FromDS면 주소 3, 아니면 주소 2) · ieee80211_get_DA()(ToDS면 주소 3, 아니면 주소 1)
주소 1은 언제나 “공중에서 이 프레임을 받을 기기”다. 그래서 기기는 주소 1만 보고 자기 것인지 판단하고, ACK도 주소 2(TA)로 보낸다. 받은 프레임을 이더넷 프레임으로 바꿀 때는 위 표로 SA·DA를 꺼내 쓴다. 이 변환이 AP가 하는 “브리지”의 핵심이다.
거실 메시 공유기(메인)가 안방 메시 공유기(위성)로 무선 백홀을 통해 노트북의 패킷을 넘긴다. 노트북은 안방 공유기에 연결되어 있다. 이 백홀 프레임에는 주소가 몇 개 필요할까?
공중의 송신·수신 기기와, 최종 출발지·목적지가 모두 다르다.
비컨과 정보 요소
AP는 보통 100 TU마다 비컨을 보낸다. TU(Time Unit)는 1,024 µs여서 100 TU = 102.4 ms, 1초에 약 10번이다. 비컨의 몸통은 타임스탬프(8바이트, 단말이 시계를 맞춤), 비컨 간격(2), 능력 정보(2) 뒤에 정보 요소(Information Element, IE)가 줄줄이 붙는다. 정보 요소는 모두 ID(1) · 길이(1) · 내용의 TLV 형식이라, 모르는 ID는 길이만큼 건너뛰면 된다. 덕분에 새 세대가 나와도 옛 기기가 비컨을 읽다 멈추지 않는다.
| ID | 정보 요소 | 내용 |
|---|---|---|
| 0 | SSID | 네트워크 이름(0~32바이트). 길이 0이면 “숨긴 SSID” 또는 프로브의 “아무나” |
| 1 | Supported Rates | 지원 속도. 맨 윗비트가 켜진 것은 모두가 지원해야 하는 기본 속도(0.5 Mb/s 단위) |
| 3 | DS Parameter Set | 현재 채널 번호 |
| 5 | TIM | AP에 데이터가 쌓인 절전 단말의 목록(11장) |
| 48 | RSN | 보안 방식: 암호(CCMP·GCMP), 인증(PSK·SAE·802.1X), 관리 프레임 보호(10장) |
| 45 / 61 | HT Capabilities / Operation | Wi-Fi 4 능력과 현재 운영(40 MHz 등) |
| 191 / 192 | VHT Capabilities / Operation | Wi-Fi 5 |
| 255 | Extension | 확장 ID로 다시 나눔: 35/36 HE(Wi-Fi 6), 106/108 EHT(Wi-Fi 7) |
| 221 | Vendor Specific | 회사별(OUI) 정보. WMM 매개변수, WPS 등 |
정보 요소 ID: Linux include/linux/ieee80211.h의 enum ieee80211_eid, enum ieee80211_eid_ext · TU = 1,024 µs: 같은 파일의 TU_TO_JIFFIES(x) = usecs_to_jiffies(x × 1024)
비컨은 모든 단말이 알아듣도록 가장 느린 기본 속도로 나간다. 2.4 GHz에서 옛 802.11b 호환을 켜 두면 1 Mb/s다. 그런데 공유기 한 대가 SSID를 여러 개(일반·게스트·IoT) 열면 SSID마다 비컨이 따로 나가고, 아파트에서는 같은 채널에 이웃 공유기 비컨까지 들린다. 이것이 붐비는 2.4 GHz가 느린 숨은 이유 중 하나다.
비컨이 먹는 채널 시간
DSSS 전송 시간 = 긴 프리앰블 144 µs + PLCP 머리말 48 µs + ⌈8 × 바이트 ÷ Mb/s⌉: Linux ieee80211_frame_duration()의 802.11b 분기 (주석: 802.11b 18.3.4) · 기본 속도·비컨 간격 설정: hostapd hostapd.conf (basic_rates, beacon_int)
핵심 정리
- 프레임은 관리(연결)·제어(매체 사용)·데이터 세 종류. 오늘날 데이터는 거의 전부 QoS 데이터다.
- 머리말은 24바이트 기본에 주소 4(6)·QoS(2)·HT Control(4)이 붙어 최대 36바이트. ACK·CTS는 10바이트. 무엇이 붙는지는 Frame Control이 정한다.
- ToDS·FromDS가 주소 칸의 의미를 정한다. 주소 1은 언제나 공중의 수신자(RA). 둘 다 1이면 주소가 넷(메시 백홀).
- 시퀀스 번호 + Retry로 중복을 버리고, FCS(CRC-32)가 틀리면 ACK 없이 버려 재전송을 부른다.
- 비컨은 100 TU(102.4 ms)마다 가장 느린 기본 속도로 나가며, 정보 요소는 ID·길이·내용 TLV라 새 기능을 덧붙이기 쉽다. SSID 수와 802.11b 호환이 채널 시간을 크게 먹을 수 있다.
확인 퀴즈
Frame Control 값이 0x0080인 프레임은?
휴대폰이 AP를 거쳐 유선의 서버로 보내는 데이터 프레임에서 주소 3은?
ACK를 잃어 보낸 쪽이 같은 프레임을 다시 보냈다. 받는 쪽이 같은 패킷을 두 번 올려 보내지 않는 방법은?
비컨 간격 100 TU는 몇 ms인가?