Rime 协议栈中的协议以分层方式排列,在这种结构中使用复杂程度低的协议实现复杂程度高的协议,如图11-5显示了Rime协议栈中的通信原语以及它们的层次结构。
图11-5 Rime协议栈结构及原语
基于经典传感器网络协议中使用的机制,Rime 协议栈选择通信原语,运行在Rime 协议栈上的应用程序或协议的附加在协议栈的任何一层,并使用任意通信原语。Rime 协议栈支持单跳和多跳通信原语,多跳原语没有指定如何在网络上路由数据分组,而是当把数据分组发送到网络上时,在每个节点上调用应用程序或上层协议,选择下跳邻居节点,这使得在该多跳原语上实现任意路由协议成为可能。下面介绍这些通信原语。
1.匿名尽力而为单跳广播
匿名尽力而为单跳广播原语(Anonymous Best-effort Single-hop Broadcast,abc)是Rime 协议栈中最基本的通信原语,在Contiki 系统中程序文件abc.c 和头文件abc.h定义了该原语,这两个文件保存在core/net/rime/文件夹下。abc原语为上层提供了一种向所有本地邻居发送数据包的方法,这些邻居监听发送数据分组的信道,传输中不包含有关谁发送数据分组的信息。
所有其他的Rime原语都是基于abc原语的,但是,通常情况下,abc原语不会直接由运行于Rime 协议栈上的应用程序或协议使用,当abc 模块接收到数据分组时,模块立即将数据分组传递给上层协议。
2.识别尽力而为单跳广播
Contiki操作系统识别尽力而为单跳广播原语的定义参见程序文件broadcast.c和头文件broadcast.h,识别尽力而为单跳广播原语(Identified Best-effort Sin⁃gle-hop Broadcast,ibc)给所有本地邻居发送分组,ibc 原语将单跳发送方地址作为数据分组属性添加到输出数据分组上。直接或间接地通过基于ibc原语的任何其他通信原语,需要输出分组中的发送者身份的所有Rime 原语都会使用ibc原语。
3.尽力而为单跳单播
尽力而为单跳单播原语(uc)将数据分组发送给标识的单跳邻居,uc 原语使用ibc原语,并将单跳接收者地址属性添加到输出数据分组。对于接收到的数据分组,uc 模块检查单跳接收者的地址属性,如果地址与节点的地址不匹配,则丢弃该数据分组。core/net/rime/文件夹下的程序文件unicast.c 和头文件unicast.h定义了uc原语。
4.固执单跳单播
固执单跳单播原语(Stubborn Single-Hop Unicast,stuc)使用uc 原语重复地将分组发送给单跳邻居,stuc原语发送和重新发送数据分组直到上层原语或协议取消传输为止。虽然使用Rime 协议的应用程序和协议可以直接使用固执单跳单播原语stuc,但stuc原语主要由可靠单跳单播(ruc)原语使用。
在stuc 原语发送数据分组之前,它会分配一个队列缓存区,应用程序数据和数据分组属性被复制到该队列缓存区,并设置一个定时器。当定时器到期时,stuc 原语将队列缓存区复制到Rime 缓存区,并使用uc 原语发送数据分组,stuc 原语将数据分组的重传次数设置为输出数据分组的数据分组属性。core/net/rime/文件夹下的程序文件stunicast.c 和头文件stunicast.h 定义了stuc原语。
5可靠单跳单播
可靠单跳单播原语(Reliable Single-hop Unicast,ruc)可靠地将数据分组发送给单跳邻居,ruc 原语使用确认和重传机制确保邻居成功接收该数据分组。当接收方确认已接收到该数据分组时,ruc模块通过回调通知发送数据分组的应用程序。ruc 原语使用固执单跳单播原语进行重传,因此,ruc 原语不必管理设置定时器和进行重传的细节,而可以专注于处理确认。
ruc 原语添加两个数据分组属性:单跳数据分组类型和单跳数据分组ID。ruc原语使用分组ID属性作为序列号,用于将确认分组与相应的数据分组进行匹配。
使用ruc 原语的应用程序或协议可以指定ruc 模块在数据分组超时之前尝试最大传输次数,如果数据分组超时,则通过回调通知发送数据分组的应用程序或协议。core/net/rime/文件夹下的程序文件runicast.c 和头文件runicast.h定义了ruc原语。(www.xing528.com)
6.礼貌单跳广播
礼貌单跳广播原语(Police Single-hop Broadcast,polite) 是来自涓流(Trickle)协议的礼貌流言(polite gossip)算法的实例。礼貌流言算法旨在通过不重复其他节点已经发送的消息来减少分组传输的总量,礼貌广播原语的目的是避免在一个时间间隔期间在本地邻居区域中的指定逻辑信道上发送特定分组属性集的多个副本。
礼貌广播原语对于实现使用(例如否定确认的广播)协议是有用的,如果许多节点需要给发送者发送否定确认,那么仅有一条消息发送给发送者是足够的。
使用礼貌广播原语的上层协议或应用程序提供间隔时间、消息以及应避免多个副本的分组属性的列表,礼貌广播原语将把输出消息存储在队列缓存区中,存储分组属性列表并设置定时器值,定时器在间隔时间的后半部分设置为随机时间,如图11-6所示。
图11-6 礼貌广播原语使用的算法时间线
在时间间隔的前半部分,发送方侦听其他传输,如果它听到与上层协议或应用程序提供的属性相匹配的数据分组,则发送方丢弃该数据分组。发送定时器已在间隔的后半部分的某个时间设置为随机时间,当定时器触发,并且发送方尚未听到相同数据分组属性的传输时,发送方向其所有邻居广播其数据分组。
除了上层协议添加的数据分组外,礼貌广播模块不会向输出数据分组添加任何数据分组属性。core/net/rime/文件夹下的程序文件polite.c和头文件polite.h定义了polite原语。
7.识别礼貌单跳广播
识别礼貌单跳广播(Identified Polite Single-hop Broadcasts,ipolite) 与polite 原语的工作方式相同,但通过使用ibc 层将发送者的身份添加为分组属性。core/net/rime/文件夹下的程序文件ipolite.c 和头文件ipolite.h 定义了ipolite原语。
8.尽力而为多跳单播
尽力而为多跳单播原语(Best-effort Multi-hop Unicast,mh)通过在网络中的每个节点上使用多跳转发将分组发送给网络中的标识节点。使用mh原语的应用程序或协议提供用于选择下一跳邻居的路由功能,如果请求mh原语发送没有找到合适的下一跳邻居的分组,则立即通知调用者,并且可能选择启动路由发现过程。
没有基于传统路由表的路由方案,例如基于属性的路由或机会路由是使用上层应用程序或协议提供的路由功能实现的,当找到下一跳邻居时,mh 原语使用尽力而为单播原语向其发送分组。core/net/rime/文件夹下的程序文件multihop.c和头文件multihop.h定义了mh原语。
9.逐跳可靠多跳单播
除了逐跳可靠多跳单播原语(Hop-by-hop Reliable Multi-hop Unicast,rmh)使用可靠单跳原语用于两个单跳邻居之间的通信外,rmh 原语类似于尽力而为多跳单播原语。core/net/rime/文件夹下的程序文件rmh.c和头文件rmh.h定义了rmh原语。
10.尽力而为网络泛洪
尽力而为网络泛洪原语(Best-effort Network Flooding,nf)将单个数据分组发送给网络中的所有节点,与涓流协议一样,nf 原语在每一跳使用礼貌广播来减少冗余传输的数量。然而,与涓流协议不同,nf 原语不执行泛洪数据分组的重传,并且数据分组未使用版本号进行标记。相反,nf 原语在它发送的数据分组上设置端到端发送方和端到端数据分组ID 属性,转发节点保存端到端发送方和它转发的最后一个数据分组的数据分组ID,如果它具有与最后一个数据分组相同的端到端发送方和数据分组ID,则不转发数据分组,这种机制降低了路由循环的风险,但并未完全消除这种风险,因为nf 原语保存了仅看到的最新数据分组的属性,因此,nf 原语还使用生存时间属性,该属性在转发数据分组之前减1,如果生存时间达到零,则原语不转发数据分组。nf原语的实现参见程序文件netflood.c和头文件netflood.h.
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。