Chapter 01

들어가며: 사양을 직접 읽는 책

BluetoothBook(1권)은 블루투스 전체를 한 번 훑어보는 책이었다. 이 책은 그다음 단계다. 같은 주제를 Bluetooth Core Specification 6.3의 원문 수준까지 내려가서, 사양에 적힌 대로 계산하고, 사양이 함께 실어 둔 예제 데이터와 한 비트도 다르지 않은지 맞춰 본다. 이 장은 그 여정에 필요한 지도와 읽는 법, 그리고 내내 따라다닐 “바이트와 비트의 순서”를 먼저 정리한다.

이 책의 지도

부장무엇을 끝까지 따라가나
컨트롤러02~05HCI 바이트, 링크 계층 상태와 스케줄링, instant가 있는 절차, 확장·주기적 광고
보안 끝까지06~09세션 키와 AES-CCM, SMP의 P-256과 키 분배, 프라이버시와 해석 목록, BIG 보안
호스트10~11L2CAP 채널과 크레딧, ATT/GATT의 EATT·큐 쓰기·Database Hash
Classic (BR/EDR)12~13도약 커널·접근 코드·HEC·FEC, 레거시에서 Secure Connections까지
오디오·위치14~17ISOAL, LE 오디오 프로파일(Core 밖), Channel Sounding, 방향 찾기
현장18HCI 로그로 원인 찾기

각 장은 같은 흐름이다. 개념 → 사양 원문의 규칙 → 그 규칙을 그대로 옮긴 계산기·시뮬레이터 → 예측해 보기 → 핵심 정리 → 퀴즈. 1권에서 같은 주제를 다룬 장이 있으면 “다른 책에서” 상자로 이어 두었다. 처음이라면 1권의 해당 장을 먼저 훑고 오는 것이 편하다.

GUIDE

목적에 맞는 읽는 순서

무엇을 하려나
    순서는 앞 장의 개념을 뒤 장이 쓰는 관계를 따랐다. 고른 길에 없는 장도 필요할 때 찾아 읽으면 된다. 장 제목을 누르면 바로 간다.

    사양 읽는 법

    Core 사양은 권(Vol)과 부(Part), 절(§)로 나뉜다. 이 책의 인용 [Vol 6] Part B §4.5.2는 “6권(LE 컨트롤러) B부(링크 계층) 4.5.2절”이다. 자주 가는 곳은 이렇다.

    권내용이 책에서
    Vol 1구조, 용어, 오류 코드(Part F)18장
    Vol 2BR/EDR 컨트롤러(무선, 기저대역, LMP, 보안, 예제 Part G)12·13장
    Vol 3호스트(L2CAP, ATT, GATT, GAP, SMP)7·8·10·11장
    Vol 4HCI2·18장
    Vol 6LE 컨트롤러(무선, 링크 계층, 예제 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

    바이트와 비트의 순서

    이 책에서 가장 많이 헷갈리는 것은 “같은 값이 어디서는 앞뒤가 뒤집혀 보인다”는 점이다. 규칙은 세 가지뿐이다.

    1. 값을 적을 때는 사람처럼 큰 자리부터(MSO 먼저): 접근 주소 0x8E89BED6.
    2. HCI와 대부분의 PDU 필드는 리틀 엔디언: 작은 바이트가 먼저. 0x8E89BED6은 D6 BE 89 8E 순서로 놓인다.
    3. 공중에서는 필드마다 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진이다. 각 장은 예제를 쓸 때 어느 표기인지 밝혀 두었다.

    CONVERTER

    값 → HCI 바이트 → 공중 비트

    필드
    공중에 먼저 나가는 비트—
    공중 비트는 낮은 바이트부터, 각 바이트 안에서는 LSB부터다. 해볼 것: 접근 주소의 공중 비트열을 뒤집으면 사양 본문의 0b10001110_10001001_10111110_11010110(큰 비트부터 쓴 값)이 된다. 3비트 값 3은 사양 §1.2의 예 그대로 110이다.
    예측해 보기

    HCI 로그에 Connection_Handle 자리가 40 00으로 찍혀 있다. 핸들 값은?

    HCI는 리틀 엔디언이다.

    작은 바이트(0x40)가 먼저 오므로 값은 0x0040이다([Vol 4] Part E §5.2). 18장의 로그도 모두 이렇게 읽는다.

    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. 1권은 훑어보기, 이 책은 사양 원문 수준에서 계산하고 예제 데이터로 맞춰 보는 책이다.
    2. 인용은 [Vol·Part·§]. Vol 2 = BR/EDR, Vol 3 = 호스트, Vol 4 = HCI, Vol 6 = LE 컨트롤러.
    3. shall = 필수, should = 권장, may = 허용(둘 다 필수 아님), must = 사실·결과, can = 가능성.
    4. 예제 데이터와 본문이 다르면 본문이 우선이다. 이 책은 불일치 두 곳을 기록해 두었다.
    5. 값은 MSO 먼저, HCI는 리틀 엔디언, 공중은 LSB 먼저. 예제마다 표기를 확인한다.

    확인 퀴즈

    사양에서 “should”의 뜻은?

    [Vol 1] Part E §1 Table 1.1: should·may·optional은 “not mandatory”, should는 권장.

    예제 데이터와 본문이 다를 때 사양의 지침은?

    [Vol 1] Part E §4: “implementers should assume that the data, rather than the specification, are erroneous.”

    광고 접근 주소 0x8E89BED6이 공중에 나갈 때 처음 8비트는?

    낮은 바이트 0xD6 = 11010110을 LSB부터 보내므로 01101011.

    “[Vol 3] Part H”는 무엇인가?

    Vol 3(호스트)의 Part H가 Security Manager다. 예제 데이터는 그 부록 D에 있다(7장).