BLE L2CAP 层 - 分段与分段

Bra*_*atw 4 bluetooth bluetooth-lowenergy

我有两个问题要问你们:

  1. BLE L2CAP中分段+重组和分段+重组有什么区别?经过一番研究,我无法理解。
  2. 除了硬写的 BL 核心规范之外,我在哪里可以找到有关 BLE 中 L2CAP 的一些理论?

Emi*_*mil 8

首先,请注意 L2CAP 最初是经典蓝牙的重要组成部分。经典蓝牙的 L2CAP 支持广泛的功能,例如连接请求、可靠数据包传输、不可靠数据包传输、重传、流量控制、通道复用、数据包分段、各种信令等。

创建 BLE 时,需要通道复用(用于 SMP 和 GATT),以及在通过 HCI 和链路层传输时对数据包进行分段的方法。最简单的决定似乎是将 BLE“硬塞”到 L2CAP 规范中。

这意味着 95% 的 L2CAP 与 BLE 无关且无效。仅考虑 BLE 时,阅读 L2CAP 规范也可能非常困难,因为并不总是清楚特定部分是否仅指经典蓝牙、仅指 BLE,还是两者兼而有之。

也就是说,分段和重组在经典蓝牙和 BLE 中都有使用,指的是如何将 L2CAP 帧分割成更小的片段,以适应较低层的数据包长度限制。BLE 的较低层是 HCI 和链路层。

L2CAP 帧始终包含 4 字节标头,其中包含 2 字节长度和 2 字节通道 ID。当将帧分成多个片段时,下层数据包标头中的附加位指示数据包是新帧的开始还是前一帧的延续。对于每个连接,属于特定帧的所有片段必须通过下层按顺序发送,即不允许将帧的GATT片段与帧的SMP片段交织。这是因为连续数据包中没有额外指示该片段属于哪个帧,因此必须始终假定前一个帧。对于链路层,此信息保存在链路层数据包标头的 LLID 字段中。有三种可能的设置:

  1. LL 数据 PDU:L2CAP 消息的连续片段,或空 PDU。
  2. LL 数据 PDU:L2CAP 消息的开始或没有分段的完整 L2CAP 消息。
  3. LL 控制 PDU。

LL 控制 PDU 实现链路层控制协议,与 L2CAP 无关。这些数据包不是直接通过 HCI 发送的。

HCI 层同样使用称为数据包边界标志的东西。数据包的 HCI 包头包括连接句柄和包边界标志。

控制器或主机都可以重组 L2CAP 片段。虽然对于主机来说当然是强制性的,但对于控制器来说它是可选的。重组只是通过累积片段直到总长度等于标头的长度来完成的。这意味着开始/继续标头在 BLE 中实际上是多余的,因为 BLE 仅使用可靠传输,但仍然可以作为检测边界错误的一种方式。

例如,支持 LE 数据长度扩展的控制器可以通过 HCI 从主机接收多个小片段,并将这些片段重新组合成一个大链路层数据包。如果远程设备不支持 LE 数据长度扩展,控制器还可能从主机接收大型 L2CAP 数据包,然后将其拆分为多个片段以通过链路层发送。

现在进行分段和重组。这是经典蓝牙中使用的一个术语,能够支持大数据包,并将这些数据包与其他数据包复用。

分段和重组的一个问题是,一个大数据包将以一个块的形式发送,在传输该数据包时保留整个链路,因为一帧中的所有分段都必须按顺序发送。因此,L2CAP 使用术语 SDU“服务数据单元”来描述高层(大)数据包。该数据包可以“分段”为几个较小的 L2CAP I 帧,然后照常发送,如果需要,可能会使用分段和重组。由于来自一个 SDU 的 I 帧可以与来自另一个 SDU 的 I 帧交织,因此前面的问题现已解决。然后,L2CAP 接收器主机会将 I 帧“重新组装”到原始 SDU 中。因此可能存在多个待处理的传入不完整SDU。

在蓝牙 4.2 中,创建了面向蓝牙 L2CAP 连接的通道,作为除 GATT 之外发送数据的附加方式。这是L2CAP中的一个全新部分,但借鉴了蓝牙经典的思想。这个想法同样是能够交织来自不同通道的大数据包(SDU)。还实现了流量控制机制。正如在经典蓝牙中一样,每个 SDU 被分为多个帧,这次称为 K 帧。每个K帧都包含信道标识符,因此接收器知道该帧属于哪个待处理的SDU。但请注意,如果您仔细阅读规范,您会发现这次该机制不称为分段和重组。事实上,它根本不被称为任何东西。分段和重组术语仅针对各种蓝牙经典模式明确定义,尽管 BLE L2CAP CoC 的原理相同。

我希望我上面写的内容足以了解 BLE 的 L2CAP 理论。否则我能推荐的最好的就是蓝牙核心规范。但是,如果您阅读 L2CAP 章节,请首先尝试确定您正在阅读的部分中是否包含单词“LE”,否则它可能不相关。如果它包含“BR/EDR”,则可能不相关。