실제 속도: 묶음 전송과 블록 ACK
휴대폰 설정에 “링크 속도 1,201 Mbps”라고 나오는데 속도 측정 앱은 800 Mbps쯤을 보여 준다. 고장일까? 아니다. 6장에서 본 대로 와이파이는 프레임마다 대기·프리앰블·ACK라는 “입장료”를 낸다. 이 장에서는 그 입장료를 한 번만 내고 많이 보내는 방법(묶음 전송), 잃은 것만 다시 보내는 방법(블록 ACK), 그리고 느린 단말 하나가 모두를 느리게 만드는 문제를 계산한다.
- 링크 속도와 실제 처리량이 다른 이유를 프레임 교환 시간으로 설명한다.
- A-MSDU와 A-MPDU의 차이, 묶음이 커질수록 효율이 오르는 이유를 안다.
- 블록 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(Aggregate MSDU): IP 패킷 여러 개를 MAC 머리말 하나 안에 이어 붙인다. 머리말·FCS를 아끼지만, 전체에 FCS가 하나라서 한 비트만 틀려도 통째로 다시 보낸다.
- A-MPDU(Aggregate MPDU): 머리말과 FCS를 가진 완전한 프레임(MPDU) 여러 개를 구분자(4바이트)로 이어 한 번의 전송(PPDU)에 싣는다. 하나가 깨져도 나머지는 살아서, 깨진 것만 다시 보내면 된다. 실제 속도의 대부분은 이쪽에서 나온다.
둘을 겹쳐 쓸 수도 있다(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가 붙는다.
묶음 크기와 실제 처리량
프리앰블 근사 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 계층은 와이파이에서 무엇이 다시 보내졌는지 모른다.
블록 ACK 비트맵 만들기
느린 단말 하나가 모두를 느리게
거실 공유기 옆의 노트북은 1,201 Mb/s, 베란다 끝의 휴대폰은 86 Mb/s로 연결되어 있다. 둘이 같이 큰 파일을 받는다. AP가 “패킷 수”를 공평하게 나누면, 휴대폰의 패킷 하나는 노트북보다 14배 긴 공중 시간을 쓰므로 공중 시간의 대부분이 휴대폰에 가고, 노트북도 휴대폰 속도 근처로 떨어진다. 이것이 성능 이상(performance anomaly)이다.
해결책은 패킷 수가 아니라 공중 시간을 공평하게 나누는 것이다(공중 시간 공정성(airtime fairness)). Linux mac80211은 프레임마다 공중 시간을 계산해(ieee80211_calc_rx_airtime() 등) 단말별 몫을 맞추는 스케줄러를 갖고 있고, 많은 공유기 제품이 같은 기능을 켠다. Wi-Fi 6의 OFDMA(12장)는 느린 단말을 좁은 자원 단위에 몰아 같은 문제를 다른 방식으로 줄인다.
패킷 공평 대 공중 시간 공평
핵심 정리
- 프레임마다 대기·백오프·프리앰블·SIFS·ACK라는 고정 비용(약 200 µs)이 붙는다. 링크가 빨라질수록 데이터 부분만 짧아진다.
- A-MSDU는 패킷 여러 개를 머리말 하나에, A-MPDU는 완전한 프레임 여러 개를 한 전송에 싣는다. A-MPDU는 깨진 것만 다시 보낼 수 있다.
- A-MPDU 프레임 수는 블록 ACK 창에 묶인다: Wi-Fi 4·5 64, Wi-Fi 6 256, Wi-Fi 7 1,024.
- 블록 ACK는 SSN + 비트맵으로 받은 것을 한꺼번에 알리고, 받는 쪽은 재정렬 버퍼로 순서를 맞춘다.
- 패킷 수를 공평하게 나누면 느린 단말이 공중 시간을 독차지한다. 공중 시간 공정성이 이를 막는다.
확인 퀴즈
Wi-Fi 6 링크 속도 1,201 Mb/s에서 1,500바이트 패킷을 하나씩 보낼 때 실제 처리량에 가장 가까운 것은?
A-MPDU가 A-MSDU보다 오류에 강한 이유는?
블록 ACK의 SSN이 100이고 비트맵의 비트 3이 0이다. 무슨 뜻인가?
공중 시간 공정성을 켜면 일반적으로 어떻게 되는가?