Thread 协议网络基础
1 介绍
Thread旨在解决物联网的独特互操作性、安全性、功耗和架构挑战。
- Thread网络没有单点故障,可以在添加或删除设备时自我修复和重新配置,并且易于设置和使用。
- Thread基于广泛支持的IEEE 802.15.4无线电标准,该标准专为极低功耗和低延迟而设计。
- Thread是一个基于普遍支持的互联网协议(IP)的低功耗无线网状网络协议,使用开放和经过验证的标准构建。
- Thread实现了设备到设备和设备到云的通信,可靠地连接数百(或数千)个产品,并包含必须实现的安全功能。
1.1 基本特性
Thread规范是一个开放的标准,用于可靠、经济高效、低功耗、安全、无线IPv6通信。它专为需要基于IP的网络连接和在同一网络上使用各种应用层的连接家庭和商业应用而设计。
以下是Thread的基本特性:
-
低功耗:主机设备可以使用适当的占空比在小电池上运行数年。
-
安全:设备只有在授权的情况下才能加入Thread网络,并且所有网络通信都是加密和安全的。
-
简单的网络安装、启动和操作:形成、加入和维护Thread网络的简单协议允许系统自我配置、动态优化和修复。
-
无单点故障:Thread网络是自动配置和自我修复的,因此即使个别设备出现故障,仍然可以继续提供安全和可靠的通信。
-
小型和大型网络:家庭网络从几个设备到数百个设备进行无缝通信。商业网络可以同时容纳数千个设备。Thread网络层旨在根据预期的使用情况优化网络操作。
-
范围:与网状网络结合的典型设备足以覆盖普通家庭。骨干边界路由器(BBRs)可以将多个Thread设备组成的IPv6子网统一为单个IPv6子网,以满足商业市场需求。物理层使用扩频技术提供良好的抗干扰能力。
-
基于开放和经过验证的标准构建:Thread规范使用了来自IEEE和IETF的明确定义的标准作为强大、现代协议的基础,而不是重新发明轮子。
-
应用层无关:Thread是基于IPv6的网络层解决方案。任何可以在IPv6上运行的低带宽应用层都可以在Thread上运行,并且多个应用层可以共享同一网络。
Thread规范的概述如下图所示
1.2 IEEE 802.15.4 PHY/MAC
Thread规范使用IEEE 802.15.4 PHY(物理)和MAC(媒体访问控制)层,在2.4 GHz频段以250 kbps的速度进行链路层通信。使用的是IEEE 802.15.4-2006和IEEE 802.15.4-2015版本。IEEE 802.15.4是Thread规范的基础,提供链路级别上各个Thread设备之间的可靠消息传输。
IEEE 802.15.4提供了CSMA-CA(载波侦听多路访问-碰撞避免)机制,允许多个Thread设备通过等待清晰频道再进行传输,从而共享2.4GHz带宽。IEEE 802.15.4使用链路层确认和重试,实现单个消息的可靠传输。加密、认证和重放保护也被提供,以保证安全通信。对于低功耗设备,定义了从始终在线节点提取缓冲消息的例程。
IEEE 802.15.4是一个广泛部署、经过良好测试的协议,Thread规范基于此协议提供可靠的端到端通信。
1.3 无单点故障
Thread网络中的设备没有单点故障,即使某些设备执行特殊功能。例如,休眠终端设备(SED)需要父设备进行通信,因此这个父设备是一个单点故障。但是,如果当前父设备不可用,SED可以选择另一个父设备,因此用户不会看到此故障。
虽然该系统被设计为没有单点故障,但在特定的拓扑结构中,会有一些设备没有备份能力。例如,在具有单个边界路由器的系统中,如果边界路由器失去电源,则无法切换到备用设备。在这种情况下,单个路由器将承担的角色来做出决策。如果领导者失败,另一个路由器将承担该角色。这种自主操作确保了没有单点故障。
2 Thread设备类型和角色
Thread网络中定义了两种类型的设备:FTD设备 (Full Thread Device)和MTD设备(Minimal Thread Device)。MTD对设备的硬件要求最低(例如内存大小),功耗也最低,而FTD在Thread网络中可以扮演的角色最多。这些角色如下说明:
2.1 FTD设备
2.1.1 路由FTD设备(Routing Full Thread Devices )
Router
线程路由器为网络中的线程设备提供路由服务。路由器还为试图加入网络的设备提供加入和安全服务。路由器不是为了睡眠而设计的。但路由器可以降低其功能,并成为符合路由器条件的终端设备(REED)
Leader
Leader是Thread网络中一个路由器的附加角色。领导者是一个路由器的选举角色,它在线程网络中做出某些决定,例如允许REED升级为路由器。如果一个线程网络的领导者意外离网,另一个路由器将被动态地选择来恢复这个角色。所有路由器都具有所需的线程网络数据,以无缝承担此角色。
2.1.2 非路由FTD设备(Non-Routing Full Thread Devices )
-
REED(Router-Eligible End Device)
REED具有成为路由器的能力,但由于网络拓扑或条件的限制,它们不能充当路由器。Thread 网络通过Leader管理成为路由器的REED,无需用户交互 -
FED (Full End Device)
FED是类似于REED的终端设备,但是它们没有路由器的能力,所以永远不会成为路由线程设备或领导者。
2.2 MTD设备
-
MED (Minimal End Device)
最小终端设备(MED)只能通过其父路由器进行通信,并且不能为其他设备转发消息。即使空闲时,MED的无线电也是打开的。 -
SED (Sleepy End Device)
休眠终端设备(SED)只能通过其父路由器进行通信,不能转发其他设备的消息。SED在空闲期间关闭无线电,并定期唤醒与其父级通信。 -
SSED (Synchronized Sleepy End Device)
同步休眠终端设备(SSED)只能通过父路由器进行通信,不能为其他设合转发消息。SSED在空闲期间关闭其无线电,并定期唤醒以按预定间隔侦听来自其父级的消息
2.3 边界路由器
边界路由器是Thread Device的一个角色,它提供从Thread网络到其他物理层上的相邻网络的连接性(例如,Wi-Fi或以太网)。边界路由器为Thread网络内的设备提供服务,包括为离线操作提供路由服务。在一个Thread网络中可能有多个边界路由器。任何FTD都可以提供边界路由器服务,即使该设备在Thread网络中不作为路由器运行。
3 Ipv6栈基础
3.1 寻址
Thread 网络中的设备支持IPV6寻址体系结构。Thread 网络会自动为每个设备缺省配置一定的IPv6地址,如表1所示。每个Thread设备还可以根据应用程序的需要配置额外的地址。线程自动配置的IPv6地址组成如下图:
构成网络的设备生成一个/64前缀,该前缀在整个Thread网络中被使用。这个前缀被称为“Mesh本地前缀”,并且被网络中的每个设备用来生成两个“Mesh本地地址”。这些Mesh本地地址是IPv6的ULA(Unique Local Address),用于在Thread网络内部进行通信。对于mesh建立和链路维护,每个Thread设备都会配置一个link-local接口标识符,使用FE80::/64前缀。
Thread网络也可能包含一个或多个边界路由器,它们可能提供额外的GUA/ULA前缀。Thread设备可以根据这些前缀配置更多的IPv6地址,使用SLAAC 或DHCPv6 ,具体取决于边界路由器的配置。
设备还支持适当的多播IPv6地址。默认情况下,这包括链路本地所有节点多播、链路本地所有路由器多播、领域本地所有节点多播和领域本地所有路由器多播,具体取决于设备类型。一个Thread设备还可以根据应用程序的需要订阅其他多播地址。每个加入Thread网络的设备都被分配了一个16位短地址。在Thread中,这被称为RLOC16。对于路由器,此地址是通过将地址字段的高位数设置为0来分配的,表示路由器地址。然后,子设备会使用其父路由器的高位数和适当的较低位数为其地址分配16位短地址。这允许Thread网络中的任何其他设备通过查看其地址字段的高位数来理解子设备的路由位置。下图展示了Thread短地址。
3.2 6LOWPAN
Thread设备使用6LoWPAN,用于在IEEE 802.15.4网络上传输IPv6数据包。
在Thread网络内部,会使用头部压缩技术来减少传输的数据包大小。发送消息的设备会尽可能地压缩IPv6头部,以最小化传输的数据包大小。
线程网络支持mesh头,这在路由和网络连接部分有详细的讨论。在Thread中使用的mesh头也允许对消息进行高效的端到端分片,而不是中指定的逐跳分片。由于MLE消息(参见MLE消息部分)已经被用来发现相邻节点和路由器
3.3 UDP和TCP协议
Thread Devices使用[RFC768]中定义的UDP (用户数据报协议)在设备之间进行消息传递,用于网格的建立和维护。线程网络还支持TCP(或任何其他基于IPv6的传输协议)用于应用层通信。
4 网络拓扑
4.1 概述
Thread规范支持线程网络中所有路由器之间的完全网状连接实际的拓扑结构是基于线程网络中的路由器数量。如果只有一个Router那么就形成了一个带有一个Router的基本星形拓扑结构。如果有多个路由器,则会自动形成网状拓扑结构。下图说明了线程网络的基本拓扑结构和设备类型
4.2 网状网络
Thread网络通过允许无线电设备转发消息给其他无线电设备,使得无线网络系统更加可靠。例如,如果一个节点无法直接向另一个节点发送消息,该网络会将消息通过一个或多个中间节点进行转发。如果单个链路失败,消息可以沿着备用路径进行转发。正如下面讨论的路由和网络连通性部分所述,Thread网络的性质是所有路由器节点都维护彼此之间的路由和连通性,从而使网格始终保持维护和连接状态。Thread网络中最多有32个活动路由器。然而,使用了64个路由器地址以允许路由器地址的回收再利用。在Thread网格网络中,终端设备不会为其他设备进行路由。这些设备通过处理其子设备路由操作的父路由器与其通信。
4.3 路由和网络连接
Thread网络最多有32个活跃的路由器,它们使用基于设备链路层路由表的下一跳路由来传输消息。链路层路由表由Thread设备维护,以确保所有路由器都具有连通性,并为Thread网络中的任何其他路由器提供最新的路径。Thread使用非常紧凑的消息格式。所有路由器都以压缩格式使用MLE(Mesh Link Establishment)与其他路由器交换它们到Thread网络中其他路由器的路由成本。
注意:从IP的角度来看,Thread网络支持路由器和主机。主机是任何终端设备,包括REEDs、FEDs、MEDs、SEDs和SSEDs。
MLE(Mesh Link Establishment)消息
MLE消息用于建立和配置安全的无线链路,检测相邻设备,并在Thread网络中的设备之间维护路由成本。MLE消息使用单跳链路本地单播和多播在Thread设备之间传输。
MLE消息用于识别、配置和保护与相邻设备的链接,因为拓扑和物理环境会发生变化。MLE还用于分发在整个Thread网络中共享的配置值,例如频道和个人区域网络ID(PAN ID)。这些消息按照低功耗和有损网络的多播协议(MPL)[RFC 7731]的规定进行控制泛洪转发。
MLE消息还确保在两个设备之间建立路由成本时考虑非对称链路成本。非对称链路质量在IEEE 802.15.4网络中很常见。为了确保双向消息可靠,Thread设备考虑双向链路质量。
路由发现和修复
Thread使用一种主动的距离矢量路由协议在路由器之间建立路由。按需(或反应式)路由发现通常用于低功耗IEEE 802.15.4网状网络。然而,由于路由发现请求泛滥整个网络,按需路由发现在网络开销和带宽方面是昂贵的。
在Thread网络中,所有路由器定期交换包含所有相邻路由器的链路质量和链路成本信息的单跳MLE广告数据包,以及Thread网络中所有其他路由器的路径成本信息。通过这些定期的本地更新,所有路由器都具有到Thread网络中任何其他路由器的最新路由成本信息。如果一条路由不再可用,路由器会选择下一个最合适的路由到达目的地。这种自我修复的路由机制允许路由器快速检测其他路由器何时已从Thread网络断开连接,并计算保持与Thread网络中所有其他设备连接的最佳路由。
每个方向上的链路质量基于来自相邻设备的传入消息的链路余量。这个传入链路余量被映射为0到3之间的链路质量值。值为0表示未知或无限成本。链路余量是接收到的消息的接收信号强度指示器(RSSI)减去无线电噪声底噪的dBm值。然后可以将链路质量值映射到链路成本上以用于路由成本计算。下表总结了链路质量和链路成本。
Thread网络中任何其他节点的路径成本是到达该节点的最小链路成本之和。路由器会监控这些成本,随着无线电链路质量或网络拓扑的变化,通过定期的MLE广告消息传播新的成本信息。
为了说明一个简化的例子,假设有一个预配置的网络,其中所有设备同时加电并共享安全材料。每个路由器都会定期发送一个最初只包含到单跳邻居的成本的广告。内部地,每个路由器都会存储下一跳信息,该信息不会在广告中发送。
最初的几份广告将具有等于链路成本的路径成本,因为已知的唯一路由器是直接邻居。但是,当路由器开始从它们的邻居那里听到包含两跳或更多跳之外的其他路由器的成本的广告时,它们的表将填充多跳路径成本,然后进一步传播,直到最终在所有路由器之间存在连接信息。
路由到子设备是通过查看子设备的RLOC16地址的高位数来确定父路由器地址的。一旦设备知道父路由器,它就具有该目标设备的路径成本信息和下一跳路由信息。
转发
设备使用IP路由来转发数据包。设备的路由表使用压缩形式的每个路由器的网状本地地址和适当的下一跳进行填充。在Thread网络上转发时,RLOC16地址的上6位定义了目的地路由器的地址。如果目的地地址的低位为0,则该路由器是最终目的地。否则,目的地路由器负责将数据包转发给最终目的地,即基于RLOC16目的地地址的低位9位的一个子节点。对于Thread网络之外的转发,使用边界路由器。每个边界路由器通知领导者它所服务的特定IPv6前缀,并将此信息作为Thread网络数据通过MLE消息分发。Thread网络数据包括前缀数据(包括前缀本身)、每个前缀的6LoWPAN上下文、每个前缀的服务边界路由器以及可选的前缀的DHCPv6服务器或DNS信息。如果设备要使用该前缀配置IPv6地址,它可以使用SLAAC(无状态地址自动配置)或联系适当的DHCPv6服务器来完成此操作。Thread网络数据还包含用于将数据包路由到离网目的地的边界路由器的RLOC地址列表。
4.4 重试和确认
虽然UDP消息传递在Thread规范中用于所有网格建立和维护通信,但可靠的消息传递仍然是必需的。这是通过以下一系列轻量级机制实现的:
- MAC层重试:每个设备使用IEEE 802.15.4从下一跳接收到的MAC确认,并在MAC层未收到MAC确认的情况下重试消息。
- 应用层重试:应用层可以确定消息可靠性是否是一个关键参数,并在必要时实现自己的重试机制。Thread使用MLE和CoAP来维护Thread网络,两者都提供了它们自己的可靠性机制。
5 新设备添加Thread网络
一个新设备在参与Thread网络之前必须经历三个阶段:
- 发现(Discovery)
- 配置(Commissioning)
- 连接(Attaching)
一旦连接上,设备就可以完全参与到Thread网络中,并与网络内外的其他设备和服务交换应用层信息。
5.1 发现(Discovery)
在Thread设备能够参与Thread网络之前,它必须先发现并与一个加入者路由器建立联系以进行配置。加入设备会遍历所有通道,在每个通道上发出MLE发现请求,并等待MLE发现响应。发现响应包含一个有效载荷,其中包括网络名称和导向数据,以引导设备加入预期的Thread网络。一旦设备发现了Thread网络,它会使用一个链接本地通道连接到加入者路由器,与配置应用程序建立连接并进行配置。
发现和配置仅适用于Thread设备首次连接到Thread网络的情况。每个Thread设备都会将网络凭据存储在非易失性存储器中,以便后续连接使用。
5.2 配置(Commissioning)
Thread配置是验证新设备并向其提供网络凭据的过程。为此,在加入的Thread设备和智能手机、平板电脑或网页上的配置应用程序之间建立一个经过身份验证的DTLS会话。此会话用于安全地验证加入者。如果此过程成功,则加入者路由器安全地向加入者提供Thread网络凭据,以便它可以连接到Thread网络。
5.3 连接(Attaching)
具有网络凭据的分离的Thread设备将定期尝试通过多播MLE父请求连接到Thread网络附近的路由器和REEDs。如果需要,REED将在听到父请求时升级为支持新连接的Thread设备的路由角色。正在连接的Thread设备和Thread路由器然后使用MLE消息来配置安全链接并提供IPv6地址。Thread设备始终作为终端设备连接,并且可以通过向领导者请求路由器ID稍后升级为路由器。这个连接过程如图所示。
5.4 MLE消息
一旦设备连接到Thread网络,它需要某些信息来保持其参与网络。MLE提供服务以在整个网络中分发网络数据,并在邻居之间交换链路成本和安全帧计数器。MLE消息分发或交换以下信息:
- 相邻设备的16位短地址和64位扩展地址
- 设备能力信息,包括是否为睡眠终端设备以及睡眠主机设备的睡眠周期
- 邻居链路质量和链路成本(如果是路由器)
- 设备之间的安全材料和帧计数器
- 到Thread网络中所有其他路由器的路由成本
- 对操作数据集(如通道或PAN ID)的更新
注意:MLE消息在加入设备获得所需网络凭据之前的发现过程中是加密的。然而,敏感的安全消息(如密钥)永远不会在未加密的MLE消息中明文发送。
网络管理
6.1 ICMPv6
Thread设备支持ICMPv6错误消息处理,以及ICMPv6回显请求(ping)和回显回复消息。
6.2 设备管理和诊断
设备管理和诊断 Thread设备的应用层可以访问一组设备管理和诊断信息,这些信息可以本地使用或收集并发送到其他管理设备。一个委托应用程序也可以从Thread设备请求这些信息。
Thread从IEEE 802.15.4 MAC层使用的信息包括:
- 64位扩展地址
- 16位短地址
- 能力信息
- PAN ID
- 发送和接收的数据包
- 在发送或接收时丢弃的数据包
- 安全错误
MAC重试次数 Thread从网络层使用的信息包括:
- IPv6地址列表
- 邻居表
- 子表
- 路由表