IPv6报文的路由头封装方法及装置与流程

    专利2022-07-07  149


    本发明实施例涉及通信领域,具体而言,涉及一种ipv6报文的路由头封装方法及装置。



    背景技术:

    rfc8200(internetprotocol,version6(ipv6)specification)制定了ipv6规范,其中定义了routingheader,发送的ipv6报文的源节点可以在routingheader中包含一些中间节点信息,以控制报文在到达最终目的节点前访问这些中间节点。routingheader中的routingtype字段是可扩展的,可以设置不同的值,以定义不同的路由头,满足不同的场景。

    rfc6554(anipv6routingheaderforsourcerouteswiththeroutingprotocolforlow-powerandlossynetworks)针对低功耗和有损网络场景,定义了一种基于压缩后的ipv6地址信息进行源路由转发的路由头(由于routingtype字段的值为3,简称为rh3)。在低功耗和有损网络中,假设所有节点的ipv6地址都处于同一个前缀(prefix)内,那么在使用rh3做源路由转发时,rh3中包含的段列表中的每个元素只需存放它相比其它元素的差异部分,而所有元素的公共前缀被存放ipv6header的destinationaddress字段中。这样达到了节约rh3的字节开销的目的。rh3的适用场景非常有限,不支持在rh3中混编多种类型的具有多种差异部分长度的segment。

    rfc8754(ipv6segmentroutingheader)针对分段路由(segmentrouting)应用于ipv6网络的场景,简称srv6,也定义了一种基于经典ipv6地址进行源路由转发的路由头(由于routingtype字段的值为4,简称为rh4)。rh4包含的段标识列表(sidlist)中,每个元素都是占用16字节的ipv6地址,当指令列表很长时,会导致很长的报文头,严重的降低了报文的载荷效率。目前业界正在考虑在srv6网络中引入针对srv6段标识(sid)的压缩能力,以减少rh4的字节开销。由于srv6网络中支持的业务类型丰富,流量工程能力更强,所以不能简单的在srv6网络中套用上述rh3。



    技术实现要素:

    本发明实施例提供了一种ipv6报文的路由头封装方法及装置,以至少解决相关技术中srv6srh中包含的段标识列表很长时,导致报文封装效率低,甚至超过设备的报文处理能力,在实际网络中的应用非常受限的问题。

    根据本发明的一个实施例,提供了一种ipv6报文的路由头封装方法,包括:

    头节点对ipv6报文进行路由头的封装,并将封装后的所述ipv6报文发送至srv6域的下一节点,其中,所述路由头包括如下字段:

    nextheader:占8比特,表示在所述路由头之后的内层头类型;

    hdrextlen:占8比特,表示所述路由头的字节开销;

    routingtype:占8比特,表示所述路由头的类型;

    segmentsleft:占8比特,表示所述路由头所包含的段列表中,剩余待访问和处理的段的数量;

    listlen:表示所述路由头所包含的段列表的字节开销;

    offset:为占12比特的无符号整数,表示当前访问的segment在段列表中的位置;

    reserved:占12比特,保留字段;

    多个<st,cmprl,segment>,每个<st,cmprl,segment>为所述段列表中的一个元素,其中,st:占4比特,表示压缩后的段的类型;cmprl:占4比特,表示公共前缀的长度;segment:表示压缩后的段内容,其长度由st确定;

    padding:可选的填充字段。

    在一个示例性实施例中,所述ipv6报文的路由头还包括可选的tlv(type-length-value)字段。

    在一个示例性实施例中,所述st包括以下类型之一:

    类型0:表示相应的segment为完整的ipv6地址;

    类型1:表示相应的segment为1字节的ipv6地址片段,该ipv6地址片段可与相应的公共前缀拼接成完整ipv6地址;

    类型2:表示相应的segment为2字节的ipv6地址片段,该ipv6地址片段可与相应的公共前缀拼接成完整ipv6地址;

    类型3:表示相应的segment为3字节的ipv6地址片段,该ipv6地址片段可与相应的公共前缀拼接成完整ipv6地址;

    类型4:表示相应的segment为4字节的ipv6地址片段,该ipv6地址片段可与相应的公共前缀拼接成完整ipv6地址;

    类型5:表示相应的segment为5字节的ipv6地址片段,该ipv6地址片段可与相应的公共前缀拼接成完整ipv6地址;

    类型6:表示相应的segment为6字节的ipv6地址片段,该ipv6地址片段可与相应的公共前缀拼接成完整ipv6地址;

    类型7:表示相应的segment为7字节的ipv6地址片段,该ipv6地址片段可与相应的公共前缀拼接成完整ipv6地址;

    类型8:表示相应的segment为8字节的ipv6地址片段,该ipv6地址片段可与相应的公共前缀拼接成完整ipv6地址;

    类型9:表示相应的segment为3字节的mplslabel索引,通过该mplslabel索引可查询映射表获得完整ipv6地址;

    类型10:表示相应的segment为4字节的sr-mplssid索引,通过该sr-mplssid索引可查询映射表获得完整ipv6地址;

    类型11:表示相应的segment为4字节的bierbfr-id索引,通过该bfr-id索引可查询映射表获得完整ipv6地址。

    在一个示例性实施例中,当st为类型0时,cmprl表示segment字段的实际长度;当st为类型1-8时,cmprl表示相应segment所属的公共前缀的长度;当st为类型9-11时,cmprl的值无意义。

    在一个示例性实施例中,所述路由头中的段列表采用正序存放方式。

    在一个示例性实施例中,当srv6域的所有节点的srv6sid均具有相同的公共前缀,则将所述公共前缀存放在ipv6header的da中,将各节点的srv6sid的差异部分作为压缩后的信息存放在所述路由头的段列表中。

    在一个示例性实施例中,所述头节点在对所述ipv6报文封装所述路由头时,对于段列表<s1,s2,s3,...,sn>,将s1拷贝至ipv6header的da字段,如果s1被保存在所述路由头中,则offset设置为指向所述路由头中的段列表中的第二个元素,segmentleft=n-1,表示段列表中还剩下有n-1个段元素待处理,其中,n为正整数。

    在一个示例性实施例中,所述头节点在为所述ipv6报文封装所述路由头时,对于段列表<s1,s2,s3,...,sn>,将s1拷贝至ipv6header的da字段,如果s1未存放在所述路由头中,则offset设置为指向所述路由头中的段列表中的第一个元素,segmentleft=n-1,表示段列表中还剩下有n-1个段元素待处理,其中,n为正整数。

    在一个示例性实施例中,所述方法还包括:所述srv6域的中间节点或尾节点接收到所述ipv6报文时,如果ipv6header中的da与本地的ip地址匹配,并且ipv6header的nextheader字段提示下一层头是所述路由头,则继续处理所述ipv6报文。

    在一个示例性实施例中,继续处理所述ipv6报文包括:如果segmentsleft等于0,则继续处理内层载荷,所述内层载荷的类型根据所述路由头的nextheader字段确定;如果segmentsleft不等于0,则将segmentsleft减1,读取下一个segment,offset的当前值指向的就是下一个<st,cmprl,segment>的首地址,根据st的类型值,读取相应长度的segment,并结合cmprl的信息,将segment转换为完整的新ipv6address;使offset指向下一个<st,cmprl,segment>的首地址;如果offset大于listlen*8,则丢弃所述ipv6报文,并向ipv6header的sourceaddress发送差错报文;如果ipv6header的ipv6hoplimit值小于或等于1,则丢弃所述ipv6报文,并向ipv6header的sourceaddress发送icmptimeexceeded-hoplimitexceededintransit报文;如果ipv6header的ipv6hoplimit大于1,则将hoplimit减1;将转换得到的所述新ipv6address拷贝到ipv6header的da,并根据新的da查ipv6路由表转发所述ipv6报文。

    根据本发明的另一个实施例,提供了一种ipv6报文的路由头封装装置,位于头节点中,该装置包括:封装模块,用于对ipv6报文进行路由头的封装;发送模块,用于将封装后的所述ipv6报文发送至srv6域的下一节点,其中,所述路由头包括如下字段:

    nextheader:占8比特,表示在所述路由头之后的内层头类型;

    hdrextlen:占8比特,表示所述路由头的字节开销;

    routingtype:占8比特,表示所述路由头的类型;

    segmentsleft:占8比特,表示所述路由头所包含的段列表中,剩余待访问和处理的段的数量;

    listlen:表示所述路由头所包含的段列表的字节开销;

    offset:为占12比特的无符号整数,表示当前访问的segment在段列表中的位置;

    reserved:占12比特,保留字段;

    多个<st,cmprl,segment>,每个<st,cmprl,segment>为所述段列表中的一个元素,其中,st:占4比特,表示压缩后的段的类型;cmprl:占4比特,表示公共前缀的长度;segment:表示压缩后的段内容,其长度由st确定;

    padding:可选的填充字段。

    根据本发明的又一个实施例,还提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机程序,其中,所述计算机程序被设置为运行时执行上述任一项方法实施例中的步骤。

    根据本发明的又一个实施例,还提供了一种电子装置,包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器被设置为运行所述计算机程序以执行上述任一项方法实施例中的步骤。

    在本发明的上述实施例,提供了一种更灵活的支持多种段类型的分段路由扩展头,提供多种压缩方式,支持任意长度的sid的混编,能更好的在ipv6网络中部署分段路由功能。

    附图说明

    图1是根据本发明实施例的计算机终端的硬件结构框图。

    图2是根据本发明实施例的ipv6报文的路由头封装方法的流程图;

    图3是根据本发明实施例的扩展srh-mst的封装格式图;

    图4是根据本发明实施例一的网络拓扑图;

    图5是根据本发明实施例的srh-mst中所有segment为2字节ipv6地址片段的封装格式图;

    图6是根据本发明实施例的srh-mst中各segment为不同长度的ipv6地址片段的封装格式图;

    图7根据本发明实施例的是srh-mst中所有segment为3字节mplslabel的封装格式图;

    图8是根据本发明实施例的ipv6报文的路由头封装装置的结构示意图。

    具体实施方式

    下文中将参考附图并结合实施例来详细说明本发明的实施例。

    需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。

    本申请实施例中所提供的方法实施例可以在计算机终端或者类似的运算装置中执行。以运行在计算机终端上为例,图1是本发明实施例的方法所运行的计算机终端的硬件结构框图。如图1所示,该计算机终端可以包括一个或多个(图1中仅示出一个)处理器102(处理器102可以包括但不限于微处理器mcu或可编程逻辑器件fpga等的处理装置)和用于存储数据的存储器104,其中,上述计算机终端还可以包括用于通信功能的传输设备106以及输入输出设备108。本领域普通技术人员可以理解,图1所示的结构仅为示意,其并不对上述计算机终端的结构造成限定。例如,计算机终端还可包括比图1中所示更多或者更少的组件,或者具有与图1所示不同的配置。

    存储器104可用于存储计算机程序,例如,应用软件的软件程序以及模块,如本发明实施例中的方法对应的计算机程序,处理器102通过运行存储在存储器104内的计算机程序,从而执行各种功能应用以及数据处理,即实现上述的方法。存储器104可包括高速随机存储器,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器104可进一步包括相对于处理器102远程设置的存储器,这些远程存储器可以通过网络连接至其他终端。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。

    传输装置106用于经由一个网络接收或者发送数据。上述的网络具体实例可包括通信供应商提供的无线网络。在一个实例中,传输装置106包括一个网络适配器(networkinterfacecontroller,简称为nic),其可通过基站与其他网络设备相连从而可与互联网进行通讯。在一个实例中,传输装置106可以为射频(radiofrequency,简称为rf)模块,其用于通过无线方式与互联网进行通讯。

    在本实施例中提供了一种运行于网络架构的ipv6报文的路由头封装方法,图2是根据本发明实施例的方法流程图,如图1所示,该流程包括如下步骤:

    步骤s102,头节点对ipv6报文进行路由头的封装;

    步骤s104,将封装后的所述ipv6报文发送至srv6域的下一节点,其中,所述路由头包括如下字段:

    nextheader:占8比特,表示在所述路由头之后的内层头类型;

    hdrextlen:占8比特,表示所述路由头的字节开销;

    routingtype:占8比特,表示所述路由头的类型;

    segmentsleft:占8比特,表示所述路由头所包含的段列表中,剩余待访问和处理的段的数量;

    listlen:表示所述路由头所包含的段列表的字节开销;

    offset:为占12比特的无符号整数,表示当前访问的segment在段列表中的位置;

    reserved:占12比特,保留字段;

    多个<st,cmprl,segment>,每个<st,cmprl,segment>为所述段列表中的一个元素,其中,st:占4比特,表示压缩后的段的类型;cmprl:占4比特,表示公共前缀的长度;segment:表示压缩后的段内容,其长度由st确定;

    padding:可选的填充字段。

    在本实施例中,所述ipv6报文的路由头还包括可选的tlv字段。

    在本实施例中,所述st包括以下类型之一:

    类型0:表示相应的segment为完整的ipv6地址;

    类型1:表示相应的segment为1字节的ipv6地址片段,该ipv6地址片段可与相应的公共前缀拼接成完整ipv6地址;

    类型2:表示相应的segment为2字节的ipv6地址片段,该ipv6地址片段可与相应的公共前缀拼接成完整ipv6地址;

    类型3:表示相应的segment为3字节的ipv6地址片段,该ipv6地址片段可与相应的公共前缀拼接成完整ipv6地址;

    类型4:表示相应的segment为4字节的ipv6地址片段,该ipv6地址片段可与相应的公共前缀拼接成完整ipv6地址;

    类型5:表示相应的segment为5字节的ipv6地址片段,该ipv6地址片段可与相应的公共前缀拼接成完整ipv6地址;

    类型6:表示相应的segment为6字节的ipv6地址片段,该ipv6地址片段可与相应的公共前缀拼接成完整ipv6地址;

    类型7:表示相应的segment为7字节的ipv6地址片段,该ipv6地址片段可与相应的公共前缀拼接成完整ipv6地址;

    类型8:表示相应的segment为8字节的ipv6地址片段,该ipv6地址片段可与相应的公共前缀拼接成完整ipv6地址;

    类型9:表示相应的segment为3字节的mplslabel索引,通过该mplslabel索引可查询映射表获得完整ipv6地址;

    类型10:表示相应的segment为4字节的sr-mplssid索引,通过该sr-mplssid索引可查询映射表获得完整ipv6地址;

    类型11:表示相应的segment为4字节的bierbfr-id索引,通过该bfr-id索引可查询映射表获得完整ipv6地址。

    在本实施例中,当st为类型0时,cmprl表示segment字段的实际长度;当st为类型1-8时,cmprl表示相应segment所属的公共前缀的长度;当st为类型9-11时,cmprl的值无意义。

    在本实施例中,所述路由头中的段列表采用正序存放方式。

    在本实施例中,当srv6域的所有节点的srv6sid均具有相同的公共前缀,则将所述公共前缀存放在ipv6header的da中,将各节点的srv6sid的差异部分作为压缩后的信息存放在所述路由头的段列表中。

    在本实施例中,所述头节点在对所述ipv6报文封装所述路由头时,对于段列表<s1,s2,s3,...,sn>,将s1拷贝至ipv6header的da字段,如果s1被保存在所述路由头中,则offset设置为指向所述路由头中的段列表中的第二个元素,segmentleft=n-1,表示段列表中还剩下有n-1个段元素待处理。

    在本实施例中,所述头节点在为所述ipv6报文封装所述路由头时,对于段列表<s1,s2,s3,...,sn>,将s1拷贝至ipv6header的da字段,如果s1未存放在所述路由头中,则offset设置为指向所述路由头中的段列表中的第一个元素,segmentleft=n-1,表示段列表中还剩下有n-1个段元素待处理。

    在本实施例中,所述方法还包括:所述srv6域的中间节点或尾节点接收到所述ipv6报文时,如果ipv6header中的da与本地的ip地址匹配,并且ipv6header的nextheader字段提示下一层头是所述路由头,则继续处理所述ipv6报文。

    在本实施例中,继续处理所述ipv6报文包括:如果segmentsleft等于0,则继续处理内层载荷,所述内层载荷的类型根据所述路由头的nextheader字段确定;如果segmentsleft不等于0,则将segmentsleft减1,读取下一个segment,offset的当前值指向的就是下一个<st,cmprl,segment>的首地址,根据st的类型值,读取相应长度的segment,并结合cmprl的信息,将segment转换为完整的新ipv6address;使offset指向下一个<st,cmprl,segment>的首地址;如果offset大于listlen*8,则丢弃所述ipv6报文,并向ipv6header的sourceaddress发送差错报文;如果ipv6header的ipv6hoplimit值小于或等于1,则丢弃所述ipv6报文,并向ipv6header的sourceaddress发送icmptimeexceeded-hoplimitexceededintransit报文;如果ipv6header的ipv6hoplimit大于1,则将hoplimit减1;将转换得到的所述新ipv6address拷贝到ipv6header的da,并根据新的da查ipv6路由表转发所述ipv6报文。

    为了便于对本发明实施例所提供的技术方案的理解,下面将结合具体应用场景的实施例进行描述。

    考虑到srv6网络的以下实际需求,在本发明实施例中提出一种新的路由头以满足如下的一些需求。

    需求1:srv6网络中的所有节点的ipv6地址规划可能很规整(即这些节点的ipv6地址都具有相同的公共前缀),或者很杂乱,这两种情况均需要有相应的机制压缩报文中的srv6sidlist。

    需求2:srv6sidlist所表示的路径可能会穿越多个具有不同ipv6地址规划的域,因此压缩后的srv6sidlist中需要支持多种类型的压缩后段标识,不同类型的压缩后段标识具有不同的压缩后长度,比如有的压缩后段标识的长度为4字节,有的为2字节。

    需求3:ipv6报文在根据srv6sidlist转发时,不能丢失ipv6header中多个字段(如trafficclass、flowlabel)保存的有用信息。

    需求4:ipv6报文中的srv6sidlist在压缩后,必须能够仅仅根据报文自身所携带的信息还原出原始的未压缩的srv6sidlist信息,而不能依赖网络中各节点上的一些控制信息或者转发表项中给出的转发信息,因为这些信息可能发生震荡变化,与头节点已经发出的ipv6报文之间存在不匹配的时序问题。这个需求非常有利于第三方离线工具解析报文。

    需求5:支持与已经部署rh4的网络进行互通。

    需求6:报文在逐段转发时,必须有指针信息去真实和准确的反应还有多少剩余段待处理。

    现有的srv6srh(即rh4)中包含的段标识列表(sidlist)中,每个sid是128比特的ipv6地址,当sidlist很长时,报文封装效率很低,甚至超过设备的报文处理能力,在实际网络中的应用非常受限。本实施例针对此问题引入一种新的路由头及其使用方法。

    本实施例采用以下技术方案:在rfc8200定义的routingheader的基础上,引入一种新的路由头,其中的段列表中可支持多种段类型,我们将这种新的路由头称之为srh-mst(segmentroutingheaderwithmultiplesegmenttype)。假设建议向iana(internetassignednumbersauthority互联网数字分配机构)申请的routingtype字段的值为5。

    图3是srh-mst的格式,其中各字段描述如下:

    nextheader:占8比特,表示紧跟在srh-mst之后的内层头类型。其定义与取值可参考rfc8200。

    hdrextlen:占8比特,表示srh-mst的字节开销,即srh-mst中包含有多少个8字节,不考虑第一个8字节在内。其定义与取值可参考rfc8200。注意本专利所述的srh-mst中所包含的段列表中,每个段可能是一个压缩后的值,即每个段并不一定是16字节,所以hdrextlen的值并不一定是段列表中段数目的两倍。

    routingtype:占8比特,该字段的取值待iana(internetassignednumbersauthority互联网数字分配机构)分配,表明本路由头是srh-mst。

    segmentsleft:占8比特,表示srh-mst中所包含的段列表中,还剩下有多少个段待访问和处理。其定义与取值可参考rfc8200。

    listlen:srh-mst中所包含的段列表的字节开销,即整个段列表包含有多少个8字节。注意整个段列表的长度必须按照8字节对齐,即是8字节的整数倍。为了这个目的,可能需要在最后一个segment(即segmentn)之后填充无意义的0。listlen必须要小于hdrextlen。

    offset:占12比特的无符号整数,它的作用是当将srh-mst中所包含的段列表看成是一个以字节为单位的数组(假设记为segmentlist[])时,当前访问的segment在segmentlist[]中的下标。根据offset访问段列表中的元素时,其访问范围必须不能超过listlen*8所表示的范围。

    reserved:占12比特,保留字段,未定义。

    以下每一个<st,cmprl,segment>都描述了段列表中的一个元素。

    st:占4比特,segmenttype,段类型,表示压缩后的段的类型。当前定义以下类型:

    0:表示相应的segment为完整的ipv6地址,注意相应的segment字段并不一定占16个字节,其长度由cmprl给出,这是因为许多ipv6地址的低位部分为0,不必真的需要将整个16字节存放至segment字段中;

    1:表示相应的segment为1字节的ipv6地址片段,该ipv6地址片段可与相应的公共前缀拼接成完整ipv6地址;

    2:表示相应的segment为2字节的ipv6地址片段,该ipv6地址片段可与相应的公共前缀拼接成完整ipv6地址;

    3:表示相应的segment为3字节的ipv6地址片段,该ipv6地址片段可与相应的公共前缀拼接成完整ipv6地址;

    4:表示相应的segment为4字节的ipv6地址片段,该ipv6地址片段可与相应的公共前缀拼接成完整ipv6地址;

    5:表示相应的segment为5字节的ipv6地址片段,该ipv6地址片段可与相应的公共前缀拼接成完整ipv6地址;

    6:表示相应的segment为6字节的ipv6地址片段,该ipv6地址片段可与相应的公共前缀拼接成完整ipv6地址;

    7:表示相应的segment为7字节的ipv6地址片段,该ipv6地址片段可与相应的公共前缀拼接成完整ipv6地址;

    8:表示相应的segment为8字节的ipv6地址片段,该ipv6地址片段可与相应的公共前缀拼接成完整ipv6地址;

    9:表示相应的segment为3字节的mplslabel,通过该mplslabel可查询映射表获得完整ipv6地址;

    10:表示相应的segment为4字节的sr-mplssid(索引),通过该sr-mplssid可查询映射表获得完整ipv6地址;

    11:表示相应的segment为4字节的bierbfr-id,通过该bfr-id可查询映射表获得完整ipv6地址;

    需要说明的是,在本实施例中,除了上述类型外,还可以对st的其它类型值进行定义。

    cmprl:占4比特,commonprefixlength,公共前缀的长度(以字节为单位)。当st为0时,cmprl表示了segment字段的实际长度;当st为1~8所表示的地址片段类型时,cmprl表示了相应segment所属的公共前缀的长度;当st为mplslabel、sr-mplssid、bierbfr-id等映射索引时,cmprl的值没有意义,可设置为0。

    segment:压缩后的段内容,其长度由st决定,如前所述。

    padding:可选的填充字段,其内容也属于段列表,必须填0,以保证整个段列表按照8字节对齐,即listlen为8的整数倍。如果段列表本来已经满足8字节对齐了,则不需要有padding字段。

    optionaltypelengthvalueobjects:srh-mst中还可包含可选的tlv,用于其它各种更高级的应用场景。

    在本实施例中,srh-mst中的段列表采用正序存放方式,比如,对于一条逻辑上的segmentlist<s1,s2,s3,...,sn>,其中s1是逻辑上的第一个segment,sn是逻辑上的最后一个segment。如图1所示,segment1字段中存放的是s1的压缩后信息,segmentn字段中存放的是sn的压缩后信息。注意,将srh-mst中的段列表设计为采用逆序存放方式也是有可行的,正如现有技术中的srh(segmentroutingheader,参考rfc8754)那样,不过考虑到处理流程的简洁行,在本实施例中选择正序存放方式。

    在本实施例中,头节点在为报文封装srh-mst时:

    对于上述segmentlist<s1,s2,s3,...,sn>,s1将被拷贝至ipv6header的da字段,如果s1也被保存在srh-mst中(即segment1字段中存放的是s1的压缩后信息),则offset需要设置为指向segment2字段,即offset=1 sizeof(segment1)。另外,segmentleft=n-1,表示段列表中还剩下有n-1个段元素待处理。

    可选的,为了进一步节省srh-mst的字节开销,对于上述segmentlist<s1,s2,s3,...,sn>,因为s1已经被拷贝至ipv6header的da字段了,所以头节点也可以不将s1存放在srh-mst中。那么srh-mst中只需要包含n-1个segments,此时segment1字段中存放的是s2的压缩后信息,segmentn-1字段中存放的是sn的压缩后信息。offset需要设置为指向segment1字段,即itemoffset=0。另外,segmentleft=n-1,表示段列表中还剩下有n-1个段元素待处理。

    在后面的实施例中,将进一步描述在不同场景下srh-mst的段列表中如何存放压缩后的段信息。

    在实施例中,在中间节点或尾节点接收到ipv6报文时,如果ipv6header中的da与本地的ip地址匹配,并且ipv6header的nextheader字段提示下一层头是srh-mst,则继续按照如下的流程处理srh-mst:

    的首地址,则根据st的类型值,读取相应长度的segment,并结合cmprl的信息,将segment转换为最终的完整newipv6address,具体如下:

    如果st为0,则根据cmprl获取相应长度的segment,由于它已经是完整ipv6地址,因此不需要转换。读取的segment值将作为ipv6地址的高位,低位补零;

    如果st为1至8,则当前ipv6header的da字段所包含的数值中,高位相应cmprl长度的部分为公共前缀,将segment字段所包含的地址片段数值拼接在该公共前缀之后,低位部分补零,即可得到128比特的完整ipv6地址。注意这里所说的高位和低位,均是指一个数值在算术上的高位和低位,并非该数字在实际硬件存储中的高位和低位。

    如果st为9至11,则本地查询相应的映射表,从映射表项中获取完整ipv6地址;

    与现有技术相比,本实施例提供了一种更灵活的支持多种段类型的分段路由扩展头,提供多种压缩方式,支持任意长度的sid的混编,能更好的在ipv6网络中部署分段路由功能。

    实施例一

    本实例描述srh-mst的段列表中各个段元素均采用16位比特的ipv6地址片段作为压缩后sid内容。如图4所示的网络中,所有节点均分配128比特的经典srv6sid,这些srv6sid均处于相同的公共前缀(2001:db80::/32)中,例如:

    节点s分配用于标识节点的nodesid2001:db80:0100::;

    节点a分配用于标识节点的nodesid2001:db80:0a00::;

    节点b分配用于标识节点的nodesid2001:db80:0b00::,另外还为三层链路b->c分配用于标识链路的adjacencysid2001:db80:0b01::;

    节点c分配用于标识节点的nodesid2001:db80:0c00::;

    节点d分配用于标识节点的nodesid2001:db80:0d00::;

    假设建立一条从头节点s至尾节点d的srv6-te路径,其segmentlist为<nodea,nodeb,linkb->c,noded>,这条路径可能有头节点自身计算而得,或者请求控制器计算而得。该segmentlist可翻译成sidlist<2001:db80:0a00::,2001:db80:0b00::,2001:db80:0b01::,2001:db80:0d00::>。

    由于上述标识链路的adjacencysid2001:db80:0b01::本身也是可路由的,所以上述sidlist可以优化为<2001:db80:0a00::,2001:db80:0b01::,2001:db80:0d00::>。

    在头节点s上,将报文沿上述sidlist转发时,可以为报文封装ipv6header srh-mst。由于这些sid均具有相同的公共前缀,因此公共前缀可存放在ipv6header的da中,这些sid的差异部分则作为压缩后的信息存放在srh-mst的段列表中,如图5所示:

    第一个段元素对应的<st,comprl,segment>为<2,4,0a00>,表明segment1字段中存放的是2字节的ipv6地址片段,该ipv6地址片段可与相应的4字节长的公共前缀拼接成完整ipv6地址,公共前缀存放在ipv6header的da中。

    第二个段元素对应的<st,comprl,segment>为<2,4,0b01>,表明segment2字段中存放的也是2字节的ipv6地址片段,该ipv6地址片段可与相应的4字节长的公共前缀拼接成完整ipv6地址,公共前缀存放在ipv6header的da中。

    第三个段元素对应的<st,comprl,segment>为<2,4,0d00>,表明segment3字段中存放的也是2字节的ipv6地址片段,该ipv6地址片段可与相应的4字节长的公共前缀拼接成完整ipv6地址,公共前缀存放在ipv6header的da中。

    为了保证段列表的长度为8字节的整数倍,填充的padding字段占7个字节。此时listlen设置2,表示整个段列表的字节开销占用2个8字节。

    下面将描述报文沿该sr-te路径的转发过程:

    1)报文从头节点s出发向逻辑上第一个segmentnode(即节点a)转发,由于头节点掌握了压缩前的原始sidlist,所以可以直接将ipv6header的da设置为sidlist的第一个sid(2001:db80:0a00::)。

    此例中,由于第一个sid(2001:db80:0a00::)也被压缩后存放至srh-mst的段列表中,所以报文发出时,srh-mst的offset字段要发生偏移,指向第二个段元素,即offset=sizeof<st,cmprl,segment1>=3。

    srh-mst的segmentleft字段设置为2,表明还剩下2个段元素待处理。

    报文将根据ipv6header的da,查找路由表,向节点a转发。

    2)报文到达节点a时,根据ipv6header的da等于2001:db80:0a00::,命中本地的localsid表项,则继续根据ipv6header的nextheader识别出内层载荷为路由头,并根据路由头的routingtype识别出是srh-mst,顺序执行以下代码处理srh-mst:

    step1:检查发现segmentleft大于0,则将segmentleft减1,变为1;

    step2:从段列表中读取下一个segment元素,即读取segmentlist[offset=3],先读取第一个字节,得到<st,comprl>信息为<2,4>,即可知segment字段中存放的是2字节的ipv6地址片段,则继续读取2字节,得到0x0b01;

    step3:offset字段发生偏移,指向第三个段元素,即offset=offset sizeof<st,cmprl,segment2>=6。

    step4:将0x0b01转换成完整的16字节的ipv6地址,即,从ipv6header的da的逻辑高位4字节中获取公共前缀(2001:db80::),和0x0b01拼接得到2001:db80:0b01::,然后拷贝到ipv6header的da字段中;

    step5:根据ipv6header的da,查找路由表转发报文,报文将向节点b转发。

    3)报文到达节点b时,根据ipv6header的da等于2001:db80:0b01::,命中本地的localsid表项,则继续根据ipv6header的nextheader识别出内层载荷为路由头,并根据路由头的routingtype识别出是srh-mst,顺序执行以下代码处理srh-mst:

    step1:检查发现segmentleft大于0,则将segmentleft减1,变为0;

    step2:从段列表中读取下一个segment元素,即读取segmentlist[offset=6],先读取第一个字节,得到<st,comprl>信息为<2,4>,即可知segment字段中存放的是2字节的ipv6地址片段,则继续读取2字节,得到0x0d00;

    step3:offset字段发生偏移,指向第四个段元素,即offset=offset sizeof<st,cmprl,segment3>=9。注意这里实际上并不存在第四个段元素。

    step4:将0x0d00转换成完整的16字节的ipv6地址,即,从ipv6header的da的逻辑高位4字节中获取公共前缀(2001:db80::),和0x0d00拼接得到2001:db80:0d00::,然后拷贝到ipv6header的da字段中;

    step5:由于上述命中的localsid表项中提示将报文沿链路b-c转发,因此不必根据ipv6header的da查找路由表,直接将报文沿链路b-c转发。

    4)报文到达节点c时,ipv6header的da等于2001:db80:0d00::,不是节点c的本地地址,则节点c继续根据ipv6header的da查找路由表,将报文向节点d转发。

    5)报文到达节点d时,根据ipv6header的da等于2001:db80:0d00::,命中本地的localsid表项,则继续根据ipv6header的nextheader识别出内层载荷为路由头,并根据路由头的routingtype识别出是srh-mst,执行以下代码处理srh-mst:

    step1:检查发现segmentleft等于0,则移除ipv6header以及srh-mst,继续根据srh-mst的nextheader字段识别和处理内层载荷。

    需说明的是,本实施例中虽然是以单纯st=2来举例描述报文的封装与转发流程,实际上,其它st(1至8)的处理都是类似的,只不过srh-mst的段列表中各个段元素<st,cmprl,segment>的长度会与本实施例不同而已,另外也会影响srh-mst中相应的listlen字段以及offset字段的设置。例如,一个st=4的段元素<st,cmprl,segment>,其长度为5个字节,当从srh-mst中读取一个这样的段元素时,offset将累加5。

    实施例二

    本实施例在实施例一的基础上,考察srh-mst中混编不同st类型的段元素。仍然如图4所示,所有节点均分配128比特的经典srv6sid,假设节点s、a、b的srv6sid均处于相同的公共前缀(2001:db80::/32)中,节点c、d的srv6sid均处于相同的公共前缀(2002:db80::/32)中,比如:

    节点s分配用于标识节点的nodesid2001:db80:0100::;

    节点a分配用于标识节点的nodesid2001:db80:0a00::;

    节点b分配用于标识节点的nodesid2001:db80:0b00::,另外还为三层链路b->c分配用于标识链路的adjacencysid2001:db80:0b01::;

    节点c分配用于标识节点的nodesid2002:db80:0c00::;

    节点d分配用于标识节点的nodesid2002:db80:0d00::;

    同样的,假设建立一条从头节点s至尾节点d的srv6-te路径,其segmentlist为<nodea,nodeb,linkb->c,noded>,该segmentlist可翻译成sidlist<2001:db80:0a00::,2001:db80:0b01::,2002:db80:0d00::>。

    在头节点s上,将报文沿上述sidlist转发时,可以为报文封装ipv6header srh-mst。由于sidlist中,第一个sid和第二个sid具有相同的公共前缀,则它们可以共享ipv6header中的da中的公共前缀,仅在srh-mst的段列表中存放它们的差异部分;由于第三个sid的前缀与相邻上一个sid的前缀不同,所以在srh-mst中需要存放完整的sid信息。srh-mst的具体封装如图6所示:

    第一个段元素对应的<st,comprl,segment>为<2,4,0a00>,表明segment1字段中存放的是2字节的ipv6地址片段,该ipv6地址片段可与相应的4字节长的公共前缀拼接成完整ipv6地址,公共前缀存放在ipv6header的da中。

    第二个段元素对应的<st,comprl,segment>为<2,4,0b01>,表明segment2字段中存放的也是2字节的ipv6地址片段,该ipv6地址片段可与相应的4字节长的公共前缀拼接成完整ipv6地址,公共前缀存放在ipv6header的da中。

    第三个段元素对应的<st,comprl,segment>为<0,6,2002:db80:0d00>,表明segment3字段中存放的是6字节的完整ipv6地址(作为ipv6地址的高位部分,低位补零)。

    为了保证段列表的长度为8字节的整数倍,填充的padding字段占3个字节。此时listlen设置2,表示整个段列表的字节开销占用2个8字节。

    下面将描述报文沿该sr-te路径的转发过程:

    1)报文从头节点s出发向逻辑上第一个segmentnode(即节点a)转发,由于头节点掌握了压缩前的原始sidlist,所以可以直接将ipv6header的da设置为sidlist的第一个sid(2001:db80:0a00::)。

    此例中,由于第一个sid(2001:db80:0a00::)也被压缩后存放至srh-mst的段列表中,所以报文发出时,srh-mst的offset字段要发生偏移,指向第二个段元素,即offset=sizeof<st,cmprl,segment1>=3。

    srh-mst的segmentleft字段设置为2,表明还剩下2个段元素待处理。

    报文将根据ipv6header的da,查找路由表,向节点a转发。

    2)报文到达节点a时,根据ipv6header的da等于2001:db80:0a00::,命中本地的localsid表项,则继续根据ipv6header的nextheader识别出内层载荷为路由头,并根据路由头的routingtype识别出是srh-mst,顺序执行以下代码处理srh-mst:

    step1:检查发现segmentleft大于0,则将segmentleft减1,变为1;

    step2:从段列表中读取下一个segment元素,即读取segmentlist[offset=3],先读取第一个字节,得到<st,comprl>信息为<2,4>,即可知segment字段中存放的是2字节的ipv6地址片段,则继续读取2字节,得到0x0b01;

    step3:offset字段发生偏移,指向第三个段元素,即offset=offset sizeof<st,cmprl,segment2>=6。

    step4:将0x0b01转换成完整的16字节的ipv6地址,即,从ipv6header的da的逻辑高位4字节中获取公共前缀(2001:db80::),和0x0b01拼接得到2001:db80:0b01::,然后拷贝到ipv6header的da字段中;

    step5:根据ipv6header的da,查找路由表转发报文,报文将向节点b转发。

    3)报文到达节点b时,根据ipv6header的da等于2001:db80:0b01::,命中本地的localsid表项,则继续根据ipv6header的nextheader识别出内层载荷为路由头,并根据路由头的routingtype识别出是srh-mst,顺序执行以下代码处理srh-mst:

    step1:检查发现segmentleft大于0,则将segmentleft减1,变为0;

    step2:从段列表中读取下一个segment元素,即读取segmentlist[offset=6],先读取第一个字节,得到<st,comprl>信息为<0,6>,即可知segment字段中存放的是6字节的完整ipv6地址的高位部分,则继续读取6字节,得到2002:db80:0d00;

    step3:offset字段发生偏移,指向第四个段元素,即offset=offset sizeof<st,cmprl,segment3>=13。注意这里实际上并不存在第四个段元素。

    step4:将2002:db80:0d00::拷贝到ipv6header的da字段中;

    step5:由于上述命中的localsid表项中提示将报文沿链路b-c转发,因此不必根据ipv6header的da查找路由表,直接将报文沿链路b-c转发。

    4)报文到达节点c时,ipv6header的da等于2001:db80:0d00::,不是节点c的本地地址,则节点c继续根据ipv6header的da查找路由表,将报文向节点d转发。

    5)报文到达节点d时,根据ipv6header的da等于2001:db80:0d00::,命中本地的localsid表项,则继续根据ipv6header的nextheader识别出内层载荷为路由头,并根据路由头的routingtype识别出是srh-mst,执行以下代码处理srh-mst:

    step1:检查发现segmentleft等于0,则移除ipv6header以及srh-mst,继续根据srh-mst的nextheader字段识别和处理内层载荷。

    实施例三

    前述实施例均是举例地址拼接方式的压缩方案,它们依赖网络中的所有节点或者一部分节点的sid具有相同的公共前缀,不过,在有些ipv6网络中,由于历史上的地址规划原因,很难将网络中的节点(即使是很少量的节点)的sid规划在相同的公共前缀内。为了在这类ipv6网络中部署分段路由,我们需要考虑使用一种短小的索引去映射完整ipv6地址的方案。本实施讨论采用mpls标签作为短小的索引,其它类型的索引如sr-mpls的prefix-sid或者bier的bfr-id都是类似的。

    仍然如图4所示的网络中,所有节点均分配128比特的经典srv6sid,比如:

    节点s分配用于标识节点的nodesid2001:db80::0100;

    节点a分配用于标识节点的nodesid2002:db80::0a00;

    节点b分配用于标识节点的nodesid2003:db80::0b00;

    节点c分配用于标识节点的nodesid2004:db80::0c00;

    节点d分配用于标识节点的nodesid2005:db80::0d00;

    这些sid没有公共的前缀。

    假设各节点还为自身的sid分配短小的mpls标签,并将相应的mpls标签至sid的映射关系通告给网络中的其它节点,其它节点收到后,可以在本地重新分配入标签,创建相应的入标签转发表项,在入标签转发表项中给出映射sid信息。标签的分配与通告有多种方式,如ldp、sr-mpls等。在mpls架构中,这里的sid就相当于一种fec。为了使得描述简洁,我们假设对于一个fec而言,其入标签与出标签的值恰好相等。比如:

    节点s从节点a收到了针对sid2002:db80::0a00的标签(label-a)通告,节点s也为该sid分配入标签(label-a);

    节点a从节点b收到了针对sid2003:db80::0b00的标签(label-b)通告,节点a也为该sid分配入标签(label-b);

    节点b从节点c收到了针对sid2004:db80::0c00的标签(label-c)通告,节点b也为该sid分配入标签(label-c);

    节点c从节点d收到了针对sid2005:db80::0d00的标签(label-d)通告,节点c也为该sid分配入标签(label-d);

    节点d针对sid2005:db80::0d00分配标签(label-d);

    假设建立一条从头节点s至尾节点d的srv6-te路径,其segmentlist为<nodea,nodeb,nodec,noded>,这条路径可能有头节点自身计算而得,或者请求控制器计算而得。虽然该segmentlist可翻译成sidlist<2002:db80::0a00,2003:db80::0b00,2004:db80::0c00,2005:db80::0d00>,但是在srh-mst中封装这样的sidlist将占用非常大的字节开销。由于头节点或控制器知晓映射至这些sid的短小索引,因此更优的sidlist为<label-a,label-b,label-c,label-d>。

    在头节点s上,将报文沿上述sidlist转发时,可以为报文封装ipv6header srh-mst。如图7所示:

    第一个段元素对应的<st,comprl,segment>为<9,0,label-a>,表明segment1字段中存放的是3字节的mplslabel,该mplslabel查询入标签映射表项获得完整ipv6地址。

    第二个段元素对应的<st,comprl,segment>为<9,0,label-b>,表明segment2字段中存放的是3字节的mplslabel,该mplslabel查询入标签映射表项获得完整ipv6地址。

    第三个段元素对应的<st,comprl,segment>为<9,0,label-c>,表明segment3字段中存放的是3字节的mplslabel,该mplslabel查询入标签映射表项获得完整ipv6地址。

    第四个段元素对应的<st,comprl,segment>为<9,0,label-d>,表明segment4字段中存放的是3字节的mplslabel,该mplslabel查询入标签映射表项获得完整ipv6地址。

    由于段列表的长度已经为8字节的整数倍,因此无需填充padding。此时listlen设置2,表示整个段列表的字节开销占用2个8字节。

    下面将描述报文沿该sr-te路径的转发过程:

    1)报文从头节点s出发向逻辑上第一个segmentnode(即节点a)转发,由于头节点掌握了压缩前的原始sidlist<2002:db80::0a00,2003:db80::0b00,2004:db80::0c00,2005:db80::0d00>,所以可以直接将ipv6header的da设置为第一个sid(2002:db80::0a00)。或者,头节点可根据压缩后的sidlist<label-a,label-b,label-c,label-d>的第一个sid(即label-a)查询相应的入标签映射表项,获取到sid(2002:db80::0a00)信息,再将其拷贝到ipv6header的da字段。

    此例中,由于第一个sid(label-a)也存放至srh-mst的段列表中,所以报文发出时,srh-mst的offset字段要发生偏移,指向第二个段元素,即offset=sizeof<st,cmprl,segment1>=4。

    srh-mst的segmentleft字段设置为3,表明还剩下3个段元素待处理。

    报文将根据ipv6header的da,查找路由表,向节点a转发。

    2)报文到达节点a时,根据ipv6header的da等于2002:db80::0a00,命中本地的localsid表项,则继续根据ipv6header的nextheader识别出内层载荷为路由头,并根据路由头的routingtype识别出是srh-mst,顺序执行以下代码处理srh-mst:

    step1:检查发现segmentleft大于0,则将segmentleft减1,变为2;

    step2:从段列表中读取下一个segment元素,即读取segmentlist[offset=4],先读取第一个字节,得到<st,comprl>信息为<9,0>,即可知segment字段中存放的是3字节的mplslabel,则继续读取3字节,得到label-b;

    step3:offset字段发生偏移,指向第三个段元素,即offset=offset sizeof<st,cmprl,segment2>=8。

    step4:根据label-b查询相应的入标签映射表项,获取到sid(2003:db80::0b00)信息,再将其拷贝到ipv6header的da字段中;

    step5:根据ipv6header的da,查找路由表转发报文,报文将向节点b转发。

    3)报文到达节点b时,根据ipv6header的da等于2003:db80::0b00,命中本地的localsid表项,则继续根据ipv6header的nextheader识别出内层载荷为路由头,并根据路由头的routingtype识别出是srh-mst,顺序执行以下代码处理srh-mst:

    step1:检查发现segmentleft大于0,则将segmentleft减1,变为1;

    step2:从段列表中读取下一个segment元素,即读取segmentlist[offset=4],先读取第一个字节,得到<st,comprl>信息为<9,0>,即可知segment字段中存放的是3字节的mplslabel,则继续读取3字节,得到label-c;

    step3:offset字段发生偏移,指向第四个段元素,即offset=offset sizeof<st,cmprl,segment2>=12。

    step4:根据label-c查询相应的入标签映射表项,获取到sid(2004:db80::0c00)信息,再将其拷贝到ipv6header的da字段中;

    step5:根据ipv6header的da,查找路由表转发报文,报文将向节点c转发。

    4)报文到达节点c时,根据ipv6header的da等于2004:db80::0c00,命中本地的localsid表项,则继续根据ipv6header的nextheader识别出内层载荷为路由头,并根据路由头的routingtype识别出是srh-mst,顺序执行以下代码处理srh-mst:

    step1:检查发现segmentleft大于0,则将segmentleft减1,变为0;

    step2:从段列表中读取下一个segment元素,即读取segmentlist[offset=4],先读取第一个字节,得到<st,comprl>信息为<9,0>,即可知segment字段中存放的是3字节的mplslabel,则继续读取3字节,得到label-d;

    step3:offset字段发生偏移,指向第五个段元素,即offset=offset sizeof<st,cmprl,segment2>=16。注意这里实际上并不存在第五个元素。

    step4:根据label-d查询相应的入标签映射表项,获取到sid(2005:db80::0d00)信息,再将其拷贝到ipv6header的da字段中;

    step5:根据ipv6header的da,查找路由表转发报文,报文将向节点c转发。

    5)报文到达节点d时,根据ipv6header的da等于2005:db80::0d00,命中本地的localsid表项,则继续根据ipv6header的nextheader识别出内层载荷为路由头,并根据路由头的routingtype识别出是srh-mst,执行以下代码处理srh-mst:

    step1:检查发现segmentleft等于0,则移除ipv6header以及srh-mst,继续根据srh-mst的nextheader字段识别和处理内层载荷。

    本实施例中,不直接采用mpls转发是因为网络并不是一个纯粹的mpls网络,比如节点s与节点a之间并非直连,它们中间可能还存在其它ipv6-only的节点。本实施例仅仅用到了mpls的标签映射关系,并不是传统的mpls报文转发行为。

    实施例四

    从前述实施例可以轻易的推导出,在srh-mst的段列表中同时封装st(0-8)与st(9-11)类型的段元素也是可能的。这本质上是因为各个段元素的解封装是独立的,相互之间没有依赖关系,比如段列表中,当前段元素所包含的压缩信息完全由它自身的<st,cmprl,segment>三元组给出,能据此独立的转换得到完整的ipv6地址,与段列表中前一个段元素或者后一个段元素没有任何关系。

    对于这种包含有任意类型的段元素的srh-mst的报文转发流程,与前述实施例完全类似,具体不再赘述。

    通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如rom/ram、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。

    在本实施例中还提供了一种ipv6报文的路由头封装装置,该装置用于实现上述实施例及优选实施方式,已经进行过说明的不再赘述。如以下所使用的,术语“模块”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的装置较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。

    图8是根据本发明实施例的ipv6报文的路由头封装装置的结构框图,如图8所示,该装置位于srv6域的头节点100中,该装置包括封装模块10和发送模块20.

    封装模块10用于对ipv6报文进行路由头的封装。发送模块20用于将封装后的所述ipv6报文发送至srv6域的下一节点,其中,所述路由头包括如下字段:

    nextheader:占8比特,表示在所述路由头之后的内层头类型;

    hdrextlen:占8比特,表示所述路由头的字节开销;

    routingtype:占8比特,表示所述路由头的类型;

    segmentsleft:占8比特,表示所述路由头所包含的段列表中剩余待访问的段的数量;

    listlen:表示所述路由头所包含的段列表的字节开销;

    offset:为占12比特的无符号整数,表示当前访问的segment在段列表中的位置;

    reserved:占12比特,保留字段;

    多个<st,cmprl,segment>,每个<st,cmprl,segment>为所述段列表中的一个元素,其中,st:占4比特,表示压缩后的段的类型;cmprl:占4比特,表示公共前缀的长度;segment:表示压缩后的段内容,其长度由st确定;

    padding:可选的填充字段。

    需要说明的是,上述各个模块是可以通过软件或硬件来实现的,对于后者,可以通过以下方式实现,但不限于此:上述模块均位于同一处理器中;或者,上述各个模块以任意组合的形式分别位于不同的处理器中。

    本发明的实施例还提供了一种计算机可读存储介质,该计算机可读存储介质中存储有计算机程序,其中,该计算机程序被设置为运行时执行上述任一项方法实施例中的步骤。

    在一个示例性实施例中,上述计算机可读存储介质可以包括但不限于:u盘、只读存储器(read-onlymemory,简称为rom)、随机存取存储器(randomaccessmemory,简称为ram)、移动硬盘、磁碟或者光盘等各种可以存储计算机程序的介质。

    本发明的实施例还提供了一种电子装置,包括存储器和处理器,该存储器中存储有计算机程序,该处理器被设置为运行计算机程序以执行上述任一项方法实施例中的步骤。

    在一个示例性实施例中,上述电子装置还可以包括传输设备以及输入输出设备,其中,该传输设备和上述处理器连接,该输入输出设备和上述处理器连接。

    本实施例中的具体示例可以参考上述实施例及示例性实施方式中所描述的示例,本实施例在此不再赘述。

    显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。

    以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。


    技术特征:

    1.一种ipv6报文的路由头封装方法,其特征在于,包括:

    头节点对ipv6报文进行路由头的封装,并将封装后的所述ipv6报文发送至srv6域的下一节点,其中,所述路由头包括如下字段:

    nextheader:占8比特,表示在所述路由头之后的内层头类型;

    hdrextlen:占8比特,表示所述路由头的字节开销;

    routingtype:占8比特,表示所述路由头的类型;

    segmentsleft:占8比特,表示所述路由头所包含的段列表中剩余待访问的段的数量;

    listlen:表示所述路由头所包含的段列表的字节开销;

    offset:为占12比特的无符号整数,表示当前访问的segment在段列表中的位置;

    reserved:占12比特,保留字段;

    多个<st,cmprl,segment>,每个<st,cmprl,segment>为所述段列表中的一个元素,其中,st:占4比特,表示压缩后的段的类型;cmprl:占4比特,表示公共前缀的长度;segment:表示压缩后的段内容,其长度由st确定;

    padding:可选的填充字段。

    2.根据权利要求1所述的方法,其特征在于,所述ipv6报文的路由头还包括可选的类型长度值tlv字段。

    3.根据权利要求1所述的方法,其特征在于,所述st包括以下类型之一:

    类型0:表示相应的segment为完整的ipv6地址;

    类型1:表示相应的segment为1字节的ipv6地址片段,该ipv6地址片段可与相应的公共前缀拼接成完整ipv6地址;

    类型2:表示相应的segment为2字节的ipv6地址片段,该ipv6地址片段可与相应的公共前缀拼接成完整ipv6地址;

    类型3:表示相应的segment为3字节的ipv6地址片段,该ipv6地址片段可与相应的公共前缀拼接成完整ipv6地址;

    类型4:表示相应的segment为4字节的ipv6地址片段,该ipv6地址片段可与相应的公共前缀拼接成完整ipv6地址;

    类型5:表示相应的segment为5字节的ipv6地址片段,该ipv6地址片段可与相应的公共前缀拼接成完整ipv6地址;

    类型6:表示相应的segment为6字节的ipv6地址片段,该ipv6地址片段可与相应的公共前缀拼接成完整ipv6地址;

    类型7:表示相应的segment为7字节的ipv6地址片段,该ipv6地址片段可与相应的公共前缀拼接成完整ipv6地址;

    类型8:表示相应的segment为8字节的ipv6地址片段,该ipv6地址片段可与相应的公共前缀拼接成完整ipv6地址;

    类型9:表示相应的segment为3字节的mplslabel索引,通过该mplslabel索引可查询映射表获得完整ipv6地址;

    类型10:表示相应的segment为4字节的sr-mplssid索引,通过该sr-mplssid索引可查询映射表获得完整ipv6地址;

    类型11:表示相应的segment为4字节的bierbfr-id索引,通过该bfr-id索引可查询映射表获得完整ipv6地址。

    4.根据权利要求3所述的方法,其特征在于,其中,当st为类型0时,cmprl表示segment字段的实际长度;当st为类型1-8时,cmprl表示相应segment所属的公共前缀的长度;当st为类型9-11时,cmprl的值无意义。

    5.根据权利要求1所述的方法,其特征在于,其中,所述路由头中的段列表采用正序存放方式。

    6.根据权利要求1所述的方法,其特征在于,其中,当srv6域的所有节点的srv6sid均具有相同的公共前缀,则将所述公共前缀存放在ipv6header的da中,将各节点的srv6sid的差异部分作为压缩后的信息存放在所述路由头的段列表中。

    7.根据权利要求1所述的方法,其特征在于,其中,所述头节点在为所述ipv6报文封装所述路由头时,对于段列表<s1,s2,s3,...,sn>,将s1拷贝至ipv6header的da字段,如果s1被保存在所述路由头中,则offset设置为指向所述路由头中的段列表中的第二个元素,segmentleft=n-1,表示段列表中还剩下有n-1个段元素待处理,其中n为正整数。

    8.根据权利要求1所述的方法,其特征在于,所述头节点在为所述ipv6报文封装所述路由头时,对于段列表<s1,s2,s3,...,sn>,将s1拷贝至ipv6header的da字段,如果s1未存放在所述路由头中,则offset设置为指向所述路由头中的段列表中的第一个元素,segmentleft=n-1,表示段列表中还剩下有n-1个段元素待处理,其中n为正整数。

    9.根据权利要求1所述的方法,其特征在于,所述方法还包括:

    所述srv6域的中间节点或尾节点接收到所述ipv6报文时,如果ipv6header中的da与本地的ip地址匹配,并且ipv6header的nextheader字段提示下一层头是所述路由头,则继续处理所述ipv6报文。

    10.根据权利要求9所述的方法,其特征在于,其中,继续处理所述ipv6报文包括:

    如果segmentsleft等于0,则继续处理内层载荷,所述内层载荷的类型根据所述路由头的nextheader字段确定;

    如果segmentsleft不等于0,则将segmentsleft减1,读取下一个segment,offset的当前值指向的就是下一个<st,cmprl,segment>的首地址,根据st的类型值,读取相应长度的segment,并结合cmprl的信息,将segment转换为完整的新ipv6address;

    使offset指向下下一个<st,cmprl,segment>的首地址;

    如果offset大于listlen*8,则丢弃所述ipv6报文,并向ipv6header的sourceaddress发送差错报文;

    如果ipv6header的ipv6hoplimit值小于或等于1,则丢弃所述ipv6报文,并向ipv6header的sourceaddress发送icmptimeexceeded-hoplimitexceededintransit报文;如果ipv6header的ipv6hoplimit值大于1,则将所述hoplimit值减1;

    将转换得到的所述新ipv6address拷贝到ipv6header的da,并根据新的da查ipv6路由表转发所述ipv6报文。

    11.一种ipv6报文的路由头封装装置,位于头节点中,其特征在于,包括:

    封装模块,用于对ipv6报文进行路由头的封装;

    发送模块,用于将封装后的所述ipv6报文发送至srv6域的下一节点,其中,所述路由头包括如下字段:

    nextheader:占8比特,表示在所述路由头之后的内层头类型;

    hdrextlen:占8比特,表示所述路由头的字节开销;

    routingtype:占8比特,表示所述路由头的类型;

    segmentsleft:占8比特,表示所述路由头所包含的段列表中剩余待访问的段的数量;

    listlen:表示所述路由头所包含的段列表的字节开销;

    offset:为占12比特的无符号整数,表示当前访问的segment在段列表中的位置;

    reserved:占12比特,保留字段;

    多个<st,cmprl,segment>,每个<st,cmprl,segment>为所述段列表中的一个元素,其中,st:占4比特,表示压缩后的段的类型;cmprl:占4比特,表示公共前缀的长度;segment:表示压缩后的段内容,其长度由st确定;

    padding:可选的填充字段。

    12.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有计算机程序,其中,所述计算机程序被处理器执行时实现所述权利要求1至10任一项中所述的方法的步骤。

    13.一种电子装置,包括存储器、处理器以及存储在所述存储器上并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现所述权利要求1至10任一项中所述的方法的步骤。

    技术总结
    本发明实施例提供了一种IPv6报文的路由头封装方法及装置,该方法包括:头节点对IPv6报文进行路由头的封装,并将封装后的所述IPv6报文发送至SRv6域的下一节点,其中,所述路由头包括如下字段:Next Header:表示在所述路由头之后的内层头类型;Hdr Ext Len:表示所述路由头的字节开销;Routing Type:表示所述路由头的类型;Segments Left:表示所述路由头所包含的段列表中剩余待访问的段的数量;List Len:表示所述路由头所包含的段列表的字节开销;Offset:表示当前访问的Segment在段列表中的位置;保留字段;多个<ST,CmprL,Segment>,每个<ST,CmprL,Segment>为所述段列表中的一个元素,其中,ST表示压缩后的段的类型;CmprL表示公共前缀的长度;Segment表示压缩后的段内容;可选的填充字段。

    技术研发人员:彭少富
    受保护的技术使用者:中兴通讯股份有限公司
    技术研发日:2020.10.15
    技术公布日:2021.03.12

    转载请注明原文地址:https://wp.8miu.com/read-8370.html

    最新回复(0)