들어가며: 사양을 직접 읽는 책
BluetoothBook(1권)은 블루투스 전체를 한 번 훑어보는 책이었다. 이 책은 그다음 단계다. 같은 주제를 Bluetooth Core Specification 6.3의 원문 수준까지 내려가서, 사양에 적힌 대로 계산하고, 사양이 함께 실어 둔 예제 데이터와 한 비트도 다르지 않은지 맞춰 본다. 이 장은 그 여정에 필요한 지도와 읽는 법, 그리고 내내 따라다닐 “바이트와 비트의 순서”를 먼저 정리한다.
- 이 책의 구성과 1권과의 관계, 내 목적에 맞는 읽는 순서를 고를 수 있다.
- Core 사양의 Vol·Part·§ 표기와 shall·should·may·must·can의 뜻을 구별할 수 있다.
- 값·HCI 바이트열·공중 비트열 사이를 바꿔 읽고, 예제 데이터마다 다른 표기를 알아볼 수 있다.
이 책의 지도
| 부 | 장 | 무엇을 끝까지 따라가나 |
|---|---|---|
| 컨트롤러 | 02~05 | HCI 바이트, 링크 계층 상태와 스케줄링, instant가 있는 절차, 확장·주기적 광고 |
| 보안 끝까지 | 06~09 | 세션 키와 AES-CCM, SMP의 P-256과 키 분배, 프라이버시와 해석 목록, BIG 보안 |
| 호스트 | 10~11 | L2CAP 채널과 크레딧, ATT/GATT의 EATT·큐 쓰기·Database Hash |
| Classic (BR/EDR) | 12~13 | 도약 커널·접근 코드·HEC·FEC, 레거시에서 Secure Connections까지 |
| 오디오·위치 | 14~17 | ISOAL, LE 오디오 프로파일(Core 밖), Channel Sounding, 방향 찾기 |
| 현장 | 18 | HCI 로그로 원인 찾기 |
각 장은 같은 흐름이다. 개념 → 사양 원문의 규칙 → 그 규칙을 그대로 옮긴 계산기·시뮬레이터 → 예측해 보기 → 핵심 정리 → 퀴즈. 1권에서 같은 주제를 다룬 장이 있으면 “다른 책에서” 상자로 이어 두었다. 처음이라면 1권의 해당 장을 먼저 훑고 오는 것이 편하다.
목적에 맞는 읽는 순서
사양 읽는 법
Core 사양은 권(Vol)과 부(Part), 절(§)로 나뉜다. 이 책의 인용 [Vol 6] Part B §4.5.2는 “6권(LE 컨트롤러) B부(링크 계층) 4.5.2절”이다. 자주 가는 곳은 이렇다.
| 권 | 내용 | 이 책에서 |
|---|---|---|
| Vol 1 | 구조, 용어, 오류 코드(Part F) | 18장 |
| Vol 2 | BR/EDR 컨트롤러(무선, 기저대역, LMP, 보안, 예제 Part G) | 12·13장 |
| Vol 3 | 호스트(L2CAP, ATT, GATT, GAP, SMP) | 7·8·10·11장 |
| Vol 4 | HCI | 2·18장 |
| Vol 6 | LE 컨트롤러(무선, 링크 계층, 예제 Part C, 보안, ISOAL, Channel Sounding) | 3~6·9·14·16·17장 |
요구의 세기는 낱말로 정해져 있다. shall(= mandatory)은 그대로 구현해야 하는 것, shall not은 금지, should는 권장, may(= optional)는 허용이다. should와 may는 둘 다 “필수가 아니다”. must는 요구가 아니라 언제나 참인 사실이나 다른 요구의 당연한 결과를, can은 가능성을 말한다. 그래서 “should allow a minimum of 6 connection events”(4·18장)는 어겨도 규격 위반은 아니지만, 어기면 현장에서 끊김을 부른다.
예제 데이터는 [Vol 2] Part G, [Vol 3] Part H 부록 D, [Vol 6] Part C에 있다. 사양은 이것을 “참고용”이라 하면서, 본문과 다르면 정오표가 나올 때까지 예제 쪽이 틀렸다고 보라고 한다. 이 책은 예제를 모두 다시 계산해 맞췄고, 맞지 않은 두 곳(5장의 AUX_ADV_IND CRC, 13장의 g() P-256)은 경고 상자와 검증 스크립트에 그대로 기록했다. LE 오디오 프로파일처럼 Core 밖의 사양은 본문에 그렇게 밝혔다.
사양 본문은 법전이다. shall은 “하여야 한다”, should는 “하는 것이 바람직하다”, may는 “할 수 있다”. 예제 데이터는 판례집과 비슷하지만 위계는 반대다. 둘이 어긋나면 법전(본문)이 이긴다. 그래서 계산이 예제와 다르면 먼저 내 구현을 의심하고, 그래도 본문대로라면 예제를 의심한다.
낱말의 뜻(Table 1.1): [Vol 1] Part E §1 · 2진·16진 표기: §2.1 · 비트 번호와 필드: §2.2 · 예약·이전 사용: §2.4.1, §2.4.2 · 예제 데이터의 지위: §4
바이트와 비트의 순서
이 책에서 가장 많이 헷갈리는 것은 “같은 값이 어디서는 앞뒤가 뒤집혀 보인다”는 점이다. 규칙은 세 가지뿐이다.
- 값을 적을 때는 사람처럼 큰 자리부터(MSO 먼저): 접근 주소 0x8E89BED6.
- HCI와 대부분의 PDU 필드는 리틀 엔디언: 작은 바이트가 먼저. 0x8E89BED6은 D6 BE 89 8E 순서로 놓인다.
- 공중에서는 필드마다 LSB가 먼저 나간다. 3비트 값 3은 1, 1, 0 순서로 보내고 사양은 이것을 “110”이라 적는다.
예제 데이터의 표기는 곳마다 다르다. [Vol 2] Part G §10은 “가장 낮은 바이트가 왼쪽”, 같은 Part G의 §7과 [Vol 3] Part H 부록 D는 “큰 바이트가 왼쪽”, Part G §3의 동기어는 전송 순서 그대로 4비트씩 끊은 16진이다. 각 장은 예제를 쓸 때 어느 표기인지 밝혀 두었다.
값 → HCI 바이트 → 공중 비트
HCI 로그에 Connection_Handle 자리가 40 00으로 찍혀 있다. 핸들 값은?
HCI는 리틀 엔디언이다.
LE 비트 순서와 LSB 먼저: [Vol 6] Part B §1.2 · 광고 접근 주소: §2.1.2 · HCI 리틀 엔디언: [Vol 4] Part E §5.2 · 예제 표기: [Vol 2] Part G §3, §7.1, §10
핵심 정리
- 1권은 훑어보기, 이 책은 사양 원문 수준에서 계산하고 예제 데이터로 맞춰 보는 책이다.
- 인용은 [Vol·Part·§]. Vol 2 = BR/EDR, Vol 3 = 호스트, Vol 4 = HCI, Vol 6 = LE 컨트롤러.
- shall = 필수, should = 권장, may = 허용(둘 다 필수 아님), must = 사실·결과, can = 가능성.
- 예제 데이터와 본문이 다르면 본문이 우선이다. 이 책은 불일치 두 곳을 기록해 두었다.
- 값은 MSO 먼저, HCI는 리틀 엔디언, 공중은 LSB 먼저. 예제마다 표기를 확인한다.
확인 퀴즈
사양에서 “should”의 뜻은?
예제 데이터와 본문이 다를 때 사양의 지침은?
광고 접근 주소 0x8E89BED6이 공중에 나갈 때 처음 8비트는?
“[Vol 3] Part H”는 무엇인가?