MTU în BLE: ce este, dimensiunea pachetului și negocierea

Autor: IT Sectr Publicat: 2026-07-15 Timp de citire: 10 min

MTU (Maximum Transmission Unit) — este dimensiunea maximă a datelor utile într-un singur pachet BLE care poate fi transmis între dispozitive într-o singură tranzacție GATT. În BLE Classic (4.x) MTU este fixat la 23 de octeți, suficient pentru citiri mici de la senzori, dar insuficient pentru transferul de fișiere sau actualizări OTA. Bluetooth Core Specification 4.2 (2014) a introdus procedura MTU Size Request, permițând negocierea unui MTU mai mare — până la 247 de octeți (BLE 5.0 — până la 251 de octeți). Configurarea corectă a MTU este unul dintre factorii cheie de performanță ai aplicațiilor BLE care transmit volume mari de date.

Principalele puncte

  • MTU — dimensiunea maximă a datelor într-un singur pachet BLE, de la 23 de octeți (BLE 4.x) la 251 de octeți (BLE 5.0).
  • Negocierea MTU are loc prin MTU Size Request/Response după stabilirea conexiunii GATT.
  • Un MTU mare (247 de octeți) crește viteza de transfer a datelor de 5–10 ori față de cei 23 de octeți standard.
  • Android solicită automat un MTU de 517 octeți cu BLE 5.0, iOS — 512 octeți prin requestMTU.
  • La actualizările OTA ale firmware-ului, un MTU mare reduce timpul de transmisie de la minute la secunde.

Ce este MTU în BLE?

Maximum Transmission Unit (MTU) în contextul BLE — este dimensiunea maximă a Application Protocol Data Unit (APDU) pe care un dispozitiv o poate primi într-o singură cerere GATT. MTU este definit la nivelul ATT (Attribute Protocol) și include header-ul ATT (1 octet) + date utile. În mod implicit, toate dispozitivele BLE suportă un MTU de 23 de octeți (23 = 1 octet header ATT + 22 de octeți de date).

MTU nu este o limită fizică a canalului radio, ci un acord între dispozitive la nivel GATT. Dimensiunea fizică a pachetului BLE la nivelul Link Layer poate fi mai mare (până la 27 de octeți în BLE 4.0, până la 257 de octeți în BLE 5.0 cu Data Length Extension), dar nivelul GATT limitează câte date sunt transmise într-o singură tranzacție. Data Length Extension (DLE) — este un mecanism separat la nivelul Link Layer care mărește pachetul fizic la 251 de octeți și trebuie negociat separat.

Diferența dintre MTU și DLE: ATT MTU — câte date sunt transmise într-o singură cerere GATT, DLE — câte date încap într-un singur pachet Link Layer. Pentru viteză maximă, ambii parametri trebuie negociați. Fără DLE, chiar și la un MTU de 247 de octeți, datele vor fi fragmentate în mai multe pachete Link Layer de 27 de octeți, reducând lățimea de bandă.

Negocierea MTU: procedură și protocol

MTU Size Request — procedură inițiată de Central după stabilirea conexiunii GATT. Central trimite MTU Request specificând capacitatea sa MTU (dimensiunea maximă pe care o poate primi). Peripheral răspunde cu MTU Response cu propria valoare. MTU utilizat este minimul dintre cele două valori. Dacă Central propune un MTU de 512, iar Peripheral suportă doar 128, conexiunea va utiliza MTU 128.

swift
import CoreBluetooth

// Solicitare MTU maxim în iOS
func requestMTU(central: CBCentralManager,
                    peripheral: CBPeripheral) {
    peripheral.maximumWriteValueLength(
        for: .withoutResponse
    )

// iOS negociază automat MTU la conectare
            // MTU = 512 pentru dispozitive BLE 5.0
    let mtu = peripheral.maximumWriteValueLength(
        for: .withResponse
    )

    print("MTU negociat: " +
          String(mtu))
}

Momentul negocierii: MTU Request trebuie trimis după descoperirea serviciilor (discoverServices), dar înainte de începerea transmiterii active a datelor. În iOS Core Bluetooth negociază automat MTU la conectare — dezvoltatorul nu trebuie să trimită manual MTU Request. În Android trebuie apelat explicit requestMTU. După negociere, MTU rămâne fix pentru această conexiune — o renegociere este imposibilă fără deconectare și reconectare.

Limitările ATT: de ce MTU nu poate fi mai mare de 251 de octeți

ATT (Attribute Protocol) — protocolul pe care este construit GATT. Pachetul ATT are o dimensiune maximă de 257 de octeți (ATT_MTU-1). Din aceștia, 1 octet este Opcode (tipul operației), 1 octet este Handle, iar până la 255 de octeți sunt Value. Astfel, MTU maxim permis de specificația ATT este de 257 de octeți (în practică se utilizează până la 251 de octeți, deoarece unele câmpuri de serviciu sunt totuși necesare).

Pentru trimiterea de date mai mari decât MTU se utilizează fragmentarea la nivelul aplicației. Dezvoltatorul împarte singur datele în bucăți de dimensiune ≤ MTU și le trimite secvențial. Fiecare bucată este formal o cerere GATT Write Request separată. Partea receptoare asamblează bucățile într-un singur buffer. Nu există suport încorporat pentru fragmentare în GATT — aceasta este sarcina dezvoltatorului.

Versiunea BLEMTU max.DLE max.Limită ATT MTU
BLE 4.0 / 4.123 de octeți27 de octețiATT fix
BLE 4.2247 de octeți251 de octeți257 de octeți
BLE 5.0251 de octeți251 de octeți257 de octeți
Android + iOS512 / 517251 de octețiDepășire ATT

Fapt interesant: iOS și Android solicită MTU de 512 și respectiv 517 octeți, dar această valoare depășește limita ATT. În practică, stiva BLE fragmentează automat astfel de date, trimițându-le ca mai multe cereri GATT secvențiale de maxim 251 de octeți. Pentru dezvoltator, diferența este imperceptibilă — writeValue funcționează cu orice dimensiune de până la 512 octeți în iOS.

Influența MTU asupra performanței

Dimensiunea MTU influențează direct lățimea de bandă a conexiunii BLE. La un MTU de 23 de octeți, viteza maximă utilă de transmisie este de aproximativ 7–10 KB/s în condiții ideale. Creșterea MTU la 247 de octeți ridică viteza la 60–90 KB/s (cu DLE și connection interval optim). Acest lucru este deosebit de important pentru aplicațiile care transmit imagini, fragmente audio sau loguri.

Performanța transmisiei BLE depinde de trei factori: MTU (câte date într-o singură cerere ATT), connection interval (cât de des au loc evenimentele de schimb) și DLE (câte date într-un singur pachet Link Layer). Configurația optimă pentru viteză maximă: MTU = 247, DLE = 251, connection interval = 7.5 ms (valoare minimă).

Conform datelor Bluetooth SIG White Paper (2023), creșterea MTU de la 23 la 247 de octeți la un connection interval de 30 ms mărește lățimea de bandă de la 8 KB/s la 42 KB/s — o creștere de 5 ori. La un connection interval de 7.5 ms, lățimea de bandă atinge 88 KB/s. Pentru aplicațiile care nu necesită viteză mare (senzori de temperatură, beacon-uri BLE), MTU standard de 23 de octeți rămâne suficient.

Configurarea MTU în iOS și Android

iOS Core Bluetooth negociază automat MTU la conectarea la Peripheral. Dezvoltatorul poate verifica MTU-ul curent prin maximumWriteValueLength, dar nu îl poate seta manual. iOS utilizează un MTU de până la 512 octeți pentru dispozitivele BLE 5.0 și până la 247 pentru BLE 4.2. Pentru scrierea unor volume mari de date, utilizați writeType: .withResponse pentru livrare garantată.

kotlin
// Solicitare MTU în Android (Kotlin)
val bluetoothGatt: BluetoothGatt = ...

// Solicitare MTU 517 octeți
bluetoothGatt.requestMtu(517)

// Gestionarea rezultatului în callback
override fun onMtuChanged(
    gatt: BluetoothGatt,
    mtu: Int,
    status: Int
) {
    if (status == BluetoothGatt.GATT_SUCCESS) {
        println("MTU negotiated: $mtu")
    }
}

Android oferă BluetoothGatt.requestMtu(int), care permite solicitarea oricărui MTU de până la 517 octeți. MTU-ul real este determinat de dispozitivul periferic — dacă acesta suportă doar 23 de octeți, Android va returna MTU 23. Pentru a determina MTU-ul curent, utilizați gatt.requestMtu(0) — aceasta va returna valoarea curentă fără a încerca să o modifice. Android 12+ suportă negocierea automată a MTU la conectare prin TRANSPORT_LE.

Framework-urile cross-platform (Flutter, React Native) oferă de obicei o API pentru requestMTU. În biblioteca FlutterBlue Plus, MTU este setat ca parametru de conectare. În RxAndroidBle — prin metoda requestMtu. Se recomandă să negociați întotdeauna MTU-ul maxim imediat după descoperirea serviciilor, înainte de începerea transmiterii datelor, pentru a evita fragmentarea la nivelul aplicației.

MTU și actualizările OTA

Actualizările OTA (Over-The-Air) ale firmware-ului — scenariul cel mai exigent în privința MTU în BLE. Dimensiunea tipică a firmware-ului unui dispozitiv IoT este de 100–500 KB. La un MTU de 23 de octeți și un connection interval de 30 ms, transmiterea a 100 KB durează aproximativ 2–3 minute. La un MTU de 247 de octeți și DLE de 251 de octeți — 20–40 de secunde. Iar la un MTU de 512 octeți (iOS) — 10–15 secunde.

Procesul de actualizare OTA include de obicei: fragmentarea firmware-ului în pachete de dimensiune ≤ MTU, trimiterea secvențială prin Notify/Write, verificarea sumei de control pe fiecare pachet și confirmarea recepției. Dacă un pachet se pierde, dispozitivul solicită retransmiterea. Fiabilitatea OTA depinde critic de alegerea corectă a MTU și a connection interval-ului.

Recomandări pentru OTA: negociați MTU-ul maxim (247–512 octeți), setați connection interval la 7.5–15 ms (dacă dispozitivul suportă), utilizați DLE (Data Length Extension) pentru a mări pachetul fizic la 251 de octeți. Pentru dispozitivele cu memorie tampon limitată (de exemplu, modulele BLE bazate pe nRF52), verificați MTU-ul maxim în specificația cipului.

Întrebări frecvente

Ce se întâmplă dacă nu negociez MTU?

Conexiunea va utiliza MTU-ul implicit — 23 de octeți. Pentru majoritatea scenariilor IoT (transmiterea citirilor de la senzori) acest lucru este suficient. Pentru transmiterea unor volume mari de date, viteza va fi de 5–10 ori mai mică decât cu un MTU negociat de 247 de octeți.

Pot schimba MTU după începerea transmiterii datelor?

Nu, MTU este negociat o singură dată după conectare și nu poate fi modificat fără deconectare și reconectare. De aceea, se recomandă negocierea MTU imediat după descoperirea serviciilor, înainte de începerea transmiterii active a datelor.

De ce Android solicită MTU 517 octeți, iar iOS doar 512?

Acestea sunt maximele empirice stabilite istoric pentru fiecare stivă. ATT MTU real este totuși limitat la 257 de octeți conform specificației. Stivele fragmentează automat datele mai mari de 251 de octeți în mai multe pachete, așa că diferența dintre 512 și 517 este nesemnificativă.

Cum este legat MTU de Data Length Extension (DLE)?

MTU — dimensiunea cererii GATT la nivel ATT. DLE — dimensiunea pachetului fizic la nivelul Link Layer. Fără DLE, fiecare cerere GATT (de până la 247 de octeți) este fragmentată în pachete de 27 de octeți. Cu DLE — este transmisă într-un singur pachet. Pentru viteză maximă, ambii parametri trebuie negociați.

Ce MTU să aleg pentru un tracker de fitness?

Pentru un tracker de fitness care transmite citiri ale pulsului și pași, MTU-ul standard 23 de octeți este suficient. Dacă este necesară transmiterea istoricului antrenamentelor (volum de 10–50 KB) — negociați un MTU de 247 de octeți pentru a accelera sincronizarea datelor la conectarea cu smartphone-ul.

Rezumat

  • MTU — dimensiunea maximă a datelor într-o singură cerere GATT: de la 23 de octeți (implicit) la 251 de octeți (BLE 5.0).
  • Negocierea MTU are loc prin MTU Size Request/Response, inițiată de Central după conectare.
  • Protocolul ATT limitează MTU la 257 de octeți, dar iOS și Android solicită până la 512–517 octeți cu fragmentare automată.
  • Creșterea MTU de la 23 la 247 de octeți mărește lățimea de bandă de 5–10 ori la un connection interval optim.
  • Pentru viteză maximă, trebuie negociat MTU + DLE + connection interval de 7.5 ms.
  • În iOS, MTU este negociat automat, în Android — prin requestMtu, se recomandă solicitarea a 247–517 octeți.
  • Actualizările OTA — scenariul cel mai exigent: un MTU corect reduce timpul de transmisie de la minute la secunde.

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și