分包组包 北斗通信_蓝牙mesh底层传输层(分包和组包)
當傳輸大于15字節的上層傳輸層PDU時,底層傳輸層就需要對上層傳輸層PDU進行分包并重新組包為了減少底層傳輸層包的數量,這里使用塊應答機制。
問題:怎么通過塊應答機制減少底層傳輸層包的數量?
上層傳輸層需要分成兩個底層傳輸層PDU的例子.jpg
示例中上層傳輸層訪問PDU包含1字節的OPCode字段,3字節的NetKeyIndex和APPKeyIndex字段,還有16字節的APPkey字段。這以為著當使用應用秘鑰加密和驗證時,上層傳輸層PDU為24字節。這被底層傳輸層分為兩個包,即分包0和分包1。每個分包具有一個標識分包數的包頭,然后被傳遞到網絡層,在那里計算完整的網絡層PDU。網絡層再使用該網絡層PDU的序列號加密網絡層PDU,然后對這些消息進行模糊處理,最終只有NID(和IV索引)字節以明文形式可見。因此可以使用兩個網絡層PDU安全地傳遞單個訪問消息。
分包
底層傳輸層將上層傳輸層PDU分為一個或多個底層傳輸層PDU。同一時間底層傳輸層將同一上層傳輸層PDU的分包訪問消息和分包控制消息發送到同一目的地。只有當上一個傳輸層PDU的所有分包都已被應答或消息被取消時,底層傳輸層才可以發送另外一個上層傳輸層PDU。
上層傳輸層訪問消息一個分包最大為12字節,上層傳輸層控制消息一個分包最大為8字節。因為上層傳輸層PDU中TransMIC的值是變動的,訪問消息是4字節,控制消息是8字節。
分包消息會在底層傳輸層會確認消息,但是不分包消息則不會。為了更加有效可靠的傳輸上層PDU,應該使用單包分段消息代替未分包消息。因為單包分段消息會被重傳,而未分包消息就不會。
上層PDU使用SegO字段識別每個分包。用于加密和驗證的SeqAuth值將不同分包鏈接在一起。同一個上層PDU分包后的每個下層傳輸層PDU應具有相同的IV Index。
SeqAuth是一個56bit的值,它由IV Index和第1個分包的序列號組成,其中IV Index在高字節,序列號在低字節。只有低位的13bit(稱為SeqZero)才包含在分包消息和分包應答消息中。在對完整的分包消息進行組包時,可以從任何段中的IV Index、SeqZero和SEQ得到SeqAuth值。例如,如果接收到的消息的SEQ是0x647262, IV索引是0x58437AF2,接收到的SeqZero值是0x1849,那么SeqAuth值就是0x58437AF2645849。如果收到的SEQ值為0x647262, SeqZero值為0x1263,則SeqAuth值為0x58437AF2645263。
由于SeqZero的大小有限,一旦SEQ比SeqAuth高8192,就不可能發送分段消息。如果一個分段消息在SEQ比SeqAuth高8192時還沒有被確認,則取消上行傳輸PDU的發送。
消息的每個段都包括它的段偏移號和最后的段號。段號(SegO)和最后段號(SegN)都包含在消息中,以允許接收方在接收到消息的任何段后總是確定上層傳輸PDU的大小(到最近的8字節)。
組包
當使用了低功耗節點功能時,消息應答由朋友節點執行,而低功耗節點不會發送應答消息。在收到分包消息時,首先應檢查SeqAuth以確認此消息是否正在接收或先前是否已接收。如果尚未接收,則接收設備應根據SeqN字段分配足夠的內存,以便存儲上層傳輸層PDU的分包并跟蹤它的分包是否被收到。
如果未使用低功耗功能,則該消息的目的地是單播地址,并且此時節點無法接收此上層傳輸層PDU,例如因為節點繁忙或資源不足以重新組裝此消息,然后節點通過將BlockAck值設置為0x00000000來向源節點發信號,通知它無法接收此上層傳輸層PDU。
底層傳輸層針對每條收到的某個SeqAuth取值的所有分包消息都設置了序列認證值(Sequence Authentication Value)和塊應答值(Block Acknowledgement)。
如果底層傳輸層收到SeqAuth值小于序列認證值的消息分包,則忽略該段。如果底層傳輸層收到新消息的分包,則它應將該段中的SeqAuth值保存為新的序列認證值。
如果底層傳輸層收到多個分包消息的其中一個分包,但此時因為它當前正忙或沒有資源接收更多的分包消息,并且如果該消息的目的地是單播地址,底層傳輸層應回復一個BlockAck字段為0x00000000的應答消息。
當接收SeqAuth值大于序列認證值的一個分包消息時,底層傳輸層將啟動不完成定時器,定義底層傳輸層接收不同分包的等待最大時間,此定時器應被設置為最少10秒。
當接收SeqAuth值大于目的地為單播地址的序列認證值的分包消息時,底層傳輸層應啟動一個應答定時器,該定時器定義底層傳輸層發送分包應答消息的時間,最少設置為150+50xTTLms.
底層傳輸層應將接收的每個分包在塊應答值中進行標記,該塊應答值可以稍后傳輸回源節點。收到分包消息的所有分包之后,底層傳輸層將發送分包確認消息,其中BlockAck字段被設置為用于序列認證值的塊應答值。它應取消未完成定時器和應答定時器,并將重新組裝的消息發送到上層傳輸層。
當應答定時器到期時,底層傳輸層將為當前序列認證值包發送分包應答消息,其中BlockAck字段被設置為塊應答值。
當未完成定時器到期時,底層傳輸層應認為正在接收的消息已經失敗并取消應答定時器,之前接收的部分消息都應被忽略。
如果只看這一篇,會感覺寫的太撈了,根本不知道在講什么玩意,連個例子都沒有。沒辦法,如果沒有整個mesh知識體系,舉出例子了也沒法理解。如果直接上例子,不講規則,也沒法搞。
總結
以上是生活随笔為你收集整理的分包组包 北斗通信_蓝牙mesh底层传输层(分包和组包)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 网络运维框架scape_“
- 下一篇: oracle 满足条件取第一行,sql