RPL源路由的IPv6路由头
An IPv6 Routing Header for Source Routes with the Routing Protocol for Low-Power and Lossy Network (RPL)
摘要
在低功耗有损网络(LLNs)中,路由器上内存限制会会导致他们最多只能维持几个路由。在一些配置中,使用这些内存受限的路由器转发数据到LLN内的节点是必要的。在一些部署中,低功耗有损网络路由协议(RPL)可以用一个(如有向无环图(DAG)的根)或几个路由器来存储大部分的路由并转发IPv6数据包,采用源路由技术以避免在内存受限的路由器上存储大量的路由表。本文档描述了一种在RPL路由域内发送数据的新的IPb6路由头部类型。
1、引言
低功耗有损网络路由协议(RPL)是一种为低功耗有损网络(LLNs)[RFC6550]设计的距离矢量IPv6路由协议。这些网络通常是资源受限的(有限的数据率、处理能力、能源、内存等)。尤其是在一些LLN配置中使用LLN路由器:受限的内存会导致节点只能维持几个默认路由,没有到其他目的地的路由。但是,使用这些内存受限的路由器来转发数据包并维持到LLN内的节点的可达性是必须的。
.
为了使用内存受限的路由器的路径,RPL依赖源路由。在RPL一种部署模式中,性能较好的路由器手机路由信息并形成到RPL路由域内任意目的地的路径。为了发送数据,需要一种IPv6支持的源路由机制。
本文档描述了一种严格用于相同RPL路由域内RPL路由器之间的源路由头部(SRH);RPL路由域是指在一个单一管理者下的RPL路由器集合。路由域的边界是网络管理员通过设置与外部链接或域内链接定义的。
1.1 要求语言
本文中的关键词"MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT" "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", 和 "OPTIONAL" RFC2119的解释相同
2、 概述
SRH的格式来源于类型为0的源路由【RFC2460】. 然而,当一个带有SRH数据包其所有的IPv6目的地址都带有相同的前缀时,SRH引入了解压缩源路由实体的机制,这是在LLNs中使用源路由的典型场景。压缩机制减少了稀有资源的消耗,如信道能力等。
SRH在处理规则上也与RH0不同,这减轻了导致RH0被弃用【5095】的安全问题。 首先,RPL实行严格的源路由策略:源和目的之间的每一个和每一跳的源路由都在SRH中指定。注意源路由可能是实际源和目的之间路径的子集。这在下面将详细讨论。二是源路由仅用于RPL路由域中的RPL路由器上。RPL边缘路由器负责连接其他RPL路由域和使用其他路由协议的IP域。 边缘路由器不允许已经带有SRH头的报文进入或退出RPL路由域。三是RPL路由器丢弃带有多个IP地址被放置在任意一个接口上的报文,以此来避免回路发生。
在RPL路由器需要使用SRH来转发报文到它的目的节点时,有两种场景来决定如何包含SRH:
1、如果SRH指定了从源到目的的完整路径,那么路由器将SRH直接放在报文中;
2、如果SRH仅仅指定了从源到目的路径的一部分,路由器使用IPv6-in-IPv6隧道技术并且将SRH放置在外部IPv6头部。 隧道技术的使用保证了报文发送不被修改和ICMP错误返回给SRH的源而不是原始数据包的源。
在RPL网络中,场景1发生在当源和目的都在RPL路由域内并且单个SRH指定了从源到地址的整个路径,如下图所示:
RPL 路由域
在上面的场景中,从源S到目的D发送的报文有如下的包结构:
S的地址放在IPv6头的源地址字段。
携带SRH的数据包,D的地址放在SRH的(Address[1..n]的)最后一个实体上,当到达最后一跳时,D的地址被放置在被放在IPv6头的目的地址字段上。
在RPL网络中,场景2发生在所有的报文中,源或目的至少有一个在RPL路由域外,如下图所示:
在上述场景中,R可能指一个RPL边界路由器或(当连接其他RPL域时)或一个RPL路由器(当连接到hosts时).当报文在RPL路由域内转发时,具有如下的结构
注意外头部(包括SRH)的添加和删除应由RPL路由器完成。
只要RPL路由器在转发报文时需要插入源路由时,场景2也会发生。 在RPL中一个这样的例子是所有的RPL流量都会经过边缘路由器并且使用边缘路由器当报文发送到最终的目的节点。 当使用隧道模式包含SRH时,边界路由器将使用IPv6-in-IPv6并在外IPv6头部包含SRH来无修改地封装收到的报文。
RPL 路由域
在上述场景中,数据包从S经过低功耗有损网络边界路由器(LBR)发送到D.在S和LBR之间,报文用RPL建立起的DAG来寻路,不包含SRH。 LBR使用IPv6-in-IPv6技术来无修改地封装收到的报文,并将SRH放在外IPv6头部。
3. RPL路由头格式
源路由头有如下的格式:
Next Header 9位选择器。 标识紧跟路由头的头类型。与【RFC2460】中IPv6下一个头部的值相同
Hdr Ext Len 8位无符号整数。 路由头的字节长度(8位一个字节),不包括第一个字节。 注意当Adress[1..n]压缩时(CmprI或CmprE的值不为0),Hdr Ext Len 不等于地址数量的2倍。
Routing Type 8位选择器。 标识特定的路由头变量。 SRH应该设置路由类型为3.
Segments Left 8为无符号整数。路由部分剩余的数量。即在到达目的地之前明确列出的仍需要经过的路由数量。 SRH的发出者设置该字段为n, 包含在Adress[1..n]中的地址数量。
CmprI 4位无符号整数。 每一段前缀的字节数量(即1到n-1段),除了被忽略的最后一段。例如,在Adress[1..n-1]中,SRH带有完整的IPv6地址时设置CmprI为0.
CmprE 4位无符号整数。 被忽略的最后一段前缀的字节数量(即段n), 例如:在Address[n]中,SRH携带完整的IPv6地址。
Pad 4位无符号整数。 在SRH的结尾Address[n]后用于扩展的字节数量。
Reserved 字段未使用。 发送者必须将其初始化为0 ,接收者必须忽略它。
Address[1..n] 从1到n编码的地址矢量, [1..n-1]中每个矢量元素的大小是(16-CmprI),元素[n]的大小是(16-CmprE). SRH的发出者将下一跳IPv6地址(第一个)放在IPv6头的IPv6目的地址字段中,将第二跳IPv6地址作为Address[1..n]中的第一个地址(即Address[n]).
SRH和类型0路由头具有相同的基本结构。 当带有完整的IPv6地址时,CmprI, CmprE, 和 Pad字段的值位0。类型0路由头和SRH编码唯一不同的是路由类型字段的值。
对于一个RPL路由域,常见的网路的配置是RPL路由域内所有的路由器共享一个前缀。 为了当所有地址实体共享的前缀作为携带SRH的数据包的IPv6目的地址字段时,允许节点压缩Address[1..n]矢量, SRH引入了CmprI, CmprE, 和 Pad 字段。 CmprI 和 CmprE 标识了与携带SRH数据包IPv6目的字段共享的前缀的字节数据。共享的前缀字节数量并不在路由头中携带并且Address[1..n-1]中每个实体的大小是(16-CmprI),Address[n]的大小是(16-CmprE)个字节。 当CmprI或CmprE非0时,最后一个实体Address[n]和路由头的结尾处可能会存在没用到的字节。 Pad字段标识了用于填充的未使用的字节数。 注意,当CmprI和CmprE都为0时,Pad必须设置为0.
SRH禁止在一个路径中经过一个节点超过一次。在产生SRH时,源节点可能并不知道IPv6地址和节点的映射关系。 最低限度是 源节点必须确保IPv6地址不能出现多于一次。 IPv6源和封装报文的目的地址不能出现在SRH中。
组播地址禁止出现在SRH中或携带SRH的报文的IPv6目的地址字段中。
4 RPL路由器行为
4.1 生成源路由头
为了将IPv6报文发送到目的节点,路由器可能需要生成一个新的SRH并指定严格的源路由。 当路由器是原始数据的源节点并且目的节点已知在相同的RPL路由域内时,路由器应该直接在原始包中包含SRH. 否则, 路由器必须使用IPv6-in-IPv6隧道【RFC2473】技术,并将SRH放在隧道的头中。 使用IPv6-in-IPv6隧道技术能够确保被发送的数据包不被修改和SRH产生的ICMPv6错误会被发送到生成SRH的路由器上。
在使用IPv6-in-IPv6隧道技术时, 为了尊重原始报文的IPv6 跳数限制值, 生成SRH的路由器在转发数据时必须设置 Segments Left的值小于原始报文的IPv6 跳数限制值。 在源路由比原始报文的IPv6跳数多的情况下,在SRH只能包含初始跳数(有原始报文的IPv6跳数限制决定)。如果RPL路由器不是原始报文的源节点,原始报文的IPv6跳数限制字段在生成SRH之前是递减的。在生成源路由后,RPL路由器通过Segments Left 值来减少原始报文的跳数限制的值。 以这种方式处理Segments Left和原始报文的IPv6跳数字段可以确在没有隧道技术上的传统网络转发报文时按照预期发生保ICMPv6 Time Exceeded 错误。
为了避免分片, 希望采用的MTU的大小可以允许头部扩展(即至少1280+40(外IP头部)+ SRH_MAX_SIZE),SRH_MAX_SIZE是在给定的RPL网络中最大路径长度。 然而,为了利用这一点,通信端点需要知道沿路(如通过路径MTU发现)MTU的大小。不幸的是比较大的MTU大小并不是在所有的连接上都支持(如在IPv6低功耗无线个域网(6LowPAN)链路上是1280字节)。 然而, 可以预