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

// Request maximum MTU on iOS
func requestMTU(central: CBCentralManager,
                    peripheral: CBPeripheral) {
    peripheral.maximumWriteValueLength(
        for: .withoutResponse
    )

// iOS negotiates MTU automatically on connection
            // MTU = 512 for BLE 5.0 devices
    let mtu = peripheral.maximumWriteValueLength(
        for: .withResponse
    )

    print("Negotiated 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
// Request MTU on Android (Kotlin)
val bluetoothGatt: BluetoothGatt = ...

// Request MTU 517 bytes
bluetoothGatt.requestMtu(517)

// Handle result in 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 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

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