Chapter 06

채널 차지하기: CSMA/CA와 EDCA

공유기 속도 표시는 1,201 Mb/s인데, 실제로 파일을 받으면 그 절반쯤이다. 아파트에서 저녁만 되면 더 느려진다. 4장의 링크 속도는 “말하는 순간의 속도”일 뿐이고, 와이파이는 말할 차례를 얻는 데 시간을 꽤 쓴다. 이 장에서는 한 채널을 여러 기기가 나눠 쓰는 규칙, 즉 먼저 듣고(CS) 무작위로 기다렸다가(CA) 말하는 방법과 그 비용을 숫자로 본다.

왜 “회피”인가

예전 이더넷은 한 선을 여럿이 나눠 썼고, 말하면서 동시에 들어 충돌을 알아챘다(CSMA/CD). 무선은 그럴 수 없다. 내 안테나에서 나가는 신호는 몇 미터 밖에서 오는 신호보다 수백만 배(60 dB 이상) 세서, 보내는 동안에는 다른 소리를 들을 수 없다. 그래서 와이파이는 충돌을 감지하는 대신 충돌이 덜 나도록 미리 피하고(Collision Avoidance), 받은 쪽이 ACK로 확인해 주지 않으면 충돌이나 오류로 보고 다시 보낸다.

손을 들 수 없는 회의

회의실(채널)에서 누가 말하는 중이면(캐리어 센스) 모두 기다린다. 말이 끝나면 바로 끼어들지 않고 각자 마음속으로 무작위 숫자를 골라 세다가 0이 된 사람이 말한다(백오프). 그 사이 누가 먼저 말을 시작하면 세던 숫자를 멈췄다가 다음 번에 이어서 센다. 두 사람이 같은 숫자를 골랐다면 동시에 말해 서로 망친다(충돌). 그럴 때는 다음번에 더 큰 범위에서 숫자를 고른다.

한 번의 프레임 교환을 마이크로초로 보기

와이파이의 시간은 몇 가지 간격으로 짜여 있다. 5 GHz OFDM 기준으로:

SIFS가 AIFS보다 짧기 때문에, 데이터를 받은 쪽의 ACK는 다른 누구도 끼어들기 전에 나간다. 간격의 길이 차이가 곧 우선순위다.

SIMULATOR

프레임 하나 보내는 데 드는 시간

데이터 전송률 (802.11a/g)
한 번 교환—
실제 처리량—
효율—
해볼 것: ① 54 Mb/s로 1,500바이트를 보내도 실제로는 약 30 Mb/s다. 대기·프리앰블·ACK가 시간의 40% 가까이를 먹는다. ② 패킷을 100바이트로 줄이면 효율이 10% 아래로 떨어진다. 게임·음성 같은 작은 패킷이 많을수록 손해다. ③ 전송률을 올릴수록 데이터 부분만 짧아지고 고정 비용은 그대로라 효율은 오히려 떨어진다. 이 문제를 푸는 것이 여러 패킷을 한 번에 묶는 집적(8장)이다. 계산: 백오프는 평균값(7.5슬롯), 충돌·재전송 없음, MAC 머리말·LLC·FCS 38바이트, 암호화 생략, ACK·RTS·CTS는 데이터 속도 이하의 가장 높은 기본 속도(6·12·24 Mb/s).

OFDM 전송 시간 = 프리앰블 16 µs + SIGNAL 4 µs + 4 µs × ⌈(16 + 8 × 바이트 + 6) ÷ (4 × Mb/s)⌉: Linux net/mac80211/util.c의 ieee80211_frame_duration() (주석: 802.11-2012 18.3.2.4, aSIFSTime 16 µs / 802.11g 10 µs + 신호 확장 6 µs) · 슬롯 9 µs, SIFS 16/10 µs: Linux ath9k 드라이버 drivers/net/wireless/ath/ath9k/hw.c · AIFSN·CW 기본값: hostapd hostapd.conf WMM 기본 설정

기기가 많아지면

CW가 15라면 기기 둘이 같은 숫자를 고를 확률은 1/16 정도로 작다. 하지만 기기가 열, 스물이 되면 누군가와 겹칠 확률이 빠르게 커진다. 충돌한 프레임은 공중 시간을 통째로 버리고, 충돌한 기기들은 CW를 키워 더 오래 기다린다. 와이파이 6가 아파트·경기장처럼 붐비는 곳을 겨냥해 새 장치(OFDMA, BSS 컬러링, 12장)를 들여온 이유가 여기에 있다.

SIMULATOR

백오프 경쟁: 기기 수와 충돌

보낸 프레임 중 충돌—
공중 시간 효율—
기기 하나의 몫—
위: 한 차례 경쟁에서 기기마다 남은 백오프 숫자(가장 작은 쪽이 보낸다, 빨강 = 같은 숫자로 충돌). 아래 수치: 같은 조건으로 2만 차례를 돌린 평균. 해볼 것: ① 기기 1대는 충돌이 없다. ② 10대면 보낸 프레임의 약 37%가 충돌한다. ③ 처음 CW를 3(=2³−1)으로 줄이면 대기는 짧아지지만 충돌이 훨씬 늘어 효율이 떨어진다. 모델: 모든 기기가 쉬지 않고 보낼 데이터가 있고(포화), 서로 다 들리며, 1,500바이트를 54 Mb/s로 보낸다. 충돌은 성공과 같은 시간을 버린다고 본다. 이 모델의 충돌 확률은 Bianchi(2000)의 해석 모델과 2%p 안에서 맞는다(검증 스크립트).

숨은 단말과 RTS/CTS

캐리어 센스는 “내가 들을 수 있는 범위”에서만 동작한다. 거실 양 끝의 노트북 A와 휴대폰 C가 둘 다 공유기와는 잘 통하지만 서로는 벽 때문에 안 들린다면, A가 보내는 중에 C는 채널이 비었다고 생각하고 보내 버린다. 공유기에서는 두 신호가 겹쳐 둘 다 망가진다. 이것이 숨은 단말(hidden node) 문제다.

AP 💻 A📱 C A가 들리는 범위C가 들리는 범위 AP에서 겹쳐 둘 다 실패 A와 C는 서로의 범위 밖: 상대가 보내는 중인지 모른다
그림 6-1. 숨은 단말. A와 C는 AP와는 통하지만 서로 들리지 않아, 캐리어 센스가 서로를 막지 못한다.

해결책은 짧은 프레임으로 먼저 예약하는 것이다. A가 짧은 RTS(Request To Send, 20바이트)를 보내면 AP가 CTS(Clear To Send, 14바이트)로 답한다. C는 A의 RTS는 못 들어도 AP의 CTS는 듣는다. 모든 프레임에는 “이 교환이 앞으로 몇 µs 동안 이어지는지”를 적은 Duration 칸이 있어서, 이를 들은 기기는 그동안 채널이 바쁘다고 기록하고(NAV(Network Allocation Vector), 가상 캐리어 센스) 조용히 기다린다. 충돌이 나더라도 짧은 RTS끼리 부딪히므로 손해가 적다.

대가는 매번 RTS + SIFS + CTS + SIFS(24 Mb/s 기준 88 µs)가 더 든다는 것이다. 그래서 RTS/CTS는 보통 큰 프레임이나 묶음에만 쓰고, 드라이버가 상황을 보고 켠다. 위의 “프레임 하나 보내는 데 드는 시간” 시뮬레이터에서 체크해 보면 작은 패킷에서는 손해가 크다는 것이 보인다.

예측해 보기

숨은 단말 C가 AP의 CTS를 들었다. CTS의 Duration 칸에는 무엇이 들어 있어야 할까?

C는 A의 데이터가 끝나고 ACK까지 나갈 때까지 조용해야 한다.

Duration은 “이 프레임이 끝난 뒤 교환이 끝날 때까지 남은 시간”이다. RTS에는 CTS·데이터·ACK와 그 사이 SIFS 셋까지, CTS에는 데이터와 ACK까지가 적힌다. Linux mac80211은 이 값을 ieee80211_rts_duration()·ieee80211_ctstoself_duration()으로 계산한다.

EDCA: 통화가 먼저다

영상 통화의 음성은 몇십 밀리초만 늦어도 끊기지만, 백업 업로드는 1초 늦어도 아무도 모른다. 802.11e(상품명 WMM)는 트래픽을 네 가지 접근 범주(Access Category, AC)로 나누고, 범주마다 AIFSN과 CW를 달리해 확률적으로 우선순위를 준다. 이것이 EDCA(Enhanced Distributed Channel Access)다. 기기 안에서도 범주마다 따로 줄을 서서 경쟁한다.

범주예AIFSNAIFS (5 GHz)CW 처음 ~ 최대한 번에 쓸 수 있는 시간(TXOP)
AC_VO 음성통화 음성234 µs3 ~ 747 × 32 µs = 1.504 ms
AC_VI 영상영상 통화, 스트리밍234 µs7 ~ 1594 × 32 µs = 3.008 ms
AC_BE 일반웹, 대부분의 트래픽343 µs15 ~ 1023프레임 하나
AC_BK 배경백업, 업데이트779 µs15 ~ 1023프레임 하나

단말용 기본값: hostapd hostapd.conf의 wmm_ac_* (CW는 지수 표기 n → 2ⁿ − 1, TXOP는 32 µs 단위). AP 자신이 보낼 때는 음성·영상의 AIFSN이 1로 더 짧다(tx_queue_data*). Linux mac80211이 WMM 정보가 없을 때 쓰는 기본값도 같은 표를 따른다(ieee80211_set_wmm_default()).

어떤 범주의 트래픽인지는 IP 헤더의 DSCP나 VLAN 우선순위 값을 보고 정한다(Linux는 cfg80211_classify8021d()). 앱이 표시하지 않으면 대부분 일반(BE)으로 간다.

SIMULATOR

두 범주가 같은 순간 경쟁하면

A
B
A가 먼저—
B가 먼저—
동시(충돌)—
그래프: 채널이 빈 순간부터 각 범주가 보내기 시작할 수 있는 시각의 분포(AIFS + 백오프, 처음 CW 기준). 해볼 것: ① 음성 대 일반은 음성이 약 91% 먼저 가고 5%쯤은 겹친다. 배경 대 일반은 일반이 이긴다. ② 같은 범주끼리는 반반이고, 겹칠 확률이 CW가 작은 음성끼리에서 가장 크다(25%). 우선순위가 “보장”이 아니라 “확률”인 이유다. 계산: 처음 CW에서 백오프 숫자의 모든 조합을 정확히 셈(첫 시도, 다른 기기 없음).

핵심 정리

  1. 무선은 보내면서 들을 수 없어 충돌을 감지하지 못한다. 그래서 먼저 듣고 무작위로 기다려 피하고(CSMA/CA), ACK가 없으면 다시 보낸다.
  2. 5 GHz: SIFS 16 µs, 슬롯 9 µs, AIFS = SIFS + AIFSN × 슬롯. 짧은 간격이 곧 우선순위다(ACK는 SIFS 뒤).
  3. 54 Mb/s로 1,500바이트를 보내도 대기·프리앰블·ACK 때문에 실제는 약 30 Mb/s. 작은 패킷일수록, 빠른 전송률일수록 고정 비용의 비중이 커진다.
  4. 기기가 많으면 충돌이 늘고 CW가 커져 대기도 는다(10대면 보낸 프레임의 약 37%가 충돌).
  5. 숨은 단말은 RTS/CTS와 Duration·NAV(가상 캐리어 센스)로 막는다. 대가는 교환마다 약 88 µs.
  6. EDCA는 음성·영상·일반·배경 네 범주에 다른 AIFSN·CW·TXOP를 줘 확률적 우선순위를 만든다.

확인 퀴즈

데이터를 받은 기기가 ACK를 다른 기기보다 먼저 보낼 수 있는 이유는?

SIFS 16 µs < AIFS 34 µs 이상. 다른 기기가 기다리는 동안 ACK가 먼저 나간다.

5 GHz에서 일반(BE) 트래픽의 AIFS는?

16 + 3 × 9 = 43 µs.

전송률을 54 Mb/s에서 더 올려도 작은 패킷의 처리량이 크게 늘지 않는 이유는?

그래서 802.11n부터 여러 패킷을 묶어 고정 비용을 한 번만 낸다(8장).

숨은 단말 C가 A의 전송 중에 조용히 하게 만드는 것은?

C는 A를 못 듣지만 AP는 듣는다. CTS의 Duration을 보고 NAV를 설정해 기다린다.