厦门手机网站建设是什么,网站底部背景,wordpress改版权,网上注册公司经营范围填不了【蓝牙mesh】Network协议层介绍
Network层简介 上一章节我们讲解了蓝牙Mesh中Lower层的功能和数据格式。 Lower层的数据往下传输就到了网络层#xff08;Network Layer#xff09;。网络层定义了收到Lower层的数据后#xff0c;如何对其进行判断、封装、加密、认证#xf…【蓝牙mesh】Network协议层介绍
Network层简介 上一章节我们讲解了蓝牙Mesh中Lower层的功能和数据格式。 Lower层的数据往下传输就到了网络层Network Layer。网络层定义了收到Lower层的数据后如何对其进行判断、封装、加密、认证最后通过承载层(Bearer层)将其发送出去。同时它对接收到的承载层的消息报文进行解密并验证将其传给Lower层或转发给其他节点。 Network层应该说是蓝牙Mesh网络中最重要的一层消息报文在该层会进行单独的加解密和认证 只要接收到的承载层的数据包通过了Network的校验那该数据包就是该蓝牙Mesh网络节点的数据 至于目的地址是不是自身消息是否正确则是更上层的处理。 换句话说只要不是该蓝牙Mesh网络的数据在蓝牙Mesh的Network层就会被拦截掉只要通过了Network层的校验该数据包就是该蓝牙Mesh网络的数据。
2.2.1 地址 网络层定义了4种基本类型的地址未分配地址、单播地址、虚拟地址和组播地址。这四种地址的区别我在之前的博客中都有讲过这里不多赘述。
下面我们分析Network层的PDU格式
Network层数据包分析 下面介绍下每个字段的含义
网络层PDU使用从单个网络密钥派生的密钥进行保护由NID字段标识。 表示IV Index的最低有效位当SEQ耗尽时会触发IV Index的更新到时候会更新该标志位。 NID字段是一个7位网络标识符该标识符用来方便地查找用于验证和加密此网络层PDU的加密密钥和隐私密钥。NID值是与加密密钥和隐私密钥一起从网络密钥派生出来的。对于主网络消息和朋友及其低功耗节点之间的私有网络消息它的派生方式有所不同。 CTL字段是一个1位的值用于确定消息是控制消息的一部分还是访问消息的一部分。 如果将CTL字段设置为0则NetMIC为32位值底层传输层的PDU包含一条访问消息。 如果将CTL字段设置为1则NetMIC为64位值底层传输层的PDU包含一条控制消息。 TTL字段表示该数据包还可以被转发几次每被转发一次该字段值减一当TTL为0时表示数据不可被转发。 SEQ字段是一个24位的整数与IV Index结合使用对于该节点发起的每个新网络层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承载器和广播承载器。
代理功能 代理功能指节点在GATT承载网络和广播承载网络之间中继或转发网络层PDU来实现GATT承载网络和广播承载网络间的消息互通。此功能是可选的如果支持此功能可以单独启用和禁用此功能。如果支持代理特性则同时支持GATT和广播承载。
Network层数据逻辑处理
当Network层接收到来自Bearer层的数据后数据的处理流程是怎样的呢
逻辑流程图如下
下面介绍上述流程 当Network层接收到来自Bearer层的数据后首先会经过上面说的过滤如果该数据包是重复包在则直接过滤掉否则进入下一步处理。 经过过滤后Network层会检查数据包的NID字段是否匹配如果NID字段不匹配则数据包直接丢弃。 NID匹配后就使用Netkey来对数据进行认证计算消息认证码是否正确如果消息认证码不匹配则丢弃该数据包。 匹配通过后就认定该数据包就是蓝牙Mesh网络中的数据包检查如果不再Cache缓存中则可以将数据包发送到Lower层进行处理了。 如果节点启用了中继功能并且Network层收到来自广播Bearer层的消息的TTL字段大于等于2并且目标地址不是自身节点的地址则会将数据包的TTL值减一并且将数据转发给网络内的其他节点。
总结 Network层是蓝牙Mesh协议栈中中按照协议栈层级仅次于网络承载层的是对整个蓝牙MeshMesh网络中非常重要的一个协议层。Network层会使用netkey对数据包进行单独的加解密和认证为mesh网络的数据安全提供有力的保障。