matter网络基础之—Thread
前文我们讲过,matter目前有两个分支,matter over Thread和matter over Wi-Fi。 matter over Thread本质上就是运行在Thread协议上的matter应用层协议。matter over Thread产品需要两个认证:CSA联盟的matter认证和Thread联盟的Thread产品认证。学习Thread协议对我matter产品开发是非常有意义的。
什么是 Thread?
Thread是专门为物联网设计的一种短距离、低功耗、支持IPv6的无线网状网络组网协议。Thread协议栈是建立在现有的IEEE和IETF标准集之上的一个开放标准,而不是一个全新的标准。
Thread协议栈的结构如下图:
Thread协议栈支持 IPv6 地址并提供与其他 IP 网络的低成本桥接,Thread协议栈针对低功耗/电池供电的操作和无线设备到设备通信进行了优化。 Thread协议栈为需要基于IP网络互联和家庭和商业应用而设计,并且可以在堆栈上使用各种应用层。
Thread协议栈的主要特性包括:
• 易于部署和维护 — 安装、启动和操作相对简单。产品安装码(Product installation codes)确保经过授权的产品可以加入网络之中。简单的建网和入网协议允许系统自我配置和修复路由错误。
• 通信安全 — Thread 网络中的设备都必须通过身份验证,并且所有的通信都经过了加密
• 稳定可靠 — 具有自愈能力的网状网络,无单点故障,并且采用扩频技术以提高抗干扰能力
• 低功耗 — Thread 低功耗设备可以进入休眠并使用电池供电,通常使用一块电池能工作数年
• 规模可扩展 — Thread 网络的规模可以扩展达数百个设备
OpenThread:
由谷歌发布是的OpenThread的开放源代码实现Thread。谷歌发布OpenThread,旨在让开发者更广泛地使用谷歌 Nest产品中使用的网络技术,以加快互联家庭和商业建筑产品的开发。
OpenThread为家庭和商业建筑应用定义了一种基于IPv6的,可靠的、安全和低功耗的无线设备到设备通信协议。OpenThread实现了Thread 1.1.1 规格中定义的所有功能以及Thread 1.2 规格的部分功能。
Thread网络结构:
全功能Thread设备(Full Thread Device)总是打开它的射频收发器,它订阅所有Router的多播地址,并维护 IPv6 地址映射。FTD 有三种类型:
路由器, REED–可以升级为Router, 全功能终端设备(Full End Device)–无法升级为 Router
最小功能Thread设备(Minimal Thread Device)不会订阅多播地址,并且它会将它的所有消息发送给它的父节点。MTD 有两种类型:
最小功能终端设备(Minimal End Device)–始终打开自身的收发器,无需从父节点中轮询消息
休眠终端设备(Sleepy End Device)–通常会关闭自身的收发器(睡眠),偶然会打开收发器(唤醒)以从父节点中轮询消息
边界路由器:是一种可以在Thread网络和其他网络(Wi-Fi,以太网,蓝牙等)之间转发信息的设备。它还为Thread网络提供服务,包括路由服务和离网服务 (一个 Thread 网络中可以有多个Border Router)。
领导者(Leader):是一个特殊的Router,在 Thread 网络分区中,Leader管理己经分配了Router ID的注册表,并接受符合升级为路由器条件的REED请求成为路由器。 Leader决定哪些REED应该是路由器,Leader 和网络中的Router一样,也可以有子节点。 Leader 还使用 CoAP分配和管理路由器地址。 Leader 中包含的所有信息都存在于其它Router中。如果Leader出现故障或失去与网络的连接,其它的Router会被推举为Leader,这个过程不需要用户的干预。
路由器:Thread路由器为网络设备提供路由服务。Thread路由器还为试图加入网络的设备提供加入和安全服务。Thread路由器不能休眠(Sleep),但是可以降级成为REED。
可以升级为Router的终端设备(Router Eligible End Device):REEDs可以成为Router或Leader,但是不能成为边界路由器。Thread会尝试将 Router 的数量保持在16-23之间。如果一个REED作为End Device加入,并且网络中的Router数量低于 16,那么它将自动升级为 Router。
终端设备: 终端设备无法升级为 Router。可以是全功能的终端设备(FED)或最小功能的终端设备(MED)。MED不需要和父节点精确的同步通信。
休眠终端设备(Sleepy end devices):只和自己的父亲路由节点通信的终端设备,不能转发消息给其它设备。
Thread的商业网络通过域和域唯一地址配置。
设备限制:
单个 Thread 网络所支持的设备类型数量是有限制的。
Thread会尝试将Router的数量保持在16-23 之间。如果一个REED作为End Device 加入,并且网络中的 Router 数量低于16,那么它将自动升级为 Router。
IPv6地址:
Thread协议栈的设备支持在RFC4219((https://tools.ietf.org/html/rfc4291)中定义的IPv6地址构架。Thread设备支持唯一的本地地址(ULA-Unique Local Address),域模型中的域唯一地址(DUA-Domain Unique Address),Thread设备根据设备提供的资源支持一个或多个全局单播地址
IPv6地址的高位64比特代表网络地址,其它的表示网络中的特殊地址。也就是说一个网络中的所有设备拥有相同的N个高比特位。这前面的N个高比特也叫做前缀(Prefix),"/64"表示这是一个具有64比特前缀的地址。加入网络中的设备被分配一个64比特前缀,设备在网络中使终使用这个前缀。前缀也是一个唯一的本地单播地址(https://tools.ietf.org/html/rfc4193: Unique Local IPv6 Unicast Addresses)。Thread网络也许有一个或多个边界路由器,这些边界路由器有些没有用来产生唯一的本地地址或全局单播地址的64比特前缀。这些设备使用它自己的EUI-64地址获取接口标识符–在RFC4944第6章有详细介绍(https://tools.ietf.org/html/rfc4944: Transmission of IPv6 Packets over IEEE 802.15.4 Networks)。这些设备会支持由EUI-64作为接口标识符而配置的本地连接IPv6地址。配置使用RFC4862(https://tools.ietf.org/html/rfc4862: IPv6 Stateless Address Autoconfiguration)中定义的知名的本地连接前缀FE80::0/64
Thread设备还支持合适的多播地址。包括本地连接的所有节点多播(link-local all node multicast),本地连接的所有路由器多播(link local all router multicast),被请求的节点多播(solicited node multicast),本地网状多播(mesh local multicast)。如果域模型中存在骨干边界路由器,设备还可以支持更大范围的多播地址。
每一个加入网络的Thread设备会依据IEEE 802.15.4-2006规格分配一个2字节的短地址。对于路由器来说,这个地址是使用地址范围中的高比特位分配的。孩子节点使用父节点的高比特位后再分配合适的低比特位形成自己的地址。这可以保证Thread网络中的其它设备能够很容易的理解孩子节点的路由位置。
单播(Unicast):
在一个单个的发送者和一个接受者之间通过网络进行的通信。
多播(Multicast):
多播用于一次将信息传达给多个设备。Thread 网络中保留了特定的地址,以提供给不同分组的设备在多播时使用。
任播(Anycast)
当目的地的 RLOC 未知时,可以使用任播将数据路由到 Thread 接口。ALOC(Anycast Locator)标识 Thread 分区内多个接口的位置。ALOC 的后 16 位,称为 ALOC16,其格式为 0xfcXX,表示 ALOC 的类型。
Thread 定义了以下 ALOC16 值
Thread应用层:
Thread协议栈是负责在Thread网络中不同设备之间传输消息的无线网状网协议。Thread协议栈没有标准化的应用层规范(matter是一个通用的应用层规范,与Thread互补),Thread提供了基本的应用服务。
IP协议栈基础:
CoAP(Constrained Application Protocol)-受限应用协议是一种专门的传输协议,用于资源受限的物联网设备和低功耗网络。CoAP 提供应用程序endpoint之间的请求/应答模型,支持内置的服务和资源发现,并包含互联网的关键概念,例如统一资源定位符URL。 在Thread网络中,CoAP用于配置设备的mesh-local地址和组播地址。 此外,CoAP 还用于管理消息,例如在活跃的Thread路由器上获取和设置诊断信息以及其他网络数据。
DTLS(Datagram Transport Layer Security)即数据包传输层安全性协议。TCP之上的应用可以用TLS来保证安全,但是TLS不能用来保证UDP的安全。Datagram TLS试图在现存的TLS协议架构上提出扩展,使之支持UDP,即成为TLS的一个支持数据报传输的版本。
距离向量路由协议(distance vector routing protocol)是为小型网络环境设计的。路由协议中的两大分类之一,这类协议采用距离向量(distance-vector,缩写为DV)算法来决定报文交换的路径。
6LoWPAN(IPv6 Over Low Power Wireless Personal Networks):是一种基于IPv6的低速无线个域网标准,6LoWPAN的主要目标是在IEEE 802.15.4的连接上面传输和接收IPv6数据包,可用于构建无线传感器网络。 在以太网链路中,具有 IPv6 最大传输单元 (MTU)-1280字节大的数据包可以作为一帧通过链路发送。为了适应无线传输的802.15.4帧尺寸,6LoWPAN做了很多折中处理。在802.15.4的网络中,6LoWPAN充当IPv6网络层和802.15.4链路层之间的适配层。 它通过在发送方对IPv6数据包进行分段并在接收方重组来解决传输IPv6 最大传输单元的问题。
6LoWPAN还提供了一种压缩机制,减少通过无线信号发送的IPv6报头大小,从而减少传输开销。 通过无线信号发送的比特越少,设备消耗的能量就越少。 Thread 充分利用这些机制在 802.15.4 网络上高效传输数据包。RFC 4944 (https://tools.ietf.org/html/rfc4944) 和 RFC 6282 (https://tools.ietf.org/html/rfc6282) 详细的描述了完成报头压缩和报文分割的方法。
ICMPv6: IPv6版本的因特网控制报文协议,在RFC 4443里面定义(https://tools.ietf.org/html/rfc4443)。
UDP: Thread协议栈支持用户数据报文协议,在RFC 768 (https://tools.ietf.org/html/rfc768: User Datagram Protocol)中定义。
Thread的系统构架:
Spinel 是一种通用管理协议,用于使主机设备能够与协处理器进行通信并对其进行管理。 Spinel 最初旨在支持基于线程的 NCP,现在采用分层方法设计,使其在未来可以轻松适应其他网络技术。它与 RCP 和 NCP 设计一起使用。
Thread 1.2:
Thread 1.2 进一步优化可扩展性、能效以及对大规模网络应用程序的支持;进一步增强基本规范,以优化功耗、延迟和节点密度。Thread 1.2 为蓝牙设备提供可选支持,增强其基于 IPv6 的大型多域网络功能并简化调试。
用蓝牙控制Thread设备:
蓝牙可以和手机直接连接而无需设置网络,因此可以使用智能手机轻松控制Thread网络。
Thread 设备,可能配备有“双无线电”,即同时拥有蓝牙和 Thread。双无线电设备可以与蓝牙设备“对话”并成为 Thread网络的一部分,提供 Thread 网络的所有功能,包括使用安全和完全加密的低功耗无线信号在所有连接的智能设备之间自动高效地路由数据。
另外,智能手机或平板电脑等双无线电设备可以充当互联网的网关,例如为 Thread 网络上的设备下载新的固件更新,或者要快速发送当前所有设备的状态给维护工程师时。
参考资料:
https://www.threadgroup.org/
https://openthread.io/
https://github.com/openthread/openthread
https://openthread.google.cn/
CSDN博客仅作为本人工作学习之余的笔记使用,无任何商业目的,如果侵犯了你的隐私或权益,请随时联系作者,本人将及时删除相关内容。