L2CAP(Logical Link Control and Adaptation Protocol)是 Bluetooth host 层中的协议复用与适配层,负责把 ATT、安全管理等上层协议送到对应 channel,并处理分段、重组和部分流控问题。
核心问题
Bluetooth 链路上不只有一种上层协议。ATT、SMP、音频或其他协议都可能需要使用同一底层连接。L2CAP 解决的是“如何在同一蓝牙链路上复用多个上层协议,并把不同大小的数据单元适配到底层可传输的包”。
核心机制
L2CAP 的核心对象是 channel:
| 对象 | 含义 | 工程关注点 |
|---|---|---|
| Channel | 上下层之间的一条逻辑通道 | fixed channel 或 dynamic channel |
| CID | Channel Identifier | 标识 L2CAP channel |
| SDU | 上层交给 L2CAP 的服务数据单元 | 可能大于下层一次可发大小 |
| PDU | L2CAP 向下层发送的协议数据单元 | 需要分段或重组 |
| PSM | Protocol/Service Multiplexer | dynamic channel 关联的上层协议标识 |
| MTU | 最大传输单元 | 限制单次 PDU/SDU 大小 |
在 BLE 中,基础 ATT 通常运行在为 ATT 保留的 fixed L2CAP channel 上;Enhanced ATT 可以使用动态 L2CAP channel,让多个 ATT bearer 并行存在。L2CAP 会根据 channel 把收到的数据交给正确上层协议。
如果上层 SDU 大于下层一次可承载的数据,L2CAP 需要分段发送,并在接收端重组。这就是为什么 BLE 吞吐不只取决于 GATT API,还取决于 ATT_MTU、L2CAP 参数、连接间隔和控制器能力。
工程用途
- 支撑 BLE 中 ATT / GATT 数据访问。
- 通过 EATT 或动态 channel 改善并发和流控。
- 在抓包和蓝牙栈调试中定位数据到底进入 ATT、SMP 还是其他上层协议。
- 分析 MTU、分段重组、队列阻塞和低层吞吐瓶颈。
边界与常见坑
- L2CAP 不是 GATT 数据模型:它不理解 service 或 characteristic,只负责 channel 和适配。
- MTU 不是唯一吞吐因素:连接间隔、PHY、控制器缓冲、应用处理速度和流控同样重要。
- 基础 ATT 串行特性会限制并发:未使用 EATT 时,一些 ATT 事务需要按顺序进行。
- 分段成功不等于应用成功:L2CAP 只把数据送到上层协议,业务语义仍由 ATT/GATT 或更高层处理。