-
开放科学(资源服务)标志码(OSID):
-
物联网(Internet of Things,IoT)中低功耗有损网络(Low Power and Lossy Network,LLN)在智慧城市等领域被广泛应用[1-5],但是LLN在内存、CPU、电池等方面受到限制. 低功耗有损网络路由协议(Routing Protocol For Low Power and Lossy Network,RPL)缓解了LLN的限制,为用户提供了工具,以描述各自的网络需求和指标路由策略[6-8],IoT采用RPL进行路由任务,以最小能量消耗和最小数据包损失来引导流量. 但是,RPL也面临节点之间能量不平衡的问题,将导致能量消耗大幅增加,主要是因为网络中一些节点在流量过大的情况下需要通过网络[9-11].
对于物联网中RPL的研究,文献[12]提出了基于粒子群优化算法的RPL负载均衡方法,该方法通过粒子群优化算法获得各子节点的最优父节点,从而实现了所有父节点的负载均衡. 文献[13]提出一种RPL多路径数据传输机制,结合无线链路质量等度量,设计一种数据流量分配度量标准和网络负载流量分配策略,从而得到最优数据传输方案. 文献[14]使用模糊逻辑组合的多个指标,并使用模糊目标函数定义最佳树路径. 文献[15]提出基于模糊逻辑的能量感知RPL路由协议,并利用模糊逻辑算法选择网络中最优父节点. 文献[16]提出新的基于负载均衡的目标函数,在一定程度上提高了协议在功耗方面的效率. 文献[17]提出一种低功耗有损网络中基于面向目标的有向无环图信息对象(Destination Oriented Directed Acyclic Graph Information Object,DIO)的移动感知路由协议,该协议在接收到DIO消息后立即更新首选父节点信息而无需等待路由到期时间. 文献[18]提出上下文的RPL负载均衡方法,设计了上下文感知目标函数,减少了数据包丢失. 文献[19]提出高负载场景下基于负载均衡的LLN路由协议(HSLB-RPL)方法,该方法对DIO控制消息的发送时间间隔进行调整,优化了最优父节点的选择. 文献[20]提出一种能耗意识目标函数(Energy Consumption aware Objective Function,ECOF) RPL方法,设计了基于模糊逻辑的目标函数,同时考虑了链路和节点度量标准.
但是,现有物联网RPL方法最优父节点选择,负载均衡等方面考虑并不全面,为实现物联网低功耗有损网络路由低丢包和高负载均衡的数据传输,本文提出一种用于物联网的RPL节能负载均衡方法. 该方法将物联网网络划分为网格,每个网格中采用重启随机游走(Random Walk with Restart,RWR)算法选择最优网格头节点. 然后,通过花斑鬣狗算法(Spotted Hyena Optimizer,SHO)对多指标的度量进行优化,选择最佳父节点来进行数据包的路由. 实验结果表明,本文方法能够以较好的性能实现负载均衡.
HTML
-
RPL协议是一个动态的距离矢量协议,在寻找网络上节点之间路径的过程中能够适应复杂的通信环境,且能够对节点设备资源受限的低功耗路由做出优化,但是RPL协议中依然存在路由开销、数据包丢失和负载不平衡等问题. RPL一般有两个基本目标函数(Objective function,OF)[21-22],即目标函数零和最小rank迟滞目标函数. 采用期望传输计数(Expected Transmission Count,ETX)度量来计算、选择路径成本和首选父节点[23],最终确定节点的下一跳. RPL协议以最小能量消耗和最小数据包损失来引导数据流量. RPL协议针构建了树状拓扑结构,称为面向目标的有向无环图(Destination Oriented Directed Acyclic Graph,DODAG)[24-25],其中每个节点都希望达到一个单一的目标. 在基于树的拓扑中,数据流由根到节点,每个节点在拓扑中的位置称为rank,节点在拓扑中的位置通过OF计算得到的.
本文方法通过5个步骤实现RPL节能负载均衡,即DODAG构建、最优网格头选择、最优父节点选择、向下路由和数据转发. 最优网格头的选择首先根据网格不同等级来构建网络区域,平衡网络的负荷和能耗,然后使用重启随机游走算法选择最优网格头节点. 对于多个指标的度量,利用SHO算法为物联网数据选择最优父节点,并以均衡的负载来路由数据包. 本文方法的流程如图 1所示.
-
在DODAG的构建过程中,传输了DODAG信息征求(DODAGInformation Solicitation,DIS)、DODAG信息对象(DODAGInformation Object,DIO)和DODAG目标广告对象(DODAGDestination Advertisement Object,DAO)等多种控制消息. DODAG的构建分为上行和下行路由建立. 对于上行路由建立,根节点用来生成网络的配置信息,将配置信息中DIO报文向邻居进行广播,收到DIO的邻居节点根据配置信息来确定是否加入该DODAG,决定加入则将DIO原地址加入父节点list,并通过目标函数计算Rank值,DIO变动并继续向邻居节点进行广播,直至所有节点加入该DODAG. 如果有节点没有接收到信息对象DIO,则广播信息征求DIS用以请求DIO. 对于下行路由建立,DODAG中节点向父节点发送DAO,其中包含自身前缀信息,收到DAO后父节点更新路由信息.
当RPL开始构造DODAG时,每个节点的排名由根节点决定,并向邻居发送DIO消息. 每一个邻居节点接收DIO消息,并进行节点的等级确定. RPL最重要的部分是OF,决定了RPL路由使用的度量,这些度量包括跳数、ETX、剩余能量、吞吐量和链路质量水平等.
此阶段的所有节点都处于唤醒状态,并且它们的发送器处于侦听模式,目的是获取消息构建网络DIO. 构建DODAG的过程是从根节点向其他节点传输DIO消息开始(图 2).
步骤1 sink/root初始化DODAG信息,root(sink)会广播第一个控制消息DIO,包含以下信息:RPLInstanceID、DODAG标识符、版本号、rank和RPL支持的OF,用于计算秩. 根通信范围内的所有节点都会收到一条DIO消息,然后决定是否加入该结构,而节点加入图 2的决定取决于满足要求的节点(如果它有足够的权力进入DODAG构建过程). 当节点满足条件时,加入取决于节点等级:即使用预定义的OF计算的增量值. 相关性要求节点秩不小于或等于图 2中的节点秩. 如果节点不满足条件,在这种情况下DIO控制消息将被忽略. 这些关联的节点会将发送方的前缀添加到其父节点列表中,并计算排名.
计算出新的秩值后,接收到DIO消息的信息用自己的新秩更新,并广播给通信范围内的所有节点. 这仅适用于第一期,其他时间段将排除具有较低等级值的节点发送DIO消息. 本文采用基于标准协议的DIO消息的大小(128字节). 图 3显示了DIO消息广播.
在第二个周期中,任何节点都将更新的DIO消息发送到通信范围内的所有节点,但父列表中的节点除外,这可以减少每个节点的控制消息数量,从而减少消耗能量,增加网络寿命.
步骤2 当其他接地节点(链接到DODAG的节点)收到更新的DIO消息时,它将执行以下操作:接地节点将检查发送节点ID及其父节点列表中所有节点的ID. 如果它们存在于父列表中,则接地节点检查发送控制消息DIO的节点等级. 如果控制消息DIO中发送节点等级大于接地节点等级,则接收节点更新其等级并更新DIO消息的信息,然后将其广播给通信范围内所有邻居父母列表中的预期节点.
如果控制消息DIO中发送的节点等级等于接地节点等级,则接收节点更新其等级并更新DIO消息的信息,然后将更新后的DIO消息广播到父列表中预期节点通信范围内的所有邻居. 如果控制消息DIO中发送节点等级小于接地节点等级,则接地节点丢弃DIO控制消息.
步骤3 继续上述步骤,直到所有节点都设置了通往DODAG根的默认路径. 每个节点都与一个或多个节点相关联,并且它包含一个首选父列表(Preferred Parents,PP). 图 4显示了DODAG构建后的网络.
完成第一阶段后,网络中所有节点都将至少有一个到其父节点的路由条目,该路由条目逐跳通向汇聚节点,代表了多点对点(Multi-Point to Point,MP2P)转发模型——向上路由,其中每个节点都可以到达接收器.
-
物联网场景RPL可表示为图G={N,L},N表示除根节点以外物联网节点的集合,L表示连接物联网节点的链接集合. DODAG构造过程从根节点开始,将DIO消息及等级广播给相邻节点,DODAG由根节点和网格头节点构成.
本文采用基于网格的网络来提高网络生命周期,与网络中其他节点相比,靠近根节点的节点消耗的能量更多,为了平衡整个网络能量消耗,本文构造了不同网格,靠近根节点的网格比网络中的其他网格要小. 在图 5中,呈现了4个不同等级网格. 1级网格小于其他级别,因为更靠近根节点. 2级和3级网格大于1级网格,因为它们与根节点具有比1级网格更高的距离变化. 4级网格大于其他3级网格,减少了每个级别的网格数量. 当根节点级别网格之间的距离增加时,网格的大小增加.
这种划分网络的方式也平衡了网络中节点之间的负载,因为靠近根节点的节点比其他节点承受更大的负载. 这些优点有效地提高了本文方法的网络寿命和负载均衡能力. 网格的构建过程从根节点向相邻节点广播其rank值和DIO消息包开始,每个层级都有自己的网格大小,由到根节点的距离决定. 这种分割网络的方式有效地减少了能量损失、负载不平衡和开销.
在每个网格中选择最优网格头节点来保证更好的网络寿命,并处理数据传输过程中的重负载条件. 网格头选择过程从根节点接收到关于DODAG构造的控制消息之后开始. 根节点主要将DIO消息及等级广播到网络. 网格头节点使用RWR算法选择,该算法从图 5中的某一个节点出发,每一步随机选择相邻节点或返回开始节点,经过迭代到达平稳. 相较于最短距离等度量,RWR算法可以捕捉图 5中两个节点之间多方面的关系,得到整体结构信息.
本文使用RWR通过3个度量(距离根节点的距离Dr、剩余能量R和选择重负载条件下工作的节点Sh)对网格中的每个节点进行排序. 距离根节点的距离Dr用于减少数据传输期间发生的时延,通过考虑网格节点和根节点之间的距离来度量.
物联网设备是资源受限设备,因此在网格头选择时有必要考虑节点的剩余能量Re. Re用于避免频繁的网格头选择,并减少能量损失,可表示为Re=Te-Ce. 其中,Te为节点总能量,Ce为消耗能量. Sh用于选择在重负载条件下工作的节点,通过传输能力和缓冲区大小度量来计算,具体表述为Sh=∑(TaBz). 其中,Bz表示缓冲区大小,Ta=Nt/T表示传输能力,Nt表示随时间T传输的数据包数量.
通过上述度量,用RWR算法估计每个节点的排名,排序最高的节点被选择为网格头节点. 通过3种度量得到RWR的边权重为wij=exp(DrReSh),则相邻矩阵W由权重组成,对其进行标准化得到
$\widetilde{\boldsymbol{W}}$ . RWR算法定义为:其中,r是得分,表示两个节点的相关度得分,c是重启概率,e是初始向量.
对于任一节点i,当以一定概率转移到相邻节点时,进行反复迭代,每次迭代重启概率c返回节点i. 当迭代稳定后,得到节点i和j的相关性得分rij,则有
$\boldsymbol{r}=(1-c)(\boldsymbol{I}-c \widetilde{\boldsymbol{W}})^{-1} e$ . 其中I为单位矩阵. 选择网格中得分最高的节点作为网格头节点,发送到每个网格内成员节点的选举信息,网格中成员节点通过网格节点将它们的数据传输到根节点. 这种传输方式提供了更好的网络寿命,并有效地减少了单个节点的能量消耗. -
本文设计了SHO的最佳父节点路径选择,通过考虑父节点链对根节点的状态来选择最优父节点,这种选择传输父节点的方式在敏感数据路由中呈现了较好的效果. 该算法将斑点鬣狗种群初始化为网络中出现的网格头节点数量,通过对每条路径适应度函数的估计,选择最优父节点路径来有效地传递数据包. 本文适应度函数设计了6个指标来估计:时延、链路可靠性、父级、缓冲区大小、数据率和预期负载.
在SHO算法中,斑点鬣狗(Spotted Hyena,SH)的行为分为搜索、包围、狩猎和攻击猎物过程. 黏性集群的建立可提高SH之间的有效合作及适应性. 随着猎物的移动,SH的位置不断进行更新.
其中,D为SH与猎物的距离,n为当前的迭代,B为系数向量,E为系数向量,Pp为猎物的位置,P表示SH的位置,则B和E可表示为:
其中,λd1和λd2表示属于(0,1)的随机向量,·表示向量乘法,对于最大迭代次数N,当迭代次数逐步增加到最大迭代次数时,|h|=5-(n*(5/N))由5降为0,||表示向量的绝对值.
SH通过群居进行生活,这样可以使用同伴的信任关系和识别猎物位置的能力追捕猎物,将SH这种行为进行数学建模,假设猎物的位置对于SH组成的集群是已知的,集群中每只SH向猎物靠近,并保留目前最好的狩猎路径来更新位置,数学描述为:
其中,Ph表示第一个SH的最优位置,Pk表示其他SH的随机位置,L表示SH总数,L=countnos(Ph,Ph+1,Ph+2,…,(Pn+Q)),Q是随机向量,介于[0.5,1]之间,nos用于定义解的个数. C表示L个最优解的集合.
为了对攻击猎物进行数学建模,h在迭代过程中不断减少,由5降低到0. 迭代次数增加使得搜索更细致,E也会随之发生变化,当|E|≤1时,SH群攻击猎物,数学公式描述为:
SH搜索更新位置并攻击猎物,式(5)为最佳解决方案,表示新的SH更新的位置.
SH根据其他同类的位置进行猎物搜索,狗群散开选择和攻击猎物. 该算法使用一个绝对值大于1的系数向量E从远离猎物较远的位置移动,保证SHO进行全局搜索. 当系数向量绝对值大于1时,则表示SH群从远离猎物的地方进行搜索;当系数向量绝对值小于1,则表示确定目标并进行攻击猎物.
另一个系数向量B则为算法提供了猎物随机权重的随机值. 针对式(3)中系数向量的表示内容,假设向量B大于1优于B小于1,这样假设的原因有助于避免局部最优. 根据SH群位置,B可以对猎物重量进行随机确定,使得SH难以接近猎物.
-
对于SHO求解最优过程中适应度的计算,本文设计了多目标适应度函数,适应度函数使用6个指标来估计:时延、链路可靠性、父级rank、缓冲区大小、数据速率和预期负载.
时延:将数据包传输到目的地所花费的时间,该指标用于RPL物联网网络减少路由过程中的端到端时延,定义为:
其中,Psz表示数据包大小,t表示数据包传输所需的时间.
链路可靠性:表示源节点和目标节点之间链接的强度,用于在敏感数据路由中保证无损传输. 定义为Lre.
父级rank:此度量用于减少源节点和目标节点之间的跳数. 网络中每个节点的rank定义为:
其中,Rp表示父级rank,ETX表示到达根节点所需的传输次数.
缓冲区大小:为了避免路由路径上的拥塞,减少了父节点的负载,避免了丢包. 缓冲区大小被描述为父节点缓冲区中剩余的空间:
其中,np表示数据包的个数,Tbl表示缓冲区的总长度.
数据速率:为了在RPL路由中实现更好的数据传输,从而提高数据包投递率(Packet Delivery Ratio,PDR). 表示为:
其中,B表示带宽,SNR表示信号噪声比.
预期负载:在父节点之间平衡负载. 使用在路径上历史行为的负荷进行估计,在源节点和目标节点之间考虑路径的历史行为,这种估计路径预期负载的方法有效地平衡了不同父节点之间的负载.
其中,Ndp,i表示在时间t期间路径i上传输的数据包数量.
通过以上这些参数,将SHO算法对每个父节点路径进行适应度估计,从而选择最优路径. 适应度估计如下:
通过式(6),采用SHO估计每个父节点向根节点的适应度函数,在估计适应度函数后对最优解进行聚类,然后更新每个SH的位置. 此过程将一直执行,直到达到停止条件,最后输出最优解,为物联网数据选择通向根节点的最终最佳父节点路径. 这种路由选择方式既减少了丢包、时延,又平衡了父节点之间的负载.
-
物联网中需要下行路由来支持点对多点(P2MP)通信. 在此阶段,本文方法将构建向下路由来绘制网络内任何节点和根/宿之间的路径,并准备向根发送数据. 在下行路由中,RPL使用DAO数据包,这种类型的控制消息旨在维护下行路由和控制消息DAO(DAO-ACK).
在这个阶段,每个已经加入DODAG的节点都向它的PP发送一个DAO消息,当PP接收到控制消息DAO时,将对该消息进行处理,控制消息DAO的处理取决于RPL支持的工作模式. 下行路径有两种操作模式,存储模式和非存储模式. 本文提出一种新的存储模式.
如果PP收到来自其子节点之一的DAO消息,则通过返回状态为0的控制消息DAO(DAO-ACK)来确认状态为0的DAO发送者,以表示接受该前缀,此时PP将接受的前缀与发送节点控制消息DAO的地址作为下一跳. 图 6表示建立路由表和控制消息DAO(DAO-ACK)传输的流程.
如果其中一个PP收到了DAO消息并且它不能传递这个DAO消息或者它没有足够的空间来存储这个前缀,它应该拒绝宣布的前缀并用状态为1的DAO-ACK确认DAO发送者表示拒绝此前缀. 在PP拒绝其子节点之一发送控制消息DAO的情况下,子节点应执行以下操作:
1) 锁定通向这个PP的路径,这样DAO消息就不会被发送回这个PP.
2) 从父列表中选择另一个PP并将DAO重新发送到这个新的PP.
在本研究中,当绘制下行路由时采用了存储模式,每个节点接收到DAO消息,并发送给它的节点地址存储在一个路由表中,路由表是一个有两个字段的表. 第一个字段是节点索引;第二个字段是该节点的下一跳或PP,用于向目的地传递控制消息或数据包. 图 7为构建向下路由的流程图.
-
在完成上行路径和下行路径绘制两个阶段后,必须从路由沿线的节点验证RPLDODAG拓扑中的两个基本条件. 首先,DODAG拓扑中所有节点的等级值应该从DODAG根向下增加到叶子/主机节点,以及从叶子节点向上减少到DODAG根. 其次,考虑到DODAG内部节点秩值的增减基数,DODAG内部的数据包传输要么向上到DODAG根,要么向下到叶子节点,即当数据包节点处于发送状态时,发送节点的值等级必须小于接收点的值等级,此时节点向顶部发送数据包. 一旦子节点从其PP接收到状态为零的DAO-ACK,即为接受目的地. 在这种情况下,子节点通过中间PP向目的地(根)发送数据包. 本节确定了每个节点发送的数据包数量,每个周期一个数据包数据. 当子节点将数据包传递给它的PP时:
1) 如果PP是目的地(DODAG根),它提取数据包并根据需要的应用程序使用它.
2) 如果PP不是目的地(DODAG根),则PP将根据其通往目的地(DODAG根)的路由表将数据包作为下一跳传递给其他PP. 这个过程会一直持续,直到访问到根节点的数据包.
Trickle算法. 一旦施工完成,就开始按照Trickle计时器进行维护. 该算法作为一个发光计时器,定期发送控制消息(DIO),减少重复消息传输. 发送控制消息之间的间隔大大增加,直到达到固定速率(也称为最大周期(Imax)). 当DODAG结算时,发送的DIO消息更少. 如果检测到不一致,间隔将返回到其最低值Imin. 算法1显示了Trickle算法的步骤.
算法1
Require:Imin,Imax and Idoubing
Ensure:I(new interval)
1 I←Imin;
2 Start new interval;
3 if (interval I expires) then
4 I←I*Idoubling
5 if (Imax≤I) then
6 I←Imax;
7 endif
8 endif
9 if (Trickle detects an inconsistent message) then
10 I←Imin;
11 endif
12 retum I;