Contiki学习笔记——RPL协议详解

前一篇博客没写完也拖了很久时间没更新了,今天补上。
整个contiki带的协议结构如下图所示:
Contiki学习笔记——RPL协议详解_第1张图片
    这里我想针对上面这幅图说说我的理解。看过计算机网络的人应该都知道TCP/IP的ISO架构,传感网的架构跟这个架构差不多。咋们从下往上看,首先是 物理层:这个对于我这种硬件出生的人很好理解,就是Radio嘛~有些Radio是符合IEEE 802.15.4的,比如CC2420;但是不满足也没有关系啊,最多跟别人的Radio不兼容喽~比如我之前用的Si1000;当然话说回来,物理层采集到的RSSI和LQI值对上层路由判断还是很有用处的。
之后是 MAC&RDC层:我为什么要把两个层放在一起讲,因为RDC实际是属于MAC层的,在TCP/IP中是没有RDC层;为什么没有?因为RDC是为了节点的低功耗,TCP/IP不用考虑功耗的;当然传感网协议也可以不需要考虑低功耗,所以可以把RDC去掉,在contiki里面用nullRDC;MAC层的存在是为了维护点对点链路的稳定性,比如上图看到的CSMA协议就采取了重发和避碰两种机制保证稳定性。
再看 适配层:这层同样很奇特,因为你可能在其他传感网协议中都没见过;它的存在是为了使得uIP和MAC层更好的通信,主要工作包括:包压缩、数据处理等,contiki里面6lowpan协议用到的就是sicslowpan.c文件。
再上面就看到 网络层:这一层是为了整个网络链路建立和维护存在。一般传感网协议核心就在网络层和应用层中。
传输层:可能的话是为了维护整条链路稳定性,注意这里的整条链路是区别于MAC层的点对点稳定性的,比如TCP会用流量、重传等维护稳定性;但是很遗憾传感网用TCP代价太大,所以就引出了应用层的CoAP协议来配合UDP来维护链路。
应用层:这层我不了解的不多,所以不敢多说,关于CoAP相关信息建议读一读相关的paper。
这两月调试下来,除了CoAP没怎么跑,其他部分倒是都试了一遍。就现在 测试结果来看,很不行。主要体现在数据量大、低功耗时丢包率大。而且网上也没有人针对contiki这个协议提出过测试结果,更别提改进办法了。所以很奇怪Adam他们是怎么进行商用的~
关于RPL学习我在前一篇提过了,主要 资料是标准文档和Cooja实际,而uIP部分因为涉及不深也不好多说。
很多人在讨论RPL跟uIP的关系,我之前也一直很糊涂深入了解后发现实际 RPL是uIP的一部分 ,和uIP应该是平行关系,也正印证了上图的关系。打开“core/net/uip6.c”文件可以发现RPL的路由包是属于ICMP6类型,与 NS(邻居请求,请求邻居相信)、NA(邻居公告,响应NS或告知链路变化)、RA(路由器通告参数)、RS(路由请求,请求生成RA)这些包是平等关系。所以RPL是网络层协议是毋庸置疑的!
你可能要说网络层已经有uIP了干嘛还要RPL?实际是这样的,uIP是从TCP/IP协议衍生过来的,并不具有多跳功能,也就是说如果去掉RPL网络就只能单跳了。
RPL标准关键词RANK:这里我们例举RPL的树形结构(RPL不只有树形结构,多谢 cy2007126提醒),RANK就代表了每个节点在树状网络中的每一层的“级别”。这点跟CTP很像,貌似RPL也借鉴了不少CTP协议方法。用了RANK就有效解决了数据环路问题。
DIO(DODAG Information Object):包含节点自身信息,比如RANK、MAC地址什么,邻居只有收到了DIO以后才确定是否能给它。
DAO(Destination Advertisement Object):这个包是为了数据下传用的,子节点传给父节点报告其距离等消息。
DIS(DODAG Information Solicitation):征集DIO包用的。
RPL组网过程:这部分我强烈建议大家用Cooja仿真过,我当时就是通过Cooja仿真后豁然开朗的。
1. 节点复位完成,首先发送DIS包,征集邻居节点信息,这点有点像ARP
2. 邻居点接收到DIS开始发送DIO包。
3. 收到DIO包的节点更新自身邻居表,并选择合适的节点发送数据包。
4. 同时节点会向选中的父节点发送DAO包,告知其是子节点。
5. 父节点更新了自身的路由表后,再向父节点的父节点发DAO,最后到达sink点后双向链路最终形成。
有人可能会问,一个点可能会收到很多节点的路由包,它如何选择呢? contiki里面两种仲裁机制:最短路径、etx。在rpl-conf.h第63行可以修改。
我理解的RPL差不多也就这么多了,如果之后又深入了解还会跟各位分享的。

你可能感兴趣的:(资料)