背景技术
在大型的网络拓扑上,当某个网络设备上的链路抖动、网络设备自身重新启动,或者网络设备上的协议重新使能时,网络中的会话被中断并在网络恢复时自动重建。大量会话的自动重建会突发大量的协议报文。对于协议报文的接收端来说,如果瞬间涌来的协议报文数量超过其接收能力,则部分协议报文会被丢弃,被丢弃的协议报文将导致相应会话的创建过程中断,需要再次重建,这样周而复始,就出现了会话振荡。
图1示出了一种可能会出现上述会话振荡情况的典型网络结构,如图1所示,路由器2(RT2,Router2)与其他多台路由器存在链接,存在链接的两台路由器之间均建立标签分发协议(LDP,Label Distribution Protocol)会话,LDP会话两端互为邻居。路由器通过周期性地发送邻居通告(Hello)消息来发现邻居,默认情况下是每隔5秒发送一个Hello消息,然后与新发现的邻居间建立LDP会话。以图1中RT2和RT4之间建立LDP会话为例,其创建大致如下:
当RT2接收到RT4发来的Hello消息后,获知RT4这个邻居,当然RT4也会获知RT2这个邻居,然后,RT2和RT4之间选举建立会话的主动方和被动方,由于LDP会话是TCP链接,因此主动方向被动方发起TCP链接,经三次TCP握手后,建立TCP链接,基于TCP链接建立LDP会话。通过LDP会话,邻居间通告标签交换方式、标签空间、会话保持定时器值等信息。
当LDP会话稳定后,邻居双方通过交互Hello消息或邻居状态保持(Keepalive)消息来维护邻居关系。当连续3个Hello消息的发送周期内接收不到邻居的Hello消息或Keepalive消息,则主动关闭LDP会话,断掉邻居关系。在后续接收到Hello消息后,再重建会话。当邻居之间需要维护标签交换路径(LSP,Label Switching Path)隧道时,也会相互通告隧道的标签信息。
一台路由器可能同时与十几台甚至几十台路由器建立邻居关系,例如,图1中的RT2。而且,在路由器采用LDP多实例的情况下,每一台路由器均可以看作是几十台逻辑对端,每一个逻辑对端都可以作为一个邻居。以每对邻居之间建立一个LDP会话计算,RT2的邻居数量就可能达到几千个,因此RT2需要维护几千个LDP会话。
如果RT2上存在1000个LDP会话,当RT2出现链路抖动、重新启动或LDP协议重新使能时,RT2需要恢复所有的LDP会话,这就意味着RT2要同时接收所有邻居发布的消息,瞬间爆发的消息量非常大。消息由RT2的接口接收后,暂存在输入队列中,再被上层应用取走进行进一步LDP会话创建处理。如果消息量大于协议报文接收的能力,那么部分Hello消息会被丢弃。对于刚建立起来的LDP会话,如果维持其LDP会话状态的消息丢失,会导致会话因3个周期内收不到邻居的Hello消息或Keepalive消息而断掉。那么,刚刚建立起来的LDP会话被断掉并重建。重建会话时,还会产生大量的协议报文,周而复始地出现LDP会话反复振荡。
此外,在RT2上LDP会话稳定的情况下,如果RT2上突发大量的用于创建LSP隧道的标签通告消息,导致标签通告消息丢失,致使隧道创建失败。而且,突发的大量标签通告消息也会挤占RT2的接收能力,导致RT2不能成功接收到维持LDP会话的协议报文,导致LDP会话反复振荡。
为了吸收瞬间爆发的消息量,防止LDP会话振荡,目前采用扩大输入队列长度或扩大协议报文上送上层应用CPU的带宽来尽量提高消息接收能力。但是,这两种解决方式均是治标不治本的办法,对于扩大输入队列长度方式来说,消息数量会随着邻居规模的扩大而不断攀升,而输入队列长度不可能无限制增长,因此当消息数量达到一定程度后,输入队列仍会溢出。对于扩大协议报文上送CPU带宽方式来说,带宽的扩大可能会导致CPU过载,降低了防报文攻击的能力。
可见,目前还没有一种有效的方法防止LDP会话振荡。
发明内容
有鉴于此,本发明提供了一种防止会话振荡的会话处理方法,能够避免消息突发,从根本上防止会话振荡。
该方法包括:接收请求创建会话的协议报文,判断在当前时间周期内建立的会话数目是否达到设置的会话创建数量阈值;如果是,不创建新的会话;否则,根据接收的协议报文创建会话。
较佳地,该方法进一步包括:预先创建资源池,该资源池保存记录的数量等于所述会话创建数量阈值;所述记录用于记载会话创建时间;
所述判断在当前时间周期内建立的会话数目是否达到设置的会话创建数量阈值包括:
从资源池中获取指针当前指向的记录所记载的时间Ti;
计算当前时间与获取的Ti之间的时间差;
如果该时间差的绝对值小于所述时间周期长度,则判定在当前时间周期内建立的会话数目已达到设置的会话创建数量阈值;否则,判定在当前时间周期内建立的会话数目未达到设置的会话创建数量阈值,将当前时间更新到指针当前指向的记录中,令所述指针指向下一个记录;如果所述指针当前指向的记录为所述资源池的最后一个记录,则所述指针指向的下一个记录为所述资源池的第一个记录。
较佳地,该方法进一步包括:在初始化时,将资源池的所有记录初始化为初始符号,指针指向资源池的第一个记录;
所述获取指针当前指向的记录所记载的时间Ti之后,该方法进一步包括:如果获取的Ti为初始符号,则根据接收的协议报文创建会话,将当前时间更新到指针当前指向的记录中,令所述指针指向下一个记录;如果获取的Ti不为初始符号,则执行所述比较当前时间与获取的Ti的时间差的操作。
较佳地,该方法进一步包括:每隔一段预设时间为预设数量个会话发送协议报文;
或者设置第二时间周期长度,在每个第二时间周期长度内最多为预设数量个会话发送协议报文。
较佳地,预先创建第二资源池,该第二资源池保存记录的数量等于所述预设数量;第二资源池中的记录用于记载为一个会话发送报文的时间;
所述在每个第二时间周期长度内最多为预设数量个会话发送协议报文包括:轮询已创建的各会话,对轮询到的会话执行如下处理:
从第二资源池中获取第二指针当前指向的记录所记载的时间Tj;
计算当前时间与获取的Tj之间的时间差;
如果该时间差的绝对值小于所述第二时间周期长度,则不为轮询到的会话发送报文;否则,为轮询到的会话发送报文,将当前时间更新到第二指针当前指向的记录中,令所述第二指针指向下一个记录;如果所述第二指针当前指向的记录为所述第二资源池的最后一个记录,则所述第二指针指向的下一个记录为所述第二资源池的第一个记录。
本发明还提供了一种防止会话振荡的会话处理单元,能够避免消息突发,从根本上防止会话振荡。
该单元包括协议报文接收模块、会话创建判断模块;
所述协议报文接收模块,用于接收协议报文,将接收的请求创建会话的协议报文发送给会话创建判断模块;
所述会话创建判断模块,用于接收所述请求创建会话的协议报文,判断在当前时间周期内建立的会话数目是否达到设置的会话创建数量阈值;如果是,不创建新的会话;否则,根据接收的协议报文创建会话。
其中,所述协议报文接收模块包括接收子模块和确定子模块;
所述接收子模块,用于接收邻居通告Hello消息;
所述确定子模块,用于判断所在单元与所述接收子模块接收的Hello消息的发送端之间的会话是否已经存在,如果不存在,则将接收的Hello消息作为请求创建会话的协议报文发送给所述会话创建判断模块。
其中,所述会话创建判断模块包括资源池、处理子模块和指针控制子模块;
所述资源池用于保存记录,所保存记录的数量等于所述会话创建数量阈值,所述记录用于记载会话创建时间;
所述处理子模块,用于接收来自所述协议报文接收模块的请求创建会话的协议报文,从资源池中,获取指针当前指向的记录所记载的时间Ti;计算当前时间与获取的Ti之间的时间差,如果该时间差的绝对值小于所述时间周期长度,则不创建新的会话;否则,根据接收的协议报文创建会话,将当前时间更新到指针当前指向的记录中,通知指针控制子模块;
所述指针控制子模块,用于在接收到通知后,控制所述指针指向下一个记录;如果所述指针当前指向的记录为所述资源池的最后一个记录,则控制所述指针指向所述资源池的第一个记录。
较佳地,所述处理子模块进一步用于,在初始化时,将资源池的所有记录初始化为初始符号,令指针指向资源池的第一个记录;所述获取指针当前指向的记录所记载的时间Ti之后,如果Ti为初始符号,则执行所述根据接收的协议报文创建会话的操作,将当前时间更新到指针当前指向的记录中,通知指针控制子模块;否则,执行所述比较当前时间与获取的Ti的时间差的操作。
较佳地,该单元进一步包括报文发送控制模块,用于每隔一段预设时间为预设数量个会话发送协议报文;或者设置第二时间周期长度,在每个第二时间周期长度内最多为预设数量个会话发送协议报文。
根据以上技术方案可见,使用本发明保证在某一段时间内最多只能创建一定数量的会话,从而对创建会话操作进行限速。那么,当网络设备在很短的时间内接收到大量请求创建会话的协议报文时,不会立刻创建所有的会话,而是只创建一部分。那么,大量会话将分散在较长的时间内创建,避免集中创建大量会话导致协议报文突发,从根本上防止会话振荡。
具体实施方式
下面结合附图并举实施例,对本发明进行详细描述。
图2为本发明防止会话振荡的会话处理方法的示例性流程图,如图2所示,该方法包括以下步骤:
步骤201:网络设备接收请求创建会话的协议报文。
步骤202:判断在当前时间周期内建立的会话数目是否达到设置的会话创建数量阈值;如果是,则执行步骤203;否则,执行步骤204。
步骤203:不创建新的会话。本流程结束。
步骤204:根据接收的协议报文创建会话。本流程结束。
根据上述流程,采用图2的处理方法,使用本发明保证在一段时间内最多只能创建一定数量的会话,从而对创建会话操作进行限速。那么,当网络设备在很短的时间内接收到大量请求创建会话的协议报文时,不会立刻创建所有的会话,而是只创建一部分。对于不满足限速条件会话创建请求,不马上创建会话,一直到接收到下一次请求创建会话的协议报文且满足限速条件才创建会话。那么,大量会话将分散在较长的时间内创建,避免集中创建大量会话导致协议报文突发,从根本上防止会话振荡。
本发明的技术方案可以适用于大量会话的创建场合。例如,对于配置有LDP协议的网络设备,每两个LDP网络设备之间可以建立一个或多个LDP会话,采用本发明可以抑制LDP会话创建速度,避免集中创建大量LDP会话导致协议报文突发,从根本上防止LDP会话振荡。以下就以该方法应用于配置LDP协议的路由器为例进行详细描述。
图3为本发明实施例中防止会话振荡的会话处理方法的流程图。如图3所示,该方法包括以下步骤:
步骤300:创建资源池,用于记载最近创建的Y1个LDP会话的时间戳。
具体来说,资源池保存Y1个记录,每个记录记载一个LDP会话的创建时间,该创建时间称为LDP会话的时间戳。其中,Y1称为会话创建数量阈值,设X1时间长度内允许创建Y1个LDP会话。
图4为本发明实施例中资源池示意图。如图4所示,该资源池包括Y1个记录。每个记录的位置用一个小方格表示。小方格中内容表示该记录的位置编号。位置编号采用Tn格式,n为第n个记录。n为正整数。指针变量Point指向其中一个记录,该记录使用完后沿着刷新方向偏移,每次偏移一个记录位置。资源池为循环使用。
步骤301:路由器初始化时,将资源池中的所有记录设置为初始符号,变量Point指向T1位置。
其中,本实施例设置初始符号0,当前还可以设置为特定字符,例如NULL。
步骤302:接收邻居发来的Hello消息。
步骤303:判断自身与发送Hello消息的邻居之间是否存在会话,如果是,则执行步骤312;否则,确定接收到请求创建会话的协议报文,执行步骤304。
步骤304:获取当前时间。其中,当前时间可以为路由器的运行累计时间。
步骤305:获取变量Point当前指向的记录中记载的时间Ti。
步骤306:判断获取的Ti是否等于0,如果是,则表明资源池的第一次循环还没有完成,不需要做限速,执行步骤309;否则,执行步骤307。
步骤307:计算步骤304获取的当前时间和步骤305获取的时间Ti之间时间差的绝对值。
步骤308:比较计算得到的时间差的绝对值是否小于预先设置的时间长度X1,如果是,则执行步骤311;否则,执行步骤309。
步骤309:根据Hello消息创建LDP会话。
本步骤中,根据Hello消息建立对端的邻居体,确定自身设备是建立会话的主动方还是被动方,如果是主动方,则向对端发起TCP链接,开始会话创建的协商,直至LDP会话创建完成。
步骤310:将当前时间更新到变量Point当前指向的记录中,令指针沿刷新方向指向下一个记录。返回执行步骤302。
由于资源池是循环使用的,因此如果变量Point当前指向的记录为Tn,且n小于Y1,则更新当前执行的记录后,令变量Point指向T(n+1);如果变量Point当前指向的记录为TY1,则更新当前指向的记录后,令变量Point指向T1。
步骤311:不创建会话。返回步骤302。
本步骤中,虽然不创建会话,但是可以根据Hello消息建立对端的邻居体。
步骤312:根据接收的Hello报文,维护相应LDP会话。返回步骤302。
至此,本流程结束。
从图3的流程可以看出,该实施例将限速操作设置在进入会话状态机之前,即在确定建立会话的主动方和被动方之前进行限速操作。如果在会话状态机中做限速,可能会出现会话反复创建,造成资源反复消耗和系统繁忙。
除了采用资源池对创建会话操作进行限速,还可以采用其他方式实现一段时间内最多创建一定数量会话的方案。例如,设置循环定时器,该循环定时器的定时时间为0到X1。再设置计数器,用于记录创建会话的数量。路由器启动后,循环定时器开始从0到X1循环计时,每当循环定时器清零,计数器也随之清零。当接收到请求建立会话的Hello报文后,判断计数器当前计数值是否小于Y1,如果是,则允许创建会话,并递增计数器的值;否则,不允许创建会话。这样,同样可以实现X1时间段内最多只创建Y1的会话的效果。
当LDP会话建立后,邻居之间会发送通告标签报文,以建立LSP隧道。如果两路由器之间建立了多条甚至上百条LDP会话,则可能出现通告标签报文突发情况,使得接收路由器过载,不仅会导致通告标签报文丢失,LSP隧道创建失败,而且,大量的通告标签报文也会挤占接收路由器的接收能力,导致接收路由器不能成功接收维持邻居关系的协议报文,致使LDP会话反复振荡。
因此,本发明实施例在路由器中对协议报文的发送进行限速,避免协议报文瞬间发送过多过快,导致接收路由器侧出现通告标签报文突发情况。其基本思想为:路由器每隔一段预设时间为预设数量个会话发送协议报文。其中,如果路由器当前承载的会话数量较多,则所述预设数量应该小于路由器当前承载的总会话个数,并且预设数量的确定还需要考虑到路由器处理报文发送的能力,即在路由器当前处理报文发送的承载能力之内,确定上述预设数量。具体来说,
在路由器中,每个会话对应一个报文队列,路由器按顺序轮询各会话对应的报文队列,对轮询到的报文队列进行报文发送处理。本实施例中,每次只轮询预设数量的报文队列,之后,等待预设时间,再按顺序轮询后续的报文队列。例如,路由器承载10个会话,设置预设数量为5,那么路由器第一次为会话1到5发送报文,之后,等待预设时间,再为会话6到10发送报文,之后,再为会话1到5发送报文,依次类推。本实施例中,被限速的协议报文可以包括通告标签报文、Keepalive报文等通过TCP发送的报文。
上述每隔一段预设时间为预设数量个会话发送协议报文的方式是一种简单的实现方式,在实际中,还可以采用前述资源池来实现协议报文的发送限速。具体为,设置第二资源池,该资源池保存Y2个记录,每个记录记载为一个会话发送报文的时间。指针变量Point2指向其中一个记录。假设在X2时间长度内允许Y2个会话发送报文。路由器初始化时,将第二资源池中的所有记录设置为初始符号,例如设置为0,变量Point2指向T1位置。接着,开始为会话发送报文后,路由器按顺序轮询各会话对应的报文队列,对轮询到的报文队列进行如下处理:
获取当前时间;
获取第二资源池中变量Point2当前指向的记录中记载的时间Tj;
如果时间Tj为0,则允许为轮询到的队列对应的会话发送报文,将当前时间更新到变量Point2当前指向的记录中,令指针沿刷新方向指向下一个记录;如果当前指向最后一个记录,则应该指向的下一个记录为第二资源池的第一个记录;
如果时间Tj不为0,则计算获取的当前时间和时间Tj之间时间差的绝对值;当该时间差的绝对值大于或等于X2时,允许为轮询到的报文队列对应的会话发送协议报文,将当前时间更新到变量Point2当前指向的记录中,令指针沿刷新方向指向下一个记录;当该时间差的绝对值小于X2时,不允许为轮询到的报文队列对应的会话发送报文。
在确定不允许为轮询到的报文队列对应的会话发送报文之后,仍然对当前轮询到的报文队列进行上述判断是否发送报文的处理,直到当前轮询到的报文队列成功发送报文,再按序轮询后续报文队列。
为了实现上述会话处理方法,本发明实施例还公开了一种会话处理单元,该单元可以应用与网络设备中,以抑制网络设备创建会话的速度。
图5为本发明实施例中防止会话振荡的会话处理单元的结构示意图,如图5所示,该会话处理单元包括协议报文接收模块51和会话创建判断模块52;其中,
协议报文接收模块51,用于接收协议报文,将接收的请求创建会话的协议报文发送给会话创建判断模块52。
会话创建判断模块52,用于接收协议报文接收模块51发来的请求创建会话的协议报文,判断在当前时间周期内建立的会话数目是否达到设置的会话创建数量阈值;如果是,不创建新的会话;否则,根据接收的协议报文创建会话。
较佳地,在会话创建后,为了防止诸如通告标签报文的协议报文突发,导致接收路由器过载,本发明实施例中的会话处理单元进一步包括报文发送控制模块(在图5中未示出),用于每隔一段预设时间为预设数量个会话发送报文,或者设置时间周期长度X2,在每个时间周期长度X2内最多为预设数量Y2个会话发送协议报文,具体可以与前述根据资源池进行报文发送限速的实现方法相同,这里不详述。
下面以会话处理单元应用于配置有LDP协议的路由器为例,对会话处理单元中的协议报文接收模块51和会话创建判断模块52进行详细描述。且会话创建判断模块52采用资源池实现创建会话的限速。在实际中,会话创建判断模块52也可以采用前述设置循环定时器和计数器的方式实现创建会话的限速。
仍参见图5,协议报文接收模块51包括接收子模块511和确定子模块512;其中,
接收子模块511,用于接收邻居通告的Hello消息。
确定子模块512,用于判断所在设备与接收子模块511接收的Hello消息的发送端之间的LDP会话是否已经存在,如果不存在,则将接收的Hello消息作为请求创建会话的协议报文发送给会话创建判断模块52。
仍参见图5,会话创建判断模块52包括资源池521、处理子模块522和指针控制子模块523;其中,
资源池521,用于保存记录,所保存记录的数量等于会话创建数量阈值,例如为Y1,每个记录用于记载LDP会话创建的时间。
处理子模块522,用于在初始化时,将资源池521的所有记录初始化为初始符号,例如初始化为0,令指针指向资源池的第一个记录。接收来自协议报文接收模块51的请求创建会话的Hello消息,从资源池521中获取指针当前指向的记录所记载的时间Ti;如果获取的Ti为0,则根据接收的协议报文创建会话,将当前时间更新到指针当前指向的记录中,并通知指针控制子模块523;如果获取的Ti不为0,则比较当前时间与获取的Ti的时间差,判断该时间差的绝对值是否小于预设的时间周期长度X1,如果是,则不创建LDP会话;否则,根据接收的Hello消息创建LDP会话,将当前时间更新到指针当前指向的记录中,并通知指针控制子模块523。
指针控制子模块523,用于在接收到通知后,控制指向资源池521的指针指向下一个记录;如果指针当前指向的记录为资源池的最后一个记录,则控制该指针指向资源池的第一个记录,从而使得资源池被循环使用。
由以上所述可以看出,本发明所提供的防止会话振荡的会话处理方案,能够避免消息突发,从根本上防止会话振荡。
综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。