具体实施方式
本发明实施例针对现有技术中嵌套隧道转发过程中需要多次路由、多次加封装,影响转发性能的问题,提供了一种嵌套隧道封装方案,用以提高隧道封装效率,进而提高转发效率。
本发明实施例中,当路由交换设备上配置的隧道的状态为Up(打开)后,生成隧道封装表项,其中包括隧道封装层数、每层封装的IP头封装信息,以及最底层IP头封装信息中的目的地址对应的下一跳路由的出接口信息。当该路由交换设备接收到报文,并确定需要从隧道转发后,根据该隧道对应的隧道封装表项对该报文进行隧道封装和转发。上述流程对于嵌套隧道封装,只需一次路由(即报文进入时查询相应路由表项,并确定是否从隧道转发)和一次封装操作,并避免了因嵌套封装次数大于路由交换设备内部路由环回次数而导致转发失败情况的发生。
下面结合附图对本发明实施例进行详细描述。
如图4所示,当路由交换设备上配置的隧道的状态变为Up后,将触发以下隧道封装表项建立过程:
步骤401:将该状态变为Up的隧道的封装信息添加到该隧道对应的隧道封装表项中,然后转入步骤402。其中,所添加的隧道封装信息可包括该隧道的源IP地址和目的IP地址。
具体的,可使能隧道的封装表项配置功能,这样,当该隧道的状态变为Up后,即可配置该隧道对应的隧道封装表项。可通过在隧道口上配置标志位来使能隧道封装表项配置功能。
步骤402:根据当前所添加的隧道封装信息中的隧道目的地址查找路由。
步骤403:如果该目的地址对应的下一跳路由的出接口是隧道口,表明是嵌套隧道,则转入步骤404,否则转入步骤405。
在具体实现时,针对存在等价路由的情况,本发明实施例提供了几种用于配置隧道封装表项过程的选路方式:
方式一:预先在隧道口上配置IP头中的TOS字段值,不同的值代表不同的选路算法。具体的,TOS字段值取值范围为0-255,预先定义该字段值为100时,对应的选路策略为:如果存在等价路由,则优先选择隧道口为出接口,进一步的,如果存在等价隧道口路由,则选择隧道口IP地址小的为出接口;若TOS不等于100,则按照常规流程选路。
方式二:预先在隧道口上配置IP头中的可选项字段值,不同的值代表不同的选路算法。具体的,用可选字段中的一个比特位,用来标识选路方式,比如,将该比特位置0,表示按照常规方式进行选路;将该比特置1,表示优先选择隧道口为出接口,进一步的,如果存在等价隧道口路由,则选择隧道口IP地址小的为出接口。优选的,默认情况下该字段取值为0,这样不会影响报文各种业务的处理。
上述两种方式均是通过在隧道口配置选路算法指示信息来指导在配置隧道封装表项时如何选路。
步骤404:根据该隧道口所对应的隧道的配置,将该隧道的封装信息添加到当前隧道对应的隧道封装表项中,然后转入步骤402。
步骤405:将下一跳路由的出接口添加到该隧道对应的隧道封装表项中。
通过以上迭代添加隧道封装信息的过程,针对以该状态变为Up的隧道口为入口的嵌套隧道,可建立对应的隧道封装表项。嵌套隧道中的最上层隧道对应的隧道封装表项中至少包括:嵌套隧道中每层隧道封装的IP报文头信息,以及迭代添加隧道封装信息结束时的目的地址对应的下一跳路由的出接口信息。可选的,还可包括隧道封装层数(即隧道嵌套层数)。
需要说明的是,对于单层隧道,也可适用本发明实施例。对于单层隧道,对应的隧道封装表项中的隧道封装信息为本隧道的封装信息,出接口信息为本隧道的目的地址对应的下一跳路由的出接口。
优选的,可在路由交换设备上配置所允许的最大嵌套层数,并且每次在隧道封装表项中添加一层隧道封装信息后,都要将该隧道封装表项中的隧道封装层数递增(该隧道封装层数的取值从1开始,每添加一层隧道封装信息,将该隧道封装层数加1)。每次在隧道封装表项中添加隧道封装信息之前,首先判断当前该隧道封装表项中的隧道封装层数是否已经达到所允许的最大嵌套层数,若已经达到,则放弃配置该隧道封装表项,若还未达到,则继续按照前述流程配置隧道封装表项。
进一步的,考虑到隧道状态或隧道配置可能会因各种原因发生变化,本发明实施例为此还提供了隧道封装表项的更新流程,具体可包括以下几种情况:
(1)当路由交换设备检测到其上配置的隧道的状态变化(通常隧道的源地址或目的地址发生变化,则隧道状态会发生变化)时,则触发更新隧道封装表项的操作。具体的,当隧道的源地址或/和目的地址发生变化时,原隧道的状态从Up变为DOWN,此时触发执行删除或清空相应隧道封装表项的操作;当使用变更后的地址的隧道从DOWN状态变为Up时,则按照前述流程创建对应的隧道封装表项。进一步的,若有其它隧道嵌套了该状态变为DOWN的隧道,则还要删除或清空该其它隧道对应的隧道封装表项,即,当路由交换设备检测到其上配置的隧道的状态从打开状态变为关闭状态时,删除或清空该关闭状态的隧道对应的隧道封装表项,并删除或清空嵌套了该关闭状态的隧道的隧道所对应的隧道封装表项。
(2)当路由交换设备检测到其上配置的隧道的目的地址的路由变化即下一跳路由出接口变化,则触发更新对应隧道封装表项。即,当路由交换设备检测到隧道的目的地址的下一跳路由的出接口变化时,根据该隧道更新后的出接口更新该隧道对应的隧道封装表项,并更新嵌套了该隧道的隧道所对应的隧道封装表项。具体的,当路由交换设备检测到单层隧道的目的地址的下一跳路由出接口发生变化时,用变化后的出接口替换该单层隧道以及所有嵌套了该单层隧道的隧道所对应的隧道封装表项中的出接口。当路由交换设备检测到隧道的目的地址的路由即下一跳路由出接口发生变化且该隧道嵌套有其它隧道,则根据更新后的下一跳路由出接口更新该下一跳路由发生变化的隧道对应的隧道封装表项,并更新嵌套有该隧道(即下一跳路由发生变化的隧道)的隧道所对应的隧道封装表项,更新隧道封装表项的操作可参考前述的创建隧道封装表项的过程。
基于隧道封装表项,当路由交换设备接收到用户设备发送的报文后,对该报文进行隧道封装和转发,其报文隧道封装和转发流程可如图5所示,包括:
步骤501:根据该报文的目的IP地址查询对应的路由表项。
步骤502:如果查询到的路由表项中该目的IP地址对应的下一跳路由的出接口为隧道口,则转入步骤503,否则转入步骤505。
步骤503:根据该下一跳路由的出接口所指示的隧道,查询该隧道对应的隧道封装表项。
步骤504:根据查询到的隧道封装表项中的隧道封装信息,对该报文进行隧道封装,并根据该隧道封装表项中的出接口转发封装后的报文。
进一步的,在对报文进行隧道封装时,可将隧道封装表项中的隧道封装层数添加到外层IP头中。这样,带隧道封装的报文在网络中传输时,路由交换设备可根据该报文的外层IP头中用来标识隧道封装层数的字段,判断该报文经过了几层隧道封装。可预先定义IP头中可选字段中的部分比特用来标记报文的隧道封装层数。优选的,可规定所允许的隧道嵌套层数最大值为7,此种情况下,可使用2比特来标记隧道封装层数。
步骤505:按照常规三层转发流程对该报文进行转发处理。
在使用图5所示流程的一种具体实现方案中,上述流程的步骤502中,在根据路由表项为该报文选路时,可根据报文IP头中的TOS字段的取值选择对应的选路算法。具体的,TOS字段的取值范围是0-255,若IP头中TOS=100,则在为报文选路时,如果存在等价路由,则优先选择隧道口为出接口,进一步的,如果存在等价隧道口路由,则选择隧道口IP地址小的为出接口;若IP头中TOS不等于100,则为报文选路时,按照常规流程处理。相应的,在步骤504中,默认情况下,对报文加隧道封装时,同步复制内层IP头中TOS字段内容,保证加隧道封装后的报文与原始报文处理一致。
进一步的,如果选路结果为从隧道转发,并且该隧道口上配置有选路算法指示信息(这里为TOS字段取值),则在步骤504中,在对该报文进行隧道封装时,将该隧道口上配置的选路算法指示信息添加到隧道封装头的TOS字段,用于指导该报文后续转发过程中的选路。
在使用图5所示流程的另一种具体实现方案中,上述流程的步骤502中,在根据路由表项为该报文选路时,可根据报文IP头中的可选项取值选择对应的选路算法。具体的,可定义IP头中的可选项字段中的一个比特位,用来标识选路方式,比如,将该比特位置0,表示按照常规方式进行选路;将该比特置1,表示优先选择隧道口为出接口,进一步的,如果存在等价隧道口路由,则选择隧道口IP地址小的为出接口。优选的,默认情况下该字段取值为0,这样不会影响报文各种业务的处理。相应的,在步骤504中,默认情况下,对报文加隧道封装时,同步复制内层IP头中的该字段内容,保证加隧道封装后的报文与原始报文处理一致。
进一步的,如果选路结果为从隧道转发,并且该隧道口上配置有选路算法指示信息(这里为可选项取值),则在步骤504中,在对该报文进行隧道封装时,将该隧道口上配置的选路算法指示信息添加到隧道封装头的可选项字段,用于指导该报文后续转发过程中的选路。
为了更清楚的说明本发明实施例,下面以图1所示的组网为例,详细描述本发明实施例的具体实现过程。
如图1所示,DUT2与DUT4之间建立4in4隧道T1;DUT2与DUT5之间建立6in4隧道T2,T2隧道的源为T1;DUT2与DUT6之间建立6in6隧道T3,T3隧道的源为T2。即,当前组网中存在单层隧道T1、两层嵌套隧道T2以及三层嵌套隧道T3。DUT1和DUT7为IPv6协议栈路由交换设备。
T1隧道状态Up后,DUT2根据T1隧道的目的地址查询路由,得到目的地址路由下一跳对应的出接口,该出接口不是隧道口,则根据T1隧道的源地址、目的地址、封装层数以及隧道目的地址对应的出接口,生成T1隧道对应的隧道封装表项。该表项中的封装次数数值是1,出接口为T1隧道的目的地址路由下一跳所对应的出接口,隧道封装内容包括:T1隧道的源IP地址、目的IP地址。
T2隧道状态Up后,DUT2根据T2隧道的目的地址查询路由,得到目的地址对应的出接口为底层的T1隧道口,判断为嵌套隧道,则先添加T2隧道的封装信息到该隧道对应的隧道封装表项,再根据该底层隧道(这里是T1隧道)的配置依次添加底层隧道的封装信息,再添加底层隧道目的地址路由出接口,生成T2隧道对应的隧道封装表项。该表项中的封装次数数值是2,出接口为T1隧道的目的地址路由下一跳所对应的出接口,隧道封装内容包括:T1隧道的源IP地址、目的IP地址,以及T2隧道的源IP地址和目的IP地址。
T3隧道状态Up后,DUT2根据T3隧道的目的地址查询路由,得到目的地址对应的出接口为底层的T2隧道口,判断为嵌套隧道,则先添加T3隧道的封装信息到该隧道对应的隧道封装表项,再根据底层隧道(这里是T2隧道)的配置依次添加T2隧道和T1隧道的封装信息,再添加T1隧道目的地址路由出接口,生成T3隧道对应的隧道封装表项。该表项中的封装次数数值是3,出接口为T1隧道的目的地址路由下一跳所对应的出接口,隧道封装内容包括:T1隧道的源IP地址、目的IP地址,T2隧道的源IP地址、目的IP地址,以及T3隧道的源IP地址、目的IP地址。
DUT1需要通过T3隧道访问DUT7。此种情况下,当DUT2从DUT1接收到IPv6报文(该报文的源为1::1,目的为6::2)后,根据该报文的目的地址查找对应路由表项,确定需要将该报文通过T3隧道转发,因此查询T3隧道对应的隧道封装表项,该表项中包括T1、T2、T3的隧道封装信息,还包括迭代结束时隧道目的路由的出接口,如图6所示,DUT2根据查询到的隧道封装表项对该报文进行隧道封装(从底层到高层依次包括T1、T2、T3隧道的封装信息),然后根据该表项中的出接口转发封装后的报文。
该报文在网络中转发的过程中,在隧道另一端进行解封装的过程,与现有实现方式相同,在此不再赘述。
可以看出,在整个转发过程中,收到原始报文后,只需要查一次路由进隧道,进隧道后执行一次隧道加封装操作,然后再根据隧道封装表项中的出接口转发,与现有技术相比,减少了路由查询以及隧道封装次数,因此提高了报文隧道封装效率,进而提高了报文转发效率。另外,由于只需一次路由查询和加封装的操作,不再受设备封装次数的限制。
此外,本发明实施例还提供了隧道封装表项的更新处理流程。仍以图1所示的组网和隧道配置为例,举例说明如下:
若T1隧道DOWN,则DUT2删除T1隧道对应的隧道封装表项;由于T1隧道是T2隧道和T3隧道的底层隧道,因此DUT2还删除T2隧道对应的隧道封装表项和T3隧道对应的隧道封装表项;
若T2隧道DOWN,则DUT2删除T2隧道对应的隧道封装表项,由于T2隧道是T3隧道的底层隧道,因此DUT2还删除T3隧道对应的隧道封装表项;
若T3隧道DOWN,则DUT2删除T3隧道对应的隧道封装表项;
若T1隧道的目的IP地址的下一跳路由出接口发生变化,则DUT2更新T1隧道对应的隧道封装表项中的下一跳路由出接口;由于T1隧道是T2隧道和T3隧道的最底层隧道,因此DUT2还更新T2隧道和T3隧道对应的隧道封装表项中的下一跳路由出接口;
若T2隧道的目的IP地址的下一跳路由出接口发生变化,则DUT2根据T2隧道更新后的下一跳路由出接口更新T2隧道对应的隧道封装表项,由于T3隧道内嵌有T2隧道,因此DUT2还更新T3隧道对应的隧道封装表项。比如,T2隧道的目的IP地址的下一跳路由出接口更新为T4隧道的隧道口(T4隧道为单层隧道),则DUT2将T2隧道的隧道封装表项中的隧道封装信息更新为:从底层到高层依次为T4隧道的封装信息、T2隧道的封装信息,出接口为T4隧道的目的地址的下一跳路由出接口,将T3隧道的隧道封装表项中的隧道封装信息更新为:从底层到高层依次为T4隧道的封装信息、T2隧道的封装信息、T3隧道的封装信息,出接口为T4隧道的目的地址的下一跳路由出接口。
基于相同的技术构思,本发明实施还提供了一种路由交换设备。
参见图7,为本发明实施例提供的路由交换设备的结构示意图。如图所示,该路由交换设备可包括:路由查询模块71、隧道封装表项查询模块72、报文转发模块73,进一步的,还包括隧道封装表项处理模块74,其中:
路由查询模块71,用于在本设备接收到报文后,根据所述报文的目的IP地址查询对应的下一跳路由,若根据查询到的下一跳路由确定从隧道转发所述报文,则指示隧道封装表项查询模块72查询对应的隧道封装表项;
隧道封装表项查询模块72,用于查询所述隧道对应的隧道封装表项;其中,隧道封装表项中至少包括:隧道封装信息和出接口信息;
报文转发模块73,用于根据查询到的隧道封装表项中的隧道封装信息对所述报文进行隧道封装,并根据该隧道封装表项中的出接口转发封装后的报文。
具体的,路由查询模块71若查询到的下一跳路由的出接口为隧道口,则确定从所述隧道口对应的隧道转发所述报文。
具体的,路由查询模块71若查询到的下一跳路由不存在等价路由,且出接口为隧道口,则确定从所述隧道口对应的隧道转发所述报文;或者,若查询到的下一跳路由存在等价路由,且出接口中包括隧道口,则判断所述报文中是否携带选路算法指示信息,若携带,则确定从所述隧道口对应的隧道转发所述报文,其中所述报文中携带的选路算法指示信息,用于指示存在等价路由的情况下,优先选择隧道口为出接口。
进一步的,报文转发模块73还用于:若路由查询模块71根据查询到的下一跳路由确定从隧道转发所述报文,并且所述隧道的隧道口上配置有选路算法指示信息,则将隧道口上配置的选路算法指示信息添加到所述报文的隧道封装中;其中,所述隧道口上配置的选路算法指示信息,用于指示存在等价路由的情况下,优先选择隧道口为出接口。
进一步的,隧道封装表项中还包括封装层数信息。报文转发模块73在根据查询到的隧道封装表项中的隧道封装信息对所述报文进行隧道封装时,还将该隧道封装表项中的封装层数信息封装到所述报文中。
具体的,隧道封装表项处理模块74可按照以下步骤建立隧道封装表项:
步骤A:当检测到其上配置的隧道的状态变为打开状态时,将该打开状态的隧道的封装信息添加到该隧道对应的隧道封装表项中;
步骤B:根据当前添加的隧道封装信息中的目的IP地址查询对应的下一跳路由,若根据查询到的下一跳路由确定对应的出接口为隧道口,则转入步骤C,否则转入步骤D;
步骤C:将查询到的隧道口对应的隧道的封装信息添加到该打开状态的隧道对应的隧道封装表项中,然后转入步骤B;
步骤D:将下一跳路由的出接口添加到该打开状态的隧道对应的隧道封装表项中;
其中,所添加的隧道封装信息包括隧道的源IP地址和目的IP地址。
具体的,隧道封装表项处理模块74具体用于:若查询到的下一跳路由不存在等价路由,且出接口为隧道口,则确定下一跳路由对应的出接口为隧道口;或者,若查询到的下一跳路由存在等价路由,并且当前添加隧道封装信息的隧道的隧道口上配置有选路算法指示信息,则在等价路由中存在隧道口的情况下,根据所述选路算法指示信息选择隧道口作为当前添加隧道封装信息的隧道的出接口,其中,所述隧道口上配置的选路算法指示信息,用于指示存在等价路由的情况下,优先选择隧道口为出接口。
进一步的,隧道封装表项中还包括封装层数信息。相应的,隧道封装表项处理模块74在将隧道封装信息添加到隧道封装表项中之前,判断该隧道封装表项中的封装层数是否已经达到所允许的最大封装层数,若判定该隧道封装表项中的封装层数已经达到所允许的最大封装层数,则放弃建立该隧道封装表项;在将隧道封装信息添加到隧道封装表项之后,更新该隧道封装表项中的封装层数信息。
进一步的,隧道封装表项处理模块74还用于:若检测到其上配置的隧道的状态从打开状态变为关闭状态,则删除该关闭状态的隧道对应的隧道封装表项,并删除嵌套有该关闭状态隧道的隧道所对应的隧道封装表项;若检测到隧道的目的地址的下一跳路由的出接口变化,且确定该隧道为单层隧道,则根据该隧道更新后的出接口更新该隧道对应的隧道封装表项,并更新嵌套有该隧道的隧道所对应的隧道封装表项;若检测到隧道的目的地址的下一跳路由的出接口变化,且确定该隧道嵌套有其它隧道,则根据更新后的下一跳路由出接口更新该隧道对应的隧道封装表项,并更新嵌套有该隧道的隧道所对应的隧道封装表项。
综上所述,本发明实施例可实现以下技术效果:
(1)与现有技术相比,省去隧道加封装后的路由过程,直接根据隧道目的地址的出接口确定路由下一跳,提高路由性能。
(2)与现有技术相比,嵌套隧道多次加封装过程节省到1次,提高隧道加封装性能,从而提高转发性能。
(3)本发明实施例同样适用单层隧道的封装,与现有技术相比,可省略加封装后的一次路由过程。
(4)不会再受到设备内部路由环回次数的限制。
(5)本发明实施例不影响现有隧道转发功能的正常运行。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本发明可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台终端设备(可以是手机,个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视本发明的保护范围。