×

Thread协议栈基础

96
公子小水
2017.06.19 12:01* 字数 6278

原文:Thread Stack Fundamentals

介绍

一般特点

Thread协议栈是可靠,经济高效,低功耗,无线D2D(设备到设备)通信的开放标准。它是专为连接家庭应用而设计的,其中需要基于IP的网络,并且可以在协议栈中使用各种应用层。

这些是Thread协议栈和网络的一般特性:

  • 简单的网络安装,启动和运行:用于形成,加入和维护Thread网络的简单协议允许系统自动配置和修复路由问题。
  • 安全:除非被授权且所有通信是加密和安全的,否则设备不被加入Thread网络。
  • 小型和大型网络:家庭网络从几个设备到数百个设备无缝通信。网络层被设计为基于预期的使用来优化网络操作(optimize the network operation based on the expected use)。
  • 范围:与网格网络(Mesh Networks)结合的典型设备,提供足够的范围来覆盖正常的家庭。物理层采用扩频技术,提供良好的抗干扰能力。
  • 无单点故障:即使在单个设备发生故障或丢失的情况下,协议栈也可以提供安全可靠的操作。
  • 低功耗:主机设备通常可以使用合适的占空比在AA型电池上运行数年。

图1显示了Thread协议栈的概述。

图1 Thread栈概述

IEEE 802.15.4

该标准基于在2.4GHz频带中以250kbps运行的IEEE 802.15.4 [IEEE802154] PHY(物理层)和MAC(媒体访问控制层)。该规范的IEEE 802.15.4-2006版本用于Thread协议栈。

802.15.4 MAC层用于基本的消息处理和拥塞控制。该MAC层包括设备用于监听干净信道的CSMA(Carrier Sense Multiple Access,载波侦听多路访问)机制,以及用于处理重试和确认消息的链路层以用于相邻设备之间的可靠通信。基于由软件协议栈的较高层建立和配置的密钥,被MAC层用于对消息的加密和完整性保护。网络层建立在这些基础机制上,以在网络中提供可靠的端对端通信。

没有单点故障

在由运行Thread协议栈的设备组成的系统中,这些设备都不代表单点故障。虽然系统中有许多设备执行特殊功能,但是Thread协议栈的设计使得它们可以被替换,而不会影响Thread网络中正在进行的通信。例如,一个常眠的子设备需要一个父设备进行通信,因此这个父设备代表它的通信失败单点。但是,如果常眠设备的父设备不可用,常眠设备可以并将会选择另一个父设备,因此该转换不应该对用户可见。

虽然系统设计用于没有单点故障,但在某些拓扑结构下,将存在没有备份功能的单个设备。例如,在具有单个网关的系统中,如果网关断电,则无法切换到另一个网关。

路由器或边界路由器可以为Thread网络中的某些功能承担Leader角色。这个Leader需要在网络内作出决定。例如,Leader分配路由器地址并允许新的路由器请求。Leader角色是被选举的,如果Leader失败,会由另一个路由器或边界路由器承担Leader角色。正是这种自主操作确保没有单点故障。

设备类型

边界路由器(Border Routers)

边界路由器是一种特定类型的路由器,提供从802.15.4网络到其他物理层(例如,Wi-Fi和以太网)上的相邻网络的连接。边界路由器为802.15.4网络中的设备提供服务,包括用于离网操作(off-network operations)的路由服务。Thread网络中可能有一个或多个边界路由器。

路由器(Routers)

路由器为网络设备提供路由服务。路由器还为尝试加入网络的设备提供加入和安全服务。路由器是设计为不休眠的。路由器可以降级其功能并成为REED(Router-eligible End Devices,符合路由器的终端设备)。

符合路由器的终端设备(Router-eligible End Devices)

REED有能力成为路由器,但是由于网络拓扑或条件,这些设备不作为路由器工作。这些设备通常不转发消息或为Thread网络中的其他设备提供加入或安全服务。如果需要,Thread网络管理REED成为路由器,且无需用户交互。

常眠终端设备(Sleepy End Devices)

常眠终端设备是主机设备。他们只通过他们的父路由器进行通信,不能转发其他设备的消息。

IP协议栈基础

寻址

Thread协议栈中的设备支持[RFC 4291]中指定的IPv6寻址架构。设备配置1个或多个ULA(Unique Local Address,唯一本地地址)或GUA(Global Unicast Address,全局单播地址)地址。

启动网络的设备选择一个/64前缀,然后在整个Thread网络中使用。该前缀是本地分配的全局ID(Locally Assigned Global ID),通常称为ULA前缀[RFC 4193],可以称为网格本地ULA前缀(mesh local ULA prefix)。Thread网络还可以具有一个或多个边界路由器,每个边界路由器可以具有或可以不具有可以用于生成附加GUA的前缀。Thread网络中的设备使用其扩展MAC地址(Extended MAC address)来导出其[RFC 4944]第6节中定义的接口标识符(interface identifier),并且基于此,通过已知的本地前缀FE80 :: 0/64配置链路本地IPv6地址,如[RFC 4862]和[RFC 4944]所述。

设备还支持适当的多播地址(multicast addresses)。这包括链路本地所有节点组播(link-local all node multicast),链路本地全路由器组播(link-local all-router multicast)和区域本地组播(realm-local multicast)。

加入Thread网络的每个设备都将分配一个16位短地址,如[IEEE 802.15.4]中所规定。对于路由器,该地址使用地址字段中的较高位分配,低位设置为0,表示路由器地址。然后,对于子设备使用其父设备的高位和适当的低位来为其地址分配一个16位的短地址。这允许Thread网络中的任何其他设备通过使用其地址字段的高位来了解子设备的路由位置。

图2说明了Thread短地址。

图2 Thread短地址

6LoWPAN

所有设备使用[RFC 4944]和[RFC 6282]中定义的6LoWPAN。

在Thread网络中使用头部压缩(Header compression),设备传输消息尽可能多地压缩IPv6报头,以最小化发送的数据包的大小。

支持网格包头(mesh header),用于更有效地压缩网格内的消息,以及针对如“路由和网络连接”部分中所述的链路层转发(link layer forwarding)。网格标头(mesh header)还允许消息的端到端分段(end-to-end fragmentation),而不是[RFC 4944]中指定的逐跳分段(hop by hop fragmentation)。Thread协议栈使用路由选择配置(route-over configuration)。

这些设备不支持[RFC 6775]中规定的邻居发现(neighbor discovery),因为DHCPv6用于向路由器分配地址。终端设备和REED由他们的路由器父节点分配短地址。然后,该短地址用于配置用于网络内通信的网格(Mesh)本地ULA。

有关6LoWPAN使用和配置的更多详细信息,请参见“6LoWPAN的Thread用法(Thread Usage of 6LoWPAN)”白皮书。Thread规范的第3章详细说明了使用的具体6LoWPAN配置。

ICMP

设备支持ICMPv6(Internet Control Message Protocol version 6,Internet控制消息协议版本6)协议[RFC 4443]和ICMPv6错误消息,以及回显请求(echo request)和回显回复消息(echo reply messages)。

UDP

Thread协议栈支持在[RFC 768]中定义的UDP(用户数据报协议),用于设备之间的消息传递。

网络拓扑

网络地址和设备

Thread协议栈支持Thread网络中所有路由器之间的全网格连接(full mesh connectivity)。

实际拓扑基于Thread网络中路由器的数量。如果只有一个路由器或边界路由器,则形成具有单个路由器的基本星形拓扑。如果有多个路由器,则自动形成网格(Mesh)拓扑。图3说明了Thread网络的基本拓扑结构和设备类型。

图3 基本Thread网络拓扑和设备

网格网络(Mesh Networks)

网格网络(Mesh Networks)通过允许射频转发其他射频的消息,使射频系统更可靠。例如,如果节点不能直接向另一个节点发送消息,则网格网络(Mesh Networks)通过一个或多个中间节点转发消息。如“路由和网络连接”一节中所讨论的,Thread网络的性质使得所有路由器节点彼此之间保持路由和连接,因此网格不断维护和连接。Thread网络中通常有最多32个活动路由器的限制。但是,64个路由器地址用于允许回收路由器地址。

在网格网络(Mesh Networks)中,常眠终端设备或REED不会为其他设备路由。这些设备将消息发送到作为路由器的父设备。该父路由器处理其子设备的路由操作。

路由和网络连接(Routing and Network Connectivity)

Thread网络通常最多有32个活动路由器,它们使用基于设备路由表的消息的下一跳路由(next-hop routing)。设备路由表由协议栈维护,以确保所有路由器都具有Thread网络中任何其他路由器的连接和最新路径。使用RIP(Routing Information Protocol,路由信息协议)算法(来自[RFC 1058]和[RFC 2080]的算法,但不采用其特定的消息格式)。所有路由器与其他路由器使用MLE(Mesh Link Establishment),以压缩格式交换其到Thread网络中的其他路由器的路由成本(cost of routing)。

注意:从IP的角度来看,Thread网络支持路由器和主机。主机是常眠终端设备或REED。

MLE消息(MLE Messages)

MLE消息(请参阅“Thread规范”第4章“消息链路建立(Message Link Establishment)” 中针对Thread进行的扩展[draft-kelsey-intarea-mesh-link-establishment-06]) 用于建立和配置安全射频链路,检测邻近设备,以及维护Thread网络中设备之间的路由成本。使用单跳链路本地单播(single-hop link local unicasts)和路由器之间多播(multicasts between Routers)来传输MLE消息。

随着拓扑和物理环境的变化,MLE消息用于识别,配置和保护邻近设备的链路。MLE还用于分发跨Thread网络共享的配置值,如通道(channel)和PAN(Personal Area Network,个人区域网络)ID。这些消息可以由MPL(Multicast Protocol for Low power and Lossy Networks,低功耗和有损网络的多播协议)指定的简单洪泛转发(forwarded with simple flooding)。(有关详细信息,请参阅[draft-ietf-roll-trickle-mcast-09])。

在建立两个设备之间的路由成本时,MLE消息还确保考虑了非对称链路成本(asymmetric link costs)。802.15.4网络中的非对称链路成本(asymmetric link costs)很常见。为了确保双向通信是可靠的,考虑双向链路的成本是很重要的。

路线发现和修复

按需路由发现(On-demand route discovery)通常用于低功耗802.15.4网络。然而,由于路由发现请求洪泛网络(route discovery requests flooding the network),按需路由发现(on-demand route discovery)在网络开销和带宽方面是昂贵的。

在Thread网络中,所有路由器定期交换包含到所有邻居路由器链路成本信息(link cost information to all neighbor Routers)的单跳MLE广告包(single-hop MLE advertisement packets),以及到Thread网络中所有其他路由器的路径开销(path costs to all other Routers)。通过这些定期的本地更新,所有路由器都具有Thread网络中任何其他路由器的最新路径开销信息,因此不需要按需路由发现。如果路由不再可用,路由器可以在到达目的地的下一个最合适的路由上进行选择。这种自愈路由机制允许路由器快速检测其他路由器是否已经脱离Thread网络,并计算最佳路径以维护与Thread网络中所有其他设备的连接。

每个方向的链路质量(link quality in each direction)基于来自该邻近设备的传入消息的链路成本(link cost on incoming messages from that neighboring device)。此传入链路成本(incoming link cost)映射到从0到3的链路质量(link quality)。值为0表示未知成本。链路成本(link cost is a measure of RSSI)是接收到的消息高于接收等级的RSSI(接收信号强度指示)的度量。

表1总结了链路质量和链路成本。

表1 链路质量和链路成本

图4示出了Thread网络上的各种链路成本的示例。

图4 Thread网络上各种链路成本的示例

Thread网络中任何其他节点的路径开销就是到达该节点的链路成本的最小值。路由器监控这些成本,即使网络的射频链路质量或拓扑变化,并通过使用周期性MLE广告消息在Thread网络传播新的成本。路由成本基于两个设备之间的双向链路质量。

为了说明一个简化的例子,想象一下预先委托的网络(pre-commissioned network),其中共享安全材料,所有的设备同时启动。每个路由器将周期性地发送初始填充的到单跳邻居成本的广告。在内部,每个路由器将存储未在广告中发送的下一跳信息(next hop information)。

前几个广告的路径成本等于链路成本,因为已知的唯一路由器是立即邻居,如图5所示。

图5 上电后形成Thread网络

但是,随着路由器开始收听来自邻居的广告,其中包含两跳或更多跳的其他路由器的成本,它们的表填充了多跳路径成本,然后传播得更远,直到最终在所有路由器之间存在如图6和图7所示的连接信息网络。

图6 Thread网络形成:路由广告
图7 Thread网络形成:多跳

当路由器从邻居接收到新的MLE广告时,它或者已经具有该设备的邻居表项,或者添加一个。MLE广告包含来自邻居的进入成本(incoming cost from the neighbor),因此在路由器的邻居表中更新(updated in the Router’s neighbor table)。MLE广告还包含其他路由器的更新的路由信息​​(updated routing information for other Routers),并且该信息在设备路由表中更新(updated in the device routing table)。

通过查看子设备的地址的高位来确定父路由器地址(Parent Router address),可以实现到子设备的路由。一旦设备知道父路由器,它就具有该设备的路径开销信息和下一跳路由信息(path cost information and next-hop routing information)。

活动路由器的数量仅限于可以包含在单个802.15.4数据包中的路由和成本信息的数量。此限制目前为32个路由器,但提供了64个活动路由器地址以允许老化掉路由器地址(aging out of Router addresses)。

路由

设备使用IP路由转发数据包(IP routing to forward packets)。设备路由表(device routing table)填充有路由器的网格本地ULA地址的压缩形式和适当的下一跳(compressed form of a mesh local ULA address for Routers and the appropriate next hop)。

距离向量路由(Distance vector routing)用于获取到Thread网络上路由器地址的路由(get routes to Router addresses)。当在Thread网络上进行路由时,该16位地址的高6位定义了目标路由器的路由器地址。如果目的地址的低位为0,则路由器为最终目的地址。否则,目的路由器负责根据16位目的地址的较低位转发到最终目的地。

对于超出Thread网络的路由,边界路由器通知Leader其所服务的特定前缀(particular prefix(es) it serves),并且该信息作为MLE数据包中的Thread网络数据分发(distributed as Thread Network data within the MLE packets)。Thread网络数据包括:前缀数据(prefix data),它是前缀本身,6LoWPAN上下文(6LoWPAN context),边界路由器(Border Routers)和该前缀的DHCPv6服务器(DHCPv6 server for that prefix)。如果设备要使用该前缀配置IPv6地址,则使用SLAAC(Stateless Address Autoconfiguration,无状态地址自动配置)或联系相应的DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)服务器。Thread网络数据还包括路由服务器列表(a list of routing servers),它们是默认的边界路由器的路由器地址。

Leader被指定做出决策,选择REED成为路由器或允许路由器降级为REED。Leader也分配和管理路由器地址。然而,此路由Leader中包含的所有信息都存在于其他路由器中,并且如果路由Leader变得无法访问,则另一个路由器将自主被选择并作为Leader接管,而无需用户干预。

重试和应答

虽然在Thread协议栈中使用UDP消息传递,但仍然需要可靠的消息传递。这是使用一系列轻量级机制完成的,如下所示:

  • MAC级别重试:每个设备使用下一跳的MAC确认,并且如果未收到MAC ACK消息,则将在MAC层重试一条消息。
  • 应用程序级别重试:应用程序级别可以确定消息可靠性是否是关键参数,并且可以在必要时实现自己的重试机制。

加入Thread网络

加入设备(joining device)必须经历各个阶段才能参与Thread网络:

  • 发现(Discovery)
  • 调试(Commissioning)
  • 附加(Attaching)

所有加入都是Thread网络中用户启动的。一旦加入,设备就可以完全参与Thread网络,并可以与Thread网络内外的其他设备和服务交换应用层信息。

发现(Discovery)

加入设备(joining device)必须发现Thread网络,并与路由器建立联系(establish contact with a Router)以进行调试(commissioning)。加入设备扫描所有信道(scans all channels),在每个信道上发出信标请求(issues a beacon request),并等待信标响应(waits for beacon responses)。信标包含一个有效载荷,包括网络SSID(Service Set Identifier,服务集标识符)和允许加入信标的许可证(a permit joining beacon),指示Thread网络是否正在接受新的成员。一旦设备发现Thread网络,它将使用MLE消息来建立一个相邻的路由器(establish a neighboring Router),通过它可以执行调试(perform commissioning)。

如果设备已经获得了调试信息(obtained commissioning information),因为它已经有足够的信息直接附加到Thread网络,则不需要发现。

调试

Thread提供两种调试方法:

  • 使用带外方法将调试信息(commissioning information)直接配置到设备上。调试信息(commissioning information)允许加入设备在引入网络后立即附加到适当的Thread网络。
  • 在智能手机,平板电脑或网络上的加盟设备和调试应用程序(commissioning application)之间建立调试会话(commissioning session)。调试会话(commissioning session)安全地向加入设备提供调试信息(commissioning information),允许在完成调试会话(commissioning session)后将其附加到正确的Thread网络。

注意:仅在通过信标有效载荷中的许可证加入标志(joining solely via the permit joining flag in the beacon payload)的典型802.15.4加入方法不在Thread网络中使用。这种方法最常用于没有用户界面或到设备的带外频道的按钮类型加入(push button type joining)。在有多个网络可用的情况下,该方法可能存在设备转向(device steering)问题,并且也可能存在安全问题。

附加

具有调试信息(commissioning information)的加入设备(joining device)与父路由器联系,然后通过父路由器交换MLE链路配置消息(exchanging MLE link configuration messages)附加到Thread网络。设备作为终端设备(end device)或REED附加到Thread网络,并由父路由器分配16位短地址,如图8所示。

图8 附加到已知密钥的Thread网络

一旦REED已经附加到Thread网络,它可能会发出一个地址请求(issue an address request)成为一个路由器,然后由Leader分配一个路由器地址。

MLE消息

一旦设备连接到Thread网络,就需要有各种各样的信息来保持其在网络中的参与。MLE提供服务以在整个网络中分发网络数据,并在邻居之间交换链路成本(link costs)和安全帧计数器(security frame counters)。

MLE消息分发或交换以下信息:

  • 相邻设备的16位短地址和64位EUI 64长地址
  • 设备功能信息,包括是否是一个常眠的终端设备(sleepy end device)和常眠主机设备的常眠周期(sleep cycle of the sleepy host device)
  • 邻居链路成本(如果是路由器)
  • 设备之间的安全材料和帧计数器(Security material and frame counters )
  • Thread网络中到所有其他路由器的路由成本(Routing costs)
  • 更新MAC中使用的信道,PAN ID和信标有效载荷 (channel, PAN ID, and the beacon payload parameter)等网络数据

注意:MLE消息是被加密的,除非是在发现时,加入设备获得所需的安全资料过程中。

DHCPv6

DHCPv6 [RFC 3315]是一种基于UDP的客户端 - 服务器协议,用于管理网络中设备的配置。DHCPv6使用UDP从DHCP服务器请求数据。

边界路由器上的DHCPv6服务用于配置:

  • 网络地址(Network addresses)
  • 设备所需的组播地址(Multicast addresses)
  • 主机名服务(Hostname services)

管理

ICMP

所有设备都支持ICMPv6错误消息,以及回显请求( echo request)和回显回应消息( echo reply messages)。

设备管理

设备上的应用层可以访问一组设备管理和诊断信息,这些信息可以在本地使用或收集并发送到其他管理设备。

Thread协议栈从802.15.4 MAC层使用的信息包括:

  • EUI 64地址
  • 16位短地址
  • 能力信息(Capability information)
  • PAN ID
  • 发送和接收的数据包
  • 发送或接收数据包丢失
  • 安全错误
  • MAC重试次数(Number of MAC retries)

Thread协议栈从网络层使用的信息包括:

  • IPv6地址丢失(IPv6 address lost)
  • 邻居表(Neighbor table)
  • 子设备表(Child table)
  • 路由表(Routing table)

持久数据

由于各种原因,在现场操作的设备可能会意外重置或故障重置。已重置的设备需要重新启动网络操作,无需用户干预。为此,需要将一组信息存储在非易失性存储中。这包括:

  • 网络信息,如PAN ID
  • 安全材料(Security material )(使用的每个秘钥key)
  • 来自网络的寻址信息以形成设备的IPv6地址
无线连接技术
Web note ad 1