一种报文处理的方法及相关装置与流程

文档序号:30606526发布日期:2022-07-01 22:36阅读:137来源:国知局
一种报文处理的方法及相关装置与流程

1.本技术实施例涉及通信技术领域,尤其涉及一种报文处理的方法及相关装置。


背景技术:

2.在基于互联网协议第6版(internet protocol version 6,ipv6)的段路由流量工程策略(segment routing traffic engineering policy,sr-te policy)中,中间节点(midpoint)的上游节点可以代替中间节点完成转发报文的处理,这种上游节点可以称为代理转发(proxy forwarding)节点。
3.图1为中间节点发生故障的通信系统的示意图。在该通信系统中,正常情况下,报文从节点a发出,依次经过节点b、节点d和节点e,到达节点f,如图1中虚线箭头所示。然而,在某次事故或突发情况下,中间节点d发生了故障。此时中间节点d的上游节点b(代理转发节点)可以感知到报文的下一跳(中间节点d)接口故障,则该节点b修改报文中的参数,使得报文绕过故障节点d,经过节点c和节点e,到达节点f,如图1中实线箭头所示。上述方案称为基于ipv6的段路由流量工程中间节点保护(segment routing ipv6traffic engineering fast reroute,srv6 te frr)。
4.其中,节点b修改报文中的参数时需要将报文中节点d的下一跳的段标识(segment identifier,sid)更新到报文头中。当前,sid存在两种类型,一种是非压缩sid,另一种是压缩sid。而当包含多个sid的报文采用了非压缩sid和压缩sid混编时,节点b无法从报文中得知节点d的下一跳sid具体是非压缩sid还是压缩sid,导致了节点b无法将节点d的下一跳sid更新到报文头中,无法实现srv6 te frr。


技术实现要素:

5.本技术实施例提供了一种报文处理的方法及相关装置,能够根据报文中的预设标识解析当前sid的下一个sid的格式,并根据下一个sid的格式更新报文头的目标地址da字段,实现绕开该故障中间节点,并进行代理转发,实现srv6 te frr。
6.第一方面,本技术实施例提供一种报文处理的方法,包括:获取报文;若当前段标识sid对应节点为故障的中间节点,则执行以下步骤:根据报文中的预设标识,解析当前sid的下一个sid的格式,报文中的预设标识包含该报文中所有sid的压缩信息,下一个sid的格式包括压缩格式和非压缩格式;根据下一个sid的格式,更新报文头的目标地址da字段;根据更新后的da字段转发报文。本技术实施提供的方法能够根据报文中的预设标识解析当前sid的下一个sid的格式,并根据下一个sid的格式更新报文头的目标地址da字段,实现绕开该故障中间节点,并进行代理转发,实现srv6 te frr。
7.结合第一方面,在本技术实施例的一种实现方式中,获取报文之后,方法还包括:若当前段标识sid对应节点不为故障的中间节点,则按照既定规则转发报文。在该实现方式中,如没有出现故障,则可以按照正常流程转发该报文。
8.结合第一方面,在本技术实施例的一种实现方式中,根据报文中的预设标识,解析
当前sid的下一个sid的格式包括:从报文头的da字段中读取当前sid的继续压缩coc标记,coc标记用于下一个sid的格式为压缩格式或非压缩格式;根据当前sid的coc标记确定下一个sid的格式。在该实现方式中,通过coc标记来确定下一个sid的格式,简单方便。
9.结合第一方面,在本技术实施例的一种实现方式中,根据报文中的预设标识,解析当前sid的下一个sid的格式包括:从报文头的源地址sa字段中读取第一标识取值,第一标识取值为第一预设值表示报文头的da字段中包括第二标识,第一标识取值为第二预设值表示报文头的da字段中不包括第二标识,第二标识用于表示剩余压缩sid的行数;若第一标识取值为第二预设值,则确定下一个sid的格式为非压缩格式。在该实现方式中,通过第一标识可以确定da字段中是否包括表示剩余压缩sid行数的第二标识,若没有第二标识,则可以直接判断下一个sid的格式为非压缩格式。
10.结合第一方面,在本技术实施例的一种实现方式中,从报文头的源地址sa字段中读取第一标识取值之后,方法还包括:若第一标识取值为第一预设值,则从报文头的da字段中读取第二标识的取值;若第二标识的取值大于0,则确定下一个sid的格式为压缩格式。在该实现方式中,若第二标识的取值大于0,说明剩余还有至少一行压缩sid,则可以直接判断下一个sid的格式为压缩格式。
11.结合第一方面,在本技术实施例的一种实现方式中,从报文头的da字段中读取第二标识的取值之后,方法还包括:若第二标识的取值等于0,则从报文头的da字段中读取sid索引参数的取值,sid索引参数用于指示压缩sid的位置;若sid索引参数的取值为0,则确定下一个sid的位置在下一行,且下一个sid的格式为非压缩格式。在该实现方式中,当第二标识的取值等于0时,说明当前sid的同一行sid均为最后一行压缩sid,下一行sid为非压缩sid,进一步通过sid索引参数确定当前sid是否为该行最后一个sid。当sid索引参数的取值为0时,当前sid为该行最后一个sid,则下一个sid处于下一行,则下一个sid为非压缩sid。
12.结合第一方面,在本技术实施例的一种实现方式中,从报文头的da字段中读取sid索引参数的取值之后,方法还包括:若sid索引参数的取值大于0,则判断sid索引参数减一的位置是否有sid;若sid索引参数减一的位置有sid,则确定sid索引参数减一的位置的sid为下一个sid,且下一个sid的格式为压缩格式;若sid索引参数减一的位置没有sid,则确定下一个sid的位置在下一行,且下一个sid的格式为非压缩格式。在该实现方式中,sid索引参数的取值大于0说明当前sid不处于该行的最后一个位置,则进一步确定当前sid的下一个位置是否有sid,若有则该sid为压缩sid,若没有,则说明下一个sid处于下一行,则下一个sid为非压缩sid。
13.结合第一方面,在本技术实施例的一种实现方式中,根据下一个sid的格式,更新报文头的目标地址da字段包括:从报文头的sa字段中读取第三标识的取值,第三标识用于指示下一个压缩头sid对应的段剩余sl参数取值;若下一个sid对应的sl取值与第三标识相同,则确定下一个sid为压缩头sid,并将压缩头sid中的第二标识的预设值更新到报文头的da字段,将压缩头sid中的第三标识的预设值更新到报文头的sa字段,根据da字段中第二标识的更新情况确定第一标识的取值。在该实现方式中,由于压缩头中存储有第二标识和第三标识的信息,因此当下一个sid为压缩头sid时,可以根据该压缩头中第二标识和第三标识的信息更新到报文头中的sa字段和da字段,并da字段中第二标识的更新情况确定第一标识的取值。通过第一标识、第二标识和第三标识的更新,能够保证报文头中第一标识、第二
标识和第三标识是最新且准确的,保证下一个sid的格式能够准确判断出来。
14.结合第一方面,在本技术实施例的一种实现方式中,根据下一个sid的格式,更新报文头的目标地址da字段还包括:在所述下一个sid对应的sl取值与所述第三标识不相同,且sl减一的情况下,根据第二标识的取值情况更新第二标识,包括:若第二标识没有取值,则不更新第二标识;若第二标识取值为0,则删除第二标识,使得第二标识没有取值;若第二标识大于0,则将第二标识减一。在该实现方式中,若下一个sid不是压缩头且sl减一的时候,则可以按照上述方式更新第二标识。
15.结合第一方面,在本技术实施例的一种实现方式中,根据报文中的预设标识,解析当前sid的下一个sid的格式包括:获取报文中预设的压缩标记数组,压缩标记数组包括至少一个压缩标记,压缩标记为第三预设值表示对应的sid为非压缩格式,压缩标记为第四预设值表示对应的sid为压缩格式;根据压缩标记数组确定当前sid的下一个sid的格式。根据该压缩标记数组可以确定每一个sid的格式。在一些情况张红,根据该压缩标记数组还可以确定该sid是否是压缩头。
16.第二方面,本技术实施例提供一种报文处理的装置,包括:获取模块,用于获取报文;处理模块,用于若当前段标识sid对应节点为故障的中间节点,则执行以下步骤:根据报文中的预设标识,解析当前sid的下一个sid的格式,报文中的预设标识包含该报文中所有sid的压缩信息,下一个sid的格式包括压缩格式和非压缩格式;根据下一个sid的格式,更新报文头的目标地址da字段;转发模块,用于根据更新后的da字段转发报文。
17.结合第二方面,在本技术实施例的一种实现方式中,转发模块,用于:若当前段标识sid对应节点不为故障的中间节点,则按照既定规则转发报文。
18.结合第二方面,在本技术实施例的一种实现方式中,处理模块,用于:从报文头的da字段中读取当前sid的继续压缩coc标记,coc标记用于下一个sid的格式为压缩格式或非压缩格式;根据当前sid的coc标记确定下一个sid的格式。
19.结合第二方面,在本技术实施例的一种实现方式中,处理模块,用于:从报文头的源地址sa字段中读取第一标识取值,第一标识取值为第一预设值表示报文头的da字段中包括第二标识,第一标识取值为第二预设值表示报文头的da字段中不包括第二标识,第二标识用于表示剩余压缩sid的行数;若第一标识取值为第二预设值,则确定下一个sid的格式为非压缩格式。
20.结合第二方面,在本技术实施例的一种实现方式中,处理模块,用于:若第一标识取值为第一预设值,则从报文头的da字段中读取第二标识的取值;若第二标识的取值大于0,则确定下一个sid的格式为压缩格式。
21.结合第二方面,在本技术实施例的一种实现方式中,处理模块,用于:若第二标识的取值等于0,则从报文头的da字段中读取sid索引参数的取值,sid索引参数用于指示压缩sid的位置;若sid索引参数的取值为0,则确定下一个sid的位置在下一行,且下一个sid的格式为非压缩格式。
22.结合第二方面,在本技术实施例的一种实现方式中,处理模块,用于:若sid索引参数的取值大于0,则判断sid索引参数减一的位置是否有sid;若sid索引参数减一的位置有sid,则确定sid索引参数减一的位置的sid为下一个sid,且下一个sid的格式为压缩格式;若sid索引参数减一的位置没有sid,则确定下一个sid的位置在下一行,且下一个sid的格
式为非压缩格式。
23.结合第二方面,在本技术实施例的一种实现方式中,处理模块,用于:从报文头的sa字段中读取第三标识的取值,第三标识用于指示下一个压缩头sid对应的段剩余sl参数取值;若下一个sid对应的sl取值与第三标识相同,则确定下一个sid为压缩头sid,并将压缩头sid中的第二标识的预设值更新到报文头的da字段,将压缩头sid中的第三标识的预设值更新到报文头的sa字段,根据da字段中第二标识的更新情况确定第一标识的取值。
24.结合第二方面,在本技术实施例的一种实现方式中,处理模块,用于:在所述下一个sid对应的sl取值与所述第三标识不相同,且sl减一的情况下,根据第二标识的取值情况更新第二标识,包括:若第二标识没有取值,则不更新第二标识;若第二标识取值为0,则删除第二标识,使得第二标识没有取值;若第二标识大于0,则将第二标识减一。
25.结合第二方面,在本技术实施例的一种实现方式中,处理模块,用于:获取报文中预设的压缩标记数组,压缩标记数组包括至少一个压缩标记,压缩标记为第三预设值表示对应的sid为非压缩格式,压缩标记为第四预设值表示对应的sid为压缩格式;根据压缩标记数组确定当前sid的下一个sid的格式。
26.第三方面,本技术实施例提供一种报文处理的设备,包括:网络接口、处理器和存储器;网络接口用于接收报文;存储器用于存储程序指令;处理器用于执行程序指令,以实现第一方面的方法。
附图说明
27.图1为中间节点发生故障的通信系统的示意图;
28.图2为本技术实施例中报文格式的示例图;
29.图3a为段列表字段的示意图之一;
30.图3b为段列表字段的示意图之二;
31.图4为sid字段的示意图;
32.图5为采用非压缩sid和压缩sid混编的报文示例图;
33.图6为现有技术中采用混编sid的报文传输情况示意图;
34.图7为本技术实施例提供的一种报文处理的方法的示例图;
35.图8为本技术实施例中步骤703的一种实现步骤流程图;
36.图9a为本技术应用例一的架构示意图;
37.图9b为本技术应用例一报文的srh拓展头的示意图;
38.图10a为本技术应用例二的架构示意图;
39.图10b为本技术应用例二报文的srh拓展头的示意图;
40.图11a为本技术应用例三中srh拓展头的示意图;
41.图11b为本技术应用例提供一种应用流程示意图;
42.图12为本技术实施例提供的一种报文处理的装置的示意图;
43.图13为本技术实施例提供的一种报文处理的设备的示意图。
具体实施方式
44.本技术实施例提供了一种报文处理的方法及相关装置,能够根据报文中的预设标
识解析当前sid的下一个sid的格式,并根据下一个sid的格式更新报文头的目标地址da字段,实现绕开该故障中间节点,并进行代理转发,实现srv6 te frr。
45.本技术的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本技术的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“对应于”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
46.在本技术实施例中,“示例性的”或者“例如”等词用于表示作例子、例证或说明。本技术实施例中被描述为“示例性的”或者“例如”的任何实施例或设计方案不应被解释为比其它实施例或设计方案更优选或更具优势。确切而言,使用“示例性的”或者“例如”等词旨在以具体方式呈现相关概念。
47.为了下述各实施例的描述清楚简洁,首先给出相关技术的简要介绍:
48.图1为中间节点发生故障的通信系统的示意图。当中间节点d发生故障时,报文的转发过程如下:
49.1、节点a向目的节点f转发报文,并在报文的sr扩展报文头(segment routing header,srh)中指定经过中间节点d。以下对本技术实施例中报文的格式进行简要介绍:
50.图2为本技术实施例中报文格式的示例图。该报文的格式可以包括但不限于三部分,第一部分为ipv6报文头201,该部分包括版本字段,用于表明该报文对应的ipv6协议版本。下一级报文头(next header)字段,用于表示下一级报文头的类型。示例性的,下一级报文头字段的值为43,则表示该ipv6报文头201的下一级报文头是srh。源地址(source address)字段,用于表示该报文的源地址。目标地址(destination address)字段,用于表示该报文的目标地址。第二部分为srh202,该部分包括段剩余(segment left,sl)字段,该字段相当于一种索引,用于指示设备读取当前报文应该访问的下一个中间节点(当sl=0时为目的节点)的信息。段列表(segment list)字段,用于搭载该报文需要经过的中间节点的信息或目的节点的信息。可以理解的是,segment list[0]一般为目的节点的信息。可以理解的是,节点首先可以读取sl的值,然后根据sl的值读取相应的segment list。示例性的,节点读取到sl的值为1,则节点将会读取segment list[1]。报文中的sl和segment list配合可以使得报文在转发过程中,通过sl的变更来更新当前报文需要到达的下一个中间节点。第三部分为ipv6的报文负荷(ipv6 payload)203,用于搭载报文的数据。
[0051]
在实际应用中,该报文实际上还包括一些现有的字段,为简要描述,本技术实施例对此省略,不再赘述。该报文还可以包括其他字段,以实现其他功能,本技术实施例对此不做限定。
[0052]
图3a为段列表字段的示意图之一。segment list一般为128位,本技术实施例以128位为例子进行描述。当sid采用非压缩格式时,sid的字段也是128位,则该行segment list即是一个sid。图3b为段列表字段的示意图之二。当sid采用压缩格式时,sid的字段仅需32位,则该行segment list可以包括4个sid。可以理解的是,当实际情况中没有达到4个压缩sid时(例如一行segment list中仅包括3个sid),则相应位置可以留空,具体可以用相
应位置的值全部置零的方式表示留空。即,段列表(segment list)中包括一个非压缩分段标识(segment id,sid)或包括多个压缩sid。当段列表中包括多个压缩sid时,可以通过sid索引(sid index,si)参数和sl来确定sid的位置。示例性的,si为0表示该段列表的最后一个sid,则sl=5、si=0表示sl=5对应的段列表的最后一个sid。
[0053]
图4为sid字段的示意图。一般地,非压缩的sid字段可以包括3部分,位置标识(locator)字段、功能(function)字段和变量(args)字段。其中,locator字段包括公共前缀部分(common prefix)和设备标识部分(nodeid),function字段用于表示该节点所支持的功能,args字段可以用于实现自定义的作用或用于携带一些参数。
[0054]
相较于非压缩的sid,压缩的sid一般会省略公共前缀部分和参数部分,使得sid的长度减少到32位。在实际应用中,压缩的格式可以采用通用段标识(generalized segment identifier,g-sid),还可以采用其他压缩格式,本技术实施例对此不做限定。
[0055]
图1中,节点a发出报文时(报文状态一),该报文中ipv6部分的目标地址为4::,说明该报文下一个中间节点为节点d。srh部分的第一个sid的设备标识为6::,说明该报文的目的节点为节点f,第二个sid的设备标识为4::,说明该报文被指定为经过中间节点d。
[0056]
2、报文到达节点b时,由于节点d故障,其上游节点b感知到报文下一跳接口故障,而下一跳正好是报文当前的目的地址4::,且此时sl》0,所以节点b执行代理转发行为。具体地,节点b将sl减1,并将下层sid 6::复制到外层ipv6报文头的目的地址字段(即将中间节点的下一跳的sid复制,需要先知道该中间节点的下一跳的sid类型是压缩还是非压缩,图1的示例中默认为非压缩sid)。此时由于sl=0,节点b可以去掉srh扩展报文头,然后根据目的地址6::查表转发。此时报文被节点b处理后为状态二。
[0057]
3、节点b处理报文为状态二后,节点b根据状态二的报文情况,建立报文到节点f的路径。由于节点b到目的地址6::之间的路径中,路径b-d-e-f的cost为30(除特殊标记外,每个节点之间的cost为10),而路径b-c-e-f之间的cost为1020。因此对于节点b来说,目的地址6::的主下一跳依然是节点d。由于目的地址6::的主下一跳依然是节点d,但是节点b不是该目的地址的倒数第二跳,且sl=0,所以节点b不再符合代理转发条件,而是按照正常ti-lfa转发流程切换到备份路径转发,备份路径的repair segment list为《3::5》,所以节点b使用“h.insert”的方式封装segment list 3::5,新增1个srh扩展报文头(sl置一),则报文以状态三被节点b发送出去,经过备份路径转发到节点f。
[0058]
4、根据ti-lfa流程,在节点a感知到节点d故障,且igp完成收敛以后,节点a删除到节点d的路由转发表项,所以节点a根据4::查表转发的时候,无法命中路由,此时节点a就要作为代理转发节点执行代理转发行为,sl减1,并将下层sid 6::更新到外层ipv6报文头,然后根据目的地址6::查表转发到节点b。节点b如果完成收敛,则按照收敛后的最短路径将报文转发到节点f;节点b如果未完成收敛,则按照ti-lfa流程经过备份路径转发到节点f。通过上述方式,就绕过了故障节点d。
[0059]
然而,通信系统中希望能够采用压缩sid和非压缩sid混编来降低报文开销。具体地,srv6技术在网络中实际部署当前主要面临二个方面的挑战:一是srv6报文开销大、网络链路带宽利用率低,256byte包长8层sid的情况下带宽利用率只有60%左右;二是srv6报文处理对芯片要求高,现网设备难以支持深度的srh头的复制和操作,并且128bit的sid处理会降低现有芯片的处理效率。针对标准srv6技术存在的问题,需要对标准srv6的srh进行压
缩优化,采用更简洁短小的g-sid,如典型的32bit sid标识,以优化srv6的sid,将标准128bit的sid采用32bit的g-sid来表示并替代其在srh头中的封装,从而将标准srv6的srh封装开销优化,在支持srv6功能的同时大大优化srv6的性能。示例性的,压缩sid的格式为nodeid+compressfunc,其中nodeid是一台设备的全域唯一标识,compressfunc为压缩sid的功能字段。如图5所示,图5为采用非压缩sid和压缩sid混编的报文示例图。为简洁,图5仅示出segment list部分。该报文既包括非压缩sid也包括压缩sid,能够节省报文开销,提高芯片处理效率。
[0060]
而代理转发节点处理这种非压缩sid和压缩sid混编的报文时,若遇到报文中当前sid故障,那么代理转发节点无法确定当前sid的下一个sid类型是压缩还是非压缩,则无法将当前sid的下一个sid复制到ipv6报文头的目的地址字段,无法绕过故障节点,无法实现srv6 te frr。
[0061]
具体地,图6为现有技术中采用混编sid的报文传输情况示意图。该携带非压缩sid和压缩sid混编的报文从节点pe-a传输至节点pe-b的过程中,网络设备a收到的报文头为:(s,sida)(vpnsid,sidc,sidb,sida,sidx;sl=3)。当网络设备b发生故障时,a设备需要跳过sidb,将sidc替换到da上去以指导转发。由于sidc的格式是由sidb的flavor指示的,网络设备a在转发时不知道sidb的flavor,使得网络设备a不知道sidc的格式(压缩或非压缩),就无法拷贝sidc到ipv6报文头的da上去。
[0062]
现有的方案为te frr降级,即直接将sl置0,将srh中最后的vpn sid替换到da,得到包(s,vpnsid)(vpnsid,sidc,sidb,sida,sidx;sl=0)或者(s,vpnsid),然后转发出去。然而,te frr降级在某些情况下是不可接受的,因为降级到srv6-be后,流量完全按照igp最短路径转发,完全丧失了流量工程的能力,对于某些网络来说,可能使得流量走到不应该走的路径上去,比如低带宽链路,导致流量丢失。
[0063]
针对上述问题,本技术实施例提供了一种报文处理的方法,能够把节点解析srh所需的信息携带在srh中,使得节点可以解析整个srh,因此节点能够在不对te frr降级的情况下绕过故障节点,实现srv6 te frr。
[0064]
图7为本技术实施例提供的一种报文处理的方法的示例图。该方法可由接收到报文的节点(网络设备)执行,该流程包括:
[0065]
701、获取报文;
[0066]
在本技术实施例中,该节点可以接收来自上一跳节点的报文。该报文中一般包括ipv6报文头、srh和ipv6 payload部分,与前述图2对应的报文格式类似,但在一些实施例中可能会增加一些参数字段,具体可参照后续步骤。
[0067]
在本技术实施例中,若接收到报文的节点是中间节点,则该中间节点在接收到报文之后,可以将下一个sid拷贝到da中,以实现中间节点的转发功能,然后再根据报文和下一个中间节点是否故障的情况判断是否需要执行本技术实施例后续步骤的代理转发。若接收到报文的节点不是中间节点,则该节点可以按照da中的sid转发该报文。
[0068]
在本技术实施例中,中间节点一般是指sid对应的节点,用于将报文中的sl减一,将对应的sid拷贝到ipv6报文头中的da字段中,实现报文的转发功能。
[0069]
702、判断当前sid对应节点是否为故障的中间节点,若是,则执行步骤703,若否,则执行步骤70x;
[0070]
在本技术实施例中,当前sid可以在该节点接收到的报文中,从ipv6报文头中的da字段读取得到。
[0071]
若当前sid对应的节点为故障的中间节点,说明该报文到达该故障的中间节点后无法正常转发,应绕开该故障中间节点。因此本技术实施例通过步骤703以及后续步骤实现绕开该故障中间节点,并进行代理转发,实现srv6 te frr。
[0072]
若当前sid对应的节点不是故障的中间节点,例如是正常运作的中间节点,则接收到报文的节点可以按照传统方案将报文转发到该正常运作的中间节点。
[0073]
可以理解的是,一般情况下,故障中间节点的上一跳网络设备可以确定该中间节点是否故障。示例性的,上一跳网络设备可以通过发送检测报文等方式确定该中间节点是否故障。在一些情况下,其他相关的网络设备也可以通过一定的方式确定该中间节点是否故障,本技术实施例对此不做限定。
[0074]
703、根据报文中的标识,解析当前sid的下一个sid的格式;
[0075]
在本技术实施例中,在报文中的sid既包括非压缩sid也包括压缩sid时,要实现代理转发,首先要确定当前sid的下一个sid的格式。具体地,本技术实施例通过在生产报文时将所有sid的压缩信息以预设的标识形式存储在该报文中,使得后续节点接收到该报文后能够根据报文中的标识,解析当前sid的下一个sid的格式。其中,预设的标识可以根据实际情况设定,本技术实施例提供三种预设的标识如下:
[0076]
第一种、通过继续压缩(continue of compress,coc)标记确定当前sid的下一个sid的格式。
[0077]
在该实现方式中,头节点生成非压缩sid和压缩sid混编的报文时,头节点可以在每个sid的功能字段(function)中设计一个coc标记来表示下一个sid是非压缩sid还是压缩sid。
[0078]
因此,当节点接收到该报文的时候,可以从ipv6报文头中的da字段读取到当前sid的coc标记。根据该当前sid的coc标记,接收到报文的节点可以确定当前sid的下一个sid的格式。
[0079]
可以理解的是,对于非压缩sid,当节点将该sid拷贝到da字段中时,参数字段(arg字段)也一并拷贝上去。对于压缩sid,压缩sid一般包括节点id(nodeid)部分和功能(function,具体可以为压缩功能compressfunc)字段部分。而在本技术实施例中,压缩sid还可以包括参数字段,该参数字段中包括coc标记。因此,当节点将该sid拷贝到da字段中时,参数字段(arg字段,带有coc标记)也是一并拷贝上去。所以,无论对于非压缩sid还是压缩sid,节点都能从ipv6报文头中的da字段中读取到当前sid的coc标记。
[0080]
可以理解的是,本技术实施例以在参数字段中设置coc标记为例进行举例,在实际应用中,也可以在功能字段或其他字段中设置coc标记,本技术实施例对coc标记的具体位置不做限定。
[0081]
第二种、通过剩余压缩sid行数量(compress sid line left,csll)字段、下一个压缩头索引(next compress header index,nchi)字段和da包含csll(da contain csll,daccsll)字段来确定当前sid的下一个sid的格式。
[0082]
csll用于指示当前的连续压缩sid何时结束。该csll有3种情况,一种是没有取值,表示当前sid不是压缩sid且下一行sid也不是压缩sid,另一种是取值为0,则说明本行sid
为最后一行压缩sid,下一行sid为非压缩sid,还有一种是取值大于0,则说明后续n行为压缩sid,n为csll的取值。可以理解的是,本技术实施例中csll取值大于或等于0。
[0083]
当报文中采用非压缩sid和压缩sid混编时,报文中既有非压缩sid也有压缩sid,并且,压缩sid的前一个非压缩sid称为压缩头sid。该压缩头sid是非压缩sid的一种,一般地,大小有128bit。示例性的,压缩头sid的格式为:block+nodeid+compressfunc+nchi+csll+si,其中,block是全域共用的前缀,nodeid是一台设备的全域唯一标识,nodeid+compressfunc构成压缩sid,si用于指示当前压缩sid在一行中的位置。
[0084]
csll的预设值一般存储在压缩头sid中。当压缩头sid对应的设备转发报文时,或压缩头sid对应的设备故障,由其他设备代理转发该报文时,压缩头sid中的csll被拷贝到ipv6报文头中的da字段,以便读取。当其他sid(即不是压缩头sid)对应的设备转发该报文时,若da字段中存在csll且不为0,则将da字段中的csll减一,若da字段中存在csll且为0,则将da字段中的csll去除,若da字段中不存在csll,则不用特别处理。
[0085]
daccsll用于指示da字段中是否存在csll。接收到报文的节点可以根据该daccsll的情况确定是否从da字段中读取csll。示例性的,daccsll取值为1说明da字段中存在csll,daccsll取值为0说明da字段中不存在csll。在实际应用中,也可以采用其他值来表示da字段中是否存在csll,本技术实施例对此不做限定。
[0086]
接收到报文的节点对da字段中的csll进行处理后,可以根据da字段中的csll确定daccsll的取值。最后再将该报文转发出去,使得后续节点能够根据daccsll的取值确定是否从da字段中读取csll。
[0087]
daccsll可以设置在ipv6报文头中的sa字段,以便读取。在实际应用中,daccsll还可能设置在报文的其他部分,本技术实施例对此不做限定。
[0088]
nchi用于指示下一个压缩头的位置。具体地,nchi的取值即为该下一个压缩头对应的sl索引。示例性的,nchi的取值为9,则说明sl=9对应的sid为压缩头sid。
[0089]
nchi的预设值一般存储在压缩头sid中。当压缩头sid对应的设备转发报文时,或压缩头sid对应的设备故障,由其他设备代理转发该报文时,压缩头sid中的nchi被拷贝到ipv6报文头中的sa字段,以便读取。
[0090]
在本技术实施例中,csll、nchi和daccsll的首个当前值均可以由头节点指定。可以理解的是,csll、nchi和daccsll的当前值是指在sa或da中读取得到的值。而csll、nchi的预设值一般存储在压缩头sid中,当需要的时候可以对预设值进行读取来更新当前值。可以理解的是,由于头节点生成报文时是确定所有sid的压缩情况的,因此头节点在生成报文时可以设定预设值的具体取值,以及当前值的初始值。
[0091]
头节点编排sid list下表的时候,自动计算出每一个压缩头sid的csll和nchi,将这两个标识携带在对应的压缩头sid中,并确定当前的daccsll取值(设置在ipv6报文头中的sa字段)。通过上述标识,接收到报文的节点可以知道压缩头的位置以及该压缩头后续压缩sid的行数,从而确定每一段压缩sid从哪里开始到哪里结束,确定该报文所有sid的压缩情况(即非压缩和压缩两种情况),从而可以确定当前sid的下一个sid的格式。该节点还通过daccsll取值确定是否读取csll,防止csll错误读取。
[0092]
图8为本技术实施例中步骤703的一种实现步骤流程图。在该实现方式中,节点可以执行如下流程,以根据报文中的标识,解析当前sid的下一个sid的格式:
[0093]
801、读取sa中的daccsll取值,若是1,则执行步骤803,若不是1,则执行步骤802;
[0094]
在本技术实施例中,节点先从ipv6报文头中sa字段读取daccsll取值,若是1,说明da字段中包含csll取值,可以读取csll取值做进一步判断。若不是1,则说明da字段中不包含csll取值,表示当前sid不是压缩sid且下一行sid也不是压缩sid,那么下一个sid为非压缩sid。
[0095]
本技术实施例以daccsll取值为1表示da字段中包含csll取值,在实际应用中可以以其他取值来表示,本技术实施例对此不作限定。
[0096]
802、下一个sid为非压缩sid;
[0097]
根据步骤801中的描述,节点可以确定下一个sid为非压缩sid。
[0098]
在步骤802的情况下,节点可以更新其中一些标识的取值,具体地,节点可以通过读取sa中nchi确定该下一个sid是否为压缩头sid。示例性的,nchi的取值与sl减一的取值相同,则说明下一个sid为压缩头sid。当下一个sid为压缩头sid时,节点可以将该压缩头sid中的nchi更新替换到ipv6报文头中的sa、将该压缩头sid中的csll更新替换到ipv6报文头中的da。并且,节点还可以根据da中是否包括csll的情况更新daccsll的取值。
[0099]
若下一个sid不是压缩头sid,而是普通的非压缩sid,因此csll取值仍然没有,daccsll的取值依然为0。
[0100]
803、读取da中的csll取值,若是0,则执行步骤805,若不是0,则执行步骤804;
[0101]
在本技术实施例中,节点可以ipv6报文头中da字段读取csll取值,若是0,说明本行sid为最后一行压缩sid,下一行sid为非压缩sid,而下一个sid处于本行还是下一行需要进一步确定。可以理解的是,本技术实施例中的本行sid为当前sid所在那一行的sid,下一行sid为sl减一对应的一行sid。
[0102]
若csll取值不是0(本技术实施例中csll取值大于或等于0),说明剩余至少还有一行压缩sid,那么下一个sid一定是压缩sid,可以执行步骤804。
[0103]
804、下一个sid为压缩sid;
[0104]
根据步骤803中的描述,节点可以确定下一个sid为压缩sid。
[0105]
在步骤804的情况下,节点可以更新其中一些标识的取值,具体地,步骤804的情况为csll取值大于0,那么节点可以进一步确定该下一个sid在当前sid的同一行还是下一行。若该下一个sid在当前sid的同一行,则节点可以将si值减一即可。若该下一个sid在当前sid的下一行,则节点可以将csll的取值减一,且sl的值减一,si的值置为3(本技术实施例以一行可以包括4个压缩sid为例,因此si的值最大为3)。
[0106]
805、读取da中的si取值,若是0,则执行步骤806,若不是0,则执行步骤807;
[0107]
可以理解的是,si参数用于表示该sid在该行中的位置。示例性的,si取值为0,则当前sid处于所在行的最后一个位置,si取值为1,则当前sid处于所在行的倒数第二个位置,以此类推。
[0108]
在本技术实施例中,节点可以通过si的取值判断下一个sid处于本行还是下一行。具体地,若节点读取到si取值为0,说明该sid处于本行最后一个位置,下一个sid处于下一行,结合步骤803中读取到的csll取值为0(表示下一行sid为非压缩sid)可以确定该下一个sid为非压缩sid。
[0109]
若si取值不是0,则说明该sid不处于本行最后一个位置,则需要判断在该行中,该
sid的后面位置是否还有sid。
[0110]
806、sl减一对应位置的sid为非压缩sid。
[0111]
根据步骤805中的描述,节点可以确定下一个sid为非压缩sid,并且,下一个sid处于下一行。因此,节点可以确定sl减一对应位置的sid(即下一行sid)为非压缩sid。
[0112]
在步骤806的情况下,节点可以更新其中一些标识的取值,具体地,步骤806的情况为下一个sid为下一行的非压缩sid,csll的取值为0,那么节点可以读取nchi的取值与sl比较确定该下一个sid是否为压缩头sid,若是,则节点可以将该压缩头sid中的nchi更新替换到ipv6报文头中的sa、将该压缩头sid中的csll更新替换到ipv6报文头中的da。并且,节点还可以根据da中是否包括csll的情况更新daccsll的取值。
[0113]
若该下一个sid不是压缩头sid,则节点可以将csll的取值删除,并将daccsll置零。
[0114]
807、判断si减一对应位置是否有sid,若没有,则执行步骤808,若有,则执行步骤809。
[0115]
在本技术实施例中,节点可以检查srh拓展头中si减一的位置是否有sid。示例性的,若节点检查到si减一的位置全部置零(本技术实施例中,sid对应位置全部置零表示该位置没有sid),则说明该位置没有sid,那么下一个sid一般在下一行。在一些实施例中,节点可以先检查si减一对应位置是否有sid,再检查si减二对应位置是否有sid,直到检查该行该sid后面所有位置都没有sid,则确定下一个sid在下一行。结合步骤803中读取到的csll取值为0(表示下一行sid为非压缩sid)可以确定该下一个sid为非压缩sid。
[0116]
若节点检查到srh拓展头中si减一的位置有sid,则该sid为下一个sid,并且是压缩sid。示例性的,节点检查到si减一的位置不是全部置零,则说明该位置有sid。而结合803中读取到的csll取值为0(表示本行sid为最后一行压缩sid),节点可以确定下一个sid为本行的下一个位置的sid,并且是压缩sid。
[0117]
808、sl减一对应位置的sid为非压缩sid。
[0118]
根据步骤807中的描述,节点可以确定下一个sid为非压缩sid,并且,下一个sid处于下一行。因此,节点可以确定sl减一对应位置的sid(即下一行sid)为非压缩sid。
[0119]
在步骤808的情况下,节点可以更新其中一些标识的取值,具体地,步骤808的情况为下一个sid为下一行的非压缩sid,csll的取值为0,那么节点可以读取nchi的取值与sl比较确定该下一个sid是否为压缩头sid,若是,则节点可以将该压缩头sid中的nchi更新替换到ipv6报文头中的sa、将该压缩头sid中的csll更新替换到ipv6报文头中的da。并且,节点还可以根据da中是否包括csll的情况更新daccsll的取值。
[0120]
若该下一个sid不是压缩头sid,则节点可以将csll的取值删除,并将daccsll置零。
[0121]
809、si减一对应位置的sid为压缩sid。
[0122]
根据步骤807中的描述,节点可以确定下一个sid为压缩sid,并且,下一个sid处于本行的下一个位置。因此,节点可以确定si减一对应位置的sid(即本行下一个位置的sid)为压缩sid。
[0123]
在步骤809的情况下,节点可以更新其中一些标识的取值,具体地,步骤809的情况为下一个sid在当前sid同一行的下一个位置,那么节点可以将si的值减一即可。
[0124]
第三种、通过srh拓展头中的tlv字段确定当前sid的下一个sid的格式。
[0125]
在该实现方式中,头节点生成报文时,可以在该报文的srh拓展头中增加一行tlv字段,用于确定当前sid的下一个sid的格式。具体地,报文的srh拓展头尾部可以增加tlv压缩标记数组(compress flags array,cfa)字段,该字段的格式为:type+length+value。其中,value由多个压缩标识组成,该多个压缩标识与srh拓展头中sid的压缩情况一一对应,并且这些标识的数量与srh拓展头中sid的行数一般相同。这些标识可以从上到下逐行表示srh拓展头中sid的压缩情况,也可以从下到上逐行表示srh拓展头中sid的压缩情况,本技术实施例对此不做限定。每个标识的两种取值分别表示sid和sid所在行的存储格式为压缩或非压缩。示例性的,标识取值为0则表示对应行的sid为非压缩,标识取值为1则表示对应行的sid均为压缩。
[0126]
进一步地,节点通过cfa即可知道该srh拓展头中所有sid的压缩情况。在一些情况下,节点可以根据其他方法确定当前sid是否包括si参数,再根据si参数以及相关情况确定下一个sid所对应的sl,最后根据该sl对应的cfa确定该下一个sid的存储格式。在不采用其他方法确定当前sid是否包括si参数时,本技术应用例提供一种应用流程可以完全根据cfa及相关情况确定下一个sid的存储格式。具体可参阅后续图11b相关的描述,此处不再赘述。
[0127]
可以理解的是,在转发报文时,该tlv_cfa字段一般无需修改,因此对转发性能无影响。可以理解的是,节点接收到这种报文时,可以从tlv_cfa字段确定该报文所有sid的压缩情况(即非压缩和压缩两种情况),从而可以确定当前sid的下一个sid的格式。
[0128]
704、根据下一个sid的格式,更新ipv6报文头的da;
[0129]
若下一个sid的格式为非压缩格式,则将下一个sid整个替换到ipv6报文头的da;
[0130]
若下一个sid的格式为压缩格式,则将下一个sid替换到ipv6报文头的da的nodeid+compressfunc。示例性的,下一个sid为压缩格式且具体为nodeid2+compressfunc2,而ipv6报文头的da字段为a1+nodeid1+compressfunc1+d1,则节点可以将da字段替换为a1+nodeid2+compressfunc2+d1。
[0131]
在一些实现方式中,该接收到报文的节点还需要更新一些标识的当前值,具体可参照图8对应的各个实施例,此处不再赘述。在实际应用中,第二种标识的修改可以总结为:
[0132]
在拷贝sid来替换更新ipv6报文头的da时,若拷贝的sid对应的sl值与当前读取到的nchi取值相同,则说明该拷贝的sid为压缩头sid。此时节点可以将该压缩头sid中的nchi更新替换到ipv6报文头中的sa、将该压缩头sid中的csll更新替换到ipv6报文头中的da(拷贝时更新)。
[0133]
在拷贝sid来替换更新ipv6报文头的da时,若该拷贝的sid不是压缩头sid,则节点可以根据csll的取值来更新csll。分为三种情况,若当前csll没有取值,则节点无需更新csll。若当前csll的取值为0,则节点可以将csll的取值删除。若当前csll的取值大于0,则节点可以将csll的取值减一。
[0134]
在拷贝sid来替换更新ipv6报文头的da之后,节点还可以根据da中是否包括csll的情况更新daccsll的取值。有些情况下,例如该拷贝的sid为压缩sid且当前sid与拷贝的sid在同一行时,节点可以直接确定csll的取值不变,daccsll的取值不变,因此无需更新,以简化处理步骤。当然,若节点在每次更新ipv6报文头的da之后均检查da中是否包括csll(或者检查该过程中是否有更新csll,若有更新csll则同时更新daccsll)来更新daccsll的
取值,则可以提高方案的稳定性,不易出错。
[0135]
705、根据更新后的ipv6报文头的da进行转发该报文。
[0136]
在本技术实施例中,当节点接收到报文时,可以按照步骤702的方式判断当前sid对应节点是否为故障的中间节点。若是,则节点执行步骤703至步骤705,确定当前sid的下一个sid格式,更新ipv6报文头的da然后转发该报文。若否,则执行步骤706,按照正常流程转发该报文。
[0137]
可以理解的是,步骤705中根据更新后的ipv6报文头的da进行转发该报文时,节点可以返回步骤702,再次判断当前sid对应节点是否为故障的中间节点。若是,则节点执行步骤703至步骤705,实现代理转发功能,若否,则执行步骤706。因此,若存在连续的故障中间节点,该节点可以连续代理转发,从而绕过连续的故障中间节点。
[0138]
706、按照正常流程转发该报文。
[0139]
在本技术实施例中,若节点判断当前sid对应节点不为故障的中间节点,那么无需跳过该中间节点,可以按照正常流程进行转发。
[0140]
本技术实施例中,节点接收到报文后,判断当前sid对应节点是否为故障的中间节点。若是,则根据报文中的标识确定当前sid的下一个sid格式,根据该格式可以更新ipv6报文头的da并转发该报文,从而绕过该故障的中间节点,进行代理转发,实现srv6 te frr。
[0141]
报文中的标识能够包含该报文中所有sid的压缩信息,在实际应用中,本技术实施例提供三种应用例来说明报文中的标识的具体形式。
[0142]
1、应用例一:
[0143]
图9a为本技术应用例一的架构示意图。报文从设备4依次进过设备3、设备2、设备1传输至设备0。设备4、设备3、设备2、设备1均为sid对应的中间节点,具体地,sid4对应的设备为设备4,sid3对应的设备为设备3,sid2对应的设备为设备2,sid1对应的设备为设备1。设备0为目的节点。可以理解的是,上述设备之间可能存在用于转发的普通转发节点,例如设备x。
[0144]
图9b为本技术应用例一报文的srh拓展头的示意图。该报文中的标识包含该报文中所有sid的压缩信息,该标识采用上述图7对应的各个实施例中步骤703中第一种标识的形式,即在每个sid中设计一个coc标记来表示下一个sid是非压缩sid还是压缩sid。在本应用例中,标识的值为1表示该sid的下一个sid为压缩sid,标识的值为0标识表示该sid的下一个sid为非压缩sid。例如,sid4中的标识为1,表示sid3为压缩sid;sid1中的标识为0,表示sid0为非压缩sid。
[0145]
1.1、应用场景一(设备3出现故障):
[0146]
当设备3出现故障,报文送达设备4时,由于设备4是中间节点,因此,设备4接收到报文后,读取当前ipv6报文头的da字段中的coc标记(即读取sid4的coc标记为1),确定sid3为压缩sid,然后将sid3替换到报文的ipv6报文头的da字段中。
[0147]
然后,设备4判断当前sid(sid3)对应的节点为故障的中间节点(即故障的设备3),那么设备4可以根据读取当前ipv6报文头的da字段中的coc标记(即读取sid3的coc标记为1),确定当前sid的下一个sid(sid2)的格式为压缩格式,则可以将sid2替换到报文的ipv6报文头的da字段中,实现代理转发功能。
[0148]
1.2、应用场景二(设备2出现故障):
[0149]
当设备2出现故障,报文到达设备x时,设备x接收到的报文中,ipv6报文头的da字段为sid2。设备x接收到报文后,可以判断当前ipv6报文头的da字段(sid2)为故障的中间节点,则根据读取当前ipv6报文头的da字段中的coc标记(即读取sid2的coc标记为1),确定当前sid的下一个sid(sid1)的格式为压缩格式,则可以将sid1替换到报文的ipv6报文头的da字段中,实现代理转发功能。
[0150]
2、应用例二:
[0151]
图10a为本技术应用例二的架构示意图。报文从设备14依次进过设备13、
……
、设备1传输至设备0。设备14、设备13、
……
、设备1均为sid对应的中间节点,具体地,sid14对应的设备为设备14,sid13对应的设备为设备13
……
sid1对应的设备为设备1。设备0为目的节点。可以理解的是,上述设备之间可能存在用于转发的普通转发节点。
[0152]
图10b为本技术应用例二报文的srh拓展头的示意图。该报文中的标识包含该报文中所有sid的压缩信息,该标识采用上述图7对应的各个实施例中步骤703中第一种标识的形式,即通过csll、nchi和daccsll来确定当前sid的下一个sid的格式。图9b中sl=7对应的sid为压缩头sid,该压缩头sid中包括csll的值为1,表示后续一行为压缩sid,nchi的值为4,表示下一个压缩头为sl=4对应的压缩头。表1为本应用例对应的标识示例。
[0153][0154]
表1
[0155]
可以理解的是,表1中sl的值可以从报文的srh拓展头中读取,csll可以从ipv6报文头的da字段读取,nchi和daccsll可以从ipv6报文头的sa字段读取。在实际应用中,为方便读取或兼容协议,这些标识也可以设计在其他位置,本技术实施例对此不做限定。
[0156]
从表1可以看出,当报文被生成时,sl=9,csll没有取值,nchi=7,daccsll=0;这些标识的当前值由生产该报文的头节点确定。为简洁直观地描述本技术方案,该报文可以用(sa:0、7,da:sid14)(sl=9)表示,其中sa中第一个标识为daccsll,第二个标识为nchi。
[0157]
2.1、应用场景三(设备13出现了故障);
[0158]
在报文从头节点发送到设备14时,设备13出现了故障,则设备14接收到该报文后,首先将sl减一,将报文中的当前sid修改为sid13,则报文被修改为(sa:0、7,da:sid13)(sl=8)。可以理解的是,对于中间节点,该中间节点首先完成自身的转发功能,再判断是否需要进行代理转发功能。
[0159]
然后,设备14判断当前sid(sid13)为故障的中间节点,则设备14可以执行代理转
发功能。该代理转发步骤包括:读取daccsll取值为0,确定下一个sid为非压缩sid;读取nchi取值为7,与sl减一(即7)相同,确定下一个sid为压缩头sid,根据压缩头sid中的csll预设值和nchi预设值更新da中的csll和sa中的nchi,然后更新sa中的daccsll,使得报文被修改为(sa:1、4,da:sid12(包含csll=1,si=0))(sl=7)。然后设备14将该报文转发出去,从而绕过该故障的设备13,朝设备12转发,实现srv6 te frr。
[0160]
2.2、应用场景四(设备13出现了故障):
[0161]
在报文正常经过设备14后,报文被修改为(sa:0、7,da:sid13)(sl=8)。
[0162]
在报文传输到设备14和设备13之间的转发节点时,设备13出现了故障,则该转发节点接收到该报文后,判断当前sid(sid13)为故障的中间节点,则该转发节点可以执行上述应用场景三中设备14执行的代理转发步骤,使得报文绕过该故障的设备13,朝设备12转发,实现srv6 te frr。代理转发步骤的具体过程可参照上述应用场景三,此处不再赘述。
[0163]
2.3、应用场景五(设备12出现了故障):
[0164]
在报文从头节点发送到设备13时,设备12出现了故障,则设备13接收到该报文后,将sl减一,将报文中的当前sid修改为sid12,并且确定sid12为压缩头sid,则根据sid12中的csll预设值和nchi预设值更新da中的csll和sa中的nchi,然后更新sa中的daccsll,使得报文被修改为(sa:1、4,da:sid12(包含csll=1,si=0))(sl=7)。
[0165]
然后,设备13判断当前sid(sid12)为故障的中间节点,则设备13可以执行代理转发功能。该代理转发步骤包括:读取daccsll取值为1,确定da中包含csll取值;进一步读取da中的csll(为1),确定下一行sid为压缩sid,sid11为压缩sid;读取si=0,确定下一个sid(sid11)在当前sid的下一行,则设备13将sl减一,si置为3,将sid11替换到da的nodeid+compressfunc,csll减一。因此报文被修改为(sa:1、4,da:sid11(包含csll=0,si=3))(sl=6)并被转发出去,从而绕过该故障的设备12,朝设备11转发,实现srv6 te frr。
[0166]
2.4、应用场景六(设备12出现了故障):
[0167]
在报文正常经过设备13后,报文被修改为(sa:1、4,da:sid12(包含csll=1,si=0))(sl=7)。
[0168]
在报文传输到设备13和设备12之间的转发节点时,设备12出现了故障,则该转发节点接收到该报文后,判断当前sid(sid12)为故障的中间节点,则该转发节点可以执行上述应用场景五中设备13执行的代理转发步骤,使得报文绕过该故障的设备12,朝设备11转发,实现srv6 te frr。代理转发步骤的具体过程可参照上述应用场景五,此处不再赘述。
[0169]
2.5、应用场景七(设备11出现了故障):
[0170]
在报文从头节点发送到设备12时,设备11出现了故障,则设备12接收到该报文后,将sl减一,si置为3,将报文中的当前sid修改为sid11,csll减一。因此报文被修改为(sa:1、4,da:sid11(包含csll=0,si=3))(sl=6)。可以理解的是,对于中间节点,该中间节点首先完成自身的转发功能,再判断是否需要进行代理转发功能。
[0171]
然后,设备12判断当前sid(sid11)为故障的中间节点,则设备12可以执行代理转发功能。该代理转发步骤包括:读取daccsll取值为1,确定da中包含csll取值;进一步读取da中的csll(为0),确定当前sid的同一行sid为压缩sid,下一行sid为非压缩sid;读取si=3,说明当前sid不是该行最后一个sid;进一步确定si减一的位置有sid(sia10),则确定下一个sid(sid10)为压缩sid。因此,设备12可以将si减一,将sid10替换到da的nodeid+
compressfunc。因此报文被修改为(sa:1、4,da:sid10(包含csll=0,si=2))(sl=6)并被转发出去,从而绕过该故障的设备11,朝设备10转发,实现srv6 te frr。
[0172]
2.6、应用场景八(设备11出现了故障):
[0173]
在报文正常经过设备12后,报文被修改为(sa:1、4,da:sid11(包含csll=0,si=3))(sl=6)。
[0174]
在报文传输到设备12和设备11之间的转发节点时,设备11出现了故障,则该转发节点接收到该报文后,判断当前sid(sid11)为故障的中间节点,则该转发节点可以执行上述应用场景七中设备12执行的代理转发步骤,使得报文绕过该故障的设备11,朝设备10转发,实现srv6 te frr。代理转发步骤的具体过程可参照上述应用场景七,此处不再赘述。
[0175]
2.7、应用场景九(设备10出现了故障):
[0176]
在报文从头节点发送到设备11时,设备10出现了故障,则设备11接收到该报文后,将si减一,将sid10替换到da的nodeid+compressfunc。因此报文被修改为(sa:1、4,da:sid10(包含csll=0,si=2))(sl=6)。
[0177]
然后,设备11判断当前sid(sid10)为故障的中间节点,则设备11可以执行代理转发功能。该代理转发步骤包括:读取daccsll取值为1,确定da中包含csll取值;进一步读取da中的csll(为0),确定当前sid的同一行sid为压缩sid,下一行sid为非压缩sid;读取si=2,说明当前sid不是该行最后一个sid;进一步确定si减一的位置有sid(sid9),则确定下一个sid(sid9)为压缩sid。因此,设备11可以将si减一,将sid9替换到da的nodeid+compressfunc。因此报文被修改为(sa:1、4,da:sid9(包含csll=0,si=1))(sl=6)并被转发出去,从而绕过该故障的设备10,朝设备9转发,实现srv6 te frr。
[0178]
2.8、应用场景十(设备10出现了故障):
[0179]
在报文正常经过设备11后,报文被修改为(sa:1、4,da:sid10(包含csll=0,si=2))(sl=6)。
[0180]
在报文传输到设备11和设备10之间的转发节点时,设备10出现了故障,则该转发节点接收到该报文后,判断当前sid(sid10)为故障的中间节点,则该转发节点可以执行上述应用场景九中设备11执行的代理转发步骤,使得报文绕过该故障的设备10,朝设备9转发,实现srv6 te frr。代理转发步骤的具体过程可参照上述应用场景九,此处不再赘述。
[0181]
2.9、应用场景十一(设备9出现了故障):
[0182]
在报文从头节点发送到设备10时,设备9出现了故障,则设备10接收到该报文后,将si减一,将sid9替换到da的nodeid+compressfunc。因此报文被修改为(sa:1、4,da:sid9(包含csll=0,si=1))(sl=6)。
[0183]
然后,设备10判断当前sid(sid9)为故障的中间节点,则设备10可以执行代理转发功能。该代理转发步骤包括:读取daccsll取值为1,确定da中包含csll取值;进一步读取da中的csll(为0),确定当前sid的同一行sid为压缩sid,下一行sid为非压缩sid;读取si=1,说明当前sid不是该行最后一个sid;进一步确定si减一的位置没有sid,则确定下一个sid(sid8)在下一行,且为非压缩sid。因此,设备10可以将si置零或是删除,sl减一,将sid8替换到da,csll删除,daccsll置零。因此报文被修改为(sa:0、4,da:sid8)(sl=5)并被转发出去,从而绕过该故障的设备9,朝设备8转发,实现srv6 te frr。
[0184]
2.10、应用场景十二(设备9出现了故障):
[0185]
在报文正常经过设备10后,报文被修改为(sa:1、4,da:sid9(包含csll=0,si=1))(sl=6)。
[0186]
在报文传输到设备10和设备9之间的转发节点时,设备9出现了故障,则该转发节点接收到该报文后,判断当前sid(sid9)为故障的中间节点,则该转发节点可以执行上述应用场景十一中设备10执行的代理转发步骤,使得报文绕过该故障的设备9,朝设备8转发,实现srv6 te frr。代理转发步骤的具体过程可参照上述应用场景十一,此处不再赘述。
[0187]
2.11、应用场景十三(设备3出现了故障):
[0188]
在报文从头节点发送到设备4时,设备3出现了故障,则设备4接收到该报文后,将si减一,将sid3替换到da的nodeid+compressfunc。因此报文被修改为(sa:1、0,da:sid3(包含csll=1,si=0))(sl=3)。
[0189]
然后,设备4判断当前sid(sid3)为故障的中间节点,则设备4可以执行代理转发功能。该代理转发步骤包括:读取daccsll取值为1,确定da中包含csll取值;进一步读取da中的csll(为1),确定当前sid的下一行sid为压缩sid;读取si=0,说明当前sid为该行最后一个sid,则确定下一个sid(sid2)在下一行,且为压缩sid。因此,设备4可以将si设置为3,sl减一,将sid2替换到da的nodeid+compressfunc,csll减一。因此报文被修改为(sa:1、0,da:sid2(包含csll=0,si=3))(sl=2)并被转发出去,从而绕过该故障的设备3,朝设备2转发,实现srv6 te frr。
[0190]
2.12、应用场景十四(设备3出现了故障):
[0191]
在报文正常经过设备4后,报文被修改为(sa:1、0,da:sid3(包含csll=1,si=0))(sl=3)。
[0192]
在报文传输到设备4和设备3之间的转发节点时,设备3出现了故障,则该转发节点接收到该报文后,判断当前sid(sid3)为故障的中间节点,则该转发节点可以执行上述应用场景十三中设备4执行的代理转发步骤,使得报文绕过该故障的设备3,朝设备2转发,实现srv6 te frr。代理转发步骤的具体过程可参照上述应用场景十三,此处不再赘述。
[0193]
3、应用例三:
[0194]
图11a为本技术应用例三中srh拓展头的示意图。该拓展头中尾部设置有tlv字段,其中包括了[001000110
……
]的数组(即cfa),其中0、1等为压缩标记,表示每一个128bit(也可以称为每一行)的压缩情况。可以理解的是,sid13对应的设备为设备13
……
sid1对应的设备为设备1。设备0为目的节点。可以理解的是,上述设备之间可能存在用于转发的普通转发节点。
[0195]
具体可以用表2来表示:
[0196]
sl876543210sid12812832_32_32_012812832_32_32_3232_0_0_0128128cfa001001100
[0197]
表2
[0198]
在本技术应用例中,表2中,若cfa为0则该sl对应的一个sid为非压缩sid,若cfa为1则该sl对应的所有sid为压缩sid。在该应用例中,转发报文的节点通过cfa即可知道该srh拓展头中所有sid的压缩情况。
[0199]
可以理解的是,本应用例中,cfa标识在tlv字段中以反向顺序与sl对应,即第一个
cfa标识为sl=8对应的cfa标识,第二个标识为sl=7对应的标识,以此类推。而在其他应用情况中,cfa标识在tlv字段中还可以以正向顺序与sl对应,即第一个cfa标识为sl=0对应的cfa标识,第二个标识为sl=1对应的标识,以此类推。本技术实施例对cfa标识的排序方式不做限定。
[0200]
在本技术实施例中,节点通过cfa即可知道该srh拓展头中所有sid的压缩情况。在一些情况下,节点可以根据其他方法确定当前sid是否包括si参数,再根据si参数以及相关情况确定下一个sid所对应的sl,最后根据该sl对应的cfa确定该下一个sid的存储格式(即压缩格式或非压缩格式)。在不采用其他方法确定当前sid是否包括si参数时,本技术应用例提供一种应用流程可以完全根据cfa及相关情况确定下一个sid的存储格式。图11b为本技术应用例提供一种应用流程示意图。该流程包括:
[0201]
1101、获取压缩标记;
[0202]
在该应用例中,节点可以将整段tlv字段的cfa读取后再根据需要获取相关压缩标记,也可以根据实际需要获取相关压缩标记,本技术实施例对此不作限定。在本技术应用例中,节点可以用到三个压缩标记,分别为当前sl对应的压缩标记,当前sl-1对应的压缩标记,当前sl-2对应的压缩标记。
[0203]
1102、若连续压缩标记为000,则下一个sid为普通非压缩sid;
[0204]
在本技术应用例中,当上述连续的三个压缩标记为000时,表示连续三行sid都是非压缩的sid,则可以确定的是前两行sid都是普通的非压缩sid,最后一行sid可能是普通的非压缩sid也可能是压缩头sid。因此,下一个sid即为第二行的sid,为普通的非压缩sid。
[0205]
1103、若连续压缩标记为001,则下一个sid为压缩头sid;
[0206]
在本技术应用例中,当上述连续的三个压缩标记为001时,表示连续两行sid为非压缩的sid,第三行sid为压缩sid。因此可以确定的是第一行sid(当前sl对应的那一行)为普通的非压缩sid,第二行sid(当前sl-1对应的那一行)为压缩头sid,第三行(当前sl-2对应的那一行)为若干个压缩sid。因此,下一个sid即为第二行的sid,为压缩头sid。
[0207]
1104、若连续压缩标记为x1x,则下一个sid为压缩sid;
[0208]
在本技术应用例中,当上述连续的三个压缩标记为x1x(x表示该标记为任意的压缩标记,可以是0也可以是1),表示第二行sid(当前sl-1对应的那一行)为若干个压缩sid,那么第一行sid为压缩头sid或者若干个压缩sid。这两种情况中,ipv6报文头的da字段中均有si参数,则节点可以根据si参数以及相关情况确定下一个sid所对应的sl,最后根据该sl对应的压缩标记确定该下一个sid的存储格式。具体包括以下步骤:
[0209]
若si参数为0,那么当前sid为压缩头sid或者若干个压缩sid的最后一个sid,下一个sid需要换行,即下一个sid在下一行,下一个sid所对应的sl为sl-1,即下一个sid在第二行(当前sl-1对应的那一行),为压缩sid。则节点可以将sl-1赋值到当前sl,将si参数置为3(本技术应用例中最多四个压缩sid组成一行,因此si参数的最大值为3,在实际应用中可能将si参数置为其他值,本技术对此不作限定),然后节点根据该下一个sid的格式更新ipv6报文头的da字段(将srh[sl][si]替换到da,da中si置3,srh[sl][si]表示srh拓展头中sl、si对应的sid),最后按照更新后的da字段转发该报文。
[0210]
若si参数大于0,那么当前sid为若干个压缩sid的非最后一个sid,则节点可以将si参数减一,然后判断si参数减一对应位置的数值是否全为0。若是,则si参数减一对应位
置没有sid,一般地下一个sid就在下一行,那么节点可以将sl-1赋值到当前sl,将si参数置为3,然后节点根据该下一个sid的格式更新ipv6报文头的da字段(将srh[sl][si]替换到da,da中si置3),最后按照更新后的da字段转发该报文。若si参数减一对应位置的数值不全为0,则si参数减一对应位置有sid,且该sid即为下一个sid,为压缩sid,节点可以根据该下一个sid的格式更新ipv6报文头的da字段(将srh[sl][si]替换到da),最后按照更新后的da字段转发该报文。
[0211]
1105、若连续压缩标记为10x,则当前da含有si参数;
[0212]
在本技术应用例中,当上述连续的三个压缩标记为10x,表示第一行sid为若干个压缩sid,第二行sid为压缩头sid或普通的非压缩sid。由于第一行sid为若干个压缩sid,说明ipv6报文头的da字段中有si参数,则节点可以根据si参数以及相关情况确定下一个sid所对应的sl,最后根据该sl对应的压缩标记确定该下一个sid的存储格式。具体包括以下步骤:
[0213]
若si参数为0,那么当前sid为若干个压缩sid的最后一个sid,下一个sid需要换行,即下一个sid在下一行,下一个sid所对应的sl为sl-1,即下一个sid在第二行(当前sl-1对应的那一行),为压缩头sid或普通的非压缩sid,则节点可以将sl-1赋值到当前sl,然后节点根据该下一个sid的格式更新ipv6报文头的da字段(将下一个sid替换到da),最后按照更新后的da字段转发该报文。
[0214]
若si参数大于1,那么当前sid为若干个压缩sid的非最后一个sid,则节点可以将si参数减一,然后判断si参数减一对应位置的数值是否全为0。若是,则si参数减一对应位置没有sid,一般地下一个sid就在下一行(下一行为压缩头sid或普通的非压缩sid),那么节点可以将sl-1赋值到当前sl,然后节点根据该下一个sid的格式更新ipv6报文头的da字段(将下一个sid替换到da),最后按照更新后的da字段转发该报文。若si参数减一对应位置的数值不全为0,则si参数减一对应位置有sid,且该sid即为下一个sid,为压缩sid,节点可以根据该下一个sid的格式更新ipv6报文头的da字段(将srh[sl][si]替换到da),最后按照更新后的da字段转发该报文。
[0215]
可以理解的是,本技术实施例中tlv字段的cfa已经包括所有sid对应的压缩信息,因此在实际应用中,设计人员可以根据实际情况设计不同的方法流程解析该压缩信息,图11b仅为其中一个举例,不应理解为本技术实施例的方案限制。
[0216]
3.1、应用场景十五:
[0217]
当报文转发到设备13或设备13与设备12之间的转发节点时,设备12故障。设备13或转发节点可以根据当前报文sl=7连续读取sl=7、6、5对应的压缩标记,得到标识组合为010,则节点可以读取da中的si参数为0,说明下一个sid需要换行,说明下一个sid(sid11)在第二行,为压缩sid。然后,设备13或转发节点可以根据该压缩格式将sid11替换更新到ipv6报文头的da字段中(将srh[sl=6][si=3]替换到da,da中si置3)。
[0218]
3.2、应用场景十六:
[0219]
当报文转发到设备12或设备12与设备11之间的转发节点时,设备11故障。设备12或转发节点可以根据当前报文sl=6连续读取sl=6、5、4对应的压缩标记,得到标识组合为100,则节点可以读取da中的si参数为3,则判断si=2对应的位置数值是否全为0。该应用场景中不全为0,因为si=2对应的位置由sid10,那么根据图11b的流程可以确定sid10即为下
一个sid,为压缩sid。然后,设备12或转发节点可以根据该压缩格式将sid10替换更新到ipv6报文头的da字段中(将srh[sl=6][si=2]替换到da)。
[0220]
3.3、应用场景十七:
[0221]
当报文转发到设备11或设备11与设备10之间的转发节点时,设备10故障。设备11或转发节点可以根据当前报文sl=6连续读取sl=6、5、4对应的压缩标记,得到标识组合为100,则节点可以读取da中的si参数为2,则判断si=1对应的位置数值是否全为0。该应用场景中不全为0,因为si=1对应的位置由sid9,那么根据图11b的流程可以确定sid9即为下一个sid,为压缩sid。然后,设备11或转发节点可以根据该压缩格式将sid9替换更新到ipv6报文头的da字段中(将srh[sl=6][si=1]替换到da)。
[0222]
3.4、应用场景十八:
[0223]
当报文转发到设备10或设备10与设备9之间的转发节点时,设备9故障。设备10或转发节点可以根据当前报文sl=6连续读取sl=6、5、4对应的压缩标记,得到标识组合为100,则节点可以读取da中的si参数为1,则判断si=0对应的位置数值是否全为0。该应用场景中si=0对应的位置数值全为0,那么根据图11b的流程可以确定下一个sid在下一行,且为普通非压缩sid。然后,设备10或转发节点可以将sid8替换更新到ipv6报文头的da字段中(将srh[sl=5]替换到da)。
[0224]
3.5、应用场景十九:
[0225]
当报文转发到设备9或设备9与设备8之间的转发节点时,设备8故障。设备9或转发节点可以根据当前报文sl=5连续读取sl=5、4、3对应的压缩标记,得到标识组合为001,则那么根据图11b的流程可以确定下一个sid在下一行,且为压缩头sid。然后,设备9或转发节点可以将sid7替换更新到ipv6报文头的da字段中(将srh[sl=4]替换到da)。
[0226]
图12为本技术实施例提供的一种报文处理的装置的示意图。该装置1200包括:
[0227]
获取模块1201,用于执行上述图7对应的各个实施例中的步骤701;
[0228]
处理模块1202,用于执行上述图7对应的各个实施例中的步骤702、步骤703和步骤704,或执行上述图8对应的各个步骤,或图11b对应的各个步骤。
[0229]
转发模块1203,用于执行上述图7对应的各个实施例中的步骤705或步骤706。
[0230]
图13为本技术实施例提供的一种报文处理的设备的示意图。该设备包括网络接口、处理器和存储器;网络接口用于接收报文;存储器用于存储程序指令;处理器用于执行程序指令,以实现上述图7对应的各个实施例中的方法。网络接口可以为以太接口等。
[0231]
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
[0232]
在本技术所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
[0233]
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个
网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
[0234]
另外,在本技术各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
[0235]
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本技术的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本技术各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、磁碟或者光盘等各种可以存储程序代码的介质。
[0236]
以上实施例仅用以说明本技术的技术方案,而非对其限制;尽管参照前述实施例对本技术进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本技术各实施例的技术方案的范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1