目录
[1 核心功能](#1 核心功能)
[1.1 L2CAP层简介](#1.1 L2CAP层简介)
[1.2 L2CAP层的主要功能](#1.2 L2CAP层的主要功能)
[2 BLE L2CAP vs. 经典蓝牙 L2CAP](#2 BLE L2CAP vs. 经典蓝牙 L2CAP)
[3 核心概念](#3 核心概念)
[3.1 信道标识符](#3.1 信道标识符)
[3.2 L2CAP数据包结构(B帧 - 基本信息帧)](#3.2 L2CAP数据包结构(B帧 - 基本信息帧))
[3.3 MTU - 最大传输单元](#3.3 MTU - 最大传输单元)
概述
L2CAP的全称是逻辑链路控制与适配协议。为上层ATT/GATT提供了稳定可靠的数据传输管道。理解L2CAP是深入理解BLE数据流和协议栈交互的关键一步。
1 核心功能
1.1 L2CAP层简介
L2CAP的全称是逻辑链路控制与适配协议 。可以把它想象成BLE协议栈中的"交通调度中心 "或"数据搬运工"。它位于底层射频协议(HCI/链路层)之上,为上层应用协议(如ATT、SM)提供稳定、可靠的数据通道。
BLE中的L2CAP层是一个高效、精简的适配层,它核心完成了三件事:
多路复用: 用CID标识不同业务(ATT/SM),让一条物理连接能同时服务多个上层协议。
适配分片: 将上层的大数据包切割成底层能传输的小块,并对上层隐藏这一细节。
基础流控: 通过信用机制,确保数据收发节奏匹配,防止丢失。

1.2 L2CAP层的主要功能
在BLE中,L2CAP的设计相对于经典蓝牙大为简化,主要承担三大核心功能:
1) 协议/通道复用
功能: 这是L2CAP最基本也是最重要的功能。底层的射频链路只有一条物理连接,但上层可能有多个应用(如读取设备信息、传输心率数据、进行配对加密)需要同时通信。
实现 : L2CAP通过信道标识符来区分不同的上层协议。每个数据包都带有CID,指明它属于哪个"逻辑通道"。例如:
CID 0x0004: 属性协议
CID 0x0006: 安全管理协议类比: 就像一栋大楼只有一根总光纤入户(物理连接),但通过路由器(L2CAP)可以分出Wi-Fi给手机、网线给电脑、IPTV给电视(多个逻辑通道),各走各的数据,互不干扰。
2) 数据分片与重组
功能 : 上层协议(如ATT)要发送的数据包可能很大(例如,读取一个很长的特征值)。但底层链路层传输有最大传输单元 的限制(BLE 4.x/5.0 默认是 27字节, ATT层可用23字节)。L2CAP负责将大的上层数据包分割成适合底层传输的小块(分片),并在接收端重新组装成完整的原始数据包(重组)。
重要性: 这是实现可靠传输大数据的基础,对上隐藏了底层MTU的复杂性。
3) 流量控制
功能 : 确保发送方的数据不会淹没接收方的缓冲区,防止数据丢失。BLE使用一种称为 "基于信用的流量控制" 的机制。
工作原理:
建立连接时,接收方会告诉发送方:"我有 X 个信用值"。每个信用值代表可以接收一个完整的L2CAP数据包(即一个PDU)。
发送方每发送一个数据包,就消耗一个信用值。
接收方处理完数据后,可以发送"信用更新"给发送方,返还信用值。
发送方只有信用值 > 0 时才能发送新数据。
优点: 这是一种简单有效的反压机制,保证了数据传输的可靠性。
2 BLE L2CAP vs. 经典蓝牙 L2CAP
这一点非常重要,因为BLE的L2CAP是简化版:
| 特性 | BLE L2CAP | 经典蓝牙L2CAP | 差异原因 |
|---|---|---|---|
| 信道类型 | 主要是固定信道 | 支持多种信道类型 | BLE简化设计 |
| 模式 | LE Credit-Based Flow Control | 基本模式、重传模式、流控模式 | BLE追求低功耗 |
| 信令复杂度 | 极简信令 | 复杂信令命令集 | BLE无需复杂协商 |
| 分段重组 | 主要在链路层完成 | L2CAP层处理 | BLE优化延迟 |
| 头部开销 | 固定4字节 | 可变,至少4字节 | BLE减少开销 |
| QoS支持 | 无 | 支持服务质量协商 | BLE场景简单 |
| 错误恢复 | 无内置重传 | 支持错误检测和重传 | 由上层处理 |
| 最大MTU | 默认23,可协商到517 | 默认672,可到65535 | BLE低内存需求 |
BLE的L2CAP是"轻量级"的,只保留了在低功耗场景下必不可少的功能。
3 核心概念
3.1 信道标识符
| CID范围 | 用途 | 说明 |
|---|---|---|
| 0x0001-0x0003 | 保留 | 不使用 |
| 0x0004 | ATT协议 | 属性协议专用通道 |
| 0x0005 | L2CAP信令通道 | 用于L2CAP控制命令 |
| 0x0006 | 安全管理协议 | 安全配对、加密通信 |
| 0x0007 | ATT协议(备用) | |
| 0x0008-0x003F | 保留/SIG分配 | |
| 0x0040-0x007F | 动态分配 | 面向连接的信道 |
| 0x0080-0x00FF | 动态分配 | LE Credit-Based连接 |
3.2 L2CAP数据包结构(B帧 - 基本信息帧)
这是BLE中最常见的L2CAP包格式:


Length (2字节): 指示后面 Payload 的长度(以字节为单位)。不包含Length和CID字段本身的4个字节。
CID(2字节): 逻辑信道标识符,指明这个包属于哪个上层协议。
Payload: 来自上层协议(如ATT、SM)的完整数据包。
信令包格式

分片过程 : 这个完整的B帧会被L2CAP交给链路层。如果B帧长度超过链路层的有效载荷容量(MTU),链路层会将其在射频层面进行分片(注意:这个分片对L2CAP透明,它只管生成完整的B帧)。接收端的链路层负责重组,再交给L2CAP一个完整的B帧。

3.3 MTU - 最大传输单元
这是一个贯穿协议栈的概念:
链路层MTU : BLE 4.x/5.0 默认是 27字节(有效载荷)。
L2CAP MTU : 链路层MTU减去L2CAP头部(4字节)后,留给上层ATT的默认空间是 23字节 。这就是著名的 ATT_MTU = 23 的由来。
ATT_MTU交换: 连接建立后,主从设备可以通过ATT协议交换一个更大的MTU值(例如247字节)。一旦协商成功,L2CAP就需要能够处理更大的B帧,并将其分片成多个链路层包进行传输。这个协商过程极大地提升了数据传输效率。
