路由不间断方法和主控板与流程

文档序号:18040078发布日期:2019-06-28 23:54阅读:578来源:国知局
路由不间断方法和主控板与流程

本申请涉及计算机通信领域,尤其涉及一种路由不间断方法和主控板。



背景技术:

不间断路由(non-stoppingrouting,nsr)是指:通过将路由协议(比如bgp协议)运行状态信息从主进程备份到备进程,使得主、备进程发生倒换时可以备进程可以自行完成链路状态的恢复和路由的重新生成,从而避免了主备进程倒换对设备业务的影响。



技术实现要素:

有鉴于此,本申请提供一种路由不间断方法和主控板,用以实现路由不间断。

具体地,本申请是通过如下技术方案实现的:

根据本申请的第一方面,提供一种路由不间断方法,所述方法应用于网络设备中的第一主控板,所述第一主控板包括:主协议模块、第一用户态协议栈中的主tcpnsr模块,所述主协议模块和所述主tcpnsr模块运行在所述第一主控板的用户态空间;所述网络设备还包括第二主控板,所述第二主控板包括:备协议模块,第二用户态协议栈中的备tcpnsr模块;所述备协议模块和所述备tcpnsr模块运行在第二主控板的用户态空间;

所述方法包括:

当所述主协议模块工作状态正常时,所述主tcpnsr模块将接收的至少一个第一tcp报文备份至所述备tcpnsr模块,并在接收到所述备tcpnsr模块发送的第一确认消息时,向所述主协议模块发送所述至少一个第一tcp报文;

所述主协议模块依次将所述至少一个第一tcp报文转换成第一pdu,并将所述第一pdu备份至所述备协议模块;

所述主协议模块向所述备协议模块依次备份至少一个第二pdu,在接收到所述备协议模块发送的第二确认消息后,通过第一用户态协议栈向对端设备依次发送与所述至少一个第二pdu对应的第二tcp报文;

当所述主协议模块工作状态异常时,所述主协议模块保持所述主协议模块所在网络设备与所述对端设备之间的tcp连接,以使所述备协议模块继承所述tcp连接,在所述主协议模块备份的第二pdu中确定第三pdu,通过第二用户态协议栈和该tcp连接,将所述第三pdu对应的第三tcp报文发送给对端设备以及,从所述备tcpnsr模块中获取所述主协议模块还未备份至所述备协议模块的第一pdu对应的第一tcp报文;所述第三pdu与所述主协议模块未发送至对端设备的第二tcp报文对应。

可选的,所述第一主控板还包括:第一中间件和第一内核协议栈;所述第一中间件位于所述第一主控板的用户态空间;所述第一内核协议栈位于所述第一主控板的内核态空间;

所述向所述主协议模块发送所述至少一个第一tcp报文,包括:

所述主tcpnsr模块向所述第一内核协议栈发送所述至少一个第一tcp报文;

所述主协议模块依次将所述至少一个第一tcp报文转换成第一pdu,包括:

所述主协议模块读取所述内核协议栈中储存的至少一个第一tcp报文,并将所述至少一个第一tcp报文转换为第一pdu。

可选的,所述第一中间件创建第一变量,所述第一变量的取值用于指示所述主协议模块还未备份至所述备协议模块的首个pdu首字节序号;

所述方法还包括:

所述主协议模块在接收到所述备协议模块发送的第三确认消息后,将所述第一变量的取值更新为所述主协议模块下一个待备份的第一pdu首字节序号;

所述主tcpnsr模块从所述第一中间件中读取所述第一变量的取值,并将记录的序号在所述第一变量取值之前的第一tcp报文删除,以及将所述第一变量的取值备份至所述备tcpnsr模块,以使所述备tcpnsr模块将所述第一变量的取值记录在第二主控板的第二中间件中,并将所述备tcpnsr模块记录的序号在所述第一变量取值之前的第一tcp报文删除。

可选的,所述主协议模块还创建第二变量,所述第二变量的取值用于指示待备份至所述备协议模块的第二pdu首字节序号;

所述主协议模块向所述备协议模块依次备份至少一个第二pdu,在接收到所述备协议模块发送的第二确认消息后,通过第一用户态协议栈向对端设备依次发送与所述至少一个第二pdu对应的第二tcp报文,包括:

所述主协议模块在储存的至少一个第二pdu中,按序读取至少一个第二pdu,作为目标pdu;

所述主协议模块将所述目标pdu以及表示目标pdu首字节序号的第二变量的取值发送至所述备协议模块;

在接收到所述备协议模块发送的针对所述目标pdu的第四确认消息后,所述主协议模块将所述第二变量的取值更新为所述第二变量的当前值与所述目标pdu长度之和;

所述主协议模块通过第一用户态协议栈向对端设备依次发送与所述目标pdu对应的目标第二tcp报文。

可选的,所述第一中间件创建第三变量,所述第三变量的取值用于指示所述对端设备已收到的所述网络设备发往所述对端设备的最后一个第二tcp报文的序号;

所述方法还包括:

若所述主tcpnsr模块接收到所述对端设备返回的针对所述目标第二tcp报文的确认报文,所述主tcpnsr模块则将所述第三变量的取值更新为所述目标第二tcp报文的序号;

所述主协议模块从所述第一中间件中读取所述第三变量的取值,并在所述主协议模块记录的第二pdu中,删除首字节序号包括所述第三变量取值之前的第二pdu,以及将所述第三变量的取值备份至所述备协议模块,以使所述备协议模块将所述第三变量的取值记录在第二主控板的第二中间件中,以及在所述备协议模块记录的第二pdu中,删除首字节序号包括所述第三变量取值之前的第二pdu。

可选的,所述第一主控板还包括:第一用户态转发模块,所述第一用户态转发模块运行在所述第一主控板的用户态空间;

所述主协议模块保持所述主协议模块所在网络设备与所述对端设备之间的tcp连接,包括:

当所述第一用户态转发模块接收到第一主控板内核发出的fin报文或rst报文时,将所述fin报文或rst报文丢弃;所述fin报文或rst报文用于断开所述主协议模块所在网络设备和所述对端设备之间的tcp连接;

所述主协议模块删除记录的与所述tcp连接对应的第一socket,并保留所述第一socket对应的第一inpcb,以使得所述备协议模块利用创建的第二socket对应的第二inpcb对所述第一inpcb进行更新,并关联所述第二socket与更新后的第一inpcb。

根据本申请的第二方面,提供一种路由不间断方法,所述方法应用于网络设备中的第二主控板,所述第二主控板包括:备协议模块、第二用户态协议栈中的备tcpnsr模块,所述备协议模块和所述备tcpnsr模块运行在所述第二主控板的用户态空间;所述网络设备还包括第一主控板,所述第一主控板包括:主协议模块,第一用户态协议栈中的主tcpnsr模块;所述主协议模块和所述主tcpnsr模块运行在第一主控板的用户态空间;

所述方法包括:

当所述主协议模块工作状态正常时,所述备tcpnsr模块接收所述主tcpnsr模块发送的至少一个第一tcp报文并进行备份;

所述备tcpnsr模块向所述主tcpnsr模块发送第一确认消息,以使所述主tcpnsr模块在接收到所述第一确认消息后,将所述至少一个第一tcp报文发送至所述主协议模块,以由所述主协议模块将所述至少一个第一tcp报文转换成第一pdu,并将所述第一pdu备份至所述备协议模块;

所述备协议模块接收所述主协议模块发送的所述第一pdu并进行备份;

所述备协议模块接收所述主协议模块发送的第二pdu并进行备份;

所述备协议模块向所述主协议模块发送第二确认消息,以使所述主协议模块通过第一用户态协议栈向对端设备依次发送与所述第二pdu对应的第二tcp报文;

在所述主协议模块工作状态异常时,所述备协议模块继承所述主协议模块所在网络设备与所述对端设备之间的tcp连接;

所述备协议模块在所述主协议模块备份的第二pdu中确定第三pdu,所述第三pdu与所述主协议模块未发送至对端设备的第二tcp报文对应;

所述备协议模块通过第二用户态协议栈和该tcp连接,将该确定出的第三pdu对应的第三tcp报文发送给对端设备;

所述备协议模块从所述备tcpnsr模块中获取所述主协议模块还未备份至所述备协议模块的第一pdu对应的第一tcp报文。

可选的,所述第一主控板还包括第一中间件,所述第一中间件位于所述第一主控板的用户态空间,所述第一中间件创建第一变量,所述第一变量的取值用于指示所述主协议模块还未备份至备协议模块的首个pdu首字节序号;

所述第二主控板还包括第二中间件,所述第二中间件位于第二主控板的用户态空间;

所述方法还包括:

所述备协议模块向所述主协议模块发送第三确认消息,以使所述主协议模块将所述第一变量的取值更新为所述主协议模块下一个待备份的第一pdu首字节的序号,以使所述主tcpnsr模块从第一中间件中读取第一变量的取值,并将所述第一变量的取值同步至所述备tcpnsr模块;

所述备tcpnsr模块接收所述主tcpnsr模块同步的所述第一变量的取值,将所述第一变量的取值记录在所述第二中间件中,并将所述备tcpnsr模块记录的序号在第一变量取值之前的第一tcp报文删除。

可选的,所述备协议模块从所述备tcpnsr模块中获取所述主协议模块还未备份至所述备协议模块的第一pdu对应的第一tcp报文,包括:

所述备协议模块读取所述第二中间件记录的第一变量的取值;

所述备协议模块从所述备tcpnsr模块记录的第一tcp报文中,获取序号包括所述第一变量的取值之后的第一tcp报文;

所述备协议模块将获取到的第一tcp报文转发为第一pdu,并将转换出的第一pdu作为所述主协议模块还未备份至所述备协议模块的第一pdu。

可选的,所述主协议模块还创建第二变量,所述第二变量的取值用于指示待备份至所述备协议模块的第二pdu首字节序号;

所述备协议模块接收所述主协议模块发送的第二pdu并进行备份,包括:

所述备协议模块接收所述主协议模块发送的目标pdu以及所述第二变量的取值并进行备份;所述第二变量的取值为所述目标pdu首字节序号;所述目标pdu是所述主协议模块在储存的至少一个第二tcp报文对应的多个第二pdu中,按序读取的至少一个第二pdu;

所述备协议模块向所述主协议模块发送第二确认消息,包括:

所述备协议模块向所述主协议模块返回的针对所述目标pdu的第四确认消息,以使所述主协议模块将所述第二变量的取值更新为所述第二变量的当前值与所述目标pdu长度之和,并通过第一用户态协议栈向对端设备依次发送与所述目标pdu对应的目标第二tcp报文。

可选的,所述第一中间件创建第三变量,所述第三变量的取值用于指示所述对端设备已收到的所述网络设备发往对端设备的最后一个第二tcp报文的序号;

所述方法还包括:

所述备协议模块接收所述主协议模块备份的第三变量的取值;

所述备协议模块将所述第三变量的取值记录在第二主控板的第二中间件中;

所述备协议模块在记录的第二pdu中,删除首字节序号包括所述第三变量取值的第二pdu。

可选的,所述所述备协议模块在所述主协议模块备份的第二pdu中确定第三pdu,包括:

所述备协议模块从所述第二中间件中读取已记录的第三变量的取值;

所述备协议模块在所述主协议模块备份的第二pdu中,将首字节序号在第三变量取值之后的第二pdu作为第三pdu。

可选的,所述主协议模块创建所述所述主协议模块所在网络设备与所述对端设备之间的tcp连接对应的第一socket,所述第一socket对应所述第一用户态协议栈创建的第一inpcb,所述第一inpcb包括第一key信息和第一tcp控制块;

所述备协议模块继承所述主协议模块所在网络设备与所述对端设备之间的tcp连接,包括:

所述备协议模块创建第二socket,所述第二inpcb包括第二key信息和第二tcp控制块,

第二用户态协议栈创建与该第二socket对应的第二inpcb;

所述备协议模块将所述第二socket设置为tcprepair修复模式,并将所述主协议模块记录的第一socket对应的连接信息设置在所述第二socket上;

所述备协议模块利用所述第二key信息和第二tcp控制块更新所述第一key信息和第一tcp控制块,并删除第二inpcb,以使所述第二socket与更新后的第一inpcb关联;

所述备协议模块通知各主控板和业务板将各主控板和业务板中记录的第一主控板与所述第一inpcb之间的对应关系更新为第二主控板与所述第一inpcb之间的对应关系。

根据本申请的第三方面,提供一种网络设备中的第一主控板,所述第一主控板包括:主协议模块、第一用户态协议栈中的主tcpnsr模块,所述主协议模块和所述主tcpnsr模块运行在所述第一主控板的用户态空间;所述网络设备还包括第二主控板,所述第二主控板包括:备协议模块,第二用户态协议栈中的备tcpnsr模块;所述备协议模块和所述备tcpnsr模块运行在第二主控板的用户态空间;

所述tcpnsr模块,用于当所述主协议模块工作状态正常时,将接收的至少一个第一tcp报文备份至所述备tcpnsr模块,并在接收到所述备tcpnsr模块发送的第一确认消息时,向所述主协议模块发送所述至少一个第一tcp报文;

所述主协议模块用于,依次将所述至少一个第一tcp报文转换成第一pdu,并将所述第一pdu备份至所述备协议模块;

所述主协议模块用于,向所述备协议模块依次备份至少一个第二pdu,在接收到所述备协议模块发送的第二确认消息后,通过第一用户态协议栈向对端设备依次发送与所述至少一个第二pdu对应的第二tcp报文;

所述主协议模块,用于当所述主协议模块工作状态异常时,保持所述主协议模块所在网络设备与所述对端设备之间的tcp连接,以使所述备协议模块继承所述tcp连接,在所述主协议模块备份的第二pdu中确定第三pdu,通过第二用户态协议栈和该tcp连接,将所述第三pdu对应的第三tcp报文发送给对端设备以及,从所述备tcpnsr模块中获取所述主协议模块还未备份至所述备协议模块的第一pdu对应的第一tcp报文;所述第三pdu与所述主协议模块未发送至对端设备的第二tcp报文对应。

根据本申请第四方面,提供一种网络设备中的第二主控板,所述第二主控板包括:备协议模块、第二用户态协议栈中的备tcpnsr模块,所述备协议模块和所述备tcpnsr模块运行在所述第二主控板的用户态空间;所述网络设备还包括第一主控板,所述第一主控板包括:主协议模块,第一用户态协议栈中的主tcpnsr模块;所述主协议模块和所述主tcpnsr模块运行在第一主控板的用户态空间;

所述备tcpnsr模块,用于当所述主协议模块工作状态正常时,接收所述主tcpnsr模块发送的至少一个第一tcp报文并进行备份;

所述备tcpnsr模块,用于向所述主tcpnsr模块发送第一确认消息,以使所述主tcpnsr模块在接收到所述第一确认消息后,将所述至少一个第一tcp报文发送至所述主协议模块,以由所述主协议模块将所述至少一个第一tcp报文转换成第一pdu,并将所述第一pdu备份至所述备协议模块;

所述备协议模块,用于接收所述主协议模块发送的所述第一pdu并进行备份;

所述备协议模块,用于接收所述主协议模块发送的第二pdu并进行备份;

所述备协议模块,用于向所述主协议模块发送第二确认消息,以使所述主协议模块通过第一用户态协议栈向对端设备依次发送与所述第二pdu对应的第二tcp报文;

所述备协议模块,用于在所述主协议模块工作状态异常时,继承所述主协议模块所在网络设备与所述对端设备之间的tcp连接;

所述备协议模块,用于在所述主协议模块备份的第二pdu中确定第三pdu,所述第三pdu与所述主协议模块未发送至对端设备的第二tcp报文对应;

所述备协议模块,用于通过第二用户态协议栈和该tcp连接,将该确定出的第三pdu对应的第三tcp报文发送给对端设备;

所述备协议模块,用于从所述备tcpnsr模块中获取所述主协议模块还未备份至所述备协议模块的第一pdu对应的第一tcp报文。

由上述描述可知,当主协议模块和备协议模块发生主、备倒换时,备协议模块可以获取到主协议模块上已接收的所有tcp报文对应的pdu,备协议模块获取到主协议模块还未发送给对端设备的tcp报文的pdu,并将获取到的pdu对应的tcp报文发送给对端设备以及主协议模块与对端设备之间的tcp连接迁移到备协议模块上,因此在主、备协议模块发生倒换时,可以实现路由不间断。

附图说明

图1是本申请一示例性实施例示出的一种路由不间断技术的组网示意图;

图2是本申请一示例性实施例示出的一种路由不间断方法的流程图;

图3是本申请一示例性实施例示出的另一种路由不间断方法的流程图;

图4是本申请一示例性实施例示出的一种主控板的示意图;

图5是本申请一示例性实施例示出的另一种主控板的示意图。

具体实施方式

这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本申请的一些方面相一致的装置和方法的例子。

在本申请使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本申请。在本申请和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。

应当理解,尽管在本申请可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本申请范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。

本申请旨在提出一种基于路由不间断方法,在介绍该方法之前,先对本申请所涉及的组网以及本申请所涉及的网络设备的结构进行介绍。

参见图1,图1是本申请一示例性实施例示出的一种路由不间断技术的组网示意图。

路由不间断技术的组网中包括:网络设备1(为了方便叙述,简称为本端设备或本设备)和网络设备2(为了方便叙述,简称对端设备)。

1、网络设备1的设备结构如下所示:

网络设备1包括:至少一个主控板、至少一个业务板等。当然,在实际应用中网络设备1还可包括其他硬件,这里只是示例性地说明,不进行具体地限定。

2、网络设备1上的每一个主控板包括如下所述模块:

主控板(即本端设备上的主控板)上的操作系统区分用户态和内核态。

1)主控板上运行于用户态空间的模块包括:至少一个协议模块、用户态协议栈中的与每个协议模块对应的tcpnsr模块、中间件、转发模块、ha(highavailability,高可靠)模块。当然,主控板上运行于用户态的模块还可包括其他模块,这里只是示例性地说明,不进行具体地限定。

a、协议模块和tcpnsr模块

主控板上的每个基于tcp协议的协议模块对应一种基于tcp(transmissioncontrolprotocol传输控制协议)的应用协议,每一个协议模块与用户协议栈中的每一个tcpnsr模块对应。主控板上的每一个协议模块被配置了主、备角色,tcpnsr模块的主、备角色与该tcpnsr模块对应的协议模块相同。在本申请中,本申请提到的协议模块是指基于tcp协议的协议模块。

b、ha模块

主控板上的ha模块,用于针对每一种路由协议,为每个主控板上与该路由协议对应的协议模块分配主、备角色。

例如,如图1所示,图1所示的网络设备1上包括两块主控板,分别为主控板1和主控板2。

主控板1上位于用户态的模块包括:协议模块11、协议模块12,用户态协议栈中包括:与协议模块11对应的tcpnsr模块11、与协议模块12对应的tcpnsr模块12,以及ha模块1、中间件1。

主控板2上位于用户态的模块包括:协议模块21、协议模块22,用户态协议栈中包括:与协议模块21对应的tcpnsr模块21、与协议模块22对应的tcpnsr模块22,以及ha模块2、中间件2。

假设,协议模块11和协议模块21对应bgp(bordergatewayprotocol,边界网关协议)协议,协议模块12和协议模块22对应ldp(labeldistributionprotocol,标签分发协议))协议。

对于bgp协议来说,ha模块1将协议模块11选择为主协议模块(下文简称主协议模块11),ha模块2将协议模块21选择为备协议模块(下文简称备协议模块21),此时,与协议模块11对应的tcpnsr模块11(下文简称主tcpnsr模块11)为主tcpnsr模块,与协议模块21对应的tcpnsr模块21为备tcpnsr模块(下文简称备tcpnsr模块21)。

对于ldp协议来说,ha模块1将协议模块12选择为备协议模块,ha模块2将协议模块22选择为主协议模块,此时,与协议模块12对应的tcpnsr模块12为备tcpnsr模块,与协议模块22对应的tcpnsr模块22为备tcpnsr模块。

c、中间件

中间件主要用于储存用户态模块和内核态模块均需访问的数据,该中间件可以通过用户态和内核态的共享内存实现。

d、用户态转发模块

用户态的转发模块主要用于将待发送给对端设备的报文发送给对端设备。

2)主控板上位于内核态的模块包括:内核协议栈和内核转发模块。当然,根据实际应用,主控板上位于内核态的模块还可包括其他模块,这里只是示例地说明,不进行具体地限定。

内核协议栈和内核转发模块的功能与现有网络设备内核协议栈和内核转发模块的功能相同,这里不再赘述。

本申请提供的路由协议不间断方法,主要是为了实现:在某一主控板的主协议模块工作状态异常时,另一块主控板上的备协议模块可以平稳接替该工作状态异常的主协议模块的工作,而又不让对端设备感知到本端设备两块主控板上的主、备协议模块发生倒换。

为了实现上述目的,本申请需要解决如下3个问题:

1、在主、备协议模块发生倒换时,如何保证tcp报文的接收无缝衔接。换句来说,在主、备协议模块发生倒换时,如何保证备协议模块可以获取到主协议模块上已接收的所有tcp报文对应的pdu(protocoldataunit,协议数据单元)。

2、在主、备协议模块发生倒换时,如何保证tcp报文的发送无缝衔接。换句来说,在主、备协议模块发生倒换时,如何保证备协议模块获取到主协议模块还未发送给对端设备的tcp报文的pdu,并将获取到的pdu对应的tcp报文发送给对端设备。

3、在主、备协议模块发生倒换时,如何保证与对端设备之间的协议连接无缝迁移。换句来说,在主、备协议模块发生倒换时,如何将主协议模块与对端设备之间的tcp连接迁移到备协议模块上。

为此,本申请提供了一种路由不间断方法,可以解决上述三个问题。

下面对本申请提出的路由不间断方法进行详细说明。

参见图2,图2是本申请一示例性实施例示出的一种路由不间断方法的流程图,该方法可应用在图1所示的网络设备的第一主控板上。该网络设备包括:第一主控板和第二主控板。

第一主控板包括:主协议模块、用户态协议栈中的主tcpnsr模块、第一用户态转发模块、第一中间件,所述主协议模块、所述主tcpnsr模块、第一用户态转发模块、第一中间件运行在所述第一主控板的用户态空间;

第一主控板包括:第一内核协议栈,所述第一内核协议栈运行在所述第一主控板的内核态空间。

第二主控板包括:备协议模块、用户态协议栈中的备tcpnsr模块、第二用户态转发模块、第二中间件,所述备协议模块、所述备tcpnsr模块、第二用户态转发模块、第二中间件运行在所述第二主控板的用户态空间;

第二主控板包括:第二内核协议栈,所述第二内核协议栈运行在所述第二主控板的内核态空间。

所述方法包括:

步骤201:当所述主协议模块工作状态正常时,所述主tcpnsr模块将接收的至少一个第一tcp报文备份至所述备tcpnsr模块,并在接收到所述备tcpnsr模块发送的第一确认消息时,向所述主协议模块发送所述至少一个第一tcp报文;

步骤202:所述主协议模块依次将所述至少一个第一tcp报文转换成第一pdu,并将所述第一pdu备份至所述备协议模块。

需要说明的是,步骤201、步骤202以及步骤204中的“从所述备tcpnsr模块中获取所述主协议模块还未备份至所述备协议模块的第一pdu对应的第一tcp报文”主要用于解决上述问题1。

在主协议模块工作状态正常时,主tcpnsr模块将已接收到的第一tcp报文备份给备tcpnsr模块。主协议模块可以依次获取备份的第一tcp报文,并将第一tcp报文转换为第一pdu,然后将获取的第一pdu依次备份给备协议模块。当主协议模块工作状态异常时,第二主控板上备协议模块可以在备tcpnsr模块中,获取主协议模块还未备份给备协议模块的第一pdu对应的第一tcp报文,从而保证了在主、备协议模块发生倒换时,备协议模块可以获取到主协议模块所有已接收到的第一pdu。

下面通过步骤2011至步骤2012对步骤201至步骤202进行详细地说明。

步骤2011:当所述主协议模块工作状态正常时,所述主tcpnsr模块将接收的至少一个第一tcp报文备份至所述备tcpnsr模块。

下面结合图1,对步骤201进行详细地说明。

其中,主控板1为第一主控板、主控板2为第二主控板、主协议模块11为第一主控板上的主协议模块、主tcpnsr模块11为第一主控板上的主tcpnsr模块、备协议模块21为第二主控板上的备协议模块、备tcpnsr模块21为第二主控板上的备tcpnsr模块。

在实现时,设备1(即图1中的网络设备1,下文将网络设备1简称为设备1,将网络设备2简称为设备2)的业务板在接收到tcp报文后,设备1的业务板可确定tcp报文的协议类型。这里为了方便叙述,将设备1业务板接收到的tcp报文称之为第一tcp报文。

假设第一tcp报文的协议类型为bgp协议,由于bgp协议与主tcpnsr模块11对应,所以业务板可将该tcp报文透传给设备1的主控板1上的主tcpnsr模块11。

主tcpnsr模块11在接收到业务板透传的第一tcp报文后,主tcpnsr模块11将接收到的第一tcp报文添加在与该主协议模块11对应的缓存队列1中,此外,主tcpnsr模块11还维护与该报文队列的相关信息。该相关信息可包括:第一tcp报文的tcp报文序号。

主tcpnsr模块11可将缓存队列1中的第一tcp报文依次装成单播消息发送给主控板2上的备tcpnsr模块21。

主控板2上的备tcpnsr模块21在接收到单播消息后,可对该单播消息进行解封装,还原成第一tcp报文,然后将第一tcp报文添加在与该备tcpnsr模块21对应的缓存队列2中。

备tcpnsr模块21在将接收到的第一tcp报文添加在缓存队列2后,向主控板1上的主tcpnsr模块11发送针对接收到的第一tcp报文的第一确认消息。

步骤2012:所述主tcpnsr模块在接收到所述备tcpnsr模块发送的针对所述至少一个第一tcp报文的第一确认消息时,向所述主协议模块提交所述多个第一tcp报文。

1)所述主tcpnsr模块向所述第一内核协议栈发送所述至少一个第一tcp报文。

仍结合图1进行详细地说明。

在实现时,主tcpnsr模块11收到缓存队列1中所有第一tcp报文的第一确认消息后,可将该缓存队列1中的第一tcp报文发送至主控板1的内核协议栈1。

2)所述主协议模块从内核协议栈储存的第一tcp报文中读取至少一个第一tcp报文,并将该至少一个第一tcp报文转换为第一pdu,并将该第一pdu备份至所述备协议模块。

在实现时,主协议模块可从内核协议栈1储存的第一tcp报文中中读取出至少一个第一tcp报文,并将该至少一个第一tcp报文储存在预设缓存空间中,通过该预设缓存空间界定出该至少一个第一tcp报文的pdu边界,从而将至少一个第一tcp报文转换为第一pdu。其中,一个第一pdu可以包括一个或者多个第一tcp报文,这里不进行具体地限定。

主协议模块11可将转换出的第一pdu备份给备协议模块21。备协议模块21在接收到主协议模块11发送的第一pdu后,向主协议模11块返回针对该接收到的第一pdu的第三确认消息。

此外,主控板1的中间件1中还预先创建了第一变量,第一变量的取值用于指示主协议模块还未备份给备协议模块的首个第一pdu首字节序号。

该第一变量可以命名为recv_nextpdu变量,这里只是对第一变量的命名进行示例性地说明,不进行具体地限定。

主协议模块11在接收到备协议模块21返回针对第一pdu的第三确认消息后,可接着从内核协议栈1中读取一个或者多个待读取的第一tcp报文,并将该待读取的一个或者多个第一tcp报文转换为下一个待备份的第一pdu。然后,将中间件中预先创建的变量recv_nextpdu的取值确定为获取到的下一个待备份的第一pdu首字节序号。

主tcpnsr模块11可定期读取中间件中的recv_nextpdu的取值,然后将读取到的取值发送给备tcpnsr模块21。主tcpnsr模块11可将缓存队列1中的序号在该取值前的第一tcp报文删除。同时,备tcpnsr模块21在接收到该取值后,可将缓存队列2中序号在该取值前的第一tcp报文删除。

需要说明的是,由于tcp报文的序号表示tcp报文的字节序号,recv_nextpdu的取值是第一pdu首字节序号,由于两者都是字节序号,所以可以通过recv_nextpdu的取值找到需要删除的第一tcp报文。

步骤203:所述主协议模块向所述备协议模块依次备份至少一个第二pdu,在接收到所述备协议模块发送的第二确认消息后,通过第一用户态协议栈向对端设备依次发送与所述至少一个第二pdu对应的第二tcp报文。

步骤203以及步骤204中的“在所述主协议模块备份的第二pdu中确定第三pdu,通过第二用户态协议栈和该tcp连接,将所述第三pdu对应的第三tcp报文发送给对端设备”主要用于是解决上述问题2。

在主协议模块工作状态正常时,主协议模块将记录的第二pdu备份给所述备协议模块,在备份完成后,主协议模块再通过用户态协议栈向对端设备发送已完成备份的第二pdu对应的第二tcp报文。当主协议模块工作状态异常时,备协议模块可从主协议模块备份来的第二pdu中,确定所述主协议模块还未发送给对端设备的第二tcp报文对应的第二pdu,并通过第二主控板上的用户态协议栈将确定出的第二pdu对应的第二tcp报文发送给对端设备,从而实现了在主、备协议模块发生倒换时,备协议模块获取到主协议模块还未发送给对端设备的tcp报文的pdu,并将获取到的pdu对应的tcp报文发送给对端设备。

仍结合图1进行详细地说明。

在实现时,设备1可将待发送到设备2的第二tcp报文对应的第二pdu保存在主协议模块11中。换句话来说,主协议模块11中储存有第二pdu,该第二pdu转换出的第二tcp报文为设备1待发送给设备2的tcp报文。其中,第二tcp报文可以包括:设备1转发的tcp报文、设备1自身产生的tcp报文等,这里只是对第二tcp报文进行示例性地说明,不进行具体地限定。

此外,主控板1上的中间件1中还预创建有第二变量。第二变量的取值用于指示主协议模块11待备份至备协议模块21的第二pdu的首字节序号。

比如,主协议模块11将要向备协议模块21备份的第二pdu的首字节序号为1000,则第二变量的取值为1000。

第二变量的初始值为主协议模块11中储存的第一个第二pdu首字节的序号。

第二变量的作用是使得备协议模块21可以获知主协议模块11备份来的各第二pdu首字节的序号,使得备协议模块21可保存主协议模块11备份来的各第二pdu以及各第二pdu首字节的序号。

该第二变量可以以snd_nextpdu命名,这里不对第二变量的命名方式进行具体地限定。

主协议模块11可在本地储存的第二pdu中,读取一个或者多个第二pdu,作为待发送到设备2的目标pdu。

然后,主协议模块可将目标pdu、以及中间件中保存的snd_nextpdu的取值(即目标pdu首字节序号)备份给主控板2上的备协议模块21。备协议模块21接收到该目标pdu后,可保存该目标pdu以及snd_nextpdu的取值。然后,备协议模块21向主协议模块11发送针对该目标pdu的第四确认消息。

主协议模块11在接收到备协议模块21发送的针对该目标pdu的第四确认消息后,可将中间件中保存的snd_nextpdu变量的取值更新为:该snd_nextpdu变量当前取值与该目标pdu长度之和。

然后,主协议模块11可通过用户态协议栈1将该目标pdu对应的目标第二tcp报文发送给对端设备。

其中,“主协议模块11可通过用户态协议栈1将该目标pdu对应的目标第二tcp报文发送给对端设备”可通过本领域技术人员熟知的方式,这里不再赘述。

比如,主协议模块11将目标pdu发送给内核协议栈1,内核协议栈1将该目标pdu转换为目标第二tcp报文,并将目标第二tcp报文发送给内核转发模块1,内核转发模块1件将该目标第二tcp报文转发给用户态协议栈1,由用户态协议栈1将该目标第二tcp报文发送给对端设备。

然后,主协议模块11可接着在本地储存的第二pdu中,读取至少一个第二pdu作为目标pdu,并重复上述过程。

此外,主协议模块11的中间件中还创建有第三变量,第三变量的取值用于指示对端设备已收到的本设备发往该对端设备的最后一个第二tcp报文的序号。

该第三变量可以以snd_peerack命名,这里只是对第三变量的命名进行示例性地说明,不进行具体地限定。

比如,对端设备已收到本设备依次发送的第二tcp报文1、第二tcp报文2。则该第三变量的取值为第二tcp报文2的序号。

此外,设备2在接收到主协议模块11发送的目标第二tcp报文后,可向设备1回应针对该目标第二tcp报文的确认报文1。

设备1的业务板在接收到该确认报文1后,可将确认报文1透传到主tcpnsr模块11中,主tcpnsr模块11将中间件1中的第三变量(即snd_peerack变量)的取值更新为该目标第二tcp报文的序号。

此外,主协议模块11还定期查询中间件中记录的snd_peerack变量的取值,然后将该snd_peerack变量的取值发送给备协议模块21。

主协议模块11可在本地记录的第二pdu中,删除首字节序号包括snd_peerack取值之前的第二pdu,(即删除首字节序号在该snd_peerack变量取值之前以及首字节序号为该snd_peerack变量取值的第二pdu),并将snd_peerack变量的取值备份至所述备协议模块。

备协议模块21可在主协议模块11备份过来的第二pdu中,删除首字节序号包括snd_peerack取值之前的第二pdu(即删除首字节序号在该snd_peerack变量取值之前以及首字节序号为该snd_peerack变量取值的第二pdu)。

步骤204:当所述主协议模块工作状态异常时,所述主协议模块保持所述主协议模块所在网络设备与所述对端设备之间的tcp连接,以使所述备协议模块继承所述tcp连接,在所述主协议模块备份的第二pdu中确定第三pdu,通过第二用户态协议栈和该tcp连接,将所述第三pdu对应的第三tcp报文发送给对端设备以及,从所述备tcpnsr模块中获取所述主协议模块还未备份至所述备协议模块的第一pdu对应的第一tcp报文;所述第三pdu与所述主协议模块未发送至对端设备的tcp报文对应。

步骤204主要解决上述问题3。

当主协议模块工作状态异常时,主协议模块不中断本设备与对端设备之间的tcp连接,备协议模块也不控制本设备与对端设备之间新建立tcp连接,而是备协议模块代替主协议模块保持本设备与对端设备之间的tcp连接,从而实现了在主、备协议模块发生倒换时,主协议模块与对端设备之间的tcp连接迁移到备协议模块上。

下面通过步骤2031至步骤2033对步骤203进行详细地说明。

步骤2031:当主协议模块工作状态异常时,所述主协议模块保持所述主协议模块所在网络设备与所述对端设备之间的tcp连接,所述备协议模块继承所述tcp连接(下文简称为tcp连接)。

在详细介绍步骤2031之前,先对下文所涉及的概念进行详细地介绍。

1)inpcb

inpcb(inetprotocolcontrolblock,inet协议控制块):在inet协议族中,每个socket(套接字)对应一个inpcb,inpcb记录了key信息,key信息可包括:socket对应的tcp连接的本地地址、本地端口、远端地址和远端端口、协议类型等。每创建一个socket就会创建对应的inpcb。

2)tcp控制块

tcp控制块包括:tcp协议独有的控制信息,比如tcp连接两个方向上的序号、窗口大小等。

每一个socket对应一个inpcb,每一个inpcb与该socket对应的tcp连接的tcp控制块关联。

3)网络设备的各个板(包括各主控板、各业务板等)均会记录inpcb与inpcb所在主控板的标识的对应关系。

比如,主控板1的协议模块11中的socket1对应inpcb1,则各个板上会记录有主控板1-inpcb1的对应关系。

下面通过步骤20311至步骤20315对步骤2031进行详细地说明。

步骤20311:当所述用户转发模块接收到所述第一主控板内核发出的fin报文或rst报文时,将所述fin报文或rst报文丢弃;所述fin报文或rst报文用于断开所述主协议模块所在网络设备和所述对端设备之间的tcp连接。所述主协议模块删除本地记录的与所述tcp连接对应的第一socket,并保留所述第一socket对应的第一inpcb。

在实现时,当第一主控板不可用时、主协议模块11和备协议模块21会发生主备倒换。

此时,主控板1上的主协议模块11在确定本主控板上使能了路由不间断功能时,主协议模块11保持与对端设备的tcp连接。

由于在主协议模块11和备协议模块21发生主备倒换时,即使主协议模块11不主动向设备2发送fin报文或者rst报文,设备1的内核仍会向设备2发送fin报文或者rst报文,如果设备2收到该fin报文或者rst报文,设备2就会断开与主协议模块11之间的tcp连接。因此,为了防止内核发送fin报文或者rst报文,主控板1上用户态转发模块若接收到主控板1内核发送的fin报文或rst报文,则将该fin报文或rst报文丢弃。

此外,主协议模块11还可关闭本模块所在设备1与设备2之间tcp连接对应的第一socket,但保留第一socket对应的第一inpcb。

此外,还需要说明的是socket中的信息以及inpcb中的信息均是全局变量。网络设备中的任何一个板都可以获取该全局变量。

为了不占用全局变量所占用的内存,主协议模块11在关闭第一socket后,可通知设备1的操作系统启动定时器。在定时器超时后,若该保留的第一inpcb仍未关联备协议模块21新创建的第二socket,则将该第一inpcb删除。

步骤20312:所述备协议模块创建新的第二socket,所述第二主控板上的第二用户态协议栈创建与该第二socket对应的第二inpcb,所述备协议模块将第二socket设置为tcprepair修复模式。

仍以图1为例进行说明

在实现时,主控板2上的备协议模块21可创建第二socket、用户态协议栈2创建与第二socket对应的第二inpcb,并将第二socket模式设置为tcprepair修复模式。

需要说明的是:将第二socket设置为tcprepair修复模式的目的在于,在tcprepair修复模式下,调用connect函数可以将与该第二socket对应的tcp连接的状态设置为已连接状态,可以阻止协议模块21与设备2发起三次握手,建立新的tcp连接。

步骤20313:备协议模块将第一socket对应的连接信息设置在所述第二socket上。

其中,连接信息包括:五元组信息、绑定的私网、tcp连接建立过程中的协商信息、以及tcp发送时间戳等。

其中,上述五元组信息包括:源地址、源端口、目的地址、目的端口和协议类型。

上述tcp连接建立过程中的协商信息包括:是否支持时间戳选项、是否支持窗口因子选项以及通告的窗口因子、是否支持选择确认sack、本端通告的mss值、对端通告的mss值等。

上述tcp发送时间戳:在tcp支持时间戳选项时,旧socket中携带的tcp发送时间戳。

备协议模块21可从全局变量中获取第一socket对应的连接信息,然后将连接信息配置在第二socket中。

需要说明的是,当主、备协议模块发生倒换时,新主协议模块(即原来的备协议模块)发送tcp报文的时间戳需要与旧主协议模块(即原来的主协议模块)发送tcp报文的时间戳一致,否则tcp报文会被对端设备丢弃。所以在第二socket中配置第一socket的tcp发送时间戳的目的在于防止对端设备因为新主协议模块和旧主协议模块发送tcp报文的时间戳不一致而将tcp报文丢弃。

步骤20314:所述备协议模块建立第二socket与第一inpcb的关联。

仍以图1为例进行说明。

备协议模块21可利用所述第二inpcb中的key信息和tcp控制块更新第一inpcb中的key信息和tcp控制块,并删除第一inpcb。

备协议模块21可通知各主控板和各业务板将各主控板和各业务板中记录的主控板1与第一inpcb的对应关系更新为主控板2与第一inpcb的对应关系。

步骤2032:所述备协议模块在所述主协议模块备份的第二pdu中确定第三pdu,所述第三pdu与所述主协议模块未发送至对端设备的tcp报文对应;所述备协议模块通过第二用户态协议栈和该tcp连接,将该确定出的第三pdu对应的第三tcp报文发送给对端设备。

仍以图1为例进行说明。

在实现时,备协议模块21读取已记录的第三变量(即snd_peerack变量)的取值;

备协议模块21在上述主协议模块11同步过来的第二pdu中,确定首字节序号在该第三变量取值之后的第二pdu作为第三pdu。

接着,备协议模块21可将通过上述tcp连接以及用户态协议栈2将该第三pdu对应的第三tcp报文发送给对端设备。

步骤2033:备协议模块从所述备tcpnsr模块中获取所述主协议模块还未备份至所述备协议模块的第一pdu对应的第一tcp报文。

在实现时,备协议模块21读取第二中间件中记录的第一变量(即recv_nextpdu)的取值。

备协议模块21从所述备tcpnsr模块21记录的第一tcp报文中,获取序号包括所述第一变量的取值之后的第一tcp报文(即获取序号是该第一变量取值的第一tcp报文、以及tcp报文序号在第一变量的取值之后的第一tcp报文)。

备协议模块21可将获取的第一tcp报文转换为第一pdu。转换出的第一pdu就是主协议模块还未备份到备协议模块的第一pdu。

由上述描述可知,一方面,针对已接收到的第一tcp报文,在主协议模块工作状态正常时,主tcpnsr模块将已接收到的第一tcp报文备份给备tcpnsr模块。主协议模块可以依次获取备份的第一tcp报文,并将第一tcp报文转换为第一pdu,然后将获取的第一pdu依次备份给备协议模块。当主协议模块工作状态异常时,第二主控板上备协议模块可以在备tcpnsr模块中,获取主协议模块还未备份给备协议模块的第一pdu对应的第一tcp报文,从而保证了在主、备协议模块发生倒换时,备协议模块可以获取到主协议模块所有已接收到的第一pdu。

另一方面,针对待发送的第二tcp报文,在主协议模块工作状态正常时,主协议模块将记录的第二pdu备份给所述备协议模块,在备份完成后,主协议模块再通过用户态协议栈向对端设备发送已完成备份的第二pdu对应的第二tcp报文。当主协议模块工作状态异常时,备协议模块可从主协议模块备份来的第二pdu中,确定所述主协议模块还未发送给对端设备的第二tcp报文对应的第二pdu,并通过第二主控板上的用户态协议栈将确定出的第二pdu对应的第二tcp报文发送给对端设备,从而实现了在主、备协议模块发生倒换时,备协议模块获取到主协议模块还未发送给对端设备的tcp报文的pdu,并将获取到的pdu对应的tcp报文发送给对端设备。

第三方面,当主协议模块工作状态异常时,主协议模块不中断本设备与对端设备之间的tcp连接,备协议模块也不控制本设备与对端设备之间新建立tcp连接,而是备协议模块代替主协议模块保持本设备与对端设备之间的tcp连接,从而实现了在主、备协议模块发生倒换时,主协议模块与对端设备之间的tcp连接迁移到备协议模块上。

参见图3,图3是本申请一示例性实施例示出的另一种路由不间断方法的流程图,该方法可应用在网络设备的第二主控板上,可包括如下所示步骤。

步骤301:当所述主协议模块工作状态正常时,所述备tcpnsr模块接收所述主tcpnsr模块发送的至少一个第一tcp报文并进行备份;所述备tcpnsr模块向所述主tcpnsr模块发送第一确认消息,以使所述主tcpnsr模块在接收到所述第一确认消息后,将所述至少一个第一tcp报文发送至所述主协议模块,以由所述主协议模块将所述至少一个第一tcp报文转换成第一pdu,并将所述第一pdu备份至所述备协议模块。

步骤302:所述备协议模块接收所述主协议模块发送的所述第一pdu并进行备份。

在实现时,所述第一主控板的第一中间件创建第一变量,所述第一变量的取值用于指示所述主协议模块还未备份至所述备协议模块的首个pdu首字节序号。

主tcpnsr模块在接收到所述备tcpnsr模块发送的针对所述至少一个第一协议报文的第一确认消息后,向所述第一内核协议栈发送所述至少一个第一tcp报文。

所述主协议模块读取所述内核协议栈中储存的第一tcp报文中,读取至少一个第一tcp报文,并将该至少一个第一tcp报文转换为第一pdu,并将该第一pdu备份至所述备协议模块。

备协议模块接收所述主协议模块发送的第一pdu进行备份。

在备协议模块完成备份后,所述备协议模块向所述主协议模块返回针对所述至少一个第一pdu的第三确认消息,以使所述主协议模块将所述第一变量的取值更新为:所述主协议模块下一个待备份的第一pdu首字节的序号,以使所述主tcpnsr模块从第一中间件中读取第一变量的取值,并将所述第一变量的取值同步至所述备tcpnsr模块;

所述备tcpnsr模块接收所述主tcpnsr模块同步的所述第一变量的取值,将所述第一变量的取值记录在所述第二中间件中,并将所述备tcpnsr模块中记录的序号在该第一变量取值之前的第一tcp报文删除。

具体可参见上述步骤201至步骤202所描述的内容,这里不再赘述。

步骤303:当所述主协议模块工作状态正常时,所述备协议模块接收所述主协议模块发送的第二pdu并进行备份;所述备协议模块向所述主协议模块发送第二确认消息,以使所述主协议模块通过第一用户态协议栈向对端设备依次发送与所述第二pdu对应的第二tcp报文。

在实现时,所述主协议模块中还创建有第二变量,所述第二变量的取值用于指示待备份至所述备协议模块的第二pdu首字节序号。

主协议模块在所述主协议模块储存有至少一个第二pdu中,主协议模块可在存储的第二pdu中按序读取至少一个第二pdu,作为目标pdu。主协议模块将该目标pdu以及第二变量取值(即目标pdu首字节序号)发送给备协议模块。

备协议模块接收所述主协议模块发送的目标pdu以及所述第二变量的取值并进行备份。

在备份完成后,所述备协议模块向所述主协议模块返回的针对所述目标pdu的第四确认消息,以使所述主协议模块将所述第二变量的取值更新为所述第二变量的当前值与所述目标pdu长度之和。

主协议模块可通过第一用户态协议栈将所述目标pdu对应的目标第二tcp报文发送给对端设备。

此外,所述第一中间件中还创建有第三变量,所述第三变量的取值用于指示对端设备已收到的所述网络设备发往对端设备的最后一个第二tcp报文的序号。

若所述主tcpnsr模块接收到所述对端设备返回的针对所述目标第二tcp报文的确认报文,所述主tcpnsr模块则将所述第三变量的取值更新为所述目标第二tcp报文的tcp报文序号;

所述主协议模块从所述第一中间件中读取所述第三变量的取值,并在所述主协议模块记录的第二pdu中,删除首字节序号包括第三变量取值之前的第二pdu(即首字节序号在所述第三变量取值之前以及首字节序号为该第三变量取值的第二pdu),以及将所述第三变量的取值备份至所述备协议模块。

所述备协议模块接收所述主协议模块备份的第三变量的取值;

所述备协议模块将该第三变量的取值记录在第二主控板的第二中间件中,以及所述备协议模块在该备协议模块记录的第二pdu中,删除首字节序号包括第三变量取值之前的第二pdu(即删除首字节序号在该第三变量取值之前以及首字节序号为该第三变量取值的第二pdu)。

具体可参见上文步骤203中的描述,这里不再赘述。

步骤304:在所述主协议模块工作状态异常时,所述备协议模块继承所述主协议模块所在网络设备与所述对端设备之间的tcp连接;所述备协议模块在所述主协议模块备份的第二pdu中确定第三pdu,所述第三pdu与所述主协议模块未发送至对端设备的第二tcp报文对应;所述备协议模块通过第二用户态协议栈和该tcp连接,将该确定出的第三pdu对应的第三tcp报文发送给对端设备;所述备协议模块从所述备tcpnsr模块中获取所述主协议模块还未备份至所述备协议模块的第一pdu对应的第一tcp报文。

下面通过步骤3041至步骤3043进行说明。

步骤3041:备协议模块继承所述主协议模块所在网络设备与对端设备之间的tcp连接。

在实现时,在主协议模块工作状态异常时,当第一主控板上的第一用户转发模块接收到所述第一主控板内核发出的fin报文或rst报文时,将所述fin报文或rst报文丢弃。

所述主协议模块删除本地记录的与所述tcp连接对应的第一socket,并保留所述第一socket对应的第一inpcb。

所述备协议模块创建第二socket,所述用户态协议栈创建与该第二socket对应的第二inpcb,所述备协议模块将第二socket设置为tcprepair修复模式,并将所述第一socket对应的连接信息设置在所述第二socket上;

所述备协议模块利用所述第二inpcb中的key信息和tcp控制块更新所述第一inpcb中的key信息和tcp控制块,并删除第二inpcb,并关联所述第二socket与更新后的第一inpcb;

所述备协议模块通知各主控板和各业务板将各主控板和各业务板中记录的第一主控板与所述第一inpcb的对应关系更新为第二主控板与所述第一inpcb的对应关系。

步骤3042:所述备协议模块在所述主协议模块备份的第二pdu中确定第三pdu,并通过第二用户态协议栈和该tcp连接,将该确定出的第三pdu对应的第三tcp报文发送给对端设备,所述第三pdu与所述主协议模块未发送至对端设备的第二tcp报文对应。

所述备协议模块从所述第二中间件中读取已记录的第三变量的取值。

所述备协议模块在所述主协议模块备份的第二pdu中,确定序号在该第三变量取值之后的第二pdu作为第三pdu,并通过第二用户态协议栈和该tcp连接,将该确定出的第三pdu对应的第三tcp报文发送给对端设备。

步骤3043:备协议模块从所述备tcpnsr模块中获取所述主协议模块还未备份至所述备协议模块的第一pdu对应的第一tcp报文。

所述备协议模块读取第二中间件中记录的第一变量的取值;

所述备协议模块从所述备tcpnsr模块记录的第一tcp报文中,获取序号包括第一变量取值之后的第一tcp报文(即获取序号是该第一变量取值的第一tcp报文、以及序号在第一变量的取值之后的第一tcp报文)

备协议模块将获取到的第一tcp报文转发为第一pdu,并将转换出的第一pdu作为所述主协议模块还未备份至所述备协议模块的第一pdu。

具体可参见上述步骤204,这里不再赘述。

下面结合图1,并通过具体地例子对本申请提出的路由不间断方法进行详细地说明。

1)主协议模块工作状态正常,针对已接收的tcp报文

假设,业务板接收到tcp报文1000、tcp报文2000和tcp报文3000。假设这三个tcp报文的上层协议是bgp协议。由于bgp协议与主控板1上的主tcpnsr模块11、主协议模块11和主控板2上的备tcpnsr模块21、备协议模块21对应,所以业务板可将tcp报文1000、tcp报文2000和tcp报文3000透传给主控板1上的主tcpnsr模块11。其中,tcp报文1000的tcp报文序号为1000,1000表示tcp报文首字节的序号。tcp报文2000、tcp报文3000与之相同,这里不再赘述。

主tcpnsr模块11在接收到这三个tcp报文后,可将tcp报文1000、tcp报文2000和tcp报文3000记录在缓存队列1中。然后,主tcpnsr模块11分别封装这三个tcp报文,并将封装好的tcp报文依次发送给备tcpnsr模块21。

备tcpnsr模块21接收到这三个封装好的报文后,可对报文解封装,得到tcp报文1000、tcp报文2000和tcp报文3000,并将这三个tcp报文记录在tcpnsr模块21对应的缓存队列2中。然后,备tcpnsr模块21向主tcpnsr模块11依次返回针对tcp报文1000的确认消息1、针对tcp报文2000的确认消息2以及针对tcp报文3000的确认消息3。

主tcpnsr模块11在接收确认消息1、确认消息2以及确认消息3后,主tcpnsr模块11可将tcp报文1000、tcp报文2000和tcp报文3000上送给主控板1的内核协议栈1。

主协议模块可从内核协议栈1中读取tcp报文。假设,主协议模块读取tcp报文1000,并将tcp报文1000放置预设缓存空间。假设主协议模块基于该预设缓存空间界定出该tcp报文1000具有完成的pdu边界,则将tcp报文1000转换为pdu1。pdu1的首字节序号为1000。

然后,主协议模块11可将pdu1备份给备协议模块21。备协议模块21在接收到主协议模块11备份的pdu1后,可记录pdu1,并向主协议模块11返回针对pdu1的确认消息。

主协议模块11在接收到备协议模块21返回的针对pdu1的确认消息后,主协议模块11可读取tcp报文2000。假设,tcp报文2000也具有一个完成的pdu边界,主协议模块将tcp报文2000转换为pdu2,pdu2的首字节序号为2000。该pdu2为下一个待备份的pdu,主协议模块11将中间件1中的recv_nextpdu变量的取值更新为2000。

然后,主协议模块11可继续采用上述方式向备协议模块备份21备份pdu2,以及由tcp报文3000转换出的pdu3。这里不再赘述。

此外,主tcpnsr模块11可定时获取该recv_nextpdu变量的取值,假设,主tcpnsr模块11当前获取的recv_nextpdu变量的取值为2000。主tcpnsr模块11可将2000同步给备tcpnsr模块21。备tcpnsr模块21可在中间件中记录recv_nextpdu=2000。

主tcpnsr模块11可将缓存队列1中的序号在2000之前的tcp报文删除,即将tcp报文1000删除,此时,缓存队列1中的tcp报文为tcp报文2000和tcp报文3000。

此外,备tcpnsr模块可将缓存队列2中的序号在2000之前的tcp报文删除,即将tcp报文1000删除,此时,缓存队列2中的tcp报文为tcp报文2000和tcp报文3000。

2)主协议模块工作状态正常,针对待发送给对端设备的tcp报文

假设主协议模块11记录有待发送给设备2的tcp报文对应的pdu。比如,主协议模块11保存3个待发送给设备2的tcp报文对应的pdu,这三个pdu分别为pdu4、pdu5和pdu6。pdu4首字节序号1,pdu5首字节序号为1501,pdu6首字节序号为3001。假设,pdu4、pdu5和pdu6的长度均是1500字节。

假设,pdu4是待发送给设备2的第一个pdu,主协议模块11保存的snd_nextpdu的初始值为pud4首字节的序号,即1。

主协议模块11可在pdu4、pdu5和pdu6中读取pdu4,然后将pdu4和snd_nextpdu的取值(即1)备份给备协议模块21。

备协议模块21在接收到pdu4和snd_nextpdu的取值后,可记录pdu4以及snd_nextpdu取值。然后备协议模块21可向主协议模11返回针对pdu4的确认消息。

主协议模块11在接收到该确认消息后,将snd_nextpdu的取值增加pdu4的长度(即1500字节),此时snd_nextpdu的取值为1501。

接着,主协议模块11可通过用户态协议栈1将pdu4对应的tcp报文1发送给设备2。此外,主协议模块11还可采用上述方法接着读取pdu5,这里不再赘述。

需要说明的是,设备2在收到tcp报文1后,会向设备1回复针对tcp报文1的确认报文。

当设备1的业务板收到设备2发送的针对tcp报文1的确认报文,则将该针对tcp报文1的确认报文上送给主tcpnsr模块11。主tcpnsr模块11将中间件中记录的snd_peerack变量的取值更新为tcp报文1的序号,即此时snd_peerack=1。

主协议模块11会定期读取中间件1中snd_peerack变量的取值。

假设,主协议模块11本次读取到的snd_peerack变量取值为1,主协议模块可将snd_peerack变量取值发送给备协议模块21。此外,主协议模块11可在本地记录的pdu4、pdu5和pd6中,删除首字节序号在snd_peerack变量取值之前首字节序号为该snd_peerack变量取值以及首字节序号为该snd_peerack变量取值的pdu,即删除pdu4,此时主协议模块11中记录的待发送pdu为pdu5和pdu6。

备协议模块21在接收到主协议模块11发送的snd_peerack变量取值后,可在主协议模块11备份来的待发送的pdu4、pdu5和pd6中,删除首字节序号在snd_peerack变量取值之前以及首字节序号为该snd_peerack变量取值的pdu,即删除pdu4,此时备协议模块11中记录的待发送pdu为pdu5和pdu6。

3)主协议模块工作状态异常,主协议模块和备协议模块发生主备倒换

假设,主协议模块11在准备将pdu2备份该备协议模块和主协议模块11待从本地记录的待发送pdu中读取pdu5是同一时刻,记为时刻t1。

假设,主、备协议模块在t1时刻发生主备倒换。

此时,虽然主协议模块不主动向设备2发送用于断开主协议模块所在设备1与设备2之间的tcp连接的fin报文或者rst报文。但是,主控板1的内核会发送用于断开该tcp连接的fin报文或者rst报文。

此时,若主协议模块11使能了路由不间断功能,主控板1上的用户态转发模块1在接收到主控板1的内核发送的fin报文或者rst报文后,用户态转发模块1会将该fin报文以及rst报文丢弃。

主协议模块11删除本地记录的且与该tcp连接对应的socket(简称旧socket),并保留该旧socket对应的inpcb(简称旧inpcb)。

备协议模块21创建新socket,所述用户态协议栈创建与该新socket对应的新inpcb,所述备协议模块将新socket设置为tcprepair修复模式,并将所述旧socket对应的连接信息设置在所述新socket上。

备协议模块21利用所述新inpcb中的key信息和tcp控制块更新旧inpcb中的key信息和tcp控制块,并删除新inpcb;

备协议模块21通知各板将各板中记录的主控板1与旧inpcb的对应关系更新为主控板2与旧inpcb的对应关系。

此外,备协议模块21可从中间件中读取recv_nextpdu的取值(即2000),然后备协议模块21可从备tcpnsr模块21对应的缓存队列2中获取序号为2000,以及序号大于2000的tcp报文,即备协议模块21可从备tcpnsr模块21对应的缓存队列2中读取tcp报文2000和tcp报文3000,并将tcp报文2000转换为pdu2,将tcp报文3000转换为pdu3。

备协议模块21还可读取已记录的snd_peerack的取值(即1)。然后备协议模块21可将本地记录的pdu5和pdu6中,确定序号在1之后的pdu(即pdu5和pdu6),然后备协议模块21通过用户态协议栈2将pdu5对应的tcp报文1501发送给设备2,将pdu6对应的tcp报文3001发送给设备2。

此外,本申请还提供了应用图2所示的路由不间断方法的主控板的示意图。

参见图4,图4是本申请一示例性实施例示出的一种主控板的示意图。图4所示的主控板为网络设备中的第一主控板。所述第一主控板包括:主协议模块401、第一用户态协议栈402中的主tcpnsr模块403,所述主协议模块和所述主tcpnsr模块运行在所述第一主控板的用户态空间;所述网络设备还包括第二主控板,所述第二主控板包括:备协议模块,第二用户态协议栈中的备tcpnsr模块;所述备协议模块和所述备tcpnsr模块运行在第二主控板的用户态空间;

所述tcpnsr模块403,用于当所述主协议模块工作状态正常时,将接收的至少一个第一tcp报文备份至所述备tcpnsr模块,并在接收到所述备tcpnsr模块发送的第一确认消息时,向所述主协议模块发送所述至少一个第一tcp报文;

所述主协议模块,用于依次将所述至少一个第一tcp报文转换成第一pdu,并将所述第一pdu备份至所述备协议模块;

所述主协议模块401,用于向所述备协议模块依次备份至少一个第二pdu,在接收到所述备协议模块发送的第二确认消息后,通过第一用户态协议栈向对端设备依次发送与所述至少一个第二pdu对应的第二tcp报文;

所述主协议模块401,用于当所述主协议模块工作状态异常时,保持所述主协议模块所在网络设备与所述对端设备之间的tcp连接,以使所述备协议模块继承所述tcp连接,在所述主协议模块备份的第二pdu中确定第三pdu,通过第二用户态协议栈和该tcp连接,将所述第三pdu对应的第三tcp报文发送给对端设备以及,从所述备tcpnsr模块中获取所述主协议模块还未备份至所述备协议模块的第一pdu对应的第一tcp报文;所述第三pdu与所述主协议模块未发送至对端设备的第二tcp报文对应。

可选的,所述第一主控板还包括:第一中间件404和第一内核协议栈405;所述第一中间件404位于所述第一主控板的用户态空间;所述第一内核协议栈405位于所述第一主控板的内核态空间;

所述主tcpnsr模块403,在向所述主协议模块401发送所述至少一个第一tcp报文时,具体用于向所述第一内核协议栈405发送所述至少一个第一tcp报文;

所述主协议模块401,在用于依次将所述至少一个第一tcp报文转换成第一pdu,具体用于读取所述内核协议栈中储存的至少一个第一tcp报文,并将所述至少一个第一tcp报文转换为第一pdu。

可选的,所述第一中间件404创建第一变量,所述第一变量的取值用于指示所述主协议模块还未备份至所述备协议模块的首个pdu首字节序号;

所述主协议模块401,还用于在接收到所述备协议模块发送的第三确认消息后,将所述第一变量的取值更新为所述主协议模块下一个待备份的第一pdu首字节序号;

所述主tcpnsr模块403,还用于从所述第一中间件中读取所述第一变量的取值,并将记录的序号在所述第一变量取值之前的第一tcp报文删除,以及将所述第一变量的取值备份至所述备tcpnsr模块,以使所述备tcpnsr模块将所述第一变量的取值记录在第二主控板的第二中间件中,并将所述备tcpnsr模块记录的序号在所述第一变量取值之前的第一tcp报文删除。

可选的,所述主协议模块401还创建第二变量,所述第二变量的取值用于指示待备份至所述备协议模块的第二pdu首字节序号;

所述主协议模块401在向所述备协议模块依次备份至少一个第二pdu,在接收到所述备协议模块发送的第二确认消息后,通过第一用户态协议栈向对端设备依次发送与所述至少一个第二pdu对应的第二tcp报文时,具体用于在储存的至少一个第二pdu中,按序读取至少一个第二pdu,作为目标pdu;将所述目标pdu以及表示目标pdu首字节序号的第二变量的取值发送至所述备协议模块;在接收到所述备协议模块发送的针对所述目标pdu的第四确认消息后,所述主协议模块将所述第二变量的取值更新为所述第二变量的当前值与所述目标pdu长度之和;通过第一用户态协议栈向对端设备依次发送与所述目标pdu对应的目标第二tcp报文。

可选的,所述第一中间件404创建第三变量,所述第三变量的取值用于指示所述对端设备已收到的所述网络设备发往所述对端设备的最后一个第二tcp报文的序号;

所述主tcpnsr模块403,还用于若所述主tcpnsr模块接收到所述对端设备返回的针对所述目标第二tcp报文的确认报文,则将所述第三变量的取值更新为所述目标第二tcp报文的序号;

所述主协议模块401,还用于从所述第一中间件中读取所述第三变量的取值,并在所述主协议模块记录的第二pdu中,删除首字节序号包括所述第三变量取值之前的第二pdu,以及将所述第三变量的取值备份至所述备协议模块,以使所述备协议模块将所述第三变量的取值记录在第二主控板的第二中间件中,以及在所述备协议模块记录的第二pdu中,删除首字节序号包括所述第三变量取值之前的第二pdu。

可选的,所述第一主控板还包括:第一用户态转发模块406,所述第一用户态转发模块406运行在所述第一主控板的用户态空间;

所述主协议模块在保持所述主协议模块所在网络设备与所述对端设备之间的tcp连接时,具体用于当所述第一用户态转发模块406接收到第一主控板内核发出的fin报文或rst报文时,将所述fin报文或rst报文丢弃;所述fin报文或rst报文用于断开所述主协议模块所在网络设备和所述对端设备之间的tcp连接;

所述主协议模块401,还用于删除记录的与所述tcp连接对应的第一socket,并保留所述第一socket对应的第一inpcb,以使得所述备协议模块利用创建的第二socket对应的第二inpcb对所述第一inpcb进行更新,并关联所述第二socket与更新后的第一inpcb。

此外,本申请还提供了应用图3所示的路由不间断方法的主控板的示意图。

参见图5,图5是本申请一示例性实施例示出的另一种主控板的示意图。图5所示的主控板为网络设备中的第二主控板。所述第二主控板包括:备协议模块501、第二用户态协议栈502中的备tcpnsr模块503,所述备协议模块501和所述备tcpnsr模块503运行在所述第二主控板的用户态空间;所述网络设备还包括第一主控板,所述第一主控板包括:主协议模块,第一用户态协议栈中的主tcpnsr模块;所述主协议模块和所述主tcpnsr模块运行在第一主控板的用户态空间;

所述备tcpnsr模块503,用于当所述主协议模块工作状态正常时,接收所述主tcpnsr模块发送的至少一个第一tcp报文并进行备份;

所述备tcpnsr模块503,用于向所述主tcpnsr模块发送第一确认消息,以使所述主tcpnsr模块在接收到所述第一确认消息后,将所述至少一个第一tcp报文发送至所述主协议模块,以由所述主协议模块将所述至少一个第一tcp报文转换成第一pdu,并将所述第一pdu备份至所述备协议模块;

所述备协议模块501,用于接收所述主协议模块发送的所述第一pdu并进行备份;

所述备协议模块501,用于接收所述主协议模块发送的第二pdu并进行备份;

所述备协议模块501,用于向所述主协议模块发送第二确认消息,以使所述主协议模块通过第一用户态协议栈向对端设备依次发送与所述第二pdu对应的第二tcp报文;

所述备协议模块501,用于在所述主协议模块工作状态异常时,继承所述主协议模块所在网络设备与所述对端设备之间的tcp连接;

所述备协议模块501,用于在所述主协议模块备份的第二pdu中确定第三pdu,所述第三pdu与所述主协议模块未发送至对端设备的第二tcp报文对应;

所述备协议模块501,用于通过第二用户态协议栈和该tcp连接,将该确定出的第三pdu对应的第三tcp报文发送给对端设备;

所述备协议模块501,用于从所述备tcpnsr模块中获取所述主协议模块还未备份至所述备协议模块的第一pdu对应的第一tcp报文。

可选的,所述第一主控板还包括第一中间件,所述第一中间位于所述第一主控板的用户态空间,所述第一中间件创建第一变量,所述第一变量的取值用于指示所述主协议模块还未备份至备协议模块的首个pdu首字节序号;

所述第二主控板还包括第二中间件504,所述第二中间件504位于第二主控板的用户态空间;

所述备协议模块501,还用于向所述主协议模块发送第三确认消息,以使所述主协议模块将所述第一变量的取值更新为所述主协议模块下一个待备份的第一pdu首字节的序号,以使所述主tcpnsr模块从第一中间件中读取第一变量的取值,并将所述第一变量的取值同步至所述备tcpnsr模块;

所述备tcpnsr模块503,还用于接收所述主tcpnsr模块同步的所述第一变量的取值,将所述第一变量的取值记录在所述第二中间件中,并将所述备tcpnsr模块记录的序号在第一变量取值之前的第一tcp报文删除。

可选的,所述备协议模块501,在从所述备tcpnsr模块中获取所述主协议模块还未备份至所述备协议模块的第一pdu对应的第一tcp报文时,具体用于,读取所述第二中间件记录的第一变量的取值;从所述备tcpnsr模块记录的第一tcp报文中,获取序号包括所述第一变量的取值之后的第一tcp报文;将获取到的第一tcp报文转发为第一pdu,并将转换出的第一pdu作为所述主协议模块还未备份至所述备协议模块的第一pdu。

可选的,所述主协议模块还创建第二变量,所述第二变量的取值用于指示待备份至所述备协议模块的第二pdu首字节序号;

所述备协议模块501,在接收所述主协议模块发送的第二pdu并进行备份时,具体用于接收所述主协议模块发送的目标pdu以及所述第二变量的取值并进行备份;所述第二变量的取值为所述目标pdu首字节序号;所述目标pdu是所述主协议模块在储存的至少一个第二tcp报文对应的多个第二pdu中,按序读取的至少一个第二pdu;

所述备协议模块501,在向所述主协议模块发送第二确认消息时,具体用于向所述主协议模块返回的针对所述目标pdu的第四确认消息,以使所述主协议模块将所述第二变量的取值更新为所述第二变量的当前值与所述目标pdu长度之和,并通过第一用户态协议栈向对端设备依次发送与所述目标pdu对应的目标第二tcp报文。

可选的,所述第一中间件504创建第三变量,所述第三变量的取值用于指示所述对端设备已收到的所述网络设备发往对端设备的最后一个第二tcp报文的序号;

所述备协议模块501,还用于接收所述主协议模块备份的第三变量的取值;将所述第三变量的取值记录在第二主控板的第二中间件中;在记录的第二pdu中,删除首字节序号包括所述第三变量取值的第二pdu。

可选的,所述所述备协议模块501,在所述主协议模块备份的第二pdu中确定第三pdu时,具体用于从所述第二中间件中读取已记录的第三变量的取值;在所述主协议模块备份的第二pdu中,将首字节序号在第三变量取值之后的第二pdu作为第三pdu。

可选的,述主协议模块创建所述所述主协议模块所在网络设备与所述对端设备之间的tcp连接对应的第一socket,所述第一socket对应所述第一用户态协议栈创建的第一inpcb,所述第一inpcb包括第一key信息和第一tcp控制块;

所述备协议模块501,在继承所述主协议模块所在网络设备与所述对端设备之间的tcp连接时,具体用于创建第二socket,所述第二inpcb包括第二key信息和第二tcp控制块;

第二用户态协议栈502,用于创建与该第二socket对应的第二inpcb;

所述备协议模块501,用于将所述第二socket设置为tcprepair修复模式,并将所述主协议模块记录的第一socket对应的连接信息设置在所述第二socket上;利用所述第二key信息和第二tcp控制块更新所述第一key信息和第一tcp控制块,并删除第二inpcb,以使所述第二socket与更新后的第一inpcb关联;通知各主控板和业务板将各主控板和业务板中记录的第一主控板与所述第一inpcb之间的对应关系更新为第二主控板与所述第一inpcb之间的对应关系。

上述装置中各个单元的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。

对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本申请方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。

以上所述仅为本申请的较佳实施例而已,并不用以限制本申请,凡在本申请的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本申请保护的范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1