邏輯鏈路控制與適配協議層(L2CAP,Logical Link Control and Adaptation Protocol)

張伯發表於2021-01-01

    邏輯鏈路控制與適配協議通常簡稱為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屬性協議通道固定通道
0x0005LE信令通道固定通道
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格式如下:

 

    Stack_L2CAP_LE_Credit_Data_Frame.png

    相比於基礎模式,該模式增加了一個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信令。。

   下圖為建立令牌流程控制的流程

 

                                               L2CAP_Segmentation

    建立連線以後,兩端裝置每傳送一個LE-Frame,令牌值都將被減1。這意味著令牌初值代表該連線能夠傳送的LE-Frame總數,比如令牌Credit=100,意味著兩端裝置最多隻能傳送100個資料幀,超過後將斷開連線。

為了傳送更多資料幀,裝置需要傳送LE Flow Control Credit信令以申請一個新的令牌值,新的令牌值包含在該信令引數中;

5、信令

信令包也屬於L2CAP資料包,信令內容含於資料包的資訊載荷中,不同的信令將驅動L2CAP執行特定的任務。傳輸信令包使用信令通道,所以協議頭的CID等於0x0005。

信令包資料格式如下:

                                       

Code表示是哪一個命令/響應;

Code信令描述
0x01Command reject拒絕一個無效的L2CAP命令,引數中包含了拒絕的原因
0x06Disconnection request斷開連線請求
0x07Disconnection response斷開連線響應
0x12Connection Parameter Update request更新連線引數請求
0x13Connection Parameter Update response更新連線引數響應
0x14LE Credit Based Connection requestLE令牌連線請求,引數中包含了MTU, MPS和PSM(Protocol Service Multiplexer) 引數,其中PSM用於分配動態通道。
0x15LE Credit Based Connection responseLE令牌連線響應
0x16LE Flow Control Credit申請新的流程控制令牌

 

有3類資料:

a. 命令:Command

b. 命令拒絕:Command Reject

c. 響應:Respons

Identifier用來匹配一發一收的資料:裝置A傳送command時會設定Identifier,裝置B響應時也要設定Identifier為同一個值。

6、分解(fragment)

    分解的這個動作一般在hci層去做,這裡說明一下概念為了讓讀者不混淆分段和分解的概念,分解過程中不會把每個小包加上LL2CAP Header資訊,下圖時分解流程具體細節江在HCI章節講解;

                                       

 

 

 

 

     

相關文章