3. Mesh Networking
- 3. Mesh Networking
- 3.1 Bearers 承載層
- 3.2 Network Layer 網絡層
- 3.2.3 Address validity 地址有效性
- 3.2.4 Network PDU
- 3.2.6 Network layer behavior
- 3.3 Lower Transport Layer 下傳輸層
- 3.4 Upper trnsport layer 上傳輸層
- 3.5 Access Layer 訪問層
- 3.6 Mesh Security
本部分以mesh網絡的分層結構的順序自下而上地介紹mesh網絡。mesh網絡結構如下所示:
3.1 Bearers 承載層
本規范定義了兩種承載層:
- Advertising bearer
- GATT bearer
3.1.1 Advertising bearer
使用 advertising bearer 時,mesh數據包可以使用Advertising Data發送,BLE advertising PDU使用 Mesh Message AD Type標識。
Length | AD Type | Contens |
---|---|---|
0xXX | Mesh Message | network PDU |
任何使用Mesh Message AD Type的廣播消息應該是無需連接( non-connectable)、無需掃描的( non-scannable) 非直接廣告事件。如果一個節點在一個連接的或者掃描的廣告事件中收到了一個Mesh Message AD Type 消息, 那么該消息會被忽略。
一個只支持 advertising bearer的設備應該使用盡可能高的占空比(接近100%)來掃描消息,以避免遺失消息或者Provisioning PDUs。
所有設備都應該支持GAP Observer role 和 GAP Broadcaster role。
3.1.2 GATT bearer
GATT bearer可以使那些不支持advertising bearer的設備可以加入到mesh網中,GATT bearer 使用Proxy protocol通過GATT連接在設備之間轉發、接受Proxy PDUs。
The GATT bearer uses a characteristic to write to and receive notifications of mesh messages using the attribute protocol.(這句話沒理解什么意思)
GATT bearer定義了兩種角色,分別是Client 和 Server。GATT Bearer Server應該實例化一個且只能一個 Mesh Proxy Service,GATT Bearer Client 應該支持Mesh Proxy Service。
3.2 Network Layer 網絡層
網路層定義了可以使Lower Transport PDUs被bearer層轉發的 Network PDU格式。網絡層將從input interface收到的incoming消息進行解密(decrypt)、授權(anthenticate)並轉發向output interface 或是更高的層級;將outgoing消息進行加密、授權並轉發到其他網絡接口。
3.2.1 字節序
該層使用大端字節序
3.2.2 地址
地址是16bit長度的值(兩個字節),如下所示:
地址二進制值 | 地址類型 |
---|---|
0b0000000000000000 | 未分配地址 |
0b0xxxxxxxxxxxxxxx(0x0000除外) | unicast address |
0b10xxxxxxxxxxxxxx | virtual address |
ob11xxxxxxxxxxxxxx | group address |
3.2.2.1 未分配地址
未分配地址是當一個節點的element還沒有配置或者還沒有分配地址時的一個地址。當不需要發布消息時,可以將publish address設置為unassigned address。
3.2.2.2 Unicast address
unicast address是分配給每一個element的唯一地址,取值范圍是0x0001到0x7FFF。unicast address在一個節點的生命周期中保持不變。unicast地址被用作消息的源地址,也可能用於消息的目的地址。如果一個消息是發往一個unicast 地址,那么該消息最多被一個element處理。
3.2.2.3 虛擬地址
虛擬地址代表一系列的目的地址,每一個虛擬地址邏輯上代表一個128-bit的標簽UUID。一個或多個element可能發布或訂閱一個標簽UUID, 標簽UUID不被傳遞,應該被當作消息完整性檢查值的附加域。
虛擬地址的15bit被設置為1, 14bit設置為0, 13~0bit是一個hash值。這個哈希值派生於UUID。
當一個發往虛擬地址的Access消息收到時,每一個匹配該虛擬地址的UUID都會被upper transport層用來當作附加唉的數據作為認證消息的一部分。
控制消息(control message)不可以使用虛擬地址。
3.2.2.4 group address
Group address 是一個被寫入0個或多個element的地址。地址位的15bit 14bit均被設置為1.
Group address只能被用作目的地址,被發往group address的消息被發送到所有訂閱該group address的modale interfaces。
group address分為兩種,一種是動態分配的,另一種是固定的。
地址值 | Fixed Group Address |
---|---|
0xFF00-0XFFFB | RFU |
0xFFFC | all-proxies |
0xFFFD | all-friends |
0xFFFE | all-relays |
0xFFFF | all-nodes |
3.2.3 Address validity 地址有效性
地址類型 | 源地址 | control message 目的地址 | access message 目的地址 |
---|---|---|---|
未分配地址 | NO | NO | NO |
unicast address | yes | yes | yes |
virtual address | no | no | no |
group address | no | yes | yes |
下表表示地址是否可以使用device key 或者是 application key:
地址類型 | Device Key 有效 | Application Key 有效 |
---|---|---|
unassigned address | no | no |
unicast address | yes | yes |
virtual address | no | yes |
group address | no | yes |
3.2.4 Network PDU
Network PDU的結構定義如下表所示:
filed | bits | notes |
---|---|---|
IVI | 1 | Least significant bit of IV Index |
NID | 7 | Value derived from the NetKey used to identify the Encryption Key and Privacy Key used to secure this PDU |
CTL | 1 | Network control |
TTL | 7 | Time to live |
SEQ | 24 | Sequence Number |
SRC | 16 | 源地址 |
DST | 16 | 目的地址 |
TransportPDU | 8 to 128 | 傳輸單元 |
NetMIC | 32 or 64 | 網絡層信息完整性檢查 |
3.2.4.1 IVI
IVI是 用來認證加密Network PDU的IV Index的最低位。
3.2.4.2 NID
NID域包含一個7bit的 network identifier,用來提供一種簡單的方式查找加密認證Network PDU所使用的Encryption Key和Privacy Key。
NID是派生於Network Key,與Encryption Key和Privacy Key關聯。
3.2.4.3 CTL
CTL位判斷消息是否是控制消息,當該位是1時,表示消息是control message。該位為0,則表示消息位access message。
當CTL為0時,NetMIC是32-bit的值,下傳輸層包含access message。
當CTL為1時,NetMIC是64-bit的值,下傳輸層包含control message。
3.2.4.4 TTL
TTL是一個7-bit的值,表示消息跳轉的次數。
0=沒有被中繼且不會被中繼。
1=已經被中繼過,不會再次中繼
2~126 = 可能被中繼過,仍將繼續中繼
127= 沒有被中繼,可以被中繼
3.2.4.5 SEQ
該成員是一個24-bit的值,由IV index組成,對於每一個network PDU來說,這是一個由節點產生的唯一的值。
3.2.4.6 SRC
源地址,必須是unicast address。可以根據源地址識別產生該消息的element。
源地址由產生該消息的element設置,並且在傳輸過程中不會被中繼節點接觸(可以理解為對中繼節點不可見?)。
3.2.4.7 DST
目的地址,16-bit值,可以時unicast address、virtual address、group address。
在傳輸過程中,不會被中繼節點的網絡層接觸(理解為對中繼節點網絡層不可見)。
3.2.4.8 Transport PDU
傳輸的字節數據,當CTL設置為1時,該域最大96 bit。當CTL為0時,最大長度為128 Bits。
Transport PDU 是被產生該消息的下傳輸層設置,不能被網絡層改變。
3.2.4.9 NetMIC
該域長度取決於CTL,當CTL為0時,該域為64-bit;當CTL為1時,該域為32-bit。
NetMIC用於確認DST和Transport PDU沒有被破壞。
NetMIC會被每一個傳輸、中繼該消息的節點的網絡層設置。
3.2.5 Network Interfaces
網絡層支持通過多個承載層來收發消息,每個bearer可以通過network interfaces與網絡層連接。同一個節點內部的不同element間的消息傳送是通過local interfaces實現的。
舉個例子,比如一個節點可能存在三個interfaces,一個用來通過advertising bearers收發消息;另外兩個通過GATT bearers收發消息。
Interface 可以提供filter(過濾器)用來控制消息的進出規則。
3.2.5.1 Interface input filter
用來確定進來的消息是丟棄還是傳送到網絡層。
3.2.5.2 Interface output filter
用來確定出去的消息是被丟棄還是被傳送到承載層。
當TTL的值為1時,會丟棄所有要傳送到承載層的消息。
3.2.5.3 Local network interface
這用來在一個節點內部的不同element之間傳送消息。當該interface受到消息時,會將消息傳送到節點內的所有element.
3.2.5.4 Advertising bearer network interfaces
該interface允許通過advertising bearer傳送消息。
當收到一個消息且消息沒有被標記中繼消息時,Advertising bearer network interface會使用Network Transmit state的值在advertisng bearer上傳送該消息。
當收到一個消息且被標記為中繼消息,Advertising bearer network interface會使用Relay Transmit state的值在advertisng bearer上傳送該消息。
3.2.6 Network layer behavior
3.2.6.1 Relay feature
中繼特性指的是將從advertising bearer收到的Network PDU進行轉發。該特性是選配的,可以啟用或者不啟用。如果支持代理特性,那么節點應該同時支持GATT和advertising兩種bearer(承載層)。
3.2.6.2 Proxy feature
用來轉發在GATT和advertising bearer之間傳送的消息。
3.2.6.3 接收network PDU
消息是通過network interface從bearer layer 傳送到network layer。網絡層可以對消息標記一些附加的標簽,以供后續使用。
當網絡層收到消息時,會首先檢查NID的值是否匹配已知的NID值,若不匹配則忽略該消息。若可以匹配已知的NID,則節點會根據相匹配的Network Key來認證該消息。如果認證成功,而且SRC、DST是有效的,且網絡層消息緩存中沒有該消息,那么消息會被傳送到下傳輸層被繼續處理。
消息被轉發時,其中的IV index應該與收到時保持一致。
如果從advertising bearer傳送過來的消息被傳送到下傳輸層處理,且節點支持中繼特性(並使能),TTL不小於2,目的地址不是本節點的unicast address,那么TTL的值減1,Network PDU被標記為relay,Network PDU被重發向所有連接到advertising bearer的網絡接口(network interfaces)。建議在收到Network PDU后,加一個任意時間的小延時,再進行轉發。這樣可以避免多次中繼同時發生。
如果從GATT承載層傳過來的消息被傳送到下傳輸層處理,節點支持並使能了代理特性,TTL不小於2,目的地址不是本節點的unicast,那么TTL減1,並且Network PDU重發到所有的network interfaces。
如果從advertsing bearer傳過來的消息被下傳輸層處理,並且代理特性被支持使能,TTL不小於2,目的地址不是本節點的unicast address,那么TTL減1,並且Network PDU將會被重發到所有連接GATT bearer的網絡接口。
3.3 Lower Transport Layer 下傳輸層
下傳輸層從上傳輸層獲取Upper Transport PDU,並將其轉發至對等的下傳輸層。這些Upper Transport PDU可以被裝進一個單獨的Lowwer Transport PDU,也可能被分割為多個。當下傳輸層受到消息時,會處理Lower Transport PDUs,將重組分片的PDU,一旦完成便將PDU發送到上傳輸層。
3.3.1 字節序
該層使用大端
3.3.2 Lower Transport PDU
Lower Transport PDU 用來轉發上傳輸層PDU到其他節點。下傳輸層PDU最高位是SEG域,SEG用來確定PDU是否被分片。如下表所示:
CTL | SEG | Lower Transport PDU |
---|---|---|
0 | 0 | 未分片access message |
0 | 1 | 分片的access message |
1 | 0 | 未分片的control message |
1 | 1 | 分片的control message |
3.3.2.1 Unsegmented Access message
數據格式如下:
Field | Size(bits) | Notes |
---|---|---|
SEG | 1 | 0=Unsegmented, 1=segmented |
AKF | 1 | Applicatoin Key Flag |
AID | 6 | application Key identifier |
Upper Transport Access PDU | 40 to 120 | 上傳輸層PDU |
AKF和AID是被上傳輸層根據application key 或 device key設置的,用來加密access payload。
這時消息是沒有SZMIC域的,因為上傳輸層的TransMIC是32-bit的,SZMIC是0,也就不需要單獨設置了。
3.3.2.2 Segmented Access message
數據格式如下:
Field | Size(bits) | Notes |
---|---|---|
SEG | 1 | 0=Unsegmented, 1=segmented |
AKF | 1 | Applicatoin Key Flag |
AID | 6 | application Key identifier |
SZMIC | 1 | Size of TransMIC |
SegZero | 13 | Least signification bits of SeqAuth |
SegO | 5 | Segment Offset number |
SegN | 5 | Last Segment number |
Segment m | 8 to 96 | Segment m of the Upper Transport Access PDU |
SZMIC表示上傳輸層PDU中TransMIC的size。0表示TransMIC是32-bit,1表示64-bit。
AKF和AID是被上傳輸層根據application key 或 device key設置的,用來加密access payload。
SeqZero是被上傳輸層設置的。
SegO域說明這是第幾個分片,SegN表示總共有多少個分片。
Segment m就表示第m個分片的上傳層PDU數據。
Access message中除了最后一個分片,其他所有分片都應該是12字節的(12m 到 12m+11)。最后一個分片就是從12*m到PDU最后
Access Message的分片應該是12個字節划分一次
同一個上傳輸層PDU分片產生的下傳輸層PDU應該具有相同的AKF, AID, SZMIC, SeqZero, and SegN。
3.3.2.3 Unsegmented Control Message
Unsegmented Control Message 用來傳輸Segmented Acknowledgment message或者是Control message。
結構如下所示:
Feild | Size(bits) | note |
---|---|---|
SEG | 1 | 0=Unsegmented, 1=segmented |
Opcode | 7 | 0x00 = Segment Acknowlegment ; 0x01 to 0x7F = Opcode of Transport Control message |
Paramenters | 0 to 88 | Parameters for the Transport Control message |
3.3.2.3.1 Segmented Acknowledgment message
Segmented Acknowledgment message是下傳輸層用來確認分片收到的。
Feild | Size(bits) | note |
---|---|---|
SEG | 1 | 0=Unsegmented, 1=segmented |
Opcode | 7 | 0x00 = segment acknowledgment message |
OBO | 1 | Friend on behalf of a Low Power node |
SegZero | 13 | SeqZero of the Upper Transport PDU |
RFU | 2 | Reserved for Future Use |
BlockAck | 32 | Block acknowledgment for segments |
SEG為0
Opcode為0x00
如果消息是被目的地址的節點收到,則OBO為0;如果消息的目的地址的節點是一個低功耗節點,那么消息是被節點的友好節點收到的,這時OBO為1。
BlockAck用來表示分片收到的情況,最低位 bit 0 代表segment 0,最高位代表segment 31。如果bit n被設置為1,說明segment被節點收到了(或被低功耗節點的友好節點收到了)。
3.3.2.4 Segmented Control message
數據格式如下:
Field | Size(bits) | Notes |
---|---|---|
SEG | 1 | 0=Unsegmented, 1=segmented |
Opcode | 7 | 0x00 = Segment Acknowlegment ; 0x01 to 0x7F = Opcode of Transport Control message |
RFU | 1 | 留給以后使用,保留位 |
SegZero | 13 | Least signification bits of SeqAuth |
SegO | 5 | Segment Offset number |
SegN | 5 | Last Segment number |
Segment m | 8 to 64 | Segment m of the Upper Transport Control PDU |
SEG設為1
Opcode 被上傳輸層設置,用來表示parameters的格式。
The SeqZero field shall be set by the upper transport layer.
The Segment m field shall be set to the subset of octets from the Upper Transport Control PDU. Segment
m shall be octets 8m to 8m+7, except for the last segment where it is 8*m to the end of the message.也就是說控制消息的分片長度是8個字節。
來自同一個上傳輸層PDU的分片具有一致的Opcode, SeqZero, and SegN。
3.3.3 分片和重組
為了傳輸大於15個字節的上傳輸層PDU,下傳輸層會將PDU分片、重組,然后被發送到同級的下傳輸層上。傳輸分片時,會使用block acknowledgment message來減小下傳輸層所傳輸信息的大小。
3.3.3.1 分割
下傳輸層可以將來自上傳輸層的PDU分片發送,需要注意的是,下傳輸層一次只能發送來自同一個上傳輸層PDU的分片。也就是說,只有當當前上傳輸層PDU的分片全部發送完必,並且收到對應的acknowledgment之后,才會發送下一個上傳輸層PDU的分片。還有一種情況就是,當前PDU分片發送被取消,這時會繼續發送下一個PDU分片的發送。
當上傳輸層PDU可以裝入一個未分片的下傳輸層PDU時,那么下傳輸層可以直接使用未分片喜愛哦戲傳輸該消息。如果上傳輸層PDU裝入一個單一的分片下傳輸層PDU(就是只分了1個segment的分片消息),那么消息就可以使用單一分片的消息來傳輸該消息。
分片信息發送會有acknowledgment確認,但是未分片消息是沒有的。因此一個使用單一分片來發送上傳輸層PDU比起使用未分片消息更加有效。
Each segment of the Upper Transport Access PDU shall be 12 octets long with the exception of the last segment, which may be shorter
Each segment of the Upper Transport Control PDU shall be 8 octets long with the exception of the last segment, which may be shorter.
分片的消息是通過SegO來識別的,通過SeqAuth來連接並認證。來源於同一個上傳輸層PDU的分片消息,都有小愛嗯他的IV index和SeqAuth值,這涌來加密和認證上傳輸層PDU。
SeqAuth是由IV index和第一個分片的sequence number(SEQ)組成的,是一個56-bit的值,其中IV index是其中的高位的字節,sequence number(SEQ)是其中的低位。只有最低13 bits(就是SeqZero)被包含進了分片消息。當重組一個完整的分片消息時,SeqAuth值可以從IV index、SeqZero和SEQ所派生出來。
舉個例子,如果收到消息的SEQ是0x6471262,IV index是0x58437AF2,SeqZero是0x1849,那么SeqAuth就是0x58437AF2645849。
3.3.3.2 重組
收到分片消息時,接收節點將會檢查SeqAuth以確認對應的上傳輸層PDU是否被收到過。如果分片消息沒有被收到過,那么接收的設備將會根據消息中的SegN字段來分配足夠的內存,以存儲上傳輸層的各個分片信息。
如果節點不支持低功耗特性,並且消息是發往一個unicast address,而此時節點不能接收該上傳輸層PDU(可能因為節點正忙,或是資源不足以重組該消息),那么節點將會通知該消息的源節點,通過發送一個BlockAck 0X00000000。
如果分片消息正在被處理,SegO字段決定分片重組時的位置,接收者將會更新BlockAck值來報告此分片發送成功。
3.3.3.3 segmentation behavior 分片表現
如果消息的目的地址是一個unicast address,那么下傳輸層會等待一個目的節點的Segment Acknoeledgment message,如果目的節點是一個低功耗節點,那么Segment Acknoeledgment message由其友好節點發送。
如果消息是被發往一個group address或者是一個虛擬地址的,那么下傳輸層會發送所有上傳輸層PDU對應的分片下傳輸層PDU。建議多次發送下傳輸層PDU,發送間隙引入隨即的延時
被發往group或者虛擬地址的上傳輸層PDU,不會收到acknowledgment,因此發送之后的狀態是不知道。因此多發送幾次可以確保成功發送的概率。
當下傳輸層PDU發送時,一個定時器將會被設置用以等待Segment Acknowledgment message ,定時器的最小值為200+50*TTL毫秒。
當收到一個確認分片收到的Segment Acknowledgment message時,下傳輸層將會重置定時器,並重新發送未確認的下傳輸層PDU分片。當收到Segment Acknowledgment message確認所有的分片都已成功接收后,上傳輸層PDU就發送成功啦。如果收到的Segment Acknowledgment message中BlockAck是0x00000000,那么上傳輸層會取消該消息的發送並通知更高層級該事件。
如果沒有收到Segment Acknowledgment message確認,分片的下傳輸層PDU至少應該重傳送兩次。弱國下傳輸層在所有分片確認前停止了重傳,那么上傳輸層PDU消息就被取消了。
3.3.3.4 Reassembly behavior 重組表現
下傳輸層有一個sequence authentication value(SeqAuth),每個源節點設備有一個與之對應的block acknowledgment value。
如果下傳輸層收到一個分片消息,但是消息的SeqAuth值比當前的sequence authentication value值小,那么就會忽略該消息。如果下傳輸層收到一個新的消息,那么就會將消息中的SeqAuth保存為新的sequence authentication value。
Sequence authentication value邏輯上包含了IV index,因此如果下傳輸層收到了的消息是使用之前的IV index的,那么該消息的SeqAuth值就會比當前的sequence authentication value小。
如果下傳輸層收到一個分片消息,但是節點不能接收該多片消息(可能因為節點繁忙或是內存不足以容納多篇消息等原因),如果消息是發往一個unicast address,那么下傳輸層就會返回一個Segment Acknowledgment message,其中 BlockAck 設置為 0x00000000。
如果下傳輸層收到的分片消息中SeqAuth值比當前的sequence authentication value要大,那么下傳輸層就會啟動一個“不完整計時器”,該定時器定義了下傳輸層等待具備相同SeqAuth值消息的時間,最小為10秒。
如果下傳輸層收到的分片消息中SeqAuth值比當前的sequence authentication value要大,同時消息的目的地址是一個unicast address,那么下傳輸層就會啟動一個acknowledgment定時器,該定時器定義了下傳輸層發送Segment Acknowledgment message的時間,最小設置為 150+50*TTL毫秒。
如果下傳輸層收到另一個對應當前 sequence authentication value的消息片,且此時acknowledgment定時器未活動,那么就會重啟acknowledgment定時器。
如果下傳輸層收到對應當前 sequence authentication value的消息片,且此時不完整計時器正在活動,那么重啟該定時器。
下傳輸層會在block acknowledgment value中標記每一個片段,以便於后面將其發送給源節點。
當某個消息的所有片段都收到后,下傳輸層會發送確認消息給源節點,並去取消不完整定時器和acknowledgment定時器,然后向上傳輸層發送重組消息。
如果acknowledgment定時器超時,下傳輸層會發送一個Segment Acknowledgment message給源節點。
如果不完整計時器超時,下傳輸層會認為消息接受失敗,取消acknowledgment定時器。任何分片消息會被忽略。
如果下傳輸層收到了其他消息片段,而此時分片的消息已經全部收到了,那么將會給源節點發送Segment Acknowledgment message。如果節點是作為一個低功耗節點的友好節點存在的,那么Segment Acknowledgment message中的OBO字段會被設置為1。表示消息已經緩存在友好節點的隊列中等待低功耗節點來輪詢獲取了。反之,則OBO設置為1。
3.3.4 Friend Queue
友好節點對每一個與其建立聯系的低功耗節點都有一個友好隊列(Friend Queue),這個友好隊列就存儲了以低功耗節點為目的地址的消息,等待低功耗節點來輪詢請求。
當一個友好節點收到消息,且該消息是發往一個與之建立聯系的低功耗節點,消息中的TTL字段不小於2,那么TTL的值減1,然后消息存儲在該友好節點的友好隊列中。
如果消息是分片的,消息會先在上傳輸層完成重組,友好節點向源節點發送Segment Acknowledgment message確認消息,然后才會將消息存儲到友好隊列中。
如果友好隊列滿了,並且新消息需要被保存,那么最老的消息將會被覆蓋,以為新消息騰出地方。(這句話可能理解的不對,原文是下面一段話)
If the Friend Queue is full and a new message needs to be stored that is not a Friend Update message, the oldest entries other than a Friend Update message shall be discarded to make room for the new message.
如果要被存儲的消息是一個 Segment Acknowledgment 消息,並且友好隊列中已經有一個 Segment Acknowledgment 消息了,兩消息的源地址、目的地址一樣而且用着相同的SeqAuth值,但是IV或者是sequence number比老消息更小,那么老的消息將會被清除。
如果友好節點需要security更新,那么要向友好隊列中添加一個Friend Update消息。
低功耗節點向友好節點發送Friend Poll消息時,若此時友好隊列為空,那么需要友好節點向友好隊列中添加一個Friend Update 消息,然后此消息就可以回應給低功耗節點啦。
3.4 Upper trnsport layer 上傳輸層
上傳輸層從訪問層(access layer )獲取消息或者是自己生成上傳輸層控制消息(upper transport layer Control message ),並將這些消息傳送給同級的上傳輸層。
對於從訪問層獲取的消息,消息的加密和認證是使用application key實現的。這允許上傳輸層認證收到的消息。
傳輸層控制消息是上傳輸層內部產生的,只能在網絡層加密和認證。
3.4.1 字節序
大端字節序
3.4.2 Upper Transport Access PDU
在Network PDU中,當CTL字段是0時表示Upper Transport Access PDU中裝的是從訪問層獲取的access payload。
access payload 使用application key或者device key加密,加密的access payload和相關的信息完整性檢查值都放在Upper Transport Access PDU中。
Field Name | Octects | Notes |
---|---|---|
Encrypted Access Payload | 1 to 380 | The encrypted access payload |
TransMIC | 4 or 8 | The message integrity check value for the access payload |
3.4.2.1 Encrypted access payload
Access payload是訪問層提供的,如果TranMIC是32-bit的,access payload最長可以是380字節。如果TranMIC是64-bit的,access payload可以最長374字節。在上傳輸層中,access payload是不可見的,這個字段的所有信息都不能使用。
3.4.2.2 TransMIC
信息完整性檢查( Message Integrity Check for Transport ,TransMIC)是一個32位或64位的數,用來認證access payload是否被破壞。對於分片消息(SEG=1),TransMIC的長度是由下傳輸層PDU中的SZMIC 字段決定的。對於未分片的消息,數據信息的TransMIC是32位的。
注意:控制消息是沒有TransMIC的
3.4.3 Upper Transport Control PDU
若CTL位是1,那么上傳輸層就裝載一個控制消息。傳輸層控制消息有一個7位的操作碼,該操作碼用來定義參數的格式。操作碼沒有包含在參數字段中,但是在每一個分片或未分片的控制消息,其下傳輸層PDU中都有操作碼。
下傳輸層可能會將消息分割個幾個小的PDU,以便於在網絡層傳輸。因此建議根據下面這個表的格式,保持傳輸控制PDU的大小,表中的值代表根據包的數量而建議的參數域最大的長度。(本段理解可能不對,原文如下)
The lower transport layer may segment messages into smaller PDUs for delivery over the network layer. It is therefore recommended to keep Transport Control PDU payload size as reflected in Table 3.16, where the values represent the maximum useful parameter field sizes depending on the number of packets.
Numbers of Packets | Transpotr Control PDU Payload Size |
---|---|
1 | 11(Unsegmented) |
1 | 8(segmented) |
2 | 16 |
3 | 24 |
n | n*8 |
32 | 256 |
Upper Transport Control PDU的最大長度是256字節
3.4.4 Upper transport layer behavior
3.4.4.1 Transmitting an access payload
所有access message在application key或是device key的上下文中被傳遞。access payload使用application key 或者 device key 加密,TransMIC設置信息完整性檢查的值。
Sequence number(SEQ) 會被發配到消息中,在被下傳輸層中分片的消息中,SEQ是SeqAuth的底24位。
下傳輸層PDU中的AKF和AID字段是根據application key 或者device key來設置的。如果一個application key被使用,那么AKF被設置為1,並且AID字段被設置為application key identifier(AID)。如果device key被使用,那么AKF字段被設置為0,且AID設置i為0b000000。
3.4.4.2 Receiving an Upper Transport PDU
收到Receiving an Upper Transport Access PDU時,access payload會被解密,TransMIC會被用來認證消息。如果PDU通過認證並通過完整性檢查,該消息將會傳送到access層。
3.4.5 Transport Control messages
Transport Control messages可以通過分片的控制消息或是單一的未分片控制信息傳送,不管用哪種方式,每個消息都有一個7位的操作碼用來確定參數域的格式。每一個傳輸控制消息都應該以最小數量的下傳輸層PDU傳送。
Value | Opcode | Notes |
---|---|---|
0x00 | – | Reserved for lower transport layer |
0x01 | Friend Poll | Sent by a Low Power node to its Friend node to request any messages that it has stored for the Low Power node |
0x02 | Friend Update | Sent by a Friend node to a Low Power node to inform it about security updates |
0x03 | Friend Request | Sent by a Low Power node the all-friends fixed group address to start to find a friend |
0x04 | Friend Offer | Sent by a Friend node to a Low Power node to offer to become its friend |
0x05 | Friend Clear | Sent to a Friend node to inform a previous friend of a Low Power node about the removal of a friendship |
0x06 | Friend Clear Confirm | Sent from a previous friend to Friend node to confirm that a prior friend relationship has been removed |
0x07 | Friend Subscription List Add | Sent to a Friend node to add one or more addresses to the Friend Subscription List |
0x08 | Friend Subscription List Remove | Sent to a Friend node to remove one or more addresses from the Friend Subscription List |
0x09 | Friend Subscription List Confirm | Sent by a Friend node to confirm Friend Subscription List updates |
0x0A | Heartbeat | Sent by a node to let other nodes determine topology of a subnet |
0x0B–0x7F | RFU | Reserved for Future Use |
3.5 Access Layer 訪問層
3.5.1 字節序
從本層級開始,字節序為小端字節序
3.5.2 Model identifier 模型識別器
Model可以被唯一的識別器所識別,藍牙官方組織定義的模型識別器是16位的,廠商定義的模型識別器是32位的,在SIG的基礎上加入了16位的廠商信息。
3.5.3 Access Payload
格式定義如下:
Field Name | Size (octets) | Notes |
---|---|---|
Opcode | 1, 2, or 3 | Operation Code |
Parameters | 0 to 379 | Application Parameters |
access payload最多被分割為32個12字節的片段(包含TranMIC字段),若TranMIC是4個字節長度,那么payload最長可以到達380字節,如果此時操作碼只有一個字節的話,那么parameter字段的最大長度是379。
下傳輸層可能會將PDU分割為多個小的數據包以便於承載層傳輸,下表列出了根據包的數量而建議的常用的包大小。
Nunber 0f Packets | maxium useful access payload size(octets) with 32-bit TransMIC | maxium useful access payload size(octets) with 64-bit TransMIC |
---|---|---|
1 | 11(unsegmented) | n/a |
1 | 8(segmented) | 4(segmented) |
2 | 20 | 16 |
3 | 32 | 28 |
n | (n*12)-4 | (n*12)-8 |
32 | 380 | 376 |
3.5.3.1 操作碼
操作碼可以是1、2或3個字節序列,操作碼的第一個字節決定了使用字節的數量。
如果操作碼第一個字節的最高位是0,那么操作碼只包含一個字節;如果最高兩位是0b10,那么操作碼包含2個字節;如果最高的兩位是0b11,那么操作碼包含3個字節。
操作碼第一個字節格式 | Notes |
---|---|
0b0xxxxxxx | 1-octet Opcodes |
0b01111111 | 保留,以后使用 |
0b10xxxxxx | 2-octet Opcodes |
0b11xxxxxx | 3-octet Opcodes |
1-octet 操作碼是藍牙SIG定義的應用操作碼,最多可以定義127個1-octet操作碼,0x7F是保留給未來使用的。
2-octet 也是藍牙SIG定義的應用操作碼,最多可以定位16384個2-octet 操作碼。
3-octet操作碼是供制造商使用的操作碼,每一個公司共有64個3-octet操作碼。
3.5.3.2 應用參數
參數字段是對應每個操作碼定義了,后面會詳細介紹,參數字段可以是0個字節長度。
3.5.4 Access layer behavior
3.5.4.1 發送access message
消息被一個模型發往一個目的地址,目的地址可以時unicast address、group address或者是虛擬地址。
消息源地址必須是產生該消息的element的unicast address。
TTL字段可以被應用設置為它所希望消息在節點之間跳轉的次數。如果沒有設置TTL,那么訪問層將會使用默認的TTL。
訪問層不保證消息的成功傳送,每個模型都應該決定消息是否應該被重復傳以及潛在重復數據的處理。
如果要發送的消息是對已接收消息的回復,若已接收消息是發往unicast address的,那么應該在發響應消息包時使用20到50毫秒的隨機延時。假如已接收消息是發往虛擬地址或者group address的,那么發送響應消息包應該假如20到500毫秒的隨機延時。通過假如隨機延時,可以降低多節點同時響應消息的概率,因而降低消息沖突。
因為網絡中的所有節點以及其他藍牙設備是共享有限的帶寬的,因此有必要觀察節點的流量。在10秒的窗口內,一個節點應該產生小於100個下傳輸層PDU。
3.5.4.2 接收access message
以下幾點全部滿足時,消息會被傳送到model來處理,
- 操作碼屬於目的地址模型的element
- 目的地址設置為模型element的unicast address或者是的element訂閱的group address 或是virtual address。
- model綁定到了用於消息傳輸的application key或是device key。
3.5.4.3 Security considerations 安全注意事項
消息是被上傳輸層就加密和認證的,一個節點產生的消息應該使用為本Model配置的application key 或者是device key。
響應消息應該使用與相關消息相同的key。
3.5.4.4 Message error procedure
當收到一個不能解析的消息時,就會忽略該消息。
消息不能解析包含以下幾種情況:
- application opcode 不能被接受消息的element理解
- access message 長度不正確
- application parameters包含當前被禁用的值
3.5.5 Unacknowledged and acknowledged messages
在訪問層,消息可以被定義為Unacknowledged或者是acknowledged。
3.5.5.1 Unacknowledged message
當應用覺得同級節點需要知道狀態變化時,會發送一個status message。狀態消息被發往與state關聯的模型的發布地址,Unacknowledged message是沒有回應消息的,因此不會知道已發送的消息是否被成功發送或是是否被處理。
3.5.5.2 Acknowledged message
Acknowledged message會被每一個接收該消息的節點回應,回應消息通常是status message。如果在一定時間內沒有收到回應消息,會重發消息,等待時間是由application確定的。
如果消息是被發往多個節點的,比如目的地址group address,節點可能不知道有多少接收節點會回應該消息。不建議向所有節點發送Acknowledged message。為了增加成功發送的概率,發送節點需要確定消息重發次數。
如果發送節點沒有收到回應消息,那么節點會認為消息沒有發送。Acknowledged message超時時間應該最少設置為30秒,值由應用設置。當一個Acknowledged message發送給model,他應該發送一個回應消息以確認該消息被接收。回應消息可以包含狀態信息,回應消息是 unacknowlwdged message。回應消息的目的地址應該被設置為Acknowledged message的源地址。如果Acknowledged message的TTL字段是0,那么也建議回應消息的TTL也設置為0。
3.5.6 Publish and subscribe發布與訂閱
發布與訂閱是通過目的地址來實現的,目的地址的配置管理在更高層級的規范中。
3.5.6.1 Publish
一個Model發布數據如果它向目的地址轉發一個無關消息,消息可以被轉發到的地址可以是unicast address, group address或者是virtual address。節點中的沒有個Model都有一個發布地址。
3.5.6.1.1 State transitions 狀態轉變
element的狀態可以立刻轉變或是經歷一段時間轉變為新的狀態,如下圖所示。
狀態從初始狀態轉變為新狀態所需要的時間被稱為轉變時間。從當前狀態到目標狀態的時間成為保持時間。當收到一個設置狀態的消息時,新的值不會立即生效,狀態值會被存儲起來作為目標狀態。一個狀態消息可以在任何時間被發出,狀態消息中會包含當前的狀態。
3.5.6.1.2 State change publishing 狀態轉變發布
發布狀態轉變的消息是通過設置Model Publication state來實現的。當model使能發布時,狀態改變完成時就會發送相關的狀態改變信息。對於狀態轉變時間超過2秒的情況,建議增加一個狀態發布在狀態轉變開始后1秒內。
3.5.6.1.3 周期發布
model可以配置為周期性的發送狀態消息,無論狀態是否變化。這是通過 Publish Period實現的。當Publish Period設為非零值時,狀態消息會周期性發布。
3.5.6.2 Subscribe 訂閱
每個model都有一個或多個訂閱列表,訂閱列表中包含一個或多個地址。訂閱地址可以是group address 或者是virtual address。
3.5.7 Example message sequence charts
3.5.7.1 Acknowledged Get
下圖說明了一個client獲取server的狀態
3.5.7.2 Acknowledged Set
下圖說明client使用Acknowledged Set消息對server的狀態進行設置,client會收到server的回應消息,如果server設置了狀態發布,那么可以發布狀態消息。如果client訂閱了server的發布地址,那么client端會收到兩個狀態消息。
3.5.7.3 Unacknowledged Set
client可以使用Unacknowledged Set消息設置server的狀態,如下圖所示。
3.5.7.4 Acknowledged set with periodic publishing
client使用Acknowledged Set消息對server的狀態進行設置,server啟用周期性狀態發布。
3.6 Mesh Security
3.6.1 Endianness 字節序
在本層使用多字節字段使用大端字節序。
3.6.2 Security toolbox
3.6.2.1 Encrption function 加密函數
加密函數具體可以查看《Volume 3, Part H, Section 2.2.1 of the Core Specification》,其形式如下:
3.6.2.2 CMAC function
Cipher-based Message Authentication Code (CMAC) 使用AES-128作為block cipher函數,也被稱為 AES-CMAC。
其中k是一個128-bit的key值,m是需要被認證的可變長度的數據。
3.6.2.3 CCM funtion
RFC3610 defines the AES Counter with CBC-MAC (CCM) (see Volume 6, Part E, Section 1 of the Core Specification ).
其中,k是128-bit的key值,n是一個104-bit的nonce,m是要被加密認證的可變長度數據(plaintext),a是要被認證的可變長度數據(additional data);ciphertext加密之后的加密后的數據,mic是信息完整性檢查的值。
3.6.2.4 s1 SALT generation function
其中,M是一個長度非0的字節序列或者是ASCII字符串,ZERO是128-bit的值(每位都是0)
如果M是一個ASCII字符串,就會被轉換為一個字節序列。比如如果M是“MESH”,會被轉換成為字節序列:0x4d, 0x45, 0x53, 0x 48。
3.6.2.5 k1 derivatoin function
The network key material derivation function k1 is used to generate instances of IdentityKey and BeaconKey.
這里的key-generation函數使用了MAC函數 \(AES-CMAC_T\),在其中使用了一個128-bit的參數 T。
其中N是0或任意字節,SALT是128bit,P是0或多個字節。\(T=AES-CMAC_{SALT} (N)\)
3.6.2.6 k2 network key material derivatoin function
The network key material derivation function k2 is used to generate instances of EncryptionKey, PrivacyKey, and NID for use as Master and Private Low Power node communication.
3.6.2.7 k3 derivation function
The derivation function k3 is used to generate a public value of 64 bits derived from a private key.The definition of this derivation function makes use of the MAC function AES-CMACT with a 128-bit key T
3.6.2.8 k4 derivation function
The derivation function k4 is used to generate a public value of 6 bits derived from a private key.
The definition of this derivation function makes use of the MAC function AES-CMACT with a 128-bit key T.
3.6.3 Sequnce number
Sequnce nmber是一個24-bit的值,在網絡層PDU的SEQ字段包含了該值,這主要是用來抵御重傳攻擊的。同一個節點內部的不同element之間可以共享該值也可以不共享。從每個element發出的Network PDU都有着不同的sequnce number可以保證mesh網絡的安全性。
作為一個24-bit的值,一個element最多可以傳遞 16777216 條消息在收到nonce之前。如果一個element沒5秒鍾發送一條喜愛哦戲,這個節點可以傳送2.6年在nonce重復之前。
每個element應該在Network PDU中使用嚴格遞增的sequence number。在sequnce number到達最大值以前,節點應該使用IV Update 程序更新IV值。
3.6.4 IV index
IV index是一個32-bit的值,這是一個共享的網絡資源,一個mesh網絡中的所有節點都使用相同的IV值。
IV值從0X00000000開始,在IV Update 程序中增加。IV增加的時間不是確切的,因為每個Network PDU都會使用IV的最低位。
3.6.5 Nonce
nonce是一個13字節的值,每一個消息的該值都是不一樣的。有四種類型的nonce,以其第一個字節的來區分,如下表所示
Nonce Type | Nonce | Description |
---|---|---|
0x00 | Network nonce | Used with an encryption key for network authentication and encryption |
0x01 | Application nonce | Used with an application key for upper transport authentication and encryption |
0x02 | Device nonce | Used with a device key for upper transport authentication and encryption |
0x03 | Proxy nonce | Used with an encryption key for proxy authentication and encryption |
3.6.6 Keys
Mesh中定義了兩種類型的key:application keys (AppKey)、network keys(NetKey)。AppKey用來在上傳輸層被使用,NetKeys在網絡層被使用。兩種類型的Key都可以在節點間共享。還有一種Key是device key(DevKey),這是一個特殊的application key,每個節點都有一個特有的DevKey,只能被節點本身以及Client Configure所知,用來保護節點和Configureaion Client之間通訊。
AppKey是跟NetKey綁定的,這意味着AppKey只能在它所綁定的NetKey的上下文中使用。一個AppKey只能綁定一個NetKey,一個DevKey可以綁定到所有的Netkey上。
key的綁定關聯關系可以用下圖解釋: