概述
逻辑链路控制和适配协议(Logical Link Control and Adaptation Protocol,L2CAP)是蓝牙的核心协议,负责适配基带中的上层协议。它同链路管理器并行工作,向上层协议提供定向连接的和无连接的数据业务。L2CAP具有分割和重组功能,使得更高层次的协议和应用能够以64KB的长度发送和接收数据包。它还能够处理协议的多路复用,以提供多种连接和多个连接类型,同时提供服务质量支持和成组通信。L2CAP在协议栈中的结构和位置如下:
SDU:Service Data Unit,是L2CAP与上层协议进行交换的数据包,可以被分成几个段(segment)以便用于L2CAP流量控制(L2CAP的分段功能,将段重新组合为完整的SDU就是重组功能)。L2CAP使用CID来标识SDU源自上层什么协议。
L2CAP的组成部分
如图1所示,在L2CAP中包含了信道管理(Channel Manager)和资源管理(Resource Manager)两个组成部分,介绍如下:
L2CAP资源管理器负责管理发送至基带的协议数据单元(Protocol Data Unit,PDU)片段的提交顺序以及信道间的相关调度,以确保L2CAP信道对物理信道的访问因Bluetooth控制器资源耗尽而被拒绝(Bluetooth控制器缓冲有限、HCI带宽有限)。L2CAP资源管理器也可以执行通信量符合性管制功能,以确保这些应用在他们协商好的QoS设置的限制范围内提交L2CAP服务数据单元(Service Data Unit,SDU)。
L2CAP信道管理器负责创建、管理和结束用于服务协议和应用数据流传输的L2CAP信道。信道管理器L2CAP与远程(对等)设备上的信道管理器交互,以创建这些L2CAP信道并将它们的端点连接到对应的实体(Entity,如下图)。信道管理器与本地链路管理器交互来创建新的逻辑链路和配置这些链路,以提供被传输数据类型要求的质量服务(Quality of Service,QoS)。
Channel ID:信道标识符(CID),相当于TCP里面的Port,约定了device之间的逻辑连接端点。在图2中,在面向连接的通道中,CID标识通道的两个端点,而面向无连接的通道是单一方向的,CID代表目标端点。
。L2CAP使用CID在一个控制器的逻辑链路上实现了多路ACL数据传输。
上面图2还说明了L2CAP信道有三种类型:
A、面向连接信道:Connection-OrientedCO,用于两个设备之间的数据通信。
B、无连接信道:Connection-LessCL,用来向一组设备广播方式传输数据。CID为固定值:0x0002。
C、信令信道:Signaling Channel,用于发送信令的通道。对于ACL-U逻辑链路,CID为0x0001,对于LE-U则使用0x0005。
下面是CID的定义,ACL-U和LE-U略有不同。0x00010x003F是固定CID,0x400xFFFF是动态分配CID。
LE的CID略有不同(特别留意0x0004是ATT协议):
L2CAP的功能
L2CAP的功能包括协议/信道多路复用、分段和重组(SAR)和服务质量3个组成部分。
- 协议/信道复用:L2CAP应支持协议复用,因为基带协议、报文格式里面没有用于标识更高层协议“类型”的字段,所以L2CAP要能够区分高层协议,例如GAP、RFCOMM等。
- 分段和重组:基带协议是基于硬件(物理)介质的,其报文中有效数据载荷受到最大输出单位(MTU,最大64KB)的限制。而更高层协议的报文可能需要更大的数据载荷,为此,来自高层协议的SDU在传输前可能会被L2CAP分段成多个符合基带传输大小的PDUs,然后再发送出去。同样,当基带收到多个PDU时,会重新组装为SDU,然后提交给高层协议处理。
- 服务质量:L2CAP连接建立过程,允许交换有关两个蓝牙设备之间服务质量的信息。每个L2CAP这杯必须监视协议使用的资源并保证服务质量的完整实现。
设备间的操作
操作模式
L2CAP信道有5中工作模式:
- 基本L2CAP模式(相当于Bluetooth v1.1中的L2CAP规范)
- 流量控制模式
- 重传模式
- 加强版重传模式
- 流媒体模式
- LE流量控制模式(LE特有的)
L2CAP连接类型
L2CAP有4连接类型,如下所示:
- 面向连接,采用基本L2CAP模式(Connection-oriented Channels in Basic L2CAP mode)。
- 无连接,采用基本L2CAP模式(Connectionless Data Channels in Basic L2CAP mode)。
- 面向连接,重传/流量控制/流模式(Connection-oriented Channels in Retransmission/Flow Control/Streaming Mode)。
- 面向连接,LE流量控制模式(Connection-oriented Channels in LE Credit Based Flow Control Mode)。
面向连接的数据信道提供两个设备之间的连接,绑定逻辑链路(ACL-U和LE-U)的CID则用于标识信道的每一端。对于无连接的数据信道,当用于广播传输时,CID限制了传输的方向;但用于单播传输时则没有限制。
L2CAP数据包和信号包
L2CAP有数据包和信号包两种格式。
L2CAP数据包格式.
L2CAP 的4中连接类型,其对应的数据包格式是不同的:
-
基本L2CAP模式下面向连接通道的数据包(也叫B-frame)
Length:2字节,payload的长度,不包括CID长度。
Channel ID:2字节,对端目的信道;
Information payload:0~65535字节(64KB)。 -
基本L2CAP模式下无连接数据通信的数据包(G-frame).
Length:2字节,PSM+payload的长度。
Channel ID:2字节,对于无连接数据传输使用固定值0x0002;
PSM:>=2字节,Protocol/Service Multiplexer -
增强的重传模式/流量控制模式/流媒体模式下面向连接通道的数据包(S-Frame/I-Frame)
I-Frame用于在L2CAP实体间进行信息传输,S-Frame则用于确认I-Frame和I-Frame的重传请求。
Length:2字节,除Basic L2CAP header外的总字节数。
Channel ID:2字节,对端目的信道;
L2CAP SDU Length:2字节,只出现在Start I-Frame(SAR=0x01)中,表示总的SDU长度。
FCS:2字节,帧检验序列(Frame Check Sequence)。
Control Field有 3模式:
a、Standard Control Field:用于流控/重传模式(Retransmission Mode and Flow Control Mode)。
b、Enhanced Control Field:用于加强重传合流模式(Enhanced Retransmission Mode and Streaming Mode)。
c、Extended Control Field:用于加强重传合流模式(Enhanced Retransmission Mode and Streaming Mode)
Standard Control Field格式如下:
Enhanced Control Field格式如下
Extended Control Field格式如下:
Control Field各字段含义如下:
SAR: (2 bits), Segmentation and Reassembly, 指明该L2CAP是否是分段过
TxSeq: (6/14 bits), Send Sequence Number, 对发送的I-Frame计数, 用于分段和重组
ReqSeq: (6/14 bits), Receive Sequence Number, 接收方用于应答I-Frame和请求重传
R: (1 bits), Retransmission Disable Bit, 用来实现Flow Control
S: (2 bits), Supervisory function, 表示S-Frame的type
P: (1 bits), Poll, 置1表示从接收方征求相应
F: (1 bits), Final, 相应P置1的S-Frame
- 基于LE流量控制模式下的面向连接通道的数据包
L2CAP信号包格式
信号包格式(Signaling Packet Format):在对端设备上两个L2CAP实体间传递的信号命令(Signaling Commands),这些信号命令通过信令通道(Signaling Channel)来传输,对于ACL-U逻辑链路应该使用CID 0x0001, 而对于LE-U则应该使用CID 0x0005。信号包的格式如下:
各个信令的具体信息可参考:Vol 3->Part A->4。下面举例:
如上图,CID=0x0001,表明这个一个信号包,信令值=0x02,Vol 3->Part A->4.2有详细介绍这个信令是Connection Request,发送连接请求包,在两个设备之间创建L2CAP通道。之后才能对L2CAP通道进行配置,比如:
Connection Request的信令包格式如下:
PSM:Protocol/Service Multiplexer 协议/服务复用器。其中蓝牙SIG已经为一些高层协议预留了PSM值,参考https://www.bluetooth.com/specifications/assigned-numbers/里面的“Logical Link Control”链接。在本例子中,PSM=0x19,代表AVDTP协议。
Source CID:表示请求创建的信道端点号(CID),这个CID是动态分配的,即要在0x0040~0xFFFF之间。本例子中CID=0x0044,创建信道成功之后,接下来与AVDTP协议相关的数据通信将在这个信道里面进行。