APP下载

基于ACP的RPL路由协议设计与实现

2020-05-09陈慈飞吴佳琪陈民华

无线电通信技术 2020年3期
关键词:行路字段路由

李 栋,陈慈飞,吴佳琪,陈民华

(重庆邮电大学 通信与信息工程学院,重庆 400065)

0 引言

随着互联网的飞速发展,规模不断壮大,衍生出了众多的新场景、新业务。由于传统网络存在运营成本大、效率低下等缺点,已经无法满足当前网络的发展趋势和要求,逐渐与互联网的发展相脱节。IBM公司于2001年首次提出自治网络的概念[1],其基本目标是实现网络自我管理、自我配置、自我优化、自我修复、自我保护以及可扩展性等特点。

自治功能需要稳定的基础架构来运行,以最大程度地降低网络复杂性。如今,大多数关键的控制平面协议和网络管理协议都在使用网络的数据平面。这通常导致一侧的控制和管理平面与另一侧的数据平面之间的不良依存关系。因此,ANIMA工作组定义自治控制平面 (Autonomic Control Plane,ACP)来为网络提供独立于数据平面的控制平面,为网络的高效通信提供基础,而ACP中通信需要满足自治属性的RPL路由协议来支撑。本文将从协议的设计、软件开发以及软件的测试和分析几个方面来讲述整个协议的原理与实现过程。

1 相关研究

2007年欧盟委员会启动了第七框架计划,同年该计划推出了EFIPSANS项目[2]。该项目旨在分析当前互联网中所存在的缺陷,探讨未来自治管理互联网的体系结构、行为特征及实现方法。在IPv6基础上探索、研究并创建新型的自治网络。2014年IETF的ANIMA(Autonomic Network Integrated Model and Approach)工作组在GANA[3]的研究基础上,提出了自己的自治网络架构,本着设计基础、可重用的组件与分布式的思想,定义了三个具体的部分:自治控制平面(Autonomic Control Plane,ACP)[4]、通用自治信令协议(Generic Autonomic Signaling Protocol,GRASP)[5]和安全自启动机制(Bootstrap Key Infrastructure,BRSKI)[6]。

自治功能需要稳定的基础架构来运行,并且所有自治功能都应使用相同的基础架构,以最大程度地降低网络的复杂性。如今,大多数关键的控制平面协议和网络管理协议都在使用网络的数据平面。这通常导致一侧的控制和管理平面与另一侧的数据平面之间的不良依存关系,只有正确配置数据平面的转发和控制平面,数据平面和管理平面才能正常工作。在传统的网络管理方法中,可以通过带外虚拟(Out of Band)技术[7]解决这些问题,但是其过高的成本与代价很大程度上限制了该技术的进一步推广。因此,ANIMA工作组定义了ACP自治控制平面来为自治域中的自治节点提供通信,ACP提供了强大而安全的通信覆盖,同时实现了控制平面和数据平面的隔离。

为了满足无线传感器网络的要求,IETF(The Internet Engineering Task Force)工作组在2008年成立了ROLL小组,ROLL小组提出了基于IPv6的低功耗有损网络路由协议RPL[8]。在实际中,ContikiOS和TinyOS是两种最流行的操作系统,而TelosB是测试平台上最常用的硬件平台。在开源实现方面,两个最广泛使用的开源RPL实现分别是ContikiOS的Contiki RPL[9]和TinyOS中的Tiny RPL[10],并且这些实现几乎已经用于涉及真实实验的所有RPL研究活动中。

2 路由协议设计与实现

路由协议承载着自治节点的通信需求,影响着整个网络的性能和存活时间。RPL协议是一个基于标准化IPv6的距离矢量路由协议,节点通过交换距离矢量构造一个有向无环图(Destination Oriented Directed Acyclic Graph,DODAG),DODAG可以有效防止路由环路问题。由于RPL路由协议具有自我管理、自我配置的特性,庞大的规模以及拓展性强等特点,ACP在标准实现中使用RPL路由协议来实现域内数据多跳传输,但由于RPL路由协议本是应用在无线传感网络中,而自治网络基于有线环境,所以本文以ANIMA工作组提出的自治控制平面为基础,阐述自治控制平面中基于Linux操作系统的RPL路由协议的设计与实现。

2.1 DODAG构建流程

在自治域中将有很多类似NOC的节点,但是只能选择一个NOC节点作为当前自治域中的根节点,负责当前域中自治节点的维护和管理,以及跨自治域流量交互等。整个自治域就是一个DODAG,DODAG的构建主要包含上行路由和下行路由的构建,其中上行路由和下行路由的构建均是由DODAG Root发起,通过DIO,DAO,DAO-ACK,DIS控制消息完成DODAG的构建。DODAG的构建流程如图1所示。

图1 DODAG的构建过程Fig.1 DODAG construction process

2.2 上行路由模块

上行路由是指自治域中的自治节点到根节点方向的路由,当网络中的其他节点无法获得某些路由时,将数据包向上默认发给根节点,同时当两个自治域中的节点进行交互时,也需要上行路由将其数据包送至根节点,由根节点与其他域中根节点进行转发。模块主要包括上行路由的构建和维护两部分。

上行路由的构建与维护主要涉及两种消息类型,分别为DODAG信息对象信息(DODAG Information object,DIO)和DODAG信息请求消息(DODAG Information Solicitation,DIS),具体消息实现格式代码如图2和图3所示。

图2 DIO消息格式Fig.2 DIO message format

图3 DIS消息格式Fig.3 DIS message format

RPLInstance ID表示当前DODAG所在RPL Instances中的ID号;Version Number表示当前DODAG的版本号,主要用于保证DODAG中所有节点的网络状态同步,且其值随着DODAG的更新而逐渐递增;Rank的大小可以反映出当前节点相对于根节点在DODAG中的相对位置;MOP表示节点加入DODAG中的操作模式:存储模式和非存储模式;DTSN表示触发DAO控制消息的序列号,主要用于维护和更新DODAG中的下行路由;DODAG ID是由DODAG Root分配的IPv6地址,表示当前DODAG的ID号,用于标识每一个DODAG的身份,且每个DODAG ID不能重复,必须唯一。Flags和Reserved 各占据1字节,在发送端这两个字段均默认初始化设置为0,在接收端直接忽略这两个字段。

上行路由的构建过程由根节点广播DIO消息请求周围邻居节点加入当前DODAG开始,确定加入DODAG的自治节点将发送DIO的节点添加至自己的父节点集合中,同时构造到父节点以及根节点的上行路由,上行路由的维护过程是从构建完上行路由后开始,接收DIO消息的节点会判断DIO消息中的Rank字段是否为INFINITE,若是,则从父节点集合中删除该节点;否则,会继续判断Version Number字段是否已经改变了,若是,则将节点的Rank值设为INFINITE,广播DIO状态变为未加入DODAG,断开与之前节点之间的连接;否则,继续判断DIO消息是否来自其他的DODAG,若是,则判断DIO中Prf字段是否大于当前根节点的Prf,当若大于当前根节点,则直接置Rank为INFINITE,广播DIO消息断开所有连接;否则,根据发送节点的Rank值计算自身节点的临时Rank值;继续判断是否加入了新的DODAG,若是,则切换父节点更新路由信息;否则,比较Rank值,选取最优父节点更新路由。

节点通过遍历节点的接口信息,创建与接口一一对应的RAW套接字用于广播的DIO消息。由于节点进行广播DIO是周期性的,所以在RPL进程中使用了单独的线程处理DIO消息的转发。IPv6中不再有广播的概念,而是将其看做一种特殊的组播。在进行组播DIO消息时使用Raw套接字组播DIO消息,使用组播地址作为目的地址,其中组播地址中“FF02::1”指所有开启了IPv6组播的主机,一般为链路上加入RPL多播组的所有主机。具体代码如下:

const uint8_t all_rpl_addr[]= {0xff,0x02,0,0,0,0,0,0,0,0,0,0,0,0,0,0x1a};

memcpy(&mreq.ipv6mr_multiaddr.s6_addr[0],all_rpl_addr,sizeof(mreq.ipv6mr_multiaddr));

if (setsockopt(sock,SOL_IPV6,IPV6_ADD_MEMBERSHIP,&mreq,sizeof(mreq)) < 0)

∥节点加入多播组

for(int i=0;i

{

pa->ifname[i]=ifname[i];

}

for(int i=0;iif_count;i++)

{

if(pa->r_sock!=*(pa->s_sock+i))∥遍历接口中继,剔除收到消息接口

{

s_bytes=sendmsg(*(pa->s_sock+i),&mhdr,0);

}

}

2.3 下行路由模块

下行路由是指自治域中的从根节点方向到其他自治节点方向的路由,根节点掌握所有子节点的路由信息,当数据包查找不到目的地时,会向上交付给父节点,由父节点查询下行路由转发数据包。模块主要包括下行路由的构建和维护两部分。

下行路由的构建与维护主要涉及两种消息类型,分别为DODAG目的地通告消息(Destination Advertisement Object,DAO)和DODAG目的地通告消息确认消息(Destination Advertisement Object Acknowledgement,DAO-ACK),具体消息格式如图4和图5所示。

图4 DAO消息格式Fig.4 DAO message format

图5 DAO-ACK消息格式Fig.5 DAO-ACK message format

DAO控制消息中RPLInstanceID是从接收到的DIO控制消息中获取;K标志位、表示DAO控制消息发送端是否需要接收端返回DAO-ACK控制消息;D字段表示DODAG ID字段是否存在;Flags字段和Reserved字段DIO控制消息中的操作一致;DAO Sequence字段被作为一个计数器,主要用于记录节点收到其下游节点发送的DAO控制消息的数量,即节点每收到一个携带路由前缀的DAO控制消息,该字段的值便增加1;DODAGID字段的“*”表示DODAGID并不总是存在,该字段仅在设置D字段时才出现,即当使用本地RPLInstanceID时才存在,当使用全局RPLInstanceID时不存在。

下行路由的创建过程由节点收到DIO消息后建立完成上行路由开始,然后向选定的父节点回复DAO消息来通告自身地址前缀,协助父节点以及根节点来建立到自身的下行路由,最后如果需要则将DAO消息送至根节点,由根节点回复确认消息DAO-ACK消息,来提高下行路由的可靠性,当节点入网后,将收到DIO消息中的目标函数(Objective Function,OF)中定义的一个或多个度量和约束转换为Rank值,然后周期广播DIO继续协助周围邻居入网。

节点通过遍历节点的接口信息,结合poll函数实现非阻塞的RAW套接字,同时实现超时时间的设定与套接字的监听。Poll函数可以实现非阻塞IO的套接字,它可以通过监视套接字描述符的变化来监测等待事件的发生,一旦判定收到DIO消息,就确定接口信息,单播回复DAO消息。通过对若干个套接字进行轮询,根据发生的事件来进行相应的处理。代码示例如下:

for(int i=0;igif_count;i++)∥轮询加入poll监听池

{

gif6.gifaddr6[i].ifa_name=pa->ifname[i];

fds[i].fd=pa->r_sock[i];

fds[i].events=POLLIN;∥设置监控触发事件

}

ret=poll(fds,pa->gif_count,INFTIM);

if(fds[i].revents==POLLIN)∥捕获触发的事件类型

send_dao(r_sock,r_src,parent,relay_src,dao_seq,r_dio.instanceid,r_dio.dodagid,ip6_src_add.s6_addr,plen);∥回复DAO消息

3 软件测试及分析

在软件协议的开发中,软件功能的实现是保障协议能够正常运行的最基本要求。为了验证RPL路由协议能否正常运行,本文编写了相应的测试用例对RPL协议模块功能进行测试。

3.1 测试环境搭建

为测试RPL路由协议功能及性能,需要首先搭建自治控制平面作为测试平台,实际搭建的测试场景网络拓扑如图6所示。

图6 测试网络拓扑结构Fig.6 Network topology used for testing

图6中所有的节点都是在一台台式机上通过Vmware Workstation虚拟机软件虚拟了多个虚拟节点,在其上运行Linux操作系统,通过对节点进行配置多个虚拟网卡来构建网络拓扑,每个网卡分别配置了不同网段的IPv6的LLA地址和ULA地址,其中LLA地址为链路本地地址,是默认为网卡分配的地址,用于本地链路之间的通信;自治控制平面在运行路由协议前,会自动分配一个ULA地址用于当前域内路由。

3.2 构建RPL路由测试

在所有的节点上运行RPL路由协议软件,节点首先会初始化接口信息,例如A节点有两个接口eth0和eth1,然后创建Raw套接字,其中假设A是根节点,其IPv6地址为fd89::1,作为DODAGID,其他节点是普通节点,首先由A构建DODAG,A节点组播DIO消息如图7所示,邻居节点B和C收到DIO消息后构建上行路由如图8所示,收到的DIO消息中的DODAGID字段为fd89::1,rank值为0表示是根节点,B,C节点根据DIO消息构建到节点A的上行路由,如图9所示。然后向节点A回复DAO消息,其中Target Prefix字段为fd89:1::10,表示B的IPv6地址,节点A构造下行路由的测试结果如图10所示。

当节点B,C,D,E,F加入到DODAG后,在A节点中会聚集子节点路由信息,如图11所示,这表示当前网络已经组网完成,如果节点是邻居直连,则下一跳使用null表示,ifname表示数据包发送接口。

路由修复以节点B脱网为例,如图12所示,当节点B故障时,A节点通过发送DIO消息并等待DAO消息,若在一定时间内没有收到,则会检测出节点B出现故障,删除故障节点路由。

图7 A节点组播DIO消息测试信息Fig.7 Test information for Node A multicast DIO messages

图8 B,C节点接收DIO消息测试信息Fig.8 Test information for node B and node C receiving DIO messages

图9 B,C节点构建上行路由测试信息Fig.9 Test information fornode B and node C to build upward routes

图10 A节点构建下行路由测试信息Fig.10 Test information for node A to build downward routes

图11 A节点存储的路由测试信息Fig.11 Test information of the routes stored at node A

图12 A节点删除错误路由测试信息Fig.12 Test information of node A deleting the wrong route

4 结束语

自治网络作为当前一个较为新颖的研究方向,在当前的学术界以及相关领域被关注的不多,研究成果也较少。因此,本文以ANIMA工作组提出的自治网络基础结架构中的自治控制平面为参考模型,重点是实现其中的路由协议来打通一个虚拟带外网络,在不依赖于节点的配置与全局路由表的情况下,依旧可以维持与网络中节点的连通性,实现对于节点的管理与维护。本实现开拓性地在Linux系统下,结合网络编程相关知识,使用C语言成功地实现了RPL路由模块以及相应功能。实现结果表明,本文所设计的软件系统能够基本满足自治控制平面中对路由的要求。

猜你喜欢

行路字段路由
资兴市:不忘来时路 走好前行路
带钩或不带钩选择方框批量自动换
举步有礼 行路不难
数据通信中路由策略的匹配模式
路由选择技术对比
浅谈台湾原版中文图书的编目经验
反洗钱行路致远
路由重分发时需要考虑的问题
基于AODV 的物联网路由算法改进研究
无正题名文献著录方法评述