3. Thread协议核心机制
Thread并不是一个从零发明的无线协议,而是把几项已经成熟的标准化技术“叠”成一套可用的低功耗Mesh网络。理解Thread,关键是理解它的分层结构:最底层用IEEE 802.15.4提供物理层和MAC层,中间用6LoWPAN把IPv6报文压缩后塞进802.15.4的小帧里,上层用IPv6和UDP承载应用数据,再由Thread自己定义的Mesh链路、路由和边界路由器机制把整个网络组织起来。下面按“从下往上”的顺序拆解这套机制。
IEEE 802.15.4:物理层与MAC层的基础
IEEE 802.15.4是Thread的无线底座。它工作在2.4 GHz频段(Thread也支持Sub-GHz,但2.4 GHz最常见),共16个信道,信道11~26,每个信道带宽2 MHz,采用OQPSK调制和DSSS扩频。802.15.4的帧结构很小:最大物理层帧127字节,去掉MAC层头、FCS等开销后,真正能承载上层数据的有效载荷通常只有约80~110字节。这个“小帧”特性是后面必须引入6LoWPAN压缩的根本原因。
在MAC层,802.15.4提供两种地址:16位短地址和64位扩展地址(EUI-64)。Thread设备通常使用16位短地址进行日常通信,以节省帧空间;64位地址用于设备身份标识。802.15.4还提供CSMA/CA信道接入、确认帧(ACK)和重传机制,保证单跳链路的可靠性。但要注意:802.15.4本身只负责“一跳”的传输,它不提供路由,也不提供端到端可靠性——这些由Thread的上层机制完成。
6LoWPAN:把IPv6压进小帧
IPv6报文头固定40字节,加上UDP头8字节,已经48字节。如果直接放进802.15.4的约100字节有效载荷里,应用数据只剩一半,效率极低。6LoWPAN(IPv6 over Low-Power Wireless Personal Area Networks,RFC 4944/6282)就是为解决这个矛盾而设计的适配层。
6LoWPAN的核心是头部压缩。它利用Thread网络中地址和前缀的规律性,把IPv6的40字节头压缩到通常只有几字节。例如,当源和目的地址都可以从链路层地址推导出来时,IPv6头中的地址字段可以完全省略;流量类别、跳数限制等字段也可以压缩或省略。压缩后,一个典型的IPv6/UDP报文头可能只剩6~8字节,留给应用数据的空间大幅增加。
6LoWPAN还负责分片与重组。当IPv6报文超过单帧容量时,6LoWPAN把它切成多个802.15.4帧发送,接收端再重组。此外,6LoWPAN定义了邻居发现和组播映射机制,使IPv6的ND(Neighbor Discovery)能在低功耗链路上高效运行。可以说,没有6LoWPAN,IPv6就无法在802.15.4上实用化。
IPv6:Thread的“通用语言”
Thread选择IPv6作为网络层协议,这是它区别于许多私有物联网协议的关键。每个Thread节点都拥有一个或多个IPv6地址,包括链路本地地址(fe80::/10)和由边界路由器分配的全局/唯一本地地址(ULA或GUA)。这意味着Thread网络中的设备可以直接与IP网络中的其他设备通信,不需要应用层网关做协议转换。
Thread定义了三种IPv6地址类型:链路本地地址(Link-Local,基于EUI-64或短地址生成,仅在本链路有效)、Mesh-Local地址(基于Mesh-Local前缀,在Thread网络内可路由)和全局地址(由边界路由器分配的前缀生成,可访问外部网络)。Mesh-Local地址是Thread内部路由的基础,它使用一个固定的前缀fd00::/8下的特定子前缀,配合RLOC(Routing Locator)形成可路由地址。
RLOC是Thread路由机制的核心概念。每个Router和边界路由器都有一个RLOC16(16位),它由Router ID和Child ID组成。Mesh-Local地址的低64位中嵌入了RLOC16,因此从IPv6地址就能推导出目的节点在Mesh中的位置。这种“地址即位置”的设计,使Thread可以用非常轻量的方式做路由决策。
Mesh链路与低功耗路由原理
Thread网络中的设备分为几种角色:边界路由器(Border Router)、Router、REED(Router-Eligible End Device)、SED(Sleepy End Device)和FED(Full End Device)。Router组成Mesh骨干,负责转发和路由;SED大部分时间休眠,只定期唤醒向父节点轮询数据;REED可以在需要时升级为Router,保持网络的自适应性。
Thread的路由机制建立在“距离矢量”思想之上,但做了低功耗优化。每个Router维护一张路由表,记录到其他Router的下一跳和路径代价。路由信息通过MLE(Mesh Link Establishment)协议和地址注册机制传播。当网络拓扑变化时,Router会重新计算路径,SED则不需要参与路由计算,只需保持与父节点的连接。
低功耗的关键在于SED的通信模式。SED不能一直监听信道,它通过“轮询”机制工作:SED定期向父节点发送数据请求(Data Poll),父节点如果有缓存的数据就下发,没有则回复空。SED的休眠周期可以配置,典型值从几百毫秒到几秒不等。轮询间隔越长,功耗越低,但下行延迟越大。工程上需要根据应用场景在功耗和实时性之间做权衡。
下面这张图展示了Thread协议栈的分层结构,以及一个数据包从应用层到物理层、再经过Mesh转发到达目的节点的完整路径。图中同时标出了各层的关键封装对象和典型开销,帮助理解“IPv6如何被压缩进802.15.4小帧”以及“RLOC如何参与路由”。
关键参数与工程权衡
在实际部署Thread网络时,有几个参数直接影响网络行为和功耗表现。下面这张表整理了常见参数及其典型取值,供工程配置时参考。需要说明的是,这些取值属于行业常见范围,具体项目应根据现场环境和设备能力调整。
| 参数 | 典型取值 | 影响 |
|---|---|---|
| 信道 | 11~26(2.4GHz) | 需避开Wi-Fi拥塞信道,建议用15、20、25等 |
| PAN ID | 0x0001~0xFFFE | 同一区域多个Thread网络需不同PAN ID |
| 网络密钥 | 128位 | 所有节点必须一致,由 commissioner 分发 |
| SED轮询周期 | 200ms~5s | 周期越长功耗越低,下行延迟越大 |
| Router升级阈值 | 通常≥2个Router邻居 | REED在邻居不足时升级,保持Mesh连通性 |
| 最大跳数 | 默认16跳 | 限制网络直径,避免过大路由表 |
从数据包视角看一次完整通信
假设一个SED温度传感器要向外部服务器上报数据。应用层生成一个CoAP POST报文,载荷约20字节。UDP头8字节,IPv6头40字节,合计68字节。6LoWPAN压缩后,IPv6/UDP头可能压缩到8字节左右,加上CoAP头和载荷,总长约40字节,可以轻松放入一个802.15.4帧。SED唤醒后,向父节点Router A发送数据请求,Router A将数据帧转发给Router B,Router B再转发给边界路由器。边界路由器把6LoWPAN解压还原为完整IPv6报文,通过以太网或Wi-Fi发送到外部服务器。整个过程SED只参与第一跳,后续转发由Router完成,SED可以迅速回到休眠状态。
总结来说,Thread的核心机制可以概括为:用802.15.4做无线底座,用6LoWPAN解决IPv6与小帧的矛盾,用IPv6和RLOC实现可路由的Mesh寻址,用Router/SED角色划分和轮询机制实现低功耗。理解这四层的关系,就理解了Thread为什么能在低功耗条件下支持IP端到端通信,也理解了工程配置中哪些参数真正影响网络行为。