模型层定义了用于规范典型用户场景操作的模型,并在蓝牙Mesh模型规范或其他更高层的规范中定义。高层模型规范的例子包括照明和传感器的模型。
基础模型层定义了配置和管理mash网络所需的状态、消息和模型。
接入层定义了上层应用如何使用上层传输层。它定义了应用程序数据的格式;它定义并控制在上层传输层执行的应用程序数据加密和解密;并且在将传入的应用数据转发到更高层之前,在正确的网络和应用密钥的上下文中检查是否已经接收到传入的应用数据。
上层传输层对应用数据进行加密、解密和认证,旨在提供访问消息的机密性。它还定义了如何使用传输控制消息来管理节点之间的上层传输层,包括当Friend特性使用时。
下层传输层定义了如何将上层传输层消息分段并重新组合成多个下层传输PDU,从而将大的上层传输层消息传递给其他节点。它还定义了单个控制消息来管理分段和重组。
网络层定义了如何向一个或多个元素寻址传输消息。它定义了允许由承载层传输的PDU网络消息格式。网络层决定是否中继/转发消息,接受消息进行进一步处理或者拒绝消息。它还定义了网络消息如何被加密和认证。
承载层定义了网络消息如何在节点间传输。定义了两个承载者,广播承载者和GATT承载者。未来可能会定义额外的承载者。
Mesh网络特性:
1.使消息能够从一个元素发送到一个或多个元素。
2.允许消息通过其他节点进行中继以扩展通信范围。
3.信息安全,抵御包括窃听攻击、中间人攻击、重放攻击、垃圾桶攻击、暴力破解密钥攻击,以及其他可能的安全攻击。
4.在当今市场上的现有设备上工作。
5.及时传递消息。
6.当一个或多个设备移动或停止运行时继续工作。
7.具有向前兼容性,以支持未来版本的Mesh Profile规范。
mesh网络通过多种方式来防止消息的无限中继。两种主要的方式是消息缓存和存活时间(Time to Live),消息缓存是通过限制缓存的个数,存活时间是通过限制中继的次数,每次接收到一条消息,然后由设备中继(最高可达126倍),TTL值递减1。
一个网络可以有一个或多个子网,便于"区域"隔离(例如,酒店网络中的独立客房子网)。子网是可以在网络层中互相通讯的一组节点,因为他们共享网络密钥。一个节点通过知道一个或多个网络密钥可能属于一个或者多个子网。一个设备可以使用配置模型被添加到一个或者多个子网。
在主NetKey的基础上,有一个特殊的子网叫做主子网。主子网上的节点参与IV更新过程,并将IV更新传播给其他子网,而其他子网上的节点只将IV Index更新传播给这些子网。
网络资源由实现Configuration Client模型的节点管理,称为Configuration Client(通常是智能手机或其他移动计算设备),并在配置时使用Configuration Server模型分配给节点。具体来说,配置角色(Provisioner)管理地址的分配,以确保没有重复的单播地址被分配,而Configuration Client生成和分发网络和应用程序密钥,并确保需要相互通信的设备为网络和访问层共享适当的密钥。Configuration Client还知道设备密钥,用于与每个节点进行安全通信,包括分发更新的网络密钥和应用密钥。
一个Mesh网络由共享四个公共资源的节点组成:
网络层定义了地址的四种基本类型:未分配、单播、虚拟和组。地址占用16位,定义如下:
未分配地址是节点的元素尚未配置或未分配地址时的一种地址,未分配地址的值应该是0x0000。例如,可以通过将模型的发布地址设置为未分配的地址来禁用模型的消息发布。未分配的地址不得用于消息的源或目的地址字段。
单播地址是分配给每个元素的唯一地址。单播地址范围0x0001至0x7FFF。单播地址必须用于消息的源地址字段,也可以用于消息的目的地址字段。发送到单播地址的消息最多只能由一个元素处理。
虚拟地址表示一组目的地址。单播地址范围0x8000至0xBFFF。每个虚拟地址在逻辑上表示一个Label UUID,它是一个128位的值,不需要集中管理。一个或多个元素可以被编程来发布或订阅一个Label UUID。虚拟地址的0-13位是hash值,该hash值是Label UUID的派生,使得每个哈希表示多个Label UUIDs。当Access消息被接收到具有匹配哈希的虚拟地址时,上层传输层将每个对应的Label UUID作为作为消息认证的额外一部分数据,直到找到匹配。虚拟地址的一个缺点是在配置过程中需要多段消息将Label UUID传输到发布或订阅节点。控制消息不可以使用虚拟地址。
组地址是被编程为零个或多个元素的地址。0xFF00到0xFFFF范围内的组地址保留给固定组地址,0xC000到0xFEFF范围内的地址一般可用于其他用途。组地址只能在消息的目的地址字段中使用。发送到组地址的消息应传递给所有订阅该组地址的模型实例。
组地址有两种:动态分配的和那些固定的
发送到全代理地址的消息应由启用代理功能的所有节点的主元素处理。
发送到全好友地址的消息应由启用好友功能的所有节点的主元素处理。
发送到全中继地址的消息应由启用中继功能的所有节点的主元素处理。
发送到全节点地址的消息应由所有节点的主元素处理。
IV Index是共享网络资源(即Mesh网络中的所有节点共享相同的IV Index值,并将其用于它们所属的所有子网)的32位值。IV Index从0x00000000开始。如果一个节点在一段时间内不在网状网络中,它可以扫描安全网络信标(Secure Network beacons)或使用IV Index Recovery过程,从而自主设置IV Index值。
不属于mesh网络成员的设备称为未配置设备。作为mesh网络成员的设备称为节点。配置角色用于管理未配置的设备和节点之间的转换。未配置的设备不能发送或接收mesh网络消息,但是它可以向配置角色宣传自己的存在。配置角色在认证完毕后会邀请这个未配置设备加入Mesh网络,将其转换为节点。通过配置客户端( Configuration Client )的配置节点可以实现在Mesh网络发送或接收消息,该客户端也可能是和配置角色是同一个设备。配置客户端可以从mesh网络中移除节点,并将其恢复到未配置的设备。
设备通过一个配置角色添加到一个mesh网络中,此时它们成为节点。将设备配置到mesh网络中不同于蓝牙无线技术中通常使用的点对点绑定和配对,设备的配置可以使用简单的广播承载或基于GATT的点对点承载。两个承载者均使用单一的配置协议。所有的设备都支持基于广播承载的配置。通过提供基于GATT的承载,使得传统电话(也就是说,设备不支持基于广播承载的配置)设备可以成为配置角色。
为了辅助配置多个设备,一个设备有一个可以通过配置角色设置的attention timer。当设置为非零值时,设备可以使用任何方法来标识自己,例如:设备可能闪光、发出声音或振动。当attention timer到期时,设备停止标识自身。配置角色可以向设备发送一条消息使其标识自己,并且设备在给定时间后自动停止标识自己。
许多现有设备无法在不更新的情况下发布或理解mesh消息。为了使这些设备能够在不需要进行操作系统更新或类似软硬件更新的情况下与Mesh网络中的节点通信,该规范允许对所有现有设备使用GATT连接。
规范不要求设备在每个连接上协调传输、建立连接或重启安全认证,从而有利于低功耗运行。需要支持低功耗的设备可以使Friendship的概念,将自己与代表他们存储和中继消息的常开设备关联起来。然而,中继消息的设备将在大部分时间内接收消息和转发消息,导致产生相对较大功耗。
Mesh网络架构使用了几种不同的概念:状态、消息、绑定、元素、寻址、模型、发布订阅、Mesh密钥和关联。
状态是表示元素的一个条件的值。
一个展示状态的元素被称为服务器。例如,最简单的服务器是Generic OnOff Server,表示它要么开要么关。访问状态的元素被称为客户端。例如,最简单的客户端是Generic OnOff Client (一个二进制开关),它可以通过Generic OnOff模型定义的消息控制Generic OnOff Server。
当一个状态被绑定到另一个状态时,一个状态的变化导致另一个状态的变化。绑定状态可能来自一个或多个元素中的不同模型。例如,一种常见的绑定类型是介于Level状态和OnOff状态之间:将Level改为0将OnOff状态改为Off,将Level改为非零值将OnOff状态改为On。
消息由操作码、相关参数和行为组成。操作码可以是单字节(对于需要参数的最大可能负载的特殊消息)、2个字节(对于标准消息)或3个字节(针对供应商特定的消息)。
包括操作码在内的总消息大小由底层传输层决定,传输层可以使用分段和重组( Segmentation and Resemble,SAR )机制。为了最大限度地提高性能并避免SAR的开销,一个设计目标是在单个段中拟合消息。传输层为非分段消息提供最多11个字节,使用1个字节操作码时可供参数使用的字节最多为10个,使用2个字节操作码时可供参数使用的字节最多为9个,使用特定厂商的3个字节操作码时可供参数使用的字节最多为8个。传输层提供了一种能够传输多达32段SAR的机制。使用SAR时的最大消息大小为384个字节。这意味着,当使用1字节操作码时,参数最多可为379个字节,使用2字节操作码时,参数最多可为378个字节,使用特定于厂商的3字节操作码时,参数最多可为377个字节。
元素是节点内的可寻址实体。每个节点至少有一个元素,即主元素,也可能有一个或多个附加的次元素。元素的数量和结构是静态的,在节点(即只要节点是网络的一部分)的整个生命周期内不会发生变化。
主元素使用配置期间分配给节点的第一个单播地址进行寻址,每个额外的次要元素使用后续地址进行寻址。这些单播元素地址允许节点识别节点内哪个元素正在发送或接收消息。如果元素的数量和结构发生变化,例如由于固件更新,节点必须重新设置。当执行固件更新以更改元素的数量或结构时,需要移除节点。消息在模型中基于操作码和元素地址进行分发。
一个地址可以是单播地址、虚拟地址或者群组地址。还有一个特殊的值来表示消息中没有使用的未分配地址。
一个单播地址分配给一个元素,并且始终代表一个节点的单个元素。每个mesh网络有32767个单播地址。
虚拟地址是多播地址,可以表示一个或多个节点上的多个元素。每个虚拟地址在逻辑上表示一个Label UUID,它是一个128位的值,不需要集中管理。发送给Label UUID的每条消息都包含用于验证消息的消息完整性校验值中的完整Label UUID。为了减少检查每个已知标签UUID的开销,使用标签UUID的哈希。共有16384个哈希值,每个哈希值编码一组虚拟地址。虽然一个虚拟地址使用的哈希值只有16384个,但是每个哈希值可以代表数百万个可能的Label UUID;因此,虚拟地址的数量被认为非常庞大。
组地址是多播地址,可以表示一个或多个节点上的多个元素。每个mesh网络有16384个组地址。有一组固定的组地址,用于根据节点的功能来解决节点的所有主要元素的子集。所有其他组地址称为动态分配组地址。其中固定组地址256个,动态分配组地址16128个。
应用定义在客户端模型、服务器模型和控制模型中。使用客户端-服务器架构与发布-订阅范式通信来指定一个mesh应用。单个设备可能包含客户端模型、服务器模型和控制模型。
服务器模型:一个服务器模型由跨越一个或多个元素的一个或多个状态组成。服务器模型定义了一组它可以发送或接收的强制消息,元素在发送和接收此类消息时所需的行为,以及消息发送或接收后发生的任何附加行为。
客户端模型:客户端模型定义了一组消息(既有强制性又有选择性),客户端用来请求、更改或消费相应的服务器状态,如服务器模型所定义的。客户端模型没有状态。
控制模型:控制模型可能包含客户端模型与其他服务器模型通信的功能和服务器模型与其他客户端模型通信的功能。一个控制模型也可能包含控制逻辑,是协调控制模型所连接的其他模型之间相互作用的一组规则和行为。
mesh网络中数据的发布和订阅被描述为使用发布-订阅范式。生成消息的节点将消息发布到单播地址、组地址或虚拟地址。有兴趣接收消息的节点将订阅这些地址。生成的消息被发送到目标mesh地址,这些地址可以是单播、预先配置的组地址或虚拟地址。消息可以作为对其他消息的回复发送,也可以是未经请求的消息。当模型的实例发送应答消息时,它使用传入消息发起者的源地址作为目的地址。当模型的实例发送未请求的消息时,它使用模型发布地址作为目标地址。节点内模型的每个实例具有单一的发布地址。
在接收方,节点内模型的每个实例可以订阅一个或多个组地址或虚拟地址。当发送到模型的一个订阅列表上的组地址或虚拟地址的消息到达时,由节点进行处理。当消息的目的地址是接收单元的单播地址时,或者消息的目的地址是该设备所属的固定组地址时,也会对消息进行处理。如果一个节点有多个元素,则在每个被寻址的元素上处理一次消息。
尽管节点可能会限制所支持的订阅数量,但节点可以在每个模型元素的实例中拥有多个订阅。使用多个订阅地址允许节点响应发布到不同组的消息。例如,一盏灯可能会订阅发送给床头灯组、卧室组、楼上组和房子组的消息。每个消息从单个单播地址(一个元素地址)发送,并使用唯一的序列号进行排序,以方便检测和防御重放攻击。
所有消息都使用两种密钥进行加密和认证。一种密钥类型是用于网络层通信,这样一个mesh网络内的所有通信都将使用相同的网络密钥。另一类密钥是用于应用数据。将网络和应用程序的密钥分离,允许敏感访问消息(例如,用于对建筑物的访问控制)与非敏感访问消息(例如,用于照明)分离。mesh网络中不存在未加密或未认证的消息。
在上层传输层和网络层对消息进行加密和认证,旨在保护Mesh网络内部的通信免受窃听者和恶意攻击。每层维护不同的密钥,以允许应用程序和网络实体之间的分离。
将应用密钥与网络密钥分离可以实现应用消息的安全中继传输:中继节点可以在不访问应用数据的情况下进行网络级的消息认证。例如,作为中继节点的灯泡不应该能够解锁门。这意味着节点可以在不需要知道应用密钥的情况下,使用从网络密钥派生的密钥中继访问消息;因此他们不会有改变或者理解应用数据的能力。通过增加Relay节点的密度,同时保护不同的应用领域,网络密钥有望被网络中的许多节点广泛知晓。这就需要为每个应用程序分配单独的密钥。例如,将敏感的门安全应用从非敏感的门铃和照明应用中分离出来。
应用程序密钥与在特定上下文中使用的关联应用程序密钥标识符一起直接使用,以识别所使用的应用程序。然而,网络密钥总是通过一个密钥派生函数来生成其他直接使用的密钥。这类密钥的例子包括加密密钥和隐私密钥。这允许更改单个网络密钥,并快速导出从该密钥派生的所有关联值。与应用密钥一样,网络密钥也用于衍生出网络密钥标识符。
该安全模型定义了三个独立的密钥(设备密钥( DevKey ))、应用密钥( AppKey )和网络密钥( NetKey )来保护消息的安全。当一个节点被赋予一个密钥时,它被授权使用该密钥。一个在多个节点之间共享的密钥使得拥有该密钥的任何节点都可以使用该密钥发送和接收消息。
设备密钥有助于配置客户端(Configuration Client)和单个节点之间密钥的机密性和认证。应用密钥便于对目标节点之间发送的应用数据进行保密和认证。网络密钥有助于网络消息的隐私性、保密性和真实性。一个节点可能拥有单个设备密钥、多个应用密钥和多个网络密钥。设备密钥与应用程序密钥类似,其设计目的是保护上层传输层中应用程序发送的信息。然而,设备密钥仅由配置客户端和单个节点知道。配置客户端知道所有节点的设备密钥。一个应用密钥只能与单个网络密钥一起使用。这意味着一个网络密钥有一个或多个与之相关的应用密钥。这种关联被称为键结合。
访问层安全的粒度是基于模型的。每个服务器模型都有一组与之绑定的应用密钥,定义了应该用来加密和认证模型要处理的消息的可能密钥。这允许多个实体操作某些节点功能。多达251个应用密钥可以绑定到一个模型。例如,一个Light Lightness Server模型有三个密钥绑定到它,因为管理员、用户和客户都可以打开一个灯。然而,只有管理员才能配置灯,因此配置服务器模型只有与之绑定的管理应用程序密钥。
该网络安全模型使用一种名为模糊化的隐私机制,该机制使用AES加密源地址、序列号和其他使用隐私密钥的头信息。模糊化的目的是使跟踪节点更加困难。
一个节点可能有多个网络或应用密钥。通过使用密钥标识符,可以识别哪些密钥子集用于保护消息。例如,一个节点可能不需要检查20个密钥,而只需要检查两个密钥标识符的最低有效位相同的密钥。如果收到的消息有一个不知道的密钥标识符,那么节点可以立即丢弃它。
密钥标识符由网络或应用密钥使用密钥派生函数生成。网络密钥标识符使用7位值在每个Network PDU中传输,而应用密钥标识符使用6位值在每个Lower Transport PDU中传输。
网络PDU包含一个24位的序列号,允许一个元素传输16777216个网络PDU。在安全机制中使用序列号来提供唯一性,因此序列号一定不能混乱。如果一个元素以2 Hz的频率传递一个新的消息,那么这些序列号在97天后就会耗尽。为了使网格网络能够在比序列号空间允许的更长的时间内运行,定义了一个额外的4字节值,称为IV Index,包含在安全nonce(Number once)中。例如,使用相同的2 Hz消息频率,使用IV Index的mesh网络生命周期可达数十亿年。
为了实现从一个IV Index到下一个IV Index的逐步过渡,每个网络PDU都包含用于传输消息的IV Index的最低有效位。节点还可以使用IV Update过程向对等节点发出信号,表明它正在更新IV Index。从旧的IV Index过渡到新的IV Index过程至少需要8天的时间(理论上入网192小时后才能更新IV Index),从而将节点传输消息的频率限制在24 Hz(防止未更新IV Index之前序列号用完)。但是一个节点不应该在任一个10秒的窗口内发送超过100个网络PDU,这通常需要大约19天才能耗尽。
低功耗节点使用Friendship来限制它们需要侦听的时间量。如果节点不能连续接收,则有可能不会接收到需要处理的mesh消息。这包括维护网络安全所需的安全更新以及正常的mesh消息。如果低功耗节点没有收到这样的消息,那么它可能无法正常工作,也可能无法及时了解网络的最新安全状态,如果这种安全状态在不知情的情况下发生了变化,它最终会退出网络。
Friendship是低功耗节点与一个邻近的Friend节点之间的一种特殊关系。这些节点必须在彼此的单跳内,并且在同一个子网中。Friendship首先由低功耗节点建立并发起;一旦建立,Friend节点执行一系列有助于降低低功耗节点功耗的操作。
Friend节点为低功耗节点维护一个Friend队列,该队列存储所有发送给低功耗节点的消息。当低功耗节点请求时,Friend节点将消息发送给低功耗节点。同时,Friend节点向低功耗节点提供安全更新。
当一个低功耗节点和一个Friend节点建立友谊时,这两个节点被认为是"朋友"。一个Friend节点可能是多个低功耗节点的朋友。低功耗节点只能与单个Friend节点为好友。
节点的功能性由其支持的特征决定。所有节点都具有发送和接收Mesh消息的能力。节点还可以选择支持一个或多个额外的特征:
中继功能:在广播承载者上接收和转发网状消息的能力,以实现更大的网络。
代理功能:在GATT和广播承载者之间接收和转发网状消息的能力。
低功耗功能:仅与支持Friend功能的节点一起在接收方占空比显著降低的mesh网络中操作。
Friend功能:通过存储针对这些节点的消息来帮助支持具有低功耗功能的节点操作。
支持某个功能的节点可能启用或禁用该功能,而该功能在启用时可能正在使用,也可能不在使用。
支持Relay特性的节点可能会禁用该特性,但它仍然会支持Relay特性,只是它没有执行该特性所要求的功能。支持Relay特性并启用Relay特性的节点称为Relay节点。
支持Proxy功能的节点可能会禁用该功能,但它仍然会支持Proxy功能,只是它没有执行该功能所要求的功能。支持Proxy特征并启用Proxy特征的节点称为Proxy节点。
一个支持低功耗特性的节点不能禁用该特性,必须与另一个支持Friend特性的节点建立友谊,才能使用低功耗特性来减少接收占空比。一个支持低功耗特性且与支持Friend特性的节点有好友关系的节点称为低功耗节点。
支持Friend特性的节点可能会禁用该特性,但它仍然会支持Friend特性,只是它没有执行该特性所要求的功能。一个支持Friend特性、启用了Friend特性以及与一个支持Low Power特性的节点有好友关系的节点称为Friend节点。
Mesh网关是能够在Mesh网络和非蓝牙技术之间转换消息的节点。节点可以通过Mesh网关发送和接收Mesh消息。
规范对节点没有并发限制或约束。