上层传输层从访问层获取消息或内部生成上层传输层控制消息,并将这些消息传输到对端的上层传输层。对于来自访问层的消息,使用应用秘钥执行消息的加密和认证;由上层传输层内部生成的传输控制消息仅在网络层加密和验证。
上层传输层访问PDU
当网络层PDU中的CTL字段为0时,上层传输层访问PDU包含一个访问负载,使用应用密钥或者设备密钥对访问负载进行加密,并且将加密访问的负载和关联的消息完整性校验值组合成上层传输层访问PDU。
字段 | 字节数 | 备注 |
---|---|---|
Encrypted Access Payload | 1到380 | 解密访问负载 |
TransMIC | 4或8 | 访问负载的消息完整性校验值 |
访问负载由访问层提供。如果TransMIC是32位,则访问负载的长度可以从单字节到380字节。如果TransMIC是64位,则访问负载的长度可以从单字节到376字节。在上层传输层,该字段是不透明的,并且不能使用该字段内的信息。
传输的消息完整性检查(TransMIC)是一个32位或64位字段,用于验证访问负载是否未更改。对于分包消息,其中SEG设置为1,TransMIC的大小由底层传输层PDU中的SZMIC字段的值确定。对于未分包的消息,TransMIC的大小为32位,用于数据消息。
控制消息不包含TransMIC。
上层传输层控制PDU
当CTL位为1时,上层传输层PDU包含一个传输控制消息。传输控制消息具有7位OPCode,用于确定参数的格式。该OPCode字段不包括在参数字段中,但包括在底层传输层PDU未分包控制消息中或分包控制消息中。
上层传输层控制PDU未在上层传输层进行认证,而是依赖由网络层执行的认证。所有上层传输层控制PDU都使用64位NetMIC。底层传输层可以将消息分包为较小的PDU,以便通过网络层传递。因此,建议保留上层传输层控制PDU有效负载大小。最大有用参数字段的大小,取决于数据包的数量。
封包数 | 上层传输层控制PDU负载长度 | 封包数 | 上层传输层控制PDU负载长度 |
---|---|---|---|
1 | 11(未分包) | 3 | 24 |
1 | 8(分包) | n | 8*n |
2 | 16 | 3 | 256 |
上层传输层行为
1.发送访问有效负载
所有访问消息应使用应用密钥或设备密钥进行加密,而TransMIC应设置为消息完整性校验值。每个消息都有一个序列号(SEQ),在底层传输层分包消息的上下文中,该SEQ对应于SeqAuth的24个最低位,用于接收方认证和解密访问消息。
底层传输层PDU中AKF和AID字段应根据用于加密和验证上层传输层PDU的应用密钥或设备密钥来设置。如果使用应用密钥,则AKF字段应被设置为1,AID字段应被设置为应用密钥标识符(AID)。如果使用设备密钥,则AKF字段应被设置为0,AID字段应被设置为0b000000。
上层传输层不应在前一个上层传输层PDU完成或取消之前,将新的上层传输层PDU的分包发送到给定目的地。
2.接收上层传输PDU
在收到上层传输层访问PDU的时候,首先对访问负载进行解密,并使用所有已知的应用密钥和设备密钥去尝试认证TransMIC,看哪个密钥的AKF和AID字段是匹配的。如果上层传输层访问PDU通过了验证和重放攻击的检查,则会将其传递给访问层,并提供此消息的上下文消息,例如源地址、目标地址,以及用于解密和验证的密钥。
在收到上层传输层控制PDU后,应根据该节点元素的单播地址检查PDU的目的地址,如果匹配,则处理该消息。
如果收到消息的节点支持且启用朋友功能,并且与低功耗节点建立了朋友关系,那么当此节点为低功耗节点维护的朋友订阅地址的列表中包含消息目的地址时,消息会被存储到节点上相应的朋友队列中。
上层传输层还包括心跳消息,低功耗与朋友节点之间的数据传输与处理。低功耗和朋友节点,暂时没有明确的应用场景,如果有兴趣了解的朋友可以留言