Chapter 08

실제 속도: 묶음 전송과 블록 ACK

휴대폰 설정에 “링크 속도 1,201 Mbps”라고 나오는데 속도 측정 앱은 800 Mbps쯤을 보여 준다. 고장일까? 아니다. 6장에서 본 대로 와이파이는 프레임마다 대기·프리앰블·ACK라는 “입장료”를 낸다. 이 장에서는 그 입장료를 한 번만 내고 많이 보내는 방법(묶음 전송), 잃은 것만 다시 보내는 방법(블록 ACK), 그리고 느린 단말 하나가 모두를 느리게 만드는 문제를 계산한다.

입장료는 그대로, 데이터만 빨라진다

Wi-Fi 6 80 MHz 2스트림 MCS 11(1,201 Mb/s)로 1,500바이트 패킷 하나를 보내면 데이터 부분은 OFDM 심볼 하나(13.6 µs)에 들어간다. 그런데 앞뒤로 AIFS 43 µs, 평균 백오프 약 68 µs, 프리앰블 40 µs 이상, SIFS 16 µs, ACK 약 30 µs가 붙는다. 데이터 14 µs를 보내려고 200 µs를 쓰는 셈이라 처리량은 60 Mb/s 남짓, 링크 속도의 5%다.

그래서 802.11n(Wi-Fi 4)부터는 여러 패킷을 한 번에 묶어 보낸다. 입장료는 한 번만 내고 데이터 부분만 길어진다. 오늘날 와이파이 속도의 대부분은 MCS나 채널 폭만큼이나 이 묶음에서 나온다.

택배 한 상자와 트럭 한 대

택배 기사가 물건 하나마다 차를 세우고, 주차하고, 초인종을 누르고, 서명을 받는다면 차가 아무리 빨라도 하루에 몇 개 못 나른다. 같은 집에 갈 물건을 상자 여러 개에 담아 한 번에 내려놓고, 마지막에 “몇 번 상자를 받았는지” 체크 목록 한 장에 서명받는 것이 묶음 전송과 블록 ACK다.

A-MSDU와 A-MPDU

묶는 방법은 두 층이 있다.

둘을 겹쳐 쓸 수도 있다(A-MSDU 여러 개를 A-MPDU로). 한 묶음에 넣을 수 있는 양은 세대마다 늘었다. A-MPDU 안의 프레임 수는 블록 ACK 창 크기에 묶이는데 Wi-Fi 4·5는 64개, Wi-Fi 6는 256개, Wi-Fi 7은 1,024개다. 묶음 전체 크기는 Wi-Fi 4가 최대 64 KB, Wi-Fi 5부터는 최대 약 1 MB까지 알릴 수 있다.

블록 ACK 창: Linux include/linux/ieee80211-ht.h의 IEEE80211_MAX_AMPDU_BUF_HT = 0x40, _HE = 0x100, _EHT = 0x400 · A-MPDU 최대 길이 지수: 같은 파일 IEEE80211_HT_MAX_AMPDU_FACTOR = 13(213+3 − 1 = 65,535바이트), ieee80211-vht.h의 IEEE80211_VHT_MAX_AMPDU_1024K

예측해 보기

링크 속도 1,201 Mb/s인 Wi-Fi 6에서 1,500바이트 패킷을 묶지 않고 하나씩 보내면 실제 처리량은?

매 전송마다 대기, 프리앰블, ACK가 붙는다.

이 책의 계산으로 약 57 Mb/s, 링크 속도의 5%다. 데이터 자체는 10 µs면 끝나지만 대기·백오프·프리앰블·ACK가 200 µs 가까이 든다. 64개를 묶으면 약 884 Mb/s가 된다. 아래에서 묶음 크기를 바꿔 보자.
SIMULATOR

묶음 크기와 실제 처리량

링크
한 번 전송—
실제 처리량—
링크 속도 대비—
그래프: 묶는 패킷 수(가로, 로그)에 따른 처리량. 점선은 링크 속도. 해볼 것: ① Wi-Fi 6에서 1개씩 보내면 약 60 Mb/s, 64개면 약 880 Mb/s다. ② Wi-Fi 7 320 MHz는 1개씩 보내면 Wi-Fi 6와 거의 같다. 빠른 링크일수록 묶음이 없으면 소용이 없다. ③ 802.11a는 묶음을 못 한다(1개 고정). 계산: AIFS 43 µs + 평균 백오프 67.5 µs + 프리앰블 + 데이터 + SIFS 16 µs + ACK(28 µs) 또는 블록 ACK(32 µs). HT 이후 프리앰블은 Linux mac80211이 공중 시간 계산에 쓰는 근사값 36 + 4 × 스트림 수 µs(실제 HE 프리앰블은 이보다 조금 길다). 패킷마다 MAC 머리말 26 + LLC 8 + CCMP 16 + FCS 4바이트, 구분자 4바이트와 4바이트 정렬. 충돌·오류·사운딩·TCP ACK는 뺐다. 실제 속도 측정은 여기서 10~20% 더 낮게 나오는 것이 보통이다.

프리앰블 근사 overhead = 36 + (streams << 2) µs: Linux net/mac80211/airtime.c의 ieee80211_get_rate_duration() · 링크 속도: 4장 계산(커널 cfg80211_calculate_bitrate_*()와 검증)

블록 ACK: 체크 목록 한 장

A-MPDU 안의 프레임 64개에 ACK를 하나씩 보낼 수는 없다. 받는 쪽은 묶음이 끝나면 블록 ACK(Block Ack) 하나를 보낸다. 블록 ACK에는 시작 시퀀스 번호(SSN)와 비트맵이 들어 있고, 비트 i가 1이면 “SSN + i번을 받았다”는 뜻이다. 보낸 쪽은 0인 것만 다음 묶음에 다시 넣는다. 블록 ACK를 쓰려면 먼저 두 기기가 ADDBA 요청·응답(액션 프레임)으로 TID별 합의(창 크기 등)를 맺는다.

받는 쪽은 순서가 어긋난 프레임을 바로 위로 올리지 않고 재정렬 버퍼에 잡아 둔다. 빠진 번호가 다시 오면 순서대로 내보낸다. 그래서 IP·TCP 계층은 와이파이에서 무엇이 다시 보내졌는지 모른다.

INTERACTIVE

블록 ACK 비트맵 만들기

A-MPDU 하나에 실린 MPDU 16개(시퀀스 번호 100~115). 눌러서 “깨짐”으로 바꿔 보자.
블록 ACK의 비트맵은 바이트 단위 리틀 엔디언이다(비트 0 = SSN). 여기서는 16개만 보이지만 실제 압축 블록 ACK 비트맵은 64비트(8바이트)이고, Wi-Fi 6·7은 256·1,024비트 비트맵을 쓸 수 있다. “다음 묶음 보내기”는 깨진 것을 먼저 다시 싣고 남은 자리를 새 번호로 채운다.

느린 단말 하나가 모두를 느리게

거실 공유기 옆의 노트북은 1,201 Mb/s, 베란다 끝의 휴대폰은 86 Mb/s로 연결되어 있다. 둘이 같이 큰 파일을 받는다. AP가 “패킷 수”를 공평하게 나누면, 휴대폰의 패킷 하나는 노트북보다 14배 긴 공중 시간을 쓰므로 공중 시간의 대부분이 휴대폰에 가고, 노트북도 휴대폰 속도 근처로 떨어진다. 이것이 성능 이상(performance anomaly)이다.

해결책은 패킷 수가 아니라 공중 시간을 공평하게 나누는 것이다(공중 시간 공정성(airtime fairness)). Linux mac80211은 프레임마다 공중 시간을 계산해(ieee80211_calc_rx_airtime() 등) 단말별 몫을 맞추는 스케줄러를 갖고 있고, 많은 공유기 제품이 같은 기능을 켠다. Wi-Fi 6의 OFDMA(12장)는 느린 단말을 좁은 자원 단위에 몰아 같은 문제를 다른 방식으로 줄인다.

SIMULATOR

패킷 공평 대 공중 시간 공평

빠른 단말 (패킷 공평)—
빠른 단말 (공중 시간 공평)—
전체 합 (패킷 → 공중 시간)—
막대: 단말별 처리량. 위는 패킷 수를 공평하게, 아래는 공중 시간을 공평하게 나눈 경우. 해볼 것: ① 기본값에서 패킷을 공평하게 나누면 빠른 노트북도 약 38 Mb/s로 떨어진다. 공중 시간을 공평하게 나누면 440 Mb/s를 지키고, 느린 단말은 20 Mb/s로 거의 그대로다. ② 느린 단말을 늘리면 차이가 더 커진다. 모델: 모든 단말이 계속 받을 데이터가 있음, 단말끼리 겹치지 않음(한 번에 하나), 처리량은 각자 혼자일 때 값.

핵심 정리

  1. 프레임마다 대기·백오프·프리앰블·SIFS·ACK라는 고정 비용(약 200 µs)이 붙는다. 링크가 빨라질수록 데이터 부분만 짧아진다.
  2. A-MSDU는 패킷 여러 개를 머리말 하나에, A-MPDU는 완전한 프레임 여러 개를 한 전송에 싣는다. A-MPDU는 깨진 것만 다시 보낼 수 있다.
  3. A-MPDU 프레임 수는 블록 ACK 창에 묶인다: Wi-Fi 4·5 64, Wi-Fi 6 256, Wi-Fi 7 1,024.
  4. 블록 ACK는 SSN + 비트맵으로 받은 것을 한꺼번에 알리고, 받는 쪽은 재정렬 버퍼로 순서를 맞춘다.
  5. 패킷 수를 공평하게 나누면 느린 단말이 공중 시간을 독차지한다. 공중 시간 공정성이 이를 막는다.

확인 퀴즈

Wi-Fi 6 링크 속도 1,201 Mb/s에서 1,500바이트 패킷을 하나씩 보낼 때 실제 처리량에 가장 가까운 것은?

데이터는 13.6 µs뿐인데 고정 비용이 약 200 µs다.

A-MPDU가 A-MSDU보다 오류에 강한 이유는?

A-MSDU는 전체에 FCS가 하나라 한 비트 오류에도 통째로 다시 보낸다.

블록 ACK의 SSN이 100이고 비트맵의 비트 3이 0이다. 무슨 뜻인가?

비트 i는 SSN + i번 프레임이다.

공중 시간 공정성을 켜면 일반적으로 어떻게 되는가?

처리량이 아니라 공중 시간을 똑같이 나눈다.