RFC6551中文版:Routing Metrics Used for Path Calculation

RFC 6551 LLN中路径计算所使用的路由度量

 

概述

与传统有线网络和ad hoc网络相比,LLNs有其独特的特征,需要特定的新型路由度量和约束。通过对比,典型的IGP路由度量使用跳数或是链路度量,本文档定义了一组适用于LLNs的链路和节点路由度量和约束,将被用在RPL中。

 

1 介绍

本文档使用了定义在【ROLL-TERMS】中的术语。

LLNs与传统有线网络和ad hoc网络相比有其特定的路由特征,这些特征已在RFC5548、RFC5673、RFC5826、RFC5867中进行论述,分别介绍了低功耗网络中的路由协议在城市、工业、家庭、楼宇自动化中的需求。

之前,IGP,如OSPF和IS-IS,使用定量静态链路度量。其它机制,如多协议标签交换(MPLS),使用了其它的链路属性,如可用预留带宽(动态的)或是链路亲和力(大部分时间为静态)来计算受限最短路径。

本文档定义了RPL中路径计算所使用的路由度量和约束。

本文档的首要目标之一是定义一种供RPL使用的路由度量和约束的通告。一些RPL实现可能选择使用一种极度简单的方法,基于使用一种没有约束的单一度量;当然,其它一些实现或许使用一组链路和节点路由度量和限制。本规范提供了高度的灵活性和一组路由度量和约束。新的路由度量和约束可能在未来定义,随着需要的进行。

一个RPL实现可以自由的包括不同的功能(本文所定义的度量,约束)子集。特定的度量/约束集合和其他可选的用在特定环境中的RPL参数将被ROLL工作组定义在相关的文档中。需要注意的是,RPL甚至可以不使用度量,例如,使用定义在RFC6552中的目标函数。

RPL是一个基于距离向量的路由协议变体,基于路由度量和约束构建有向无环图(DAGs)。DAG的形成规则定义在RFC6550中:

i DODAG根可以通告一个路由约束,被当作一个过滤器来滤掉不符合特定属性的链路和节点。例如,或许需要一条主电源供电的节点构成的路径,或是有最小可靠性的链路,或者是一个反应使用者定义的链路特征的特定颜色。

ii 一个路由度量是一个定量值,该值被用来评估路径代价。链路和节点度量通常(但不总是)叠加使用。

 

最好的路径是满足所有约束,同时对于各自的特定度量代价最低。也被称作最短约束路径

依据下面的特征,可以对路由度量进行分类:

    i 链路度量 VS 节点度量

    ii 定性 VS 定量

    iii 动态 VS 静态

 

路由需求文档(RFC5548、RFC5673、RFC5826、RFC5867)描述了必须被考虑的各种节点约束/度量在路径计算的时候。

一些链路或节点特征(如链路可靠性、节点剩余能量)或许被RPL要么用作路由约束,要么用作度量(有时候两者都用)。本文档提供了灵活性对于使用链路和节点特征作为约束和/或度量。

链路和节点路由度量和约束的使用并不是排他的,例如,也可能通告一个“跳数”,即作为一个路径计算优化的度量,同时作为一个约束(路径不能超过n跳)。

 

LLN中的链路一般会快速的改变节点和链路的特征,所以,路由度量必须是动态的,同时必须使用相关技术平滑这些度量的动态性,这样可以避免路由震荡。

 

为了保存路由的平稳性,对于路由度量和属性值的改变速度必须非常谨慎。当使用了动态路由度量,一个rpl实现应当使用一种多阈值方案。

在不同的度量中,报告频率或许不同;所以每种度量使用不同的报告速率。

 

被用来计算通过RPL构建的DAG的目标函数规范不在本文档范围内本文档定义了从目标函数中分离出的路由度量和约束。所以,例如,一个通用目标函数可以定义一些规则在DAG中选择最好的父代,备用父代的数量等等,同时,他可能使用本文档所定义的任一路由度量或是约束。

一些度量要么是被聚合的要么是被记录的。一个聚合的度量被调整作为DIO消息,沿DAG遍历。例如,如果度量是跳数,每个节点更新路径成本,这些路径成本反应了沿DAG的跳数。相对的,对于一个记录的度量,每个节点添加一个子对象,来反应度量的本地估值。例如,记录了某一路径的链路质量水平。对于这种方法,每个被访问的节点添加一个子对象来记录本地链路质量水平。为了去限制子对象的数量,要使用一个计数器(如,记录每一链路水平的链路的数量),所以压缩信息来减少信息的长度。例如,一旦从一组父节点收到DIO消息,一个节点根据OF和本地策略来决定选择哪个节点作为父节点,基于一个特定链路可靠性水平的最大数量。

本文定义的度量和约束并不针对于任何特定的链路层。

由于一组度量和约束将被LLN中的链路和节点所使用,所以确保网络中的链路和节点使用一致度量计算机制是很重要的。

实现必须清楚地说明包括了哪些选项,同时,必须说明在选项中哪些是默认的,哪些是要配置的。

 

2 对象格式

2.1DAG Metric Container 格式

路由度量和约束由DAGMetric Container对象所携带。多度量和/或约束应当在DAGMetric Container中存在,他们被OF所定义用来决定最好路径。

路由度量/约束对象代表一种特定类型的一种度量或是一种约束。他们可以以任何顺序出现在DAG Metric Container中。他们有共同的格式,具有一个共同头部和一个或是多个字节的对象体构成。

该对象体携带本文档后面所定义的一个或是多个子对象。需要注意的是,一个对象可能携带一个TLV,同时该TLV它自己或许有其他TLVs组成。他们都被称作TLV。

Routing-MC-Type(8bits):独特的标识每一个路由度量/约束对象,由IANA管理。

Length(8bits):定义了对象体的长度,以字节为度量。长度变化从0到255.

Res Flags(16bits),标志字段有IANA管理。未分配的保留位,必须有发送端初始化为0,接收端不做任何处理。

P:仅被记录度量使用。清零,路径上的节点成功记录了相关度量。置位,表示路径上一个或几个节点不能记录相关度量(要么因为缺少理解,要么因为被策略阻止)。

C:置位,表示Routing MC对象涉及一个路由约束。清零,涉及的是一个路由度量

O:该标志位只被路由约束使用(C置位)。当置位,表明定义在该对象体内的约束是可选的。当清零,约束是必须的。如果C标志位是0,O标志位必须被发送端置位0,接收端不处理。

R:只于路由度量相关,即C=0。当c=1时,必须清零。当R置位,表明沿着该路径路由度量被记录。想反,当清零,表示路由度量是聚合的。

A字段(3bits):该字段只于度量相关,被用来表明被聚合的路由度量是否是可附加、可增加的,是否报告一个最大或是最小:

A=0:路由度量是可附加的(additive)

A=1:路由度量报告一个最大值

A=2:路由度量报告一个最小值

A=3:路由度量是可增加的(multiplicative)

当C被置位的时候,A字段是没有意义的。只有当R清零,A字段才有效。另外,A字段必须置位零,同时接收方不进行处理。

 

Prec(4bits):该字段表明该RoutingMetric/Constraint 对象相对于容器中其它对象的优先度。当一个DAG度量容器包括几种路由度量对象的时候,该字段是有用的。它的变化范围0-15。0为最高优先。

 

例1:RPL构建一个DAG,满足所有节点是主电源供电,最好路径是较低被聚合的ETX。在本例中,DAG MC(DAG度量容器)携带两种Routing Metric/Constraint对象:一个是ETX度量对象(头部:c=0,O=0,A=00,R=0);另一个是节点能量约束对象(头部:c=1,O=0,A=00,R=0)。要注意的是一个RPL实例可能使用度量对象去报告一个最大(A=1)或是最小(A=2)。例如,如果最优路径要避免低质量链路,该路径度量报告一个maximum(A=1)(越高的ETX,越低的链路质量):当报告该链路质量度量(ETX)的DIO信息被一个节点处理时,选择通告节点作为一个父节点的每一个节点更新度量对象所携带的值,更新原则,只有当本地链路ETX高于度量对象所携带的值的时候,才会用本地链路ETX替换度量对象中的值。就这个约束而言,该对象体将会携带一个3.1中定义的节点能量约束对象,来表明节点必须是主电源供电:如果DIO消息中的约束不被满足,那么处理这个DIO消息的节点就不选择发送该通告的节点作为父节点

例2:RPL构建一个DAG,链路度量为链路质量水平(在4中定义),同时,链路质量水平必须沿路径记录。在这个例子中,DAG MC携带一个Routing Metric/Constraint对象:包含多个子对象的链路质量水平度量(c=0,O=0,A=00,R=1)。

 

一个Routing Metric/Constraint object 或许也包括一个或是多个附加的type-length-value(TLV)编码数据集。每一个RoutingMetric/Constraint TLV拥有同样的结构:

Type:1byte

Length:1byte

Value:variable

一个Routing Metric/Constraint TLV的length字段定义了value字段的长度,以字节为度量单位(从0-255)。

 

不能被辨别的TLVs必须被接收端忽略,即使正在被接收节点产生的DIOs消息所推送。

 

2.2 多DAG度量容器的使用

由于RPL选项的长度有1个字节编码,所以不能超过255字节,DAG MC当然也不能超过255字节。在绝大多数案例中,通告的路由度量和约束将不会需要很多的空间。但是,在某些场合或许需要大的空间,例如,一组路由度量将沿着一长路径被记录。此时,为避免溢出,正如6550中定义的,路由度量将使用多个DAG MC对象传送。

 

2.3 度量使用

当DAG MC包括一个单一的聚合度量(标量值),从度量类型中选择最佳路径的顺序关系。例如,对于跳数、链路时延和ETX,越低越好。相反的,节点能量或是吞吐量则是越高越好。

 

使用单一聚合度量的例子是节点能量优化路由。定义在3.2中的节点能量度量(E_E 字段)通过一个显式的最小函数(A字段)沿路径被聚合,同时,最优路径通过一个最大函数进行选择,因为度量是能量。

 

当DAG MC包括几个聚合度量,它们将根据Prec字段定义的优先度来被使用。

这是一个多聚合度量的例子:跳数为基本标准,链路质量水平作为次要标准,节点能量作为最终的决策者。在这样一个例子中,三个标准度量对象的Prec字段应当分别是0,1,2这样递增。

 

3 节点的度量/约束对象

3和4定义了几种链路和节点度量/约束对象。在一些案例中,一个特定类型不必超过一个对象。在那些案例中,若一种RPL实现接收到超过一种的那种类型的对象,那么第二种对象必须被忽略。

在一个约束面前,一个节点必须包括一个同种类型的度量。该度量被用来核对约束是否被满足。在所有的情况下,一个节点不会改变约束的内容

 

3.1 节点状态和属性对象(node state and attribut)

节点状态和属性对象(NSA)可以用来提供有关节点特征的信息。

NSA对象可以出现在DAG MC中。每个DAG MC应当只有一个NSA对象作为一个约束,同时,每个DAG MC应当只有一个NSA对象作为一个度量。

NSA对象或许也包括了一组TLVs,用来表述各种节点特征,当前没有TLV被定义。

NSA Routing Metric/Constraint Type已经被IANA分配了类型值,为1。

NSA对象体的格式:

Res flags(8bits):保留字段。该字段必须设置为零,同时接收端不做处理。

Flags(8bits):目前只定义了两个标志位

A:数据聚合属性。数据聚合属性被定义在rfc55486.2节作为一个需求罗列出。一些应用或许在路由决策中使用聚合节点属性,以此最小化网络中的流量,进而潜在增加了生存期在电池供电环境中。置位,表示节点可以作为作为一个流量聚合器使用。后续的文档可能定义可选的TLVs来描述节点流量聚合器功能。

O:节点的工作量在某些标量形式下很难决定和表述。然而,在路径计算,特别是要求最低时延的高敏感流量,节点工作量是一种有用的度量。节点工作量可以在cpu超负荷、缺少存储或其他任何节点相关条件下被设置。如何置位以及如何避免被置位的节点选择路径的算法并不是本文档的范围,但建议不要频繁改变该位,避免路由抖动。当置位,表明节点超负荷,可能无法处理流量。

 

3.2Node Energy Object

有时候会避免选择一个低能量的节点作为路由器;所以需要可以支持约束的路由。在这样的环境下,路由协议可能为某些流量计算出一条较长的路径(基于约束),以此来增加网络生存期。

能量对于LLN来说是非常重要的资源。同时对于各种供能方式也很难有一种抽象的概括。

不了解每次发送和接收数据包所消耗的能量,对于原始的能量值是没有意义的;无法评估某些对生命期有高水平约束的设备,那么生命期评估也是没有价值的。

考虑到试图解决如此广泛的约束的复杂性,本文档在方案中定义了两级保真度。

最简单的方案依靠2bits字段编码三类能量源:powered、battery和scavenger。这一简单方法或许满足很多应用。

较为复杂的方案,用一个单一参数来编码电池供电和拾荒节点的能量水平。对于scavengingnodes,8bits表示,E_E=P_in/P_out。收集的能量多于消耗的能量,那么高于100。对于电池供电设备,E_E表示当前预料生存期比上期望的最低生存期。剩余电量和实际能量消耗的评估是困难的,计算方法不在本文档范围,但给出了两个例子。如果节点可以计算他的平均电量消耗,可以这样计算E_E: E_E=P_max/P_now或是E_E=E_bat / [E_0 (T-t)/T]。

 

最优路由的一个例子,沿路由的所有电池供电节点max(min(E_E));让所有沿路由的拾荒节点E_E>100作为约束。

 

NE对象用来提供节点能量相关的信息,可以作为度量,也可以作为约束。

NE对象可以出现在DAG MC中。每个DAG MC应当只有一个NE对象作为一个约束,同时,每个DAG MC应当只有一个NE对象作为一个度量。

NE对象类型已经被IANA分配了类型值,为2。

NE对象体的格式:

NE对象也包括了一组TLVs,用来传递各种节点特征。

Flags(8bits):目前定义了三位:

I(included):只对约束有效。例如,路径只能包含主电源供电节点。置位:表明节点类型字段所定义的节点类型必须被包括。清零,则必须被排除。

T(nodeType):2bits,T=0,主电源供电节点;T=1,电池供电节点;T=2,拾荒节点

E(Estimation):当E被置位用于度量,表明E_E字段为节点剩余电量的百分比;清零,不提供剩余电量评估。当E置位用于约束,E_E字段定义了一个包括/排除的门限值:如果是inclusion,节点能量高于该门限值的被包括;如果是exclusion,低于门限值将被排除。

E_E(estimated-energy):8bits无符号整数字段,剩余电量评估百分比。只有E置位的时候有效,当E清零,该位必须为零。

 

3.3 hop Count Object

HP对象用来报告沿路径所遍历的节点的数量。

HP对象可以出现在DAG MC中。每个DAG MC应当只有一个HP对象作为一个约束,同时,每个DAG MC应当只有一个HP对象作为一个度量。

HP对象或许也包括了一组TLVs,用来表述各种节点特征,当前没有TLV被定义。

HP Routing Metric/Constraint Type已经被IANA分配了类型值,为3。

HP对象体的格式:

 

当被用作约束,DAG Root表明了一条路径可以遍历的最大节点数量。当达到该数目,其它的节点就不能再加入路径。当被用作度量,每个被访问的节点只是简单的增加Hop Count字段

路径上第一个节点在插入HopCount MC对象时,必须值Hop Count字段值为1

 

4 LinkMetric/Constraint Objects

4.1Throughput

Throuthput对象可以出现在DAG MC中。每个DAG MC应当只有一个Throughput对象作为一个约束,同时,每个DAG MC应当只有一个Throughput对象作为一个度量。

Throughput对象由throughput子对象组成,而且,至少由一个Throughput子对象组成。第一个Throughput子对象必须是最新评估的实际吞吐量。吞吐量的实际评估不在本文档定义范围内

每个Throughput子对象的长度固定为4bytes。

Throughput对象不包括任何TLVs。

Throughput object Type已经被IANA分配了类型值,为4。

Throughput对象体的格式:

Throughput:32bits。Throughput以32位无符号整数作为编码,每秒钟的字节数。

 

4.2Latency

Latency对象可以出现在DAG MC中。每个DAG MC应当只有一个Latency对象作为一个约束,同时,每个DAG MC应当只有一个Latency对象作为一个度量。

Latency对象由Latency子对象组成,而且,至少由一个Latency子对象组成。

每个Latency子对象的长度固定为4bytes。

Throughput对象不包括任何TLVs。

Throughput object Type已经被IANA分配了类型值,为5。

Throughput对象体的格式:

Latency:32bits无符号整数,以微秒为单位(百万分之一秒)。

Latency对象可以用作约束或是路径度量。例如,不想让延时超出某一值。在这种情况下,延迟对象就是一个约束。在另外的例子中,延时对象被用作一个聚合的附加度量,沿着路径更新来反应路径时延。

 

4.3Link Reliability

在LLNs,链路稳定性收到很多因素的干扰:信号衰减,各种形式的干扰等。误包率通常是可以被计算的,其他的度量(如误码率,平均出错时间)也都是从它推测而来。这种变化率并不仅仅在无线链路,也出现在PLC链路。

链路质量的改变可以影响网络的连通性;因此,链路质量被考虑为一个重要的路由度量。

本文定义了两种链路稳定性度量:Link Quality Level(LQL)和ETX Metric

RPL实现可以使用LQL、ETX,甚至是两者都用。

 

4.3.1LQL稳定性度量(略)

LQL使用一组离散的值,0到7来量化链路稳定性,0表示LQL为unknown,1表示最高链路质量等级。有关LQL的计算机制和算法由实现定义,这超出了本文档的范围

 

4.3.2ETX Reliability Object

ETX度量是从一个节点到一目的地成功传输一个数据包所传输的次数。ETX提供了一个离散值(可能不是整数),该值根据某一特定方程计算出,例如,某一实现可能使用这个方程:ETX= 1 / (Df * Dr),Df表示一个数据包被邻居接收的可能性,Dr表示成功接收确认数据包的可能性。本文档并没有义务来选定某一特定方程计算ETX值

 

ETX对象可能出现在DAG MC中。每个DAG MC中只能有一个ETX对象作为约束,度量也同样不能超过一个。

ETX对象由ETX子对象组成,必须至少要有一个子对象。每个ETX子对象的固定长度是16bits。

ETX对象不包括任何额外的TLVs。

ETX对象类型由IANA分配,为7.

ETX:16bits,ETX*128使用16bits无符号整数编码,取舍为最接近的整数值。例如,ETX =3.569,那么该对象的值,即ETX字段是457。如果ETX>511.9921875,那么该对象将取最大值65535

ETX对象可以用作约束或是路径度量。比如要求ETX不能超过某一值,此时是约束相关的;也可能被用作聚合度量,也即沿路径更新该值反应路径质量:当一个节点收到某一链路聚合的ETX值(从通告节点到DAG根所遍历的所有链路的链路ETX的总和,即累积路径ETX),如果选择那个节点作为优先父代,那么在通告他自己的新的路径ETX的时候,就要更新该路径ETX,通过将位于他自己和优先父代之间的本地链路的ETX值,加到接收到的路径成本(路径ETX)

 

4.4Link Color Object

4.4.1 链路颜色对象描述

LC对象是一个10bits的链路约束,用来为特定流量类型避免或是吸引特定链路。

LC对象可以用作度量或是约束。当作为度量使用,只能用作记录型度量。比如,DAG可能需要记录所有遍历过的链路的链路颜色。一种颜色和特定的位值相对应:换句话说,10bits的字段是一个标志字段,并不是一个标量值。之后,每一个节点依据用户定义的规则(例如,选择数量最多的首位被置1(比如是加密链路)的链路的路径)使用LC来选择父代。LC对象也能被用作约束。

当用作记录型度量,接收到的每种LC的链路数量信息可以使用计数器进行压缩。

LC对象无论作为度量还是约束,在MC中出现的次数不能超过一次。

每个LC对象必须至少有一个LC子对象。

ETX对象不包括任何额外的TLVs。

ETX对象类型由IANA分配,为8

Res flags(8bits):保留字段。发送端必须置为零,接收端不处理。

当LC对象用作记录型度量时,LC对象体由一个或多个LC Type 1 子对象:

当LC对象被用作约束,LC对象体由一个或是多个LC Type 2子对象:

Reserved(5bits):预留字段。发送端置为零,接收端不处理。

I:只与约束有关。置位,特定颜色的链路必须被包括;清零,特定颜色的链路必须被排除。

 

10bits的Link Color标志字段的每一位的意义由实现者自己定义

 

4.2Mode of Operation

链路颜色可以用作约束或是度量。

当被用作约束,LC对象表明某一特定颜色的链路应当被包括或是被排除出所计算的路径

当被用作记录型度量沿路径的每一个节点可以向DAG mc中插入LC对象,报告本地链路的颜色。如果已经存在一个LC对象报告了某一相似颜色,节点不必添加了另一个同样的LC子对象,而是必须增加计数器字段

 

5 动态度量和属性的计算

正如已经指出的那样,在LLNs中的许多情况下,动态计算度量具有极大的重要性。这主要是因为各种度量的改变很频繁,也就意味着需要去适应路由决定。对于网络中所报告的改变步幅必须多加留意。那些属性将会依据他们自己的时间尺度进行改变RPL控制报告的频率

为了最小化度量更新,应当使用多阈值算法决定更新发送的时间。在实际中,低通滤波和/或滞后应使用,以避免这些值的快速波动。最后,尽管使用动态度量算法计算路径的规范不在本文档的范围但建议尽量小心设计路由优化算法避免在度量值改变时,太过频繁的新路由计算

过量路由改变将会对流量和能量消耗产生不良影响,进而潜在的影响网络的可扩展性。

你可能感兴趣的:(OS,CONSTRAINT,metric,6lowpan,contiki,RFC6551,ETX)