基于分层结构的PIM—SM协议注册过程效率的改进

时间:2022-05-24 05:58:11

基于分层结构的PIM—SM协议注册过程效率的改进

摘要:本文关注于PIM-SM协议的注册流程,通过对协议注册流程的分析,提出一种分层模型。该模型对于不同种类的协议注册报文,针对其特定报文类型,为其选择合适的处理层次,通过分类分层处理减少协议软件对注册报文的处理次数,缩短汇聚点(RP)端注册过程的处理时间,提高协议运行效率。

关键词:PIM-SM协议 注册 注册停止 空注册报文 MRM DR RP

中图分类号:TP393 文献标识码:A 文章编号:1007-9416(2013)01-0139-03

1 引言

PIM协议是当前IP网络中广泛使用的域内组播协议,它通过收集单播路由信息构建并组播转发表并通过监视单播路由信息的变化维护组播转发表。PIM-SM协议是PIM协议的重要组成部分,它适用于组播组成员分布相对分散、范围较广的大中型网络中。由于这样的特性,PIM-SM成为PIM系列协议中使用最频繁的协议。PIM-SM协议具有一套复杂的机制,它拥有很多种状态,同时由于网络环境的复杂性,在每个状态它都需要处理大量不同的网络事件以保证组播转发表的正确性和实时性。因此,保证协议运行时的效率显得尤为重要。传统的对协议效率的改进主要体现在对特定协议事件的处理,比如加入/剪枝处理、RP通告或者SPT切换等方面。本文关注于PIM-SM协议的注册流程,通过对协议注册流程的分析,提出一种分层模型。该模型对于不同种类的协议注册报文,针对其报文类型,为其选择合适的层次进行处理,通过分类分层处理减少协议软件对注册报文的处理次数,缩短汇聚点(RP)端注册过程的处理时间提高协议运行效率。

2 传统注册流程

大体上来讲,PIM-SM的注册流程主要包括两个阶段:第一阶段,组播报文经过封装后通过单播方式将报文转发至RP并通过RP转发。第二阶段,通过在源和RP之间构建最短路径树使组播报文到达RP并通过RP转发。

在第一阶段,当指定路由器(DR)收到一个来自本地网络的组播报文的时候,它会为相应的(S,G)创建注册通道,该注册通道是虚拟的,用来标识唯一一个(S,G)在注册过程中的“隧道传输”。此时,DR会将相应的组播IP数据包封装在PIM注册报文中,再将注册报文封装在IP报文中并利用单播路由将其发送到RP。RP收到该数据包后会将其解封并根据自身维护的组播转发表将报文在RPT上进行转发。

由于在“隧道传输”中,报文的封装和解封装可能会耗费路由器大量的cpu时间。因此,这种低效的做法只是权宜之计。当第一个注册报文到达后,注册流程进入第二个阶段。

第二阶段主要分为三个部分。首先,当第一个注册报文到达后,RP通常会向特定源S发送一个(S,G)加入,这个(S,G)加入报文会从RP逐跳向S转发,并在RP到DR中间路由器上建立相关的(S,G)表项。因此,当(S,G)加入到达DR时,一条基于特定(S,G)的从DR到RP的组播最短路径已经建立。

其次,当(S,G)组播转发路径建立后,从特定源S到RP的路径有两条:通过单播封装的注册通道和之前建立的组播路径。在这种情况下,当组播报文需要通过RP转发时,RP会收到两份相同的组播报文:一份来自于组播路径,一份来自于注册通道。此时,为了避免重复流,RP会向DR发送一个注册停止报文阻止DR通过单播封装的方式继续发送组播报文。而在随后一段时间内RP仅接收到来特定(S,G)自组播路径的报文。

最后,当DR收到注册停止报文后,它会停止发送注册报文并删除注册通道。同时,为了保证(S,G)组播转发链路的有效性,DR需要启动一个注册停止定时器。每当定时器超时后,DR都会向RP发送一个空注册报文,RP在收到这个报文后会刷新自己(S,G)表项的生存周期,回复注册停止报文,继续使用组播转发链路。

3 软件结构

从之前的描述中,我们可以看到PIM-SM协议的注册过程有如下特点:

1)注册流程中主要参与者是RP与DR,其中DR负责将本地网络中的组播报文发送至RP,而RP负责将收到的组播报文通过RPT转发给各个组成员。

2)在注册流程中,相对于RP而言DR更趋于主导位置,它负责添加/删除注册通道,发送注册报文或空注册报文,根据当前状态和发生事件进行状态机切换等工作。

3)在注册流程中RP虽然扮演这十分重要的角色,但相对而言它负责的事务较少,仅包含回复注册停止报文和解封并转发注册报文(发送(S,G)加入正常情况下应该由协议(S,G)状态及负责因此不属于注册的范畴)

同时,我们可以看出,虽然在注册流程中RP的事务较少,但作为RPT的根节点,RP不仅仅要处理收到的注册报文与空注册报文,同时还要处理各种其他协议报文(Hello报文、(*,G)加入/剪枝报文、(S,G,rpt)剪枝/加入报文等)。因此,当有多个源节点需要通过RP转发组播流的时候(在大型网络中这种情况是经常出现的),大量的空注册报文会占用RP路由器较长的CPU处理时间。因此,对大量空注册报文的处理直接影响了RP对协议报文处理的效率。

对于特定(S,G)组播流,随着组播转发路径的建立,RP可以通过组播转发信息库(MFIB)转发收到的组播数据报文。而对于收到的空注册报文,RP仅需刷新协议维护的(S,G)表项生存时间并回复注册停止报文。针对上述特性,我们可以对PIM-SM协议提出如下构架:

如图1所示,将以PIM-SM为核心的三层组播路由软件分为三个层次,这三个层次分别为:驱动,组播路由管理模块和PIM-SM协议模块。其中,驱动部分主要用于发送、接收、转发收到的组播数据包以及将相关的协议报文上送到更高一层。组播路由管理模块包含组播路由信息库(MRIB)和组播转发信息库(MFIB),它维护组播转发信息和组播路由的拓扑信息。组播路由管理模块既可以将相关的协议数据包上送到更高的层次,也可以通过消息机制将网络事件通知上层模块。最后,它还可以负责处理一些简单的协议报文(如空注册报文),并在处理之后仅用消息通知上层模块。PIM协议模块部分主要用于处理大多数的协议报文,建立并维护协议表项和特定表项的协议状态机。此外,对于某些事件,PIM协议模块还需要发送消息通知底层模块刷新组播路由的拓扑结构或转发信息。

从图中我们还可以看到,PIM协议模块运行在用户态,驱动通常运行在内核态,而组播路由管理模块即存在内核态实现的部分,又存在用户态实现的部分。这样的设计使该模块即可以方便接收来自驱动的数据报文,又可以和运行在用户态的协议模块交互。同时,我们可以将协议相关性不大的、对时间要求较高的操作放在内核态进行处理。这样既可以提高处理时延,又可以提高协议模块的运行效率。

4 改进RP端注册报文处理算法

传统的RP端对于注册报文处理的算法如下:

packet_arrives_on_rp_tunnel( pkt )

{

if( outer.dst is not one of my addresses )

{

drop the packet silently;

}

if( I_am_RP(G) AND outer.dst == RP(G) )

{

sentRegisterStop = FALSE;

if ( SPTbit(S,G) OR (SwitchToSptDesired(S,G)

AND (inherited_olist(S,G) == NULL )))

{

send Register-Stop(S,G) to outer.src

sentRegisterStop = TRUE;

}

if ( SPTbit(S,G) OR SwitchToSptDesired(S,G) )

{

if ( sentRegisterStop == TRUE )

{

set KeepaliveTimer(S,G) to RP_Keepalive_Period;

}

else

{

set KeepaliveTimer(S,G) to Keepalive_Period;

}

}

if( !SPTbit(S,G) AND ! pkt.NullRegisterBit )

{

decapsulate and forward the inner packet to

inherited_olist(S,G,rpt);

}

}

else

{

send Register-Stop(S,G) to outer.src;

}

}

算法 1

我们可以看到,原始的算法是将普通注册报文和空注册报文都交付协议模块处理,正如我们之前提到的,在存在大量需要通过RP转发的组播源时,这种方法会使对空注册报文的处理占用一定的时间,减少软件单位时间内能够处理的其他更为重要的协议报文的数量。因此,我们将对空注册报文的处理放在组播路由管理模块的内核部分。其算法如下:

MRM_packet_arrives_on_rp_tunnel( pkt )

{

if( outer.dst is not one of my addresses ) {

drop the packet silently;

}

if( I_am_RP(G) AND outer.dst == RP(G) ) {

if( pkt.NullRegisterBit ) {

if ( SPTbit(S,G) OR (SwitchToSptDesired(S,G)

AND (inherited_olist(S,G) == NULL ))) {

send Register-Stop(S,G) to outer.src;

sentRegisterStop = TRUE;

}

if ( SPTbit(S,G) OR SwitchToSptDesired(S,G) ) {

if ( sentRegisterStop == TRUE ) {

set msg.period to RP_Keepalive_Period;

}

else {

set msg.period to Keepalive_Period;

}

send message to PIM modual;

}

}

else {

send packet to PIM modual;

}

}

else {

send Register-Stop(S,G) to outer.src;

}

}

算法 2

从算法中我们可以看到,组播路由管理模块首先检查报文是否为空注册报文,如果是且组播转发路径已经构建则回复注册停止报文并发送消息通知PIM协议模块刷新相应的(S,G)表项生存周期。否则,将该注册报文上送PIM协议模块。PIM协议模块的处理流程如下:

PIM_register_msg_handler(msg)

{

if(msg.type is Register packet handle request) {

get the Register packet from data queue;

PIM_packet_arrives_on_rp_tunnel(pkt);

}

if(msg.type is Null-Register packet handle request){

set KeepaliveTimer(S,G)to msg.period;

}

}

算法3

当PIM协议模块收到消息时,它会根据消息类型选择合适的处理方法,若是来自组播路由管理模块的空注册报文处理消息,PIM模块会刷新(S,G)表项的生存周期。若消息是普通注册报文到达消息,则PIM模块会获取注册报文并调用特定的报文处理函数,该函数对注册报文的处理算法与算法1相似。

5 实验与结论

5.1 实验设计

实验环境如图2所示:

从图中我们可以看到,利用5个互相联通的路由器组成网络拓扑模型,每台路由器上跑得都是本文改进后的PIM-SM协议软件,组播数据流被发送到router1上,(*,G)加入报文报文被发送到router4上,然后我们观察router3和router4的路由表和转发表,正常情况下当(*,G)报文和(S,G)报文加入后,路由表里的标志位F和(S,G)表项会被创建。

5.2 实验结果:

我们可以清楚的看到当(*,G)加入后,(S,G)的发送端接口列表已经从(*,G)中复制而建立。

性能分析

通过对一些列关键数据的测试,我们可以明显发现路由表的收敛时间在0.5S以内,而协议注册时间为0.15ms,这些数据表明算法效率得到明显提高。

参考文献

[1]Developing IP Multicast Networks,Volume I

[2]Interdomain multicast routing:practical Juniper Networks and Cisco systems solutions.

[3]RFC 4601 Protocol Independent Multicast -Sparse Mode (PIM-SM):Protocol Specification (Revised).

[4]RFC 2362 Protocol Independent Multicast-Sparse Mode (PIM-SM):Protocol Specification.

[5]RFC 1112 Host Extensions for IP Multicasting.

上一篇:移动互联网安全分析与防范措施 下一篇:基于VC++与开放式运动控制器的并联机器人控制...