当前位置: 首页 > news >正文

为什么 iOS MTU=517,但 BLE 吞吐量通常只有 6~8KB/s?

在做 BLE 高速数据传输(例如 OTA、日志传输、大数据同步)时,很多开发者都会发现一个现象:

  • iOS 与设备协商MTU = 517

  • 理论上 ATT payload 可以达到514 bytes

但实际测试吞吐量时却只有:

6 KB/s ~ 8 KB/s

这个结果往往让人困惑:

MTU 已经这么大了,为什么速度还是这么慢?

要理解这个问题,需要从 BLE 的三个关键因素来看:

  1. MTU(ATT 层)

  2. Link Layer Packet Size(空口包大小)

  3. Connection Interval 与 Connection Event


一、BLE 数据从 App 到空口的路径

BLE 数据从应用层发送到无线空口,会经过多个协议层:

App

CoreBluetooth

ATT

L2CAP

Link Layer

Air

MTU 只影响:

ATT 层

吞吐量真正取决于 Link Layer 和连接参数


二、MTU=517 的真实含义

BLE 中的 MTU 指的是ATT PDU 最大长度

例如 iOS 连接 BLE 设备时常见:

Exchange MTU Request: 527
Exchange MTU Response: 517

最终:

ATT MTU = 517

ATT Write PDU 结构:

Opcode (1 byte)
Handle (2 bytes)
Value (N bytes)

因此最大 payload:

517 - 3 = 514 bytes

也就是说:

ATT 层一次最多可以写 514 bytes

但这并不意味着空口包也是 517 bytes


三、ATT 数据会封装到 L2CAP

ATT 数据会被封装到 L2CAP:

Length (2)
CID (2)
Payload (ATT)

因此:

ATT 517
→ L2CAP 521


四、真正发到空口的是 Link Layer Packet

BLE 无线包结构:

Preamble
Access Address
LL Header
LL Payload
CRC

关键限制是:

LL Payload


五、BLE 有两个时代

BLE 4.0 / 4.1

最大:

LL payload = 27 bytes

如果 ATT payload = 514:

514 / 27 ≈ 20 packets

吞吐量非常低。


BLE 4.2 以后(Data Length Extension)

BLE 4.2 引入Data Length Extension (DLE)

最大:

LL payload = 251 bytes

因此:

ATT 517
→ L2CAP 521
→ 分片

可能变为:

251 + 251 + 19


六、Data Length Extension 协商

连接建立后,BLE 设备还会协商数据长度:

LL_LENGTH_REQ
LL_LENGTH_RSP

协商内容:

MaxTxOctets
MaxRxOctets
MaxTxTime
MaxRxTime

如果双方都支持:

MaxTxOctets = 251

否则:

MaxTxOctets = 27


七、真正限制吞吐量的是 Connection Event

BLE 数据发送不是连续的,而是在connection event中发送。

连接参数通常类似:

Connection Interval = 30 ms

也就是说:

每 30ms 才能发送一次数据


八、每个 Connection Event 能发多少包?

iOS 控制器通常允许:

4 ~ 6 packets / event

假设:

6 packets

每个 packet payload:

≈ 247 bytes

(251 - L2CAP header)


九、吞吐量计算

假设:

247 bytes × 6 packets = 1482 bytes

Connection interval:

30 ms

吞吐量:

1482 / 0.03
≈ 49 KB/s

这是理论最大值


十、为什么实际只有 6~8 KB/s?

因为实际情况通常更差。

常见情况:

Connection Interval = 30 ms
Packets per event = 2
Payload ≈ 200 bytes

则:

200 × 2 = 400 bytes

吞吐:

400 / 0.03
≈ 13 KB/s

再考虑:

  • ACK

  • CPU调度

  • iOS发送节流

最终:

6 ~ 8 KB/s


十一、iOS 发送节流(Flow Control)

在 iOS 中,如果使用:

WriteWithoutResponse

系统内部有发送队列限制。

需要监听:

peripheralIsReadyToSendWriteWithoutResponse

否则会出现:

发送暂停

这也是吞吐下降的重要原因。


十二、BLE 吞吐量的核心公式

BLE 吞吐量近似为:

throughput ≈
(payload_per_packet × packets_per_event)
/ connection_interval


十三、提高 BLE 吞吐量的方法

如果需要更高速度,可以优化:

1 减小 Connection Interval

例如:

30 ms → 7.5 ms

吞吐会提升约4 倍


2 启用 Data Length Extension

确保:

LL payload = 251


3 使用 WriteWithoutResponse

避免等待 ACK。


4 合理分包

每包大小:

maximumWriteValueLengthForType


十四、总结

很多开发者误以为:

MTU = 吞吐量

其实 BLE 吞吐量取决于多个因素:

因素影响
ATT MTU单次写入大小
Data Length空口包大小
Connection Interval发送频率
Packets per event每次可发包数

因此即使:

MTU = 517

实际吞吐量仍可能只有:

6~8 KB/s


如果你在做BLE OTA 或高速数据传输,理解这些机制非常重要,否则很容易误判问题。

例如:

  • 误以为 MTU 不够大

  • 误以为设备性能不足

  • 实际是连接参数限制

http://www.jsqmd.com/news/472920/

相关文章:

  • 潮玩解锁新方式!扭蛋机盲盒小程序前端功能玩法解析
  • 通过Clonezilla Live USB制作完整ubuntu系统克隆
  • 商协会换届流程
  • 宠物食品市场综合分析与发展规划
  • 人肉防火墙:用生理反应阻断黑客攻击——软件测试从业者的专业视角
  • loader加载器
  • 北京婚礼策划公司排名
  • 你的“情感算法”,正在如何左右你的恋爱选择?——从依恋理论看亲密关系的底层代码
  • 孩子不敢说、学校发现晚?朗心科技用数智化筑起心育“防火墙”
  • 2026更新版!AI论文网站 千笔·专业学术智能体 VS 文途AI,专科生写作新选择!
  • 【分布式】Hadoop完全分布式的搭建(零基础)
  • 不懂技术怎么做题库小程序?我把经验写下来了,你看看
  • MATLAB与Simulink联合仿真:车辆二自由度动力学模型验证及对比分析
  • 初探COMSOL之混凝土Mazars拉伸损伤模型
  • 魔术轮胎公式验证:一场数值与现实的碰撞
  • 2026年玩具喷涂废气治理优质厂家推荐榜
  • COMSOL 3D脉冲激光刻槽:探索微观世界的神奇工艺
  • 实训2 MySQL zip安装
  • 员工AI培训别乱搞!漫无目的的课程等于“烧钱”没效果
  • 亲测!防爆阀门定位器企业实践案例分享,效果惊人
  • OpenClaw浏览器在Linux中的配置指南
  • AI时代传播新范式:情绪让位于理性,流量让位于权重,浅传播让位于深传播
  • 使用 java -jar 命令启动 Spring Boot 应用时,指定特定的配置文件的几种实现方式
  • Playwright 完整教程(从入门到实战,新手友好)
  • 一个基于Spring Boot的简单网吧管理系统
  • ZS316搭配VL171 实现TypeC互转DP 8K60 设计方案
  • 三次谐波注入 SPWM调制 matlab simulink 仿真 3相逆变器开关函数
  • Hertz框架内存管理:后端性能优化的关键
  • 【ETestDEV5教程24】通信协议管理之功能支持
  • 利用机器学习对生产中的电池周期寿命进行早期质量分类和预测