第四章:L2CAP 的“数据语言”——揭秘蓝牙通信的报文格式
🔍 “蓝牙耳机怎么知道该播放哪段音频?键盘按键如何准确传送到电脑?”
答案藏在 L2CAP 的数据包格式中——它就像一套“通用语言”,让不同设备之间能高效、可靠地交换信息。
上一节我们深入探秘了 L2CAP 信道的“生命周期引擎”——状态机。现在,让我们走进它的“数据世界”:L2CAP 如何封装数据?不同的连接模式下,报文结构有何差异?
本章将带你全面解析 L2CAP 的四种核心通信模式及其对应的数据包格式(Packet Format),从基础帧到高级流控机制,一网打尽!
🌐 4.1 面向连接通讯(Connection-oriented Channels)
✅ 什么是面向连接通信?
在蓝牙协议中,面向连接的信道(Connection-Oriented Channel) 是最常见、最可靠的通信方式。它类似于打电话:必须先建立连接,然后才能传输数据,且保证顺序、完整性与错误恢复。
💡 类比:
- 打电话 = 面向连接
- 发短信 = 无连接
这类信道适用于对可靠性要求高的场景,如:
- 蓝牙耳机播放音乐
- 键盘输入同步
- 智能手表心率上传
📄 基础信息帧(Basic Information Frame, B-frame)
面向连接的数据包采用 B-frame 格式,其结构如下图所示:
Figure 4.1: L2CAP Packet (field sizes in bits)
🔹 字段详解:
字段 | 大小 | 说明 |
---|---|---|
Length | 16 bits | 表示 Information payload 的长度(单位:字节),不包含 L2CAP 头部。最大支持 65535 字节。用于接收端校验数据完整性。 |
Channel ID (CID) | 16 bits | 标识目标信道的唯一编号。每个 CID 对应一个逻辑通道,范围由设备动态分配。例如:0x0001 是信令通道,0x0002 是组帧通道。 |
Information (payload) | 0~65535 bytes | 实际承载的用户数据或上层协议数据(如 ATT、RFCOMM)。 |
⚠️ 注意:所有字段均按 小端模式(Little Endian) 编码,即低位在前。
📌 关键点总结:
- 最小 MTU(Maximum Transmission Unit):在通道配置期间协商,但至少为 48 字节。
- CID 是关键:决定了数据发往哪个信道,是多路复用的核心。
- Length 字段:帮助接收方判断是否完整收到数据包,防止截断或拼接错误。
✅ 这种结构简单高效,适用于大多数常规应用。
🚫 4.2 无连接通讯(Connectionless Data Channel)
✅ 什么是无连接通信?
无连接通信不需要预先建立连接,数据直接广播发送,类似“群发短信”。它不保证顺序、不提供重传机制,但延迟低、开销小。
适用场景包括:
- 服务发现(SDP)
- 广播通知
- 快速状态更新
📄 组帧(Group Frame, G-frame)
无连接通信使用 G-frame 格式,结构如下图所示:
Figure 4.2: Group Frame (G-frame)
🔹 字段详解:
字段 | 大小 | 说明 |
---|---|---|
Length | 16 bits | 整个数据包的长度(不含 Basic L2CAP Header),即 PSM + Payload 的总大小。 |
CID | 16 bits | 固定值为 0x0002,表示这是一个组帧。 |
PSM (Protocol/Service Multiplexer) | ≥16 bits | 指明上层协议类型,如 RFCOMM、SDP、ATT 等。 |
Information payload | 0~65535 bytes | 要分发给组内所有成员的数据。 |
📌 PSM 字段规则(重要!)
为了支持未来扩展,PSM 字段遵循以下规则:
- 所有 PSM 值必须是 奇数 → 最低位(bit 0)为 1
- 高八位的最低有效位(bit 7)必须为 0
- 允许扩展到超过 16 位(通过保留位)
✅ 示例:
- RFCOMM 使用 PSM = 0x0003
- SDP 使用 PSM = 0x0001
- ATT 使用 PSM = 0x0005
📌 关键点总结:
- 最小无连接 MTU(MTUcnl):必须支持至少 670 字节,除非另有约定。
- 广播特性:数据会被发送到所有注册该 PSM 的设备。
- 无需握手:发送即完成,不等待确认。
❗ 由于无连接不可靠,不适合传输关键数据。
🔁 4.3 在重传、流控、流模式下的面向连接通信
✅ 为什么需要增强模式?
虽然基础 B-frame 已能满足大部分需求,但在高可靠性要求的场景中(如文件传输、实时控制),我们需要更强的机制来实现:
- 错误检测与重传
- 流量控制
- 有序传输
为此,L2CAP 提供了三种增强模式:
- Retransmission Mode(重传模式)
- Flow Control Mode(流控模式)
- Streaming Mode(流模式)
这些模式统一使用 I-frame(Information Frame) 和 S-frame(Supervisory Frame) 来实现。
📄 I-frame 与 S-frame 结构
🔹 I-frame(信息帧)
用于传输实际数据,结构如下图所示:
Figure 4.3: I-frame and S-frame
字段 | 大小 | 说明 |
---|---|---|
Length | 16 bits | 数据包总长度(不含 Basic L2CAP Header) |
Channel ID | 16 bits | 目标信道标识 |
Control | 16 或 32 bits | 控制字段,决定帧类型和序列号 |
L2CAP SDU Length | 0 或 16 bits | 只存在于“Start of L2CAP SDU”帧中(SAR=01b),表示整个 SDU 的长度 |
Information Payload | 可变 | 用户数据 |
FCS | 0 或 16 bits | 帧校验序列(可选),用于错误检测 |
✅ FCS 是可选的,通常在高可靠性场景启用。
🔹 S-frame(监督帧)
用于控制和管理通信过程,如确认、请求重传等。
字段 | 大小 | 说明 |
---|---|---|
Length | 16 bits | 数据包长度 |
Channel ID | 16 bits | 信道标识 |
Control | 16 或 32 bits | 控制字段,定义帧行为 |
FCS | 0 或 16 bits | 可选校验 |
🎯 Control 字段详解
Control 字段是 I-frame 和 S-frame 的核心,分为两种格式:
1️⃣ Standard Control Field(标准控制字段)
适用于重传和流模式,结构如下图所示:
✅ 字段说明:
- Frame Type:I=信息帧,S=监督帧
- SAR:Segmentation and Reassembly(分段重组),00=完整,01=开始,10=继续,11=结束
- ReqSeq:请求序列号,用于确认
- TxSeq:发送序列号,用于排序
- R:接收确认标志
- P:Poll(轮询),请求对方响应
- S:Sequence Number(序列号)
- X:保留位,未来扩展用
2️⃣ Enhanced Control Field(增强控制字段)
适用于加强版重传和流模式,结构如下图所示:
✅ 新增字段:
- F:Flag,用于区分不同功能(如流控、重传)
✅ 优势:支持更大的序列号空间,提升吞吐量和可靠性。
3️⃣ Extended Control Field Formats
该格式一般用于加强重传模式和流模式,字段描述如下:
1. X(Reserved for future use)
- 保留位,用于未来扩展。
- 当前设为 0。
2. ReqSeq(Receive Sequence Number)
- 接收端使用此字段来确认已收到的 I-frame。
- 在 REJ 和 SREJ 帧中,用于请求重传具有特定发送序列号的 I-frame。
3. TxSeq(Send Sequence Number)
- 发送端为每个 I-frame 分配唯一的序列号,用于:
- 保证数据顺序
- 支持重传机制
- 实现丢包检测
4. R(Retransmission Disable Bit)
- 重传禁用位,用于实现流量控制。
- 当接收端缓冲区满时,设置 R=1,通知发送端暂停重传。
- 发送端收到 R=1 后,停止使用 RetransmissionTimer,改用 MonitorTimer 监控信令。
✅ 功能独立于 ReqSeq,可单独启用。
5. SAR(Segmentation and Reassembly)
- 指示当前帧是否为分段数据的一部分。
- 取值如下图所示:
值 | 含义 |
---|---|
00b | 未分段的 L2CAP SDU |
01b | L2CAP SDU 的起始帧 |
10b | L2CAP SDU 的结束帧 |
11b | L2CAP SDU 的中间帧(续传) |
✅ 支持大 SDU 的分片传输,避免单包过大导致丢包。
6. S(Supervisory Function)
- 标记 S-frame 的类型,取值如下图所示:
值 | 含义 |
---|---|
00b | RR - Receiver Ready(接收就绪) |
01b | REJ - Reject(拒绝) |
10b | RNR - Receiver Not Ready(接收未就绪) |
11b | SREJ - Selective Reject(选择性拒绝) |
✅ 用于实现滑动窗口机制和选择性重传。
7. P(Poll)
- 设置为 1 时,请求接收方立即响应。
- 接收方应返回 F=1 的 S-frame 作为响应。
8. F(Final)
- 设置为 1 时,表示这是对 P=1 请求的最终响应。
- 用于确保双向通信的完整性。
⚡ 4.4 在 LE Credit-Based Flow Control 模式下的面向连接通信
🚀 这是蓝牙低功耗(BLE)中最常用的模式,专为节能设计!
在 BLE 中,L2CAP 使用 Credit-Based Flow Control(信用额度流控)机制,避免频繁的握手和确认,从而降低功耗。
✅ 特点:
- 基于信用(Credits):发送方获得一定数量的“信用点”,每发送一个包消耗一点,当信用耗尽时暂停发送。
- 无需复杂 ACK:接收方定期返回信用额度,简化流程。
- 高效节能:特别适合传感器、智能手环等低功耗设备。
📄 数据包格式
在此模式下,仍使用 B-frame 结构(见 Figure 4.1),但增加了额外的控制字段用于信用管理。
✅ 例如:ATT 协议在 BLE 中就运行在该模式下。
🔹 LE Information Frame(LE-frame)
结构如下图所示:
Figure 4.4: LE Information Frame (LE-frame)
字段 | 大小 | 说明 |
---|---|---|
Length | 16 bits | 数据包长度(不含头部) |
Channel ID | 16 bits | 信道标识 |
L2CAP SDU Length | 16 bits | 仅出现在第一个 LE-frame 中,表示整个 SDU 的长度 |
Information Payload | 可变 | 用户数据 |
✅ 该格式专为 BLE 设计,支持大 SDU 分片传输。
🔮 下一章预告:L2CAP 的“灵魂”——信道管理与协议栈集成
你以为 L2CAP 只会“发包”?那你就错了!
在下一章《5. 信道管理与协议栈集成》中,我们将深入探讨:
- 如何创建、配置和关闭信道?
- L2CAP 如何与上层协议(如 ATT、RFCOMM)协同工作?
- 信令通道(Signaling Channel)是如何工作的?
- 多信道并发时的资源调度策略?
💬 你会看到:L2CAP 不仅是“搬运工”,更是整个蓝牙通信的“大脑”。
📌 小结:
L2CAP 的数据包格式是其通信能力的基础。从简单的 B-frame 到复杂的 I/S-frame,再到 BLE 的信用流控模式,每一种格式都服务于特定的应用场景。
✅ 掌握这些格式,你就掌握了蓝牙通信的“语法”。
⚠️ 禁止转载:本文为原创内容,未经授权不得转载、复制或用于商业用途。如需引用,请注明出处并联系作者。
👉 喜欢这篇文章?记得点赞 ❤️ + 收藏 📌 + 关注 👤,下一期带你解锁 L2CAP 的“信道管理黑科技”!