[译] Rime: 传感器网络中的轻量级分层通信栈

摘要

  在早期的传感器网络的研究过程中,人们发现传统的分层通信架构具有太多的局限性,因此提出了跨层优化。不过,在最近的研究工组中,人们又发现跨层优化过于复杂,可能导致系统很脆弱或者难以管理。在此条件下,我们开发了Rime。Rime是用于传感器网络的分层通信协议栈,比传统架构的分层更精细。我们设计Rime的初衷是简化协议的实现过程。经过初步评估证明,只需要增加一点点资源,就能显著地简化传感器网络中协议实现的复杂性。这表明,即使在传感器网络中,使用分层协议栈也是可取的。

介绍

  在早期的传感器网络的研究过程中,人们发现传统的分层通信架构具有太多的局限性,因此提出了跨层优化。具体来说,在底层实现上层优化。但是最近的研究工作中,人们又发现跨层优化过于复杂,导致系统脆弱、难以管理。相反,一个更加传统的分层架构被提出来了,且其效率也跨层架构相近。这也使得我们再次将精力投入到分层通信抽象中。
  本论文重点是介绍Rime——一个为传感器网络设计的轻量级分层通信协议栈。Rime不同于传统分层架构,比如因特网架构,Rime的每一层很(即Rime是轻量级的)。Rime的代码量小于2kb,内存需求大约为几十个字节。
  Rime的目的是简化传感器网络协议的实现,以及促进代码的重用。我们已经在Contiki中实现Rime协议[3],并经过初步评估证明,Rime在只需要增加一点点资源的情况下就能显著地简化协议的实现难度。
  Rime设计得比已经存在的传感器网络模块化通信抽象协议都更加简单。Rime不是一个完全模块化架构,即不允许所有的模块被替换,而仅仅运行最底层和应用层被替换。

![这里写图片描述](http://img.blog.csdn.net/20160521065223365)

图1. 当前的Rime栈。可以添加更多的协议和层

Rime

  Rime的分层结构如图1所示。就接口和实现而言,Rime的各层都极其简单。发出消息时,每一层都添加本层头部。由于Rime的各层都很简单,因此各层头部也很小,一般都是几个字节。
  由于Rime各层都很薄,这就使得在堆栈内部重用代码变得可能。例如,可靠可信不是由一层实现的,而是被划分为两次。一层实现消息确认和定序,另一层负不停地重发消息,直到上层告诉它停止。我们将后面那一层叫做“顽固层”(stubborn)。顽固层不仅被用于可靠协议,还用于那些需要发送周期性消息的协议,比如路由协议中的邻居维护、需要反复传输的Rime洪泛路由层。图2展示了如何通过Rime的顽固层广播,sibc,可靠单播,ruc实现的逐跳可靠数据采集协议。
  Rime的最底层是匿名广播abc(anonymous broadcast)。abc层提供了一个16bit的抽象通道,但是不对节点编址(编址由上层协议完成)。被标识广播ibc(identity broadcast)添加了一个发送标识头字段。单播uc(unicast)添加了一个结束头字段。
  潜在的MAC或者链路层可以选择在硬件或者固件张实现Rime栈的一部分,比如abc,ibc或者uc。
  

  
图2. 利用Rime实现的逐跳可靠数据采集协议

A.将重担从应用程序转移到系统内核
  Rime的一个基本功能是将重担从协议实现转移到Rime。通过将Rime作为Contiki系统内核的一部分(系统内核总是存在内存中),可加载程序就可以变得更小。因此,加载程序[2]所消耗的能量就更少了。
B.缓冲管理
  为了减小内存占用,Rime与uIP类似,接收包和发送包使用同一个buffer。各层(比如顽固协议、MAC层)需要就数据排队,并拷贝数据到动态分配的队列buffer中。

初步评估

A.内存占用

  单个Rime模块的代码内存占用是很少的。当前最小的模块是ibc,它只占用100字节。最大的模块时顽固层单播和可靠单播,它们占用266字节。当前Rime所有模块总占用的内存不超过2kb。当然,如果添加更多的特性,占用量肯定会增加。
  Rime中的每一层的每个连接都需要二到四个字节的内存空间。顽固层由于包含重传定时器,需要额外占用18个字节内存。不过,如果对定时器进行内存占用优化,它所占用的字节数应该更少。

B.逐跳可靠数据采集路由协议

  为了评估Rime,我们使用Rime重新实现了Contiki的逐跳可靠数据采集路由协议Treeroute。我们对比了两者所占用的代码行数以及内存占用量,发现Rime能够显著简化传感器网络的协议实现。
  在这个初步评估中,Treeroute的重新实现没有完全遵循已经存在的实现。已存在的实现隐式地使用确认消息,而重新实现时显示地使用确认消息。
  重新实现的结果如表1所示。统计的代码行数不包括注释。两者都使用编译器GCC 3.2.3编译。重实现的代码占用不包括Rime模块的代码占用,内存占用包括Rime模块的内存占用。从表中可以看出,程序大小明显减小了,头部有一点点增加。
  尽管重新实现数据采集协议模块的代码和内存占用都显著减小了,但是数据采集协议和Rime的代码总量比已存在的数据采集实现略大。在使用Rime的系统中,Rime模块分摊了各个模块的占用量。因此,从整体上来说,使用Rime的系统减小了整体的代码占用和内存占用。

总结

  我们的初步评估表明,Rime只需要增加一点点资源代价,就能显著简化传感器网络协议的实现。如果更周密地评估后,依然保持该结果,那么就可以证明,分层协议栈也适用于无线传感器网络。