邏輯鏈路控制與適配協議層(L2CAP,Logical Link Control and Adaptation Protocol)
邏輯鏈路控制與適配協議通常簡稱為L2CAP(Logical Link Control and Adaptation Protocol),它向上連線host,向下連線controller,起到host與controller之間適配的作用,使上層應用操作無需關心控制器的資料處理細節。
經典藍芽的L2CAP層比較複雜,它實現了協議複用、資料分段與重組、封裝排程等操作,使得主機能夠支援LE和BR/EDR不同的控制器,實現音訊資料流傳輸等高階功能。
BLE的L2CAP層是經典藍芽L2CAP層的簡化版本,它在基礎模式下,不執行分段和重組,不涉及流程控制和重傳機制,僅使用固定通道進行通訊,在LE令牌流程控制模式下,實現了流程控制,執行資料分段和重組,使用動態通道進行通訊。
1、基礎術語講解
在開篇的時候主要介紹一些和LLCAP層有關的基礎專業術語
名稱 | 描述 |
SDU | Service Data Unit:應用層傳送給LLCAP層的資料,包括屬性的讀寫資料,安全資料,信令等等,不包含LLCAP生成的任何協議資料;
|
Segment
| 分段:將來自上層的SDU資料分割成不同的小資料段 |
Reassembly
| 重組:與分段對應的相反過程 |
PDU
| 協議資料單元:這裡指代LLCAP傳給下層的資料單元 |
Fragment
| 分解:這個一般作用在HCI層,HCI層有自己的傳輸限制,PDU大小超過傳輸限制時PUD被分解成不同的小包 |
Recombination
| 合併:與分解對應的相反過程 |
MTU | 上層能夠傳送傳給LLCAP層單後設資料最大有效資料長度,以位元組為單位,即SDU對應的最大長度為MTU |
MPS | L2CAP能夠傳送給下層單後設資料最大有效資料長度,以位元組為單位,即PDU對應的最大長度為MPS |
應用層傳送給L2CAP層的資料稱為SDU(Service Data Unit),包括屬性的讀寫資料,安全資料,信令等等,不包含LLCAP生成的任何協議資料;
LLCAP將接收到的SDU報文新增協議頭信心封裝成LL2CAP資料包,這就是PUD;
一定不要將分解(fragment)與分段(segment)混淆,分段是將SDU拆分成很多個PUD其中PUD含有LLCAP的協議頭資訊,分解是因為HCI層的限制將PUD拆分成很多個小包只有第一個小包包含LLCAP的協議頭資訊;
MTU表示上層傳輸給LLCAP的最大資料長度,這個長度是為了限制上層與LLCAP之間的傳輸長度,即最大SDU長度,BLE預設的MTU為23位元組(可以修改);
MPS表示LLCAP傳輸給下層的最大資料長度,這個長度是為了限制LLCAO與下層的傳輸長度,一個很長的SDU來到LLCAP層要現根據MPS的大小拆分成很多個資料包;很顯然MTU一定是大於等於MPS的
SDU在資源管理器中新增L2CAP協議頭資訊,封裝成L2CAP資料包,簡稱PDU(Protocol Data Unit)。PDU的Payload欄位就包含了SDU或SDU的一部分。
顯然,L2CAP層中MPS值小於等於MTU值。兩個裝置建立連線時,會交換MTU和MPS資訊,取最小值作為有效值進行工作。
2、接收傳送的資料型別
L2CAP在整個藍芽協議的資料流傳輸如圖所示;
LL2CAP接收upper layer的資料主要包括
屬性訊息(attribute):屬性協議通道用於收發屬性協議層的資料,也就是BLE應用層通訊所傳輸的資料。
信令(Signaling Command):通道用於處理應用層傳送的命令。
安全管理訊息(security):安全管理協議通道用於處理加密、配對和繫結等相關資料。
LE 令牌包(LE CREDIT) :可用於分段傳輸的報文;
3、通道
上圖是BLE整個空口包的組成 其中LLCAP的PDU包含PUD Header以及PDU Payload兩部分
Length為PDU Payload的長度兩個位元組,
通道ID(Channel ID)簡稱CID,用一個2位元組數表示L2CAP層的一個邏輯通道。
在這裡通道不是我們常常會說的通訊通道,在BLE的使用以及開發過程中,我們所謂的通道其實是不同頻率的物理頻道,就是PYH的通訊通道,但這裡所說的通道不是這個意思,這裡的通道只得是被哪個協議佔用得通道,不同得協議使用不同得通道方便程式解析,這裡千萬不要混淆
不同頻段得通道我們叫做物理通道,這裡得通道我們稱之為邏輯通道,物理通道對應著物理連線得概念,邏輯通道對應著邏輯連線得概念;
L2CAP層擁有兩種通道,固定通道和動態通道。兩端裝置一旦建立連線,固定通道即可使用而無需額外配置,建立動態通道則需要首先執行配置過程。BLE僅在收發資料時候與對端裝置連線,適合使用固定通道。
0x0001-0x003F部分是固定通道,0x0040之後通道是動態通道。BLE得固定通道0x0004、0x0005、0x0006;
CID | 描述 | 通道型別 |
---|---|---|
0x0004 | 屬性協議通道 | 固定通道 |
0x0005 | LE信令通道 | 固定通道 |
0x0006 | 安全管理協議通道 | 固定通道 |
0x0040-0x007F | 基於令牌連線機制的通訊通道 | 動態通道 |
0x0004屬性協議通道用於收發屬性協議層的資料,也就是BLE應用層通訊所傳輸的資料。
0x0005信令(Signaling Command)通道用於處理應用層傳送的命令。
0x0006安全管理協議通道用於處理加密、配對和繫結等相關資料。
0x0040-0x007F令牌連線的通訊通道是動態通道,它專用於LE令牌流程控制工作模式。
注意到,廣播資料不適用於任何一個L2CAP通道,事實上廣播資料將從應用層直通過COMMAND直接傳送到HCI介面、廣播並不經過LLCAP層;
4、模式
對於BLE得LLCAP層而言分為兩種模式:基礎模式、令牌流程控制模式;
4.1基礎模式
L2CAP層基礎模式分為面向連線和麵向無連線兩類子模式,其中面向無連線僅應用於經典藍芽的一對多通訊場景。
面向連線的基礎模式的資料幀稱為B-Frame(Basic Frame),其PDU格式如下
基礎模式下MTU=MPS,從上層來的SDU報文不會經歷分段重組過程,這種模式下得報文得CID只能是固定通道得CID;
綜上所述、ATT報文、信令包、安全包一定不會被分段(但是可以在HCI層被分解);
4.2LE令牌流程控制模式
基於LE 令牌流程控制模式的連線,也稱為面向連線通道(connection Oriented Channel, COC),是一種允許LE的L2CAP特性
在特定鏈路上為資料交換建立專用通道的服務。
為什麼要存在令牌包流程控制模式?
一開始的藍芽應用都是基於GATT協議來實現的,藍芽的定位就是智慧家居、智慧穿戴的一些應用場景ATT屬性協議適合端資料傳輸的協議、溫度、心率之類的資料幾十位元組,顯然已經就足夠了,
但是我們有OTA韌體升級需求時使用GATT協議完成大量資料的傳輸顯然效率有點低、就算使用ATT write command 其中報文作為傳輸流程,報文中不僅包含LL2CAP header的內容還冗餘了ATT協議的引數資訊,顯然浪費頻寬
所以令牌包流程控制模式應運而生,他不依賴任何特定協議,在兩個裝置之間建立單獨的通道用來傳輸報文
LE令牌流程控制模式實現了流程控制,以一個令牌引數作為流程控制依據。
LE令牌流程控制模式下的資料幀稱為LE-Frame(LE Information Frame),其PDU格式如下:
相比於基礎模式,該模式增加了一個2位元組的L2CAP SDU Length欄位。該欄位記錄了SDU的總長度,在分段過程中,第一個LE-Frame將包含該欄位,在後續LE-Frame中不包含該欄位。
LE-Frame的載荷長度不能超過MPS值,且MPS值小於等於MTU值。
L2CAP工作在LE令牌流程控制模式時,將使用動態通道,主機使用LE Credit Based Connection Request信令作為連線請求,該信令中包含了一個令牌初值,從機返回LE Credit Based Connection Response信令。。
下圖為建立令牌流程控制的流程
建立連線以後,兩端裝置每傳送一個LE-Frame,令牌值都將被減1。這意味著令牌初值代表該連線能夠傳送的LE-Frame總數,比如令牌Credit=100,意味著兩端裝置最多隻能傳送100個資料幀,超過後將斷開連線。
為了傳送更多資料幀,裝置需要傳送LE Flow Control Credit信令以申請一個新的令牌值,新的令牌值包含在該信令引數中;
5、信令
信令包也屬於L2CAP資料包,信令內容含於資料包的資訊載荷中,不同的信令將驅動L2CAP執行特定的任務。傳輸信令包使用信令通道,所以協議頭的CID等於0x0005。
信令包資料格式如下:
Code表示是哪一個命令/響應;
Code | 信令 | 描述 |
---|---|---|
0x01 | Command reject | 拒絕一個無效的L2CAP命令,引數中包含了拒絕的原因 |
0x06 | Disconnection request | 斷開連線請求 |
0x07 | Disconnection response | 斷開連線響應 |
0x12 | Connection Parameter Update request | 更新連線引數請求 |
0x13 | Connection Parameter Update response | 更新連線引數響應 |
0x14 | LE Credit Based Connection request | LE令牌連線請求,引數中包含了MTU, MPS和PSM(Protocol Service Multiplexer) 引數,其中PSM用於分配動態通道。 |
0x15 | LE Credit Based Connection response | LE令牌連線響應 |
0x16 | LE Flow Control Credit | 申請新的流程控制令牌 |
有3類資料:
a. 命令:Command
b. 命令拒絕:Command Reject
c. 響應:Respons
Identifier用來匹配一發一收的資料:裝置A傳送command時會設定Identifier,裝置B響應時也要設定Identifier為同一個值。
6、分解(fragment)
分解的這個動作一般在hci層去做,這裡說明一下概念為了讓讀者不混淆分段和分解的概念,分解過程中不會把每個小包加上LL2CAP Header資訊,下圖時分解流程具體細節江在HCI章節講解;
相關文章
- 談談網路協議 - 資料鏈路層( Data Link)協議
- 一文讀懂遠端控制協議—Remote Control Protocol協議REMProtocol
- 【網路協議】資料鏈路層協議
- LLDP鏈路層發現協議協議
- 0213-資料鏈路層協議協議
- 網路協議之:haproxy的Proxy Protocol代理協議協議Protocol
- IP協議(網路層協議)協議
- 網路七層協議協議
- 網路協議之:memcached text protocol詳解協議Protocol
- 網路七層協議之物理層協議
- SIP (Session Initiation Protocol) 協議SessionProtocol協議
- TCP/IP協議 - 網路層TCP協議
- 網路協議之:memcached binary protocol詳解協議Protocol
- 微信小程式之邏輯層與介面層03微信小程式
- 移動前端適配—邏輯畫素和物理畫素前端
- OSI 七層網路協議的定義與理解協議
- TCP與應用層協議TCP協議
- 浣熊網路系統開發(RAC自由協議原始碼)邏輯方案協議原始碼
- 配額協議協議
- Swift Protocol 詳解 - 協議&面向協議程式設計SwiftProtocol協議程式設計
- Runtime原始碼 protocol(協議)原始碼Protocol協議
- OSI七層網路協議 、TCP協議TCP
- Dart空安全的底層原理與適配Dart
- java邏輯控制Java
- 詳談OSI七層網路協議和TCP/IP協議協議TCP
- https與TLS/SSL 握手協議、record protocol簡介HTTPTLS協議Protocol
- Free自由協議系統開發原始碼邏輯協議原始碼
- 基於surging網路元件多協議適配的平臺化發展元件協議
- iOS10 再談 CAAnimationDelegate 相關協議的適配iOS協議
- 漫談計算機網路:網路層 ------ 重點:IP協議與網際網路路由選擇協議計算機網路協議路由
- 在nginx中使用proxy protocol協議NginxProtocol協議
- 計算機網路七層協議計算機網路協議
- 計算機網路層次與對應協議的理解計算機網路協議
- 資料鏈路層(流量控制與可靠傳輸機制)
- TCP/IP 協議及網路分層模型TCP協議模型
- 網路層協議及ARP攻擊協議
- 10-02、協議protocol的注意點協議Protocol
- 邏輯表空間管理結構(Logical Storage Structures)Struct