Network层简介
【资料图】
上一章节我们讲解了蓝牙Mesh中Lower层的功能和数据格式。Lower层的数据往下传输就到了网络层(NetworkLayer)。网络层定义了收到Lower层的数据后,如何对其进行判断、封装、加密、认证,最后通过承载层(Bearer层)将其发送出去。同时它对接收到的承载层的消息报文进行解密并验证,将其传给Lower层或转发给其他节点。
Network层应该说是蓝牙Mesh网络中最重要的一层,消息报文在该层会进行单独的加解密和认证,只要接收到的承载层的数据包通过了Network的校验,那该数据包就是该蓝牙Mesh网络节点的数据,至于目的地址是不是自身,消息是否正确,则是更上层的处理。换句话说,只要不是该蓝牙Mesh网络的数据,在蓝牙Mesh的Network层就会被拦截掉,只要通过了Network层的校验,该数据包就是该蓝牙Mesh网络的数据。
2.2.1地址
网络层定义了4种基本类型的地址:未分配地址、单播地址、虚拟地址和组播地址。这四种地址的区别,我在之前的博客中都有讲过,这里不多赘述。
下面我们分析Network层的PDU格式
Network层数据包分析
下面介绍下每个字段的含义:
网络层PDU使用从单个网络密钥派生的密钥进行保护,由NID字段标识。
表示IVIndex的最低有效位,当SEQ耗尽时会触发IVIndex的更新,到时候会更新该标志位。
NID字段是一个7位网络标识符,该标识符用来方便地查找用于验证和加密此网络层PDU的加密密钥和隐私密钥。NID值是与加密密钥和隐私密钥一起从网络密钥派生出来的。对于主网络消息和朋友及其低功耗节点之间的私有网络消息,它的派生方式有所不同。
CTL字段是一个1位的值,用于确定消息是控制消息的一部分还是访问消息的一部分。
如果将CTL字段设置为0,则NetMIC为32位值,底层传输层的PDU包含一条访问消息。
如果将CTL字段设置为1,则NetMIC为64位值,底层传输层的PDU包含一条控制消息。
TTL字段表示该数据包还可以被转发几次,每被转发一次,该字段值减一,当TTL为0时,表示数据不可被转发。
SEQ字段是一个24位的整数,与IVIndex结合使用,对于该节点发起的每个新网络层PDU,该整数应该是唯一的值。
SRC字段表示数据包发送方的源地址,是一个16位的值,该地址应为单播地址。SRC字段由发包节点来设置,作为中继节点运行的节点在转发过程中不能修改该字段。
DST字段表示数据包接收方的地址,是一个16位的值,该地址应为单播地址、组播地址或虚拟地址。DST字段由发包节点设置,作为中继节点运行的节点在转发过程中不能修改该字段。
TransportPDU表示传输协议数据单元,从网络层的角度看,TransportPDU字段是数据的字节序列。当CTL位为0时,TransportPDU字段的最大值为128位。当CTL位为1时,TransportPDU字段的最大值为96位。TransportPDU字段由发包节点的底层传输层设置,网络层不能更改。
NetMIC字段表示网络消息完整校验值,是一个32位或64位的字段(取决于CTL位的值),它用于验证DST和TransportPDU是否被更改。当CTL位为0时,NetMIC字段为32位。当CTL位为1时,NetMIC字段为64位。NetMIC由网络层中每个传输节点或中继该网络层PDU的节点设置。
Network层过滤
Network层支持通过多个Bearer层发送和接受消息。一个承载器可能存在多个实例。承载器的每个实例都通过网络接口连接到Network层。
什么意思呢?很简单举个例子:我们的蓝牙Mesh设备配网后,既可以通过ble广播通道来接收来自其他节点的广播数据,也可以通过GATT连接来接收来自手机APP的数据,这两种数据虽然使用不同的Bearer层,但是最终使用的Network层接口都是一样的。
Network层会对输入和输出的数据进行过滤,当Network层接收到下层的数据包,会将其缓存在Buffer中,当再次接收到相同的数据,就会将其过滤掉,不会再进行处理,这可以减少Network层处理的数据包数量,防止阻塞。
举个例子:比如一个数据包在网络内,被很多节点进行转发,那每个节点都会多次收到该数据包,难道没收到一次network层都会处理一次该数据包吗?不是的,Network层的过滤功能就是用在过滤这类数据包的。
Network层行为
中继功能
中继功能用于中继节点或转发结点通过广播承载器接受的网络层PDU。此功能是可选的,如果支持此功能,则可以单独启用和禁用此功能。如果支持代理特性,则必须同时支持GATT承载器和广播承载器。
代理功能
标签: