L2CAP(Logical Link Control and Adaption Protocol),链路控制和适配协议,位于基带层之上,将基带层的数据分组交换以便于高层应用的数据分组格式,并提供复用和服务质量交换等功能。L2CAP屏蔽了低层传输协议中的许多特性,从而方便高层协议的开发。
1.L2CAP概述
L2CAP处于链路控制协议之上,属于数据链路层。其采用协议复用、分段、重组和组抽象功能对上层协议提供面向连接和无连接数据服务。允许高层协议和应用发送和接受最大长度为64k字节的数据分组,也允许通过流控制和重传模式来进行每个信道的流控制和重传。L2CAP提供逻辑信道,叫做L2CAP信道,它通过ACL逻辑传输的支持映射到L2CAP逻辑链路。
1.1 L2CAP特征
L2CAP的功能要求包括协议/信道复用,分段和重组,每个信道的流控制、差错控制和组管理。
下图表示了L2CAP层的结构,Channel manager(信道管理器)提供控制平面功能(Control Plane Function),并负责内部信令、L2CAP点对点信令以及它和高、低层之间的信令。Retransmission(重传)和Flow Control(流控制)块提供了每个信道的流控制和可选的重传应用。资源管理器负责提供对信道管理器、重传及流控制和流控制块,以及一些不需要重传和流控制服务的应用数据流的帧中继服务。它负责在低层接口提供的设备之上的和多路L2CAP信道有关的收发分组保持一致。
1.1.1 协议复用
L2CAP必须能够区分高层协议,在信道建立时,协议复用功能用来发送请求来连接正确的上层协议;数据传输时,逻辑信道复用必须能够把用同一协议的不用几个高层实体区分出来。
1.1.2 分段与重组
通过由资源管理器所提供的帧中继服务,在L2CAP层之上个人应用程序可以控制传输帧的大小。如果L2CAP控制了PDU的长度,那么就可为多路复用提供更好的服务,它提供下面的好处:
<1>分段将允许应用数据单元的交错,这样可以满足延时要求;
<2>在L2CAP控制了分组大小以后,内存和缓冲区管理就会变得更加简单;
<3>重传纠错更有效;
<4>减少丢失数据
<5>上层分组映射在低层分组中,并可以从底层分组中剥离出来。
每个L2CAP信道的流控制,在同一个L2CAP逻辑链路上有几个数据流传输时,每个信道需要各自的流控制,L2CAP也对需要流控制的应用提供流控制。L2CAP连接建立过程,允许交换有关两蓝牙单元之间服务质量的信息。每个L2CAP设备必须监视由协议使用的资源并保证服务质量(QoS)的完整实现。
1.2 主要操作
逻辑链路控制盒适配协议(L2CAP)是以信道概念为基础的。每个L2CAP信道的端点有信道标识符(Channel Identifier,CID)来表示。
1.2.1 信道标识符
不同蓝牙设备的L2CAP层之间通信时,建立在逻辑链路的基础上,这些逻辑链路被称为信道(channel),每条信道的每个端点都被赋予了一个信道标志(Channel Identifier,CID)。CID是表示逻辑信道本地端设备的名字。从0x0001到0x003F的标志符保留用于特定的L2CAP功能,空标识符(0x0000)则定义为一个非法标识符,并且不得用于目标端,在本地设备与多个远端设备存在多个并发L2CAP信道的情况下,同一CID不得重新用作本地L2CAP信道端。
CID的分配与特定设备有关,一台设备可以独立于其他设备指定CID。
L2CAP信道有三种类型:
- 面向连接(Connection-Oriented,CO)信道,用于两个连接设备之间的双方通信;
- 无连接(Connection-Less,CL)信道,用来向一组设备进行广播式的数据传输,为单项信道;
- 信令(Signaling)信道,用于创建CO信道。
1.2.2 设备间操作
下图说明了不同设备之间的L2CAP实体间通信的使用方式。面向连接的数据信道提供了两设备间的连接,而CID则用于标识信道的每一端。。这些信道用于支持一个信道”组”,在该信道组里发送端CID用于表示一个或多个远程设备。
1.2.3 层间操作
L2CAP的实施遵循下述总体体系结构,并可在高层协议和低层协议间传送数据。每个应用都必须支持一组用于L2CAP应用间通信的信令命令。L2CAP应用还应准备从底层接受某类型的事件,并可向高层发出事件。
1.2.4 操作方式
L2CAP有三种不同的操作模式:
<1>基本L2CAP模式
<2>流控制模式
<3>重传模式
模式的选择是通过配置过程完成的,默认模式是L2CAP模式。在流控制模式和重传模式下,双方传输的数据包都是编了号的。数据包中的序列号码用于控制缓冲。流控制模式下,丢失的数据包可以被检测出来,并通知对方丢失但不能重传。重传模式下使用一个定时器,把需要重新传输的数据包发送过来,并确保所有的数据包发送给对方。
2.数据分组格式
L2CAP基于分组,但它实际上遵循的是一个基于信道的通信模型。一条信道代表远程设备上两个L2CAP实体间的一种数据流。信道可以是面向连接和面向无连接的。所有分组字段都采用小端字节命令。对应于三种信道类型,L2CAP有两种数据分组类型,一种用于CO信道,另一种CL信道,信令信道实际上使用的是CO信道的分组类型。三种信道的数据分组格式的信道ID不同。
2.1 面向连接信道
在基本L2CAP模式下,面向连接信道上的L2CAP PDU也称作B-帧。如下图所示格式,
长度:2字节,指除了L2CAP报文头长度以外的信息净荷的大小,单位为字节,信息净荷的长度可以达65535个字节,长度字段用于重组时,并用于接收端重组后L2CAP分组的简单整数校验。
信道ID:2字节,用于标识分组的目标信道终端。
净荷信息:0~65535字节。净荷信息包含来自上层协议的净荷或者发送到上层协议的净荷。MTU的值在信道配置时确定,所支持的用于信道分组的MTU的最小值为48字节。
2.2 无连接数据信道
无连接数据信道上的L2CAP PDU也称作G-帧。
长度:2字节,信息净荷与PSM字段长度的和
信道ID:2字节,CL信道的ID固定为0x0002
协议/服务复用(PSM):2字节(最小)
信息净荷:0~65535字节。该信息净荷将分发到组中所有成员。
2.3 在重传/流控制模式下的面向连接信道
为了支持流空和重传,在基本L2CAP头之外定义了协议元素的L2CAP PDU类型。在L2CAP实体之间,信息的传递用信息帧(I-帧),而使用监督帧(S-帧)来用作对I-帧的应答和请求重传。
2.3.1.L2CAP 头字段
长度:2字节,在L2CAP PDU的头两个字节包含了整个L2CAP PDU的长度字节信息,它所指明的长度包括长度和CID字段,对于I-帧和S-帧,长度字段包括控制、L2CAP SDU长度(当前的)、信息净荷字节和FCS的长度字节。如果存在L2CAP SDU长度字段,I-帧中的最大信息净荷字节长度为65529,如果不存在L2CAP PDU长度字段,则I-帧最大信息净荷字节长度为65531。
信道ID:2字节
2.3.2.控制字段(2字节)
控制字段定义了帧类型,包含可应用的序列号码,
信息帧格式:信息帧是用作在L2CAP实体之间传递信息的。每个信息帧都有一个TxSeq(发送序列号)和RxSeq(接受序列号),这样可以对由数据链路层实体接收到的附加信息帧进行应答或者不应答。而重传位(R bit)决定信息帧是否重传。
信息帧中的SAR字段用来对分段和重组进行控制。L2CAP SDU长度字段指明了SDU的长度,包括所有分段的长度。
监督帧格式:用于对信息帧进行应答和请求重传。每个监督帧有一个RexSeq序列号码对数据链路层实体接收到的附加帧进行应答,和一个重传位(R Bit)来影响是否对信息帧进行重传。
监督帧类型:RR(Receice Ready)和REJ(Reject)。
Send Sequence Number—TxSeq(6位):用于对每个信息帧进行编号,来使能排序和重传。
Receive Sequence Number—RxSeq(6位):接收方用来对信息应答,REJ帧来请求重传指定序列号码的信息帧。
重传屏蔽位R(1位):
2.4 信令分组格式
2.5 配置参数选项
选项和信息元素一样进行传输,它包括选项类型、选项长度和一个或多个选项数据段。
类型:1个字节
定义为要协商的参数,如果没能识别出选项,则由选项类型的最高位决定要采取的动作。
0:必须识别该选项,若无法识别则拒绝配置请求
1:若无法识别该选项则跳过该选项。
长度:1字节,定义选项净荷的字节数,无净荷的选项类型的长度值为0
选项数据:
取决于选项类型。
2.5.1 最大传输单位
表明发送方能接受的最大SDU大小,类型为0x01,净荷长度为2字节。净荷携带一两字节的MTU大小值为唯一信息单元,
2.5.2 刷新超时选项
用来通知对方发送者接收时所用刷新超时事件。刷新超时定义在基带中,其类型是0x02,2字节净荷。
刷新超时:表示以ms为单位的时间单元。它是一个不对称的值,请求发送者应该定义它的刷新时间值
2.5.3 服务质量选项
服务质量QoS选项说明与1363类似的流控制规范,QoS默认参数为0x03。
2.5.4重传和流控制选项
表明是否使用重传和流控制,
模式:1字节
2.6 状态机
CLOSED--信道没有连接
WAIT_CONNECT--接收到了一个连接请求,但是只能连接应答中标志状态为”Pending(未觉的)”
WAIT_CONNECT_RSP--发送了一个连接应答,等待确认连接应答。
CONFIG--不同的选项在双方进行配置
OPEN--数据用户传输状态
WAIT_DISCONNECT—发送了一个断开连接请求,等待断开连接应答。
2.7 L2CAP常规操作流程
2.7.2 分段和重组
分段就是把PDU分解成小块,然后把这些小块通过L2CAP传输到下层。重组就是通过对一个个分段进行重装来重新组成PDU,然后传输给上层。分段和重组可以用到任何类型L2CAP PDU。
1.分段
协议在基带净荷(帧头部)中定义了两位的LLID位,来通知接收方该分组是L2CAP PDU的开始或后续分段,10表示开始分段,01表示后续分段。
2. L2CAP PDU的重组
链路控制协议试图按顺序传输ACL分组,并使用16位的CRC来保护数据的完整性。在基带检测到错误的时候,就使用自动重传请求方案。L2CAP层应该使用在L2CAP PDU头中的长度字段来校验判断,如果长度不匹配,则要丢弃该L2CAP PDU。如果信道可靠性要求不高,则应该缺省地丢弃长度不匹配分组。
2.7.3 服务数据单元的封装
服务数据单元(SDU)是L2CAP和上层协议之间交换的数据格式,它是上层协议传给L2CAP层的数据或者L2CAP要传送给上层的数据。
在基本的L2CAP模式下,每个SDU被封装在一个最小的L2CAP协议元素中,形成的L2CAP PDU叫做基本信息帧(B-frame)。
分段和重组操作只用在重传模式和流控制模式下。SDU被分段成一个个小的SDU段,然后每个段用L2CAP协议封装成L2CAP PDU,这种PDU叫做信息帧(I -frame),最大PDU负荷长度(MPS)定义了一个SDU分段的最大长度。MPS可以通过一个特定的接口通知上层。
1.L2CAP SDU的分组
在流控制或重传模式下,SDU被分段,然后单独用L2CAP协议封装(加头和长度元素)形成I-帧,头包括2bit的SAR段,用于确定该I-帧是原来SDU的开始或后续或是一个没经过分段的SDU。
2.L2CAP SDU的重组
接收方根据接收到的I-帧的SAR字段来进行重组过程。根据L2CAP SDU的长度字段和序列号码以确定那些SDU丢失了。
2.8 流控制和重传模式
2.9 L2CAP PDU数据分析
L2CAP_PDU根据信道的不同分为CO信道的L2CAP_PDU、CL信道的L2CAP_PDU、信令信道L2CAP_PDU三种不同的PDU格式,传输过程中通过信道标识符区分。
对比三种PDU格式,他们的区别在于信道ID,这里的CID是表示对方的CID,
对于一个具体数据分组,可据其第三、四个字节来确定数据结构属于哪个信道的PDU。
<1>CID为0x0001,属于L2CAP_PDU。
代码是表示不同的信令命令,ox01~0xB共11种命令,标识符是应答命令和请求命令的匹配标识。长度代表后面数据的字节数。,根据代码的不同,可以找出不同的命令,然后根据不同命令所特有的格式和含义知道代码的含义。
<2>CID:0x0002,则属于CL信道的L2CAP_PDU。根据前面的CL信道的L2CAP_PDU标志图,可以获取其数据长度(第一,二字节),PSM代表所复用的协议,大于等于2字节,以最低字节的最低位为1,最高字节的最低位为0来表示,根据PSM取值,PSM小于0x1000,则其为SDP,0x0003则为RFCOMM,0x0005对应于TCS;PSM大于等于0x1000,则为动态分配并与SDP一同使用。
<3>CID为0x0040~0xFFFF