Mesh Profile (3.6)高传输层
(翻译自《MeshProfile v1.0》3.6 Uppper Transport Layer)
综述
高传输层包含了来自访问层的访问数据或者来自高传输层内部的控制消息。并完成将消息传输给对侧高传输层的工作。
对于来自访问层的消息,会使用一个应用秘钥完成加密和认证。这允许了在高传输层的接收过程中完成对接收到的消息的认证。
传输控制消息有高传输层内部生成,并且只在网络层完成加密和认证。
高传输层访问PDU
当网络层PDU中的CTL字段为0时,高传输层PDU中包含一个访问数据。这个PDU被认为是高传输层访问PDU。
访问数据的加密使用一个应用秘钥或者设备秘钥(需要确定究竟使用的什么秘钥完成加密)。加密后的访问数据和相关的消息完整性检验值组成了高传输层访问PDU。
加密后的访问数据 | TransMIC
加密访问数据
访问数据有访问层提供。
如果TransMIC是32bit,访问数据大小可以为1~380octets。如果TransMIC是64bit,访问数据的大小可以为1~376octets。
在高传输层,该字段是不透明的,而且该字段中的信息是没有被使用的。
传输完整性检验
传输消息完整性检验(TransMIC)是一个32bit或者64bit的字段。用于认证访问层数据没有发生改变。
对于一个SEG设置为1的分片消息,TransMIC的大小由低传输层PDU的SZMIC字段确定。
对于一个非分片消息,TransMIC的大小为32bit。
注意:控制消息没有TransMIC。
高传输层控制PDU
当CTL字段设置为1时,高传输层PDU包含了一个传输控制消息。
一个传输控制消息包括7bit的命令码。该命令码决定了参数的格式。命令码字段不包括在参数字段中,但是包括在低传输层PDU的非分片控制消息中或者分片控制消息的每一个分片包中。
高传输层控制PDU并不再高传输层中完成认证而是依赖网络层的认证。所有的高传输层PDU使用一个64bit的NetMIC。
低传输层可能将消息分片为更小的PDU用于通过网络层发送。建议为8 * n octets(具体见文档表格3.16)
最大的传输层控制PDU的大小是256octests。
高传输层行为
发送一个访问数据
所有访问消息的发送都在一个应用秘钥和一个设备秘钥的上下文中。访问数据应该使用应用秘钥或者设备秘钥完成加密。TransMIC应该被设置为消息完整性检验值。
这个访问消息应该申请一个序列号(SEQ)。在低传输层对一个消息分片的上下文中,该序列号(SEQ)于SeqAuth中的最低24bit相符合。序列号(SEQ)用于接收方认证和解密访问数据。
低传输层PDU中的AKF和AID字段应该根据在高传输层使用应用秘钥还是设备秘钥做的加密和认证来确定。
如果使用应用秘钥,那么AKF字段应该被设置为1,AID字段应该设置为应用秘钥表示符(AID)。
如果使用设备秘钥,那么AKF字段应该被设置为0,AID字段应该设置为0b 00000000。
高传输层在上一个高传输层PDU给某个目的地址发送的消息完成或者被取消之前,不可以发送一个新的分片的额高传输层PDU给相同的目的地址。
接收一个高传输层PDU
当收到一个高传输层访问PDU时,访问数据应该被解密并且TransMIC应该根据已知的应用秘钥或者网络秘钥(根据AKF和AID字段要求确定使用哪一种秘钥)完成认证。
如果高传输层访问通过PDU认证并且通过了重复攻击的检验,那么该PDU可以传递给访问层并携带这上下文信息,例如源地址,目的地址,以及用于认证和解密过程的秘钥。
当收到一个高传输层控制PDU时,PDU中携带的目的地址应该被检查是否和该节点元素的单播地址相匹配,以确定该消息是否应该被该元素处理。
如果节点提供了已经使能的朋友特性,并且节点和一个低功耗节点建立了朋友关系,并且消息的目的地址是当前该低功耗节点朋友订阅列表中的一个地址,那么消息应该被保存在合适的朋友队列中。
传输控制消息
传输控制消息可以通过一个单独的没有分片的控制消息或者一些分片的控制消息完成发送。每条控制消息中包含一个7bit的命令码字段,该字段决定了参数字段的格式。每条传输控制消息应该以尽可能最小的低传输层PDU个数被发送。
命令码为0x00是指地传输层的终结,用于消息的分片和重组,不应该在高传输层发送。所有其他的控制消息在高传输层完成终结。
表3.39总结了传输层命令码。
朋友轮询消息
朋友轮询消息由低功耗节点发送,用于请求一个朋友节点发送一条已经被保存的发送给该低功耗节点的消息。
该控制消息的命令码为 0x01。
FSN字段表示朋友序列号,用于低功耗节点确认收到之前来自朋友节点的消息。
该消息需要将网络层PDU中TTL字段设置为0.
该消息需要使用朋友安全凭据完成发送。
朋友更新消息
朋友更新消息由朋友节点发送给低功耗节点用于通知低功耗节点网络安全参数已经发生改变或者正在发送改变或者朋友队列为空。
Flags字段包含IV更新标志和Key刷新标志。其中
- bit0表示Key刷新标志。 0:不在阶段2 ;1:在阶段2
- bit1表示IV更新标志。 0:正常操作 ; 1:IV更新活动
IV index字段表示当前朋友节点所致的IV index。
MD字段指示了朋友队列是否为空。0:朋友队列为空;1:朋友队列不为空。
该消息的命令码为0x02。
该消息需要将网络层PDU的TTL字段设置为0。
该消息需要通过朋友安全凭据发送。
朋友请求消息
朋友请求消息由低功耗节点向全部朋友组发送,用于寻找一个朋友节点。
Criteria字段表示朋友节点应该支持加入朋友关系协商的标准。其中,
- bit5~bit6 表示RSSI因子。用于表示朋友节点在计算朋友提供延时时RSSI的影响。00:1;01:1.5;10:2;11:2.5
- bit3~bit4 表示接收窗口因子。用于表示在计算朋友提供延时时支持接收串口的影响。00:1;01:1.5;10:2;11:2.5
- bit0~bit2 表示最小队列尺寸信息。用于表示朋友节点中可以保存在朋友队列中最小消息个数。
RecieveDelay字段表示低功耗节点的接收延迟时间。0x0A~0xFF,单位1ms。
PollTimeOut字段表示低功耗节点设置的初始轮询超时时间。0x00000A~0x34BBFF,单位100ms。
PreviousAddress字段表示之前朋友的单播地址。
NumElements字段表示低功耗节点的元素个数。用于根据该消息的SRC地址计算朋友节点单播地址的范围。
LPNCounter字段表示低功耗节点已经发送的朋友请求消息的个数。
该消息需要将网络层PDU中TTL字段设置为0。
该消息需要通过主安全凭据完成发送。
朋友提供消息
朋友提供消息有朋友节点发送,用于提供一个朋友关系。
ReceieveWindow字段由朋友节点支持。0x01~0xFF,单位1ms。
QueueSize字段表示朋友节点可用队列的大小。即朋友节点可以保存的低功耗节点消息的总条数。
SubscriptionListSize字段表示朋友节点对于一个低功耗节点可以提供支持的订阅列表大小。
RSSI字段表示朋友节点测得的RSSI。用于指示该朋友节点的接收信号强度。
FriendCounter字段表示朋友节点已经发送的朋友提供消息的条数。
该消息的命令码为 0x04。
该消息需要将网络层PDU的TTL设置为0。
该消息需要通过主安全凭证发送。
朋友清除消息
朋友清除确认消息
朋友订阅列表增加
朋友订阅列表移除
朋友订阅列表确认
心跳
命令码总结
朋友关系
一个朋友节点可以为低功耗节点保存消息。
功能总览
为了优化低功耗节点的功耗,使用轮询(polling)机制使低功耗节点的接收窗口最小。低功耗节点可以在它可以接收消息的时间告知朋友节点以获得更新的消息。
在低功耗节点和朋友检点保持朋友关系的时间内,存在一些不变的时间参数。
- 接收延迟(ReceiveDelay)
- 接收窗口(ReceiveWindow)
- 轮询时间(PollTimeout)
接收延迟表示低功耗节点发送一个请求和监听一个响应之间的时间。
接收窗口表示低功耗几点监听响应的时间。当低功耗节点接收到一条来自朋友节点的消息后,低功耗节点可以不再监听额外的消息。
请求消息可以是一个朋友轮询消息,一个朋友订阅列表增加消息,或者一个朋友订阅列表移除消息。
对于朋友轮询消息的响应可以是一个朋友更新消息或者一条保存的消息。
对于朋友订阅列表增加或者移除的消息是一个朋友订阅列表确认消息。
从图中可以看到,低功耗节点在发出请求消息后即可以进入休眠,而朋友节点在约定的接收延迟后并且在低功耗节点的接收窗口中对低功耗节点做出响应。
轮询时间超时定时器用于测量由低功耗节点发出的连续两个请求间的时间。如果在该定时器超时前没有一个请求被朋友节点接收到,那么朋友关系将被认为终止。
为了建立朋友关系,支持低功耗特性的节点需要向全部朋友地址(一个固定的组地址0xFFFD)发送一个朋友请求。这个消息会被射频通信范围内的全部支持朋友特性的节点接收到。
朋友请求消息中包含了该低功耗检点对于将来的作为自己朋友节点的需求。每一个支持朋友特性并且能够支持朋友请求中需求的节点将通过发送一个朋友提供消息作为响应。
在这个朋友提供消息中也包含了关于该节点能力的额外信息。这使得低功耗节点可以决定使用哪一个节点作为自己朋友节点。
低功耗节点然后发送一个朋友轮询消息给选中的朋友节点,朋友节点发送一个朋友更新消息作为响应。在此时朋友关系建立成功。
如果低功耗节点之前有一个朋友节点,那么新的朋友节点将通知老的朋友节点自己是该低功耗节点当前的朋友。
在朋友关系建立之后,朋友节点保存了该低功耗节点对应的鞥有订阅列表。该订阅列表保存了低功耗节点订阅的一系列组地址和虚拟地址。该列表是的朋友节点可以保存低功耗节点订阅的消息。
朋友节点在朋友队列中保存了发给低功耗节点的全部消息,包括最近的安全更新信息(IV index,IV更新标志,Key刷新标志等)。这些信息被称为保存的消息。
低功耗节点如果需要获取上面提到的保存的消息,需要发送朋友轮询消息。那么朋友节点将发送这些保存的消息作为响应。
保存在朋友队列中的消息发送给低功耗节点需要得到确认和保持顺序。为此,需要使用一个朋友序列号。该值保存在低功耗节点中,并在朋友轮询消息中发出。当低功耗节点接收到一个有效的朋友轮询消息的响应是,低功耗节点应该改变朋友序列号用于下次发送轮序消息时,朋友节点可以发送下一条消息。如果朋友节点没有收到朋友轮询消息的响应,那么低功耗节点不改变朋友序列号,朋友节点将得知上一次消息没有被低功耗节点正常接收并将重发上一条消息。
朋友关系的安全性
朋友特性
低功耗特性
分片和重组用例
心跳
心跳用于监测网络中的节点并且发现节点间彼此距离多远。
功能总览