MTU в BLE: що це, розмір пакета та узгодження

Автор: IT Sectr Опубліковано: 2026-07-15 Час читання: 10 хв

MTU (Maximum Transmission Unit) — це максимальний розмір корисних даних в одному BLE-пакеті, який може бути переданий між пристроями за одну GATT-транзакцію. У BLE Classic (4.x) MTU фіксований на рівні 23 байт, що достатньо для невеликих показів датчиків, але недостатньо для передачі файлів або OTA-оновлень. Bluetooth Core Specification 4.2 (2014) ввів процедуру MTU Size Request, яка дозволяє узгодити більший MTU — до 247 байт (BLE 5.0 — до 251 байта). Правильне налаштування MTU — один із ключових факторів продуктивності BLE-додатків, що передають великі обсяги даних.

Головне

  • MTU — максимальний розмір даних в одному BLE-пакеті, від 23 байт (BLE 4.x) до 251 байта (BLE 5.0).
  • Узгодження MTU відбувається через MTU Size Request/Response після встановлення з'єднання GATT.
  • Великий MTU (247 байт) збільшує швидкість передачі даних у 5–10 разів порівняно зі стандартними 23 байтами.
  • Android автоматично запитує MTU 517 байт з BLE 5.0, iOS — 512 байт через requestMTU.
  • При OTA-оновленнях прошивки великий MTU скорочує час передачі з хвилин до секунд.

Що таке MTU в BLE?

Maximum Transmission Unit (MTU) в контексті BLE — це максимальний розмір Application Protocol Data Unit (APDU), який пристрій може прийняти в одному GATT-запиті. MTU визначається на рівні ATT (Attribute Protocol) і включає заголовок ATT (1 байт) + корисні дані. За замовчуванням усі BLE-пристрої підтримують MTU 23 байти (23 = 1 байт ATT header + 22 байти даних).

MTU — це не фізичний ліміт радіоканалу, а угода між пристроями на рівні GATT. Фізичний розмір BLE-пакета на Link Layer може бути більшим (до 27 байт у BLE 4.0, до 257 байт у BLE 5.0 з Data Length Extension), але GATT-рівень обмежує, скільки даних передається за одну транзакцію. Data Length Extension (DLE) — окремий механізм на Link Layer, який збільшує фізичний пакет до 251 байта, і він має бути узгоджений окремо.

Різниця між MTU та DLE: ATT MTU — скільки даних передається за один GATT-запит, DLE — скільки даних поміщається в один Link Layer пакет. Для максимальної швидкості необхідно узгодити обидва параметри. Без DLE навіть при MTU 247 байт дані будуть фрагментуватися на кілька Link Layer пакетів по 27 байт, знижуючи пропускну здатність.

Узгодження MTU: процедура та протокол

MTU Size Request — процедура, яку ініціює Central після встановлення GATT-з'єднання. Central надсилає MTU Request із зазначенням свого MTU Capacity (максимальний розмір, який він може прийняти). Peripheral відповідає MTU Response зі своїм значенням. Використовуваний MTU — мінімальне з двох значень. Якщо Central пропонує MTU 512, а Peripheral підтримує лише 128, з'єднання використовуватиме MTU 128.

swift
import CoreBluetooth

// Запит максимального MTU на iOS
func requestMTU(central: CBCentralManager,
                    peripheral: CBPeripheral) {
    peripheral.maximumWriteValueLength(
        for: .withoutResponse
    )

// iOS автоматично узгоджує MTU при підключенні
            // MTU = 512 для пристроїв BLE 5.0
    let mtu = peripheral.maximumWriteValueLength(
        for: .withResponse
    )

    print("Узгоджений MTU: " +
          String(mtu))
}

Таймінг узгодження: MTU Request має бути надісланий після виявлення сервісів (discoverServices), але до початку активної передачі даних. У iOS Core Bluetooth MTU автоматично узгоджується при підключенні — розробнику не потрібно надсилати MTU Request вручну. В Android необхідно явно викликати requestMTU. Після узгодження MTU залишається фіксованим для даного з'єднання — повторне узгодження неможливе без розриву та перепідключення.

Обмеження ATT: чому MTU не може бути більше 251 байта

ATT (Attribute Protocol) — протокол, на якому побудований GATT. ATT-пакет має максимальний розмір 257 байт (ATT_MTU-1). З них 1 байт — Opcode (тип операції), 1 байт — Handle, і до 255 байт — Value. Таким чином, максимальний MTU, допустимий специфікацією ATT, — 257 байт (але на практиці використовується до 251 байта, оскільки частина службових полів все одно потрібна).

Для відправки даних більших за MTU використовується фрагментація на рівні додатка. Розробник сам розбиває дані на шматки розміром ≤ MTU та надсилає їх послідовно. Кожен шматок оформлюється як окремий GATT Write Request. Приймальна сторона збирає шматки в єдиний буфер. Вбудованої підтримки фрагментації в GATT немає — це задача розробника.

Версія BLEМакс. MTUМакс. DLEATT MTU ліміт
BLE 4.0 / 4.123 байти27 байтATT фіксований
BLE 4.2247 байт251 байт257 байт
BLE 5.0251 байт251 байт257 байт
Android + iOS512 / 517251 байтПеревищення ATT

Цікавий факт: iOS та Android запитують MTU 512 та 517 байт відповідно, але це значення перевищує ліміт ATT. На практиці стек BLE фрагментує такі дані автоматично, надсилаючи їх як кілька послідовних GATT-запитів по максимум 251 байту. Для розробника різниця непомітна — writeValue працює з будь-яким розміром до 512 байт в iOS.

Вплив MTU на продуктивність

Розмір MTU безпосередньо впливає на пропускну здатність BLE-з'єднання. При MTU 23 байти максимальна корисна швидкість передачі становить близько 7–10 КБ/с за ідеальних умов. Збільшення MTU до 247 байт піднімає швидкість до 60–90 КБ/с (з DLE та оптимальним connection interval). Це особливо важливо для додатків, що передають зображення, аудіофрагменти або логи.

Продуктивність BLE-передачі залежить від трьох факторів: MTU (скільки даних за один ATT-запит), connection interval (як часто відбуваються події обміну) та DLE (скільки даних за один Link Layer пакет). Оптимальна конфігурація для максимальної швидкості: MTU = 247, DLE = 251, connection interval = 7.5 ms (мінімальне значення).

За даними Bluetooth SIG White Paper (2023), збільшення MTU з 23 до 247 байт при connection interval 30 ms підвищує пропускну здатність з 8 КБ/с до 42 КБ/с — зростання в 5 разів. При connection interval 7.5 ms пропускна здатність досягає 88 КБ/с. Для додатків, що не потребують високої швидкості (датчики температури, BLE-маячки), стандартний MTU 23 байти залишається достатнім.

Налаштування MTU в iOS та Android

iOS Core Bluetooth автоматично узгоджує MTU при підключенні до Peripheral. Розробник може запросити поточний MTU через maximumWriteValueLength, але не може встановити його вручну. iOS використовує MTU до 512 байт для BLE 5.0 пристроїв і до 247 для BLE 4.2. Для запису великих обсягів даних використовуйте writeType: .withResponse для гарантованої доставки.

kotlin
// Запит MTU на Android (Kotlin)
val bluetoothGatt: BluetoothGatt = ...

// Запит MTU 517 байт
bluetoothGatt.requestMtu(517)

// Обробка результату в callback
override fun onMtuChanged(
    gatt: BluetoothGatt,
    mtu: Int,
    status: Int
) {
    if (status == BluetoothGatt.GATT_SUCCESS) {
        println("MTU negotiated: $mtu")
    }
}

Android надає BluetoothGatt.requestMtu(int), який дозволяє запросити будь-який MTU до 517 байт. Фактичний MTU визначається периферійним пристроєм — якщо він підтримує лише 23 байти, Android поверне MTU 23. Для визначення поточного MTU використовуйте gatt.requestMtu(0) — це поверне поточне значення без спроби зміни. Android 12+ підтримує автоматичне узгодження MTU при підключенні через TRANSPORT_LE.

Міжплатформні фреймворки (Flutter, React Native) зазвичай надають API для requestMTU. У бібліотеці FlutterBlue Plus MTU задається як параметр підключення. У RxAndroidBle — через метод requestMtu. Рекомендується завжди узгоджувати максимальний MTU відразу після виявлення сервісів, до початку передачі даних, щоб уникнути фрагментації на рівні додатка.

MTU та OTA-оновлення

OTA (Over-The-Air) оновлення прошивки — найбільш вимогливий до MTU сценарій в BLE. Типовий розмір прошивки IoT-пристрою — 100–500 КБ. При MTU 23 байти та connection interval 30 ms передача 100 КБ займає близько 2–3 хвилин. При MTU 247 байт та DLE 251 байт — 20–40 секунд. А при MTU 512 байт (iOS) — 10–15 секунд.

Процес OTA-оновлення зазвичай включає: фрагментацію прошивки на пакети розміром ≤ MTU, послідовну відправку через Notify/Write, верифікацію контрольної суми на кожному пакеті та підтвердження прийому. Якщо якийсь пакет загублено, пристрій запитує повторну відправку. Надійність OTA критично залежить від правильного вибору MTU та connection interval.

Рекомендації для OTA: узгодьте максимальний MTU (247–512 байт), встановіть connection interval 7.5–15 ms (якщо пристрій підтримує), використовуйте DLE (Data Length Extension) для збільшення фізичного пакета до 251 байта. Для пристроїв з обмеженою пам'яттю буфера (наприклад, BLE-модулі на базі nRF52) перевіряйте максимальний MTU в специфікації чипа.

Часті запитання

Що станеться, якщо не узгодити MTU?

З'єднання використовуватиме MTU за замовчуванням — 23 байти. Для більшості IoT-сценаріїв (передача показів датчика) цього достатньо. Для передачі великих обсягів даних швидкість буде в 5–10 разів нижчою, ніж з узгодженим MTU 247 байт.

Чи можна змінити MTU після початку передачі даних?

Ні, MTU узгоджується один раз після підключення і не може бути змінений без розриву та перепідключення. Тому рекомендується узгоджувати MTU відразу після виявлення сервісів, до початку активної передачі даних.

Чому Android запитує MTU 517 байт, а iOS — лише 512?

Це історично сформовані емпіричні максимуми для кожного стека. Реальний ATT MTU все одно обмежений 257 байтами за специфікацією. Стеки автоматично фрагментують дані > 251 байта на кілька пакетів, тому різниця між 512 та 517 несуттєва.

Як MTU пов'язаний з Data Length Extension (DLE)?

MTU — розмір GATT-запиту на рівні ATT. DLE — розмір фізичного пакета на Link Layer. Без DLE кожен GATT-запит (до 247 байт) фрагментується на пакети по 27 байт. З DLE — передається одним пакетом. Для максимальної швидкості потрібно узгодити обидва параметри.

Який MTU вибрати для фітнес-трекера?

Для фітнес-трекера, що передає покази пульсу та кроки, стандартного MTU 23 байти достатньо. Якщо потрібно передавати історію тренувань (об'ємом 10–50 КБ) — узгодьте MTU 247 байт для прискорення синхронізації даних при підключенні до смартфона.

Підсумки

  • MTU — максимальний розмір даних в одному GATT-запиті: від 23 байт (за замовчуванням) до 251 байта (BLE 5.0).
  • Узгодження MTU відбувається через MTU Size Request/Response, яке ініціюється Central після підключення.
  • ATT Protocol обмежує MTU 257 байтами, але iOS та Android запитують до 512–517 байт з автоматичною фрагментацією.
  • Збільшення MTU з 23 до 247 байт підвищує пропускну здатність у 5–10 разів при оптимальному connection interval.
  • Для максимальної швидкості необхідно узгодити MTU + DLE + connection interval 7.5 ms.
  • В iOS MTU узгоджується автоматично, в Android — через requestMtu, рекомендується запитувати 247–517 байт.
  • OTA-оновлення — найвимогливіший сценарій: правильний MTU скорочує час передачі з хвилин до секунд.

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також