采用单进程处理路由协议栈的方法

文档序号:7596337阅读:162来源:国知局
专利名称:采用单进程处理路由协议栈的方法
技术领域
本发明涉及通信领域,尤其涉及一种路由器、多层交换机等具有三层路由功能的网络节点设备中处理路由协议栈的方法。
背景技术
目前,路由器、多层交换机等具有路由功能的网络节点设备主要用于连接多个逻辑上分开的网络,从事不同网络之间数据的存储转发功能。它可以根据不同的链路帧来传输数据,进而完成网络层中继任务。以下以路由器为例,具体说明其完成路由和转发的工作过程。
所述路由即判定到达目的地的最佳路径,由路由协议中的路由选择算法来实现。为了判定最佳路径,根据路由协议来创建包含路由信息的路由表,并且,通过路由器之间的相互通信息来达到更新路由信息的目的,使得路由表能够正确反映网络的拓扑变化,并由路由协议根据量度来决定最佳路径。以上是路由协议的主要功能。
所述转发为路由器从输入端口接收IP分组,查找路由器中的路由表来选择该IP分组的输出端口。路由表是通过路由协议维护的包含所有路由信息的数据结构。转发功能主要是通过基本协议栈完成,其过程为。
首先,路由器将收到的IP分组后,截取IP分组中的目的IP地址;然后,用获得的目的IP地址作为索引值量找路由表,判断能否查找到其发送的下一跳地址信息,即查找有无对应于该IP地址的路由表项,若有,则根据路由表的相应表项输出查表结果;否则,即在路由表中未存在对应表项,路由器通常将该分组丢弃;最后,路由器根据查表结果(查表结果为下一跳地址信息)将IP分组送到输出端口发送出去。
负责构造路由表的路由协议和负责转发过程的基本协议栈组成路由协议栈。请参阅图1,其为路由协议栈的一个基本构成示意图。该路由协议栈1与操作系统2相连,主要运行在UNIX、LINUX等操作系统上,也可以运行在嵌入式操作系统上。其中,路由协议包括域内路由协议(如路由信息协议RIP、开放式最短路径优先协议OSPF、协议无关组播路由协议PIM等)和域间路由协议(如边界网关协议BGP等)。基本协议栈指以IP协议为核心的多个协议,一般包括链路层协议(如以太网协议802.3、点对点协议PPP等)、IP层协议(地址解析协议ARP、IP协议、网间控制报文协议ICMP、动态主机配置协议DHCP等)、传输层协议(传输控制协议TCP、用户数据报协议UDP等)。
目前,路由器的操作系统普遍采用多进程处理路由协议栈协议,即构筑在操作系统之上的路由协议栈的每一个协议运行一个进程,有的系统还使用了线程(进程内更小的并行单位)来实现进程内的并行操作。这种处理方法别然易于多协议独立开发和系统可扩展性较好,但是存在以下缺点首先,由于CPU按时间片分配给各个进程使用,并且每个进程都有自己的运行环境,因此使得在CPU做进程切换时需要记住该进程已完成的计算任务。即进程的每一次切换都是一次中断处理过程,包括三个步骤(1)用户数据的保存包括正文段(TEXT),数据段(DATA,BSS),栈段(STACK),共享内存段(SHARED MEMORY)的保存。(2)寄存器数据的保存包括PC(programcounter,程序计数器,指向下一条要执行的指令的地址),PSW(processorstatus word,处理机状态字),SP(stack pointer,栈指针),PCBP(pointerof process control block,进程控制块指针),FP(frame pointer,指向栈中一个函数的local变量的首地址),AP(augument pointer,指向栈中函数调用的实参位置),ISP(interrupt stack pointer,中断栈指针),以及其他的通用寄存器等。(3)系统层次的保存包括虚拟存储空间管理表格,中断处理栈。从上可知,进程间切换的开销很大。
其次,进程间通信IPC(Inter-process communication)一般采用如下几种方式(1)共享内存由于共享内存在设计时没有处理锁机制,因此当有多个进程在访问共享内存时就会产生问题。如一个进程正在修改一个共享内存单元,而另一个进程企图读取该共享内存单元的内容,这时会影响程序的正确性。按操作系统的运作方式,有读锁和写锁来保证数据的一致性。而没有锁机制的共享内存,必须和信号量一起使用,才能保证共享内存的正确操作;(2)消息队列进程取得消息队列的访问权限后必须通过关键值来读消息队列中具有相同关键值的消息,写消息时带入消息关键值。这样可以通过不同的关键值区分不同的交易,使得同一个消息队列可以供多种消息同时使用而不冲突,在一次读写操作前都必须取得消息队列标识符,即访问权;消息队列的访问具备锁机制处理,即一个进程在访问时另一个进程不能访问;(3)信号量信号量可用于进程间互斥和同步。互斥信号量用于多进程对共享资源的互斥操作;同步信号量用于协调多进程的运行顺序,但是,在多信号量环境下易引起系统死锁;(4)信号在用户进程需要对某个中断做自己定义的处理时,可以自己定义中断处理函数,并设置中断处理函数与该中断相关联。这样用户进程在收到该中断后,即调用用户定义的函数,处理完成后用户进程从被中断处继续运行,这种方式很有可能造成系统中断,其对其它任务影响的程度决定于信号处理函数设计的优劣。
从上可知,采用多进程处理路由协议栈不仅进程切换的开销大,而且为了解决进程之间的通信,包括进程间数据如何交换、进程间数据如何同步、如何协调进程间等所使用的IPC方法都需要花费一定的开销,甚至带来系统不稳定因素(如多信号量的使用容易导致死锁等)。
而路由协议栈的多个协议不同于一般的多任务系统路由协议之间相对独立,基本协议栈的各个协议具有顺序执行的特点,由于使用多进程实现基本协议栈的协议,使得协议之间的优先关系不易确定,从而为了实现协议进程之间的通信而导致操作系统的开销增大,进而使得CPU的运行效率降低。

发明内容
本发明解决的问题是采用多进程处理路由协议栈协议时,由于进程之间切换和进程之间的相互通信,从而导致CPU的开销大,进而使得CPU的运行效率低的技术问题。
为解决上述问题,本发明公开了一种采用单进程处理路由协议栈的方法,包括(1)当路由协议栈的进程启动时,进行路由协议栈的初始化,所述初始化包括A建立每一层的协议注册链表,所述协议注册链表的每一节点保存本层所支持的一协议的信息,所述信息用于处理收发数据和协议事件;B建立协议事件链表,若协议收到应用层发送来指令时,在所述协议事件链表中增设一节点用以保存本协议事件;(2)依次查找所述协议注册链表的每一节点,对本节点对应的协议进行收包操作和发包操作;(3)依次查找协议事件链表的每一节点,调用所述节点对应的事件的处理函数进行处理。
步骤(1)还包括C建立定时器链表,若协议动作时,在所述定时器链表中增设一定时器节点用以保存该协议的时限信息,若协议完成动作时,在所述定时器链表中删除所述协议动作所对应的定时器节点。
步骤(3)之后还包括(4)依次查找定时器链表的每一节点,当本节点对应的协议动作超时时,调用其回调函数,并复位定时器。
步骤A具体包括建立链路层的协议注册链表,初始化配置信息,并建立本链路层的收发缓冲队列,所述协议注册链表的每一节点保存该层上的一协议信息;建立网络层的协议注册链表,初始化配置信息,并建立本网络层的收发缓冲队列,所述协议注册链表的每一节点保存该层上的一协议信息;建立传输层的协议注册链表,初始化配置信息,并建立本传输层的收发缓冲队列,所述协议注册链表的每一节点保存该层上的一协议信息;建立应用层的协议注册链表,初始化配置信息,并建立本应用层的收发缓冲队列,所述协议注册链表的每一节点保存该层上的一协议信息。
上述协议信息包含协议的标识、协议名称、协议事件处理函数指针、协议MIB库操作函数指针、协议类型、协议使能标识、协议收发函数指针以及收发后续处理函数指针。
步骤(2)中还包括在进行本协议的收包和发包操作之前,判断所述协议使能标识是否使能,若是,进行本协议的收包和发包操作,否则,进行轮询下一个节点。
步骤(2)中的收包步骤具体包括当路由协议栈进程轮询至节点所对应的协议时,所述协议对应的协议注册链表的收包处理函数从本节点向前查看下层协议的接收缓冲队列,若存在包含属于本协议的报文时,从所述接收缓冲队列中取出所述报文数据进行本协议的解析,解析后的数据存在本协议对应的接收缓冲队列。
步骤(2)中的发包步骤具体包括当路由协议栈进程询到协议栈事件列队时,依次调用各层的发送函数进行处理。
步骤(1)中还包括读取协议栈配置文件信息;初始化系统缓冲池;初始化网络设备驱动程序。
所述协议事件链表的每一节点中包含一协议事件,该节点的信息格式包括事件链表前后向指针、端口号、指令字、套接字描述符、缓冲区首指针、缓冲区大小、数据首指针、目的地址、目的协议类型、源地址和源协议类型。
与现有技术相比,本发明具有以下优点本发明采用单一的路由协议栈进程对接收到的各种报文和各种协议事件进行顺序处理,由于没有多进程切换与通信,因此使得系统的更多资源用于协议处理,从而提高了CPU的运行效率。另外,本发明采用轮询方式依次执行路由协议和基本协议栈,由于其轮询的次序是一定的,从而使得协议处理的先后次序也确定,因此不会出现多进程环境中运行状态无法预料的情况。还有,由于采用了单进程的方式,数据在多个协议之间的传递可以方便地实现“零拷贝”,这对于大量的数据处理来说,节省的资源是很可观的。对于需要紧急处理的情况,可以在协议事件中加上优先级信息,这样在加入协议消息链表中时,就可以实现一定程度的排队。


图1是路由协议栈的一个基本构成示意图。
图2是本发明采用单进程处理路由协议栈的一流程图。
具体实施例方式
以下参照附图,具体说明本发明的发明点。
请参阅图2,其为本发明采用单进程处理路由协议栈的一流程图。该方法包括S110当路由协议栈的进程启动时,进行路由协议栈的初始化,所述初始化包括A建立每一层的协议注册链表,所述协议注册链表的每一节点保存本层所支持的一协议的信息,所述信息用于处理收发数据和协议事件;B建立协议事件链表,若协议收到应用层发送来指令时,在所述协议事件链表中增设一节点用以保存本协议事件;S120依次查找所述协议注册链表的每一节点,对本节点对应的协议进行收包操作和发包操作;S130依次查找协议事件链表的每一节点,调用所述节点对应的事件的处理函数进行处理。
步骤S120和步骤S130,是系统初始化完后,进行的路由协议栈的运行,上述两个步骤可以是一个两重轮询步骤。
本申请人还提出了对路由协议栈的协议运作进行统一的定时器管理策略,即在步骤S110中还设置子步骤C建立定时器链表,若协议动作时,在所述定时器链表中增设一定时器节点用以保存该协议的时限信息,若协议完成动作时,在所述定时器链表中删除所述协议动作所对应的定时器节点。
步骤S130之后,设置步骤S140依次查找定时器链表的每一节点,当本节点对应的协议动作超时时,调用其回调函数,并复位定时器。
从上可知,本发明路由协议与基本协议栈集中在单一进程中运行,并采用轮询调度的方法进行路由协议栈的协议的执行,而且在轮询过程中,步骤S120和步骤130可以是根据具体情况设置优先次序,在本实施方式中,是先执行步骤S120,但并非局限于此。
以下就举一个具体实施例,来说明本发明是如何利用单进程来处理路由协议栈的方法。该方法包括路由协议栈初始化过程和路由协议栈的轮询过程。其中路由协议栈进程启动后,首先进行协议栈系统初始化,主要包括以下步骤(1)读取协议栈配置文件信息;(2)初始化系统缓冲池;(3)初始化网络设备驱动程序;(4)建立并初始化定时器链表;(5)建立并初始化协议事件链表;(6)建立链路层的协议注册链表,初始化配置信息,并建立本链路层的收发缓冲队列,所述协议注册链表的每一节点保存该层上的一协议信息;
(7)建立网络层的协议注册链表,初始化配置信息,并建立本网络层的收发缓冲队列,所述协议注册链表的每一节点保存该层上的一协议信息;(8)建立传输层的协议注册链表,初始化配置信息,并建立本传输层的收发缓冲队列,所述协议注册链表的每一节点保存该层上的一协议信息;(9)建立应用层的协议注册链表,初始化配置信息,并建立本应用层的收发缓冲队列,所述协议注册链表的每一节点保存该层上的一协议信息。
以上步骤(6)至(9)是建立各层的协议注册链表,协议注册链表为一个链表结构,按照链路层协议、IP层协议、传输层协议和应用层协议分类建立不同的链表。各协议在启动前应向本协议所在的层的协议注册链表进行注册,协议注册链表在链表结构中添加一个节点登记该协议的有关信息,这些信息包含协议的标识(id),协议名称,协议事件处理函数指针,协议MIB库操作函数指针,协议类型,协议使能标识,协议收发函数指针以及收发后续处理函数指针,关于收发缓冲区的各种指示,协议头部在数据包中占据的字节数,协议端口号,协议发送时需要使用的源地址。这些必要的信息将作为参数用于收发数据和协议事件的处理。
链表表项结构如下PROTOCOL_REGISTRATION_ENTRY


各协议通过如下调用向协议注册链表注册一节点


注册函数的参数中没有包含的注册节点中的信息在系统配置文件中指明。系统配置文件记录了一系列需要预先静态配置的协议信息,用法相同于多进程协议环境。
在路由协议栈进行初始化时,本路由器所支持的各层协议通过上述方法向协议所在的层的协议注册链表进行注册,在协议注册链表中增设一对应的节点,从而形成一链表。当路由器的端口上电后,增加所支持的协议时,该协议通过向本协议所在的层的协议注册链表进行注册即可,具有很好的扩展性。
在步骤(4)建立并初始化定时器链表,在本实施例中,是通过以下方式建立定时器链表的。
由于路由协议栈中大量使用定时器来触发协议动作,本发明人设计了一个对路由协议栈所有协议的定时器进行统一管理的链表。各协议每当生成一个定时器,便向定时器管理链表登记,管理链表生成一个定时器节点,其中包含该定时器的各种信息,包括定时器激活标志,定时器超时时限,启动时间,回调函数(即超时后的操作)指针,定时器名称,相关协议注册节点指针,定时器标识,定时器类型(单次定时或循环定时)。在路由协议栈进程扫描定时器链表过程中对各个已登记的定时器进行检查,将当前系统时间与定时器超时时间和启动时间进行比较,若发现本定时器超时,则调用其回调函数进行处理,并复位定时器。
定时器链表节点结构如下TIMING_NODE


当各协议动作时,通过如下调用登记定时器

当协议动作完成后,删除定时器链表中本协议所对应的定时器节点。
在步骤(5)建立并初始化协议事件链表,在本实施例中,是通过以下方式建立协议事件链表的。
这里的协议事件是指协议收到应用层软件发来的指令,包括应用启动、应用终止、应用使能、取套接字(SOCKET)出错码、连接完成、收到连接请求、连接关闭、远端连接关闭、从套接字收到数据、向套接字发送数据。
本发明设计了一个协议事件链表,应用层软件作为独立的进程,可以向协议事件链表发送待处理的各个事件,其信息格式如下APP_MESSAGE

其中,指令字包括前面提到的若干类型。
协议事件触发协议栈自上而下的一系列处理,其处理过程依赖于具体事件,可由各协议实现。
经过上述路由协议栈的初始化过程后,接下来进行三重轮询过程;第一重轮询过程依次查看协议注册链表中的每一个节点(即协议),对于使能的协议,调用其收包处理函数进行收包处理;其间若有报文需要发送则直接调用发送函数进行发包处理;协议栈收包处理当路由协议栈进程轮询到某协议时,它的收包处理函数在协议注册链表中,从自己这个节点向前查看可能的下层协议的接收缓冲队列。由于下层协议在自己的收包处理函数中对数据包的相应字段进行了解析,并在缓冲区头部指明了上层协议的类型,因此上层协议可以从下层协议的接收缓冲队列中取出自己的包并进行处理。
例如当路由协议栈进程轮询到IP协议时,IP的收包处理函数将查看802.3协议和PPP协议(若均已注册)的接收缓冲队列,其中若包含属于IP协议的报文,则IP协议从队列中取出该缓冲区进行IP层处理,若该报文属于上层协议TCP,则IP会在报文缓冲区头部相应的字段指明这是一个TCP分段,然后将其加入自己的接收缓冲队列;随后当路由协议栈进程轮询到TCP协议时,TCP会查看IP的接收缓冲队列,并取出TCP分段进行处理。
协议栈发包过程协议栈发送的报文分为两种一种是上层应用进程向网络中发送的报文;一种是源自协议栈的报文(包括路由器用户数据报文,即经过IP层转发的报文)。
应用层需要发送数据时,通过通用的SOCKET接口调用生成SOCKET事件,SOCKET事件被加入到协议栈事件队列,同时,应用层数据也加入到SOCKET发送缓冲区。当协议栈进程轮询到事件队列时,发现有应用数据需要发送,则调用SOCKET发送函数,而SOCKET发送函数又会依次调用TCP发送函数、TCP发送函数调用IP发送函数、IP发送函数根据目的地选择路由器端口并根据链路类型调用相应的链路层协议发送函数,最终应用数据被发送到网络上。
当协议栈内部某协议在运行过程中需要发送数据时,采用同上的方法依次调用各层发送函数进行处理。需要指出的是,IP层收到某报文后,经过查找路由表,发现该报文需要从另一个端口发送出去,即该报文是用户数据报文,此时便直接调用发送函数进行发送。
第二重轮询依次查看协议事件链表,若链表中包含节点,则调用相应的事件处理函数进行处理;第三重轮询依次查看定时器链表,若发现超时的定时器节点,则调用相应的超时处理函数进行处理,并对定时器进行复位。
路由协议栈进程不断重复以上的三重轮询以处理路由协议栈收发的各种报文。
权利要求
1.一种采用单进程处理路由协议栈的方法,其特征在于,包括(1)当路由协议栈的进程启动时,进行路由协议栈的初始化,所述初始化包括A建立每一层的协议注册链表,所述协议注册链表的每一节点保存本层所支持的一协议的信息,所述信息用于处理收发数据和协议事件;B建立协议事件链表,若协议收到应用层发送来指令时,在所述协议事件链表中增设一节点用以保存本协议事件;(2)依次查找所述协议注册链表的每一节点,对本节点对应的协议进行收包操作和发包操作;(3)依次查找协议事件链表的每一节点,调用所述节点对应的事件的处理函数进行处理。
2.如权利要求1所述的采用单进程处理路由协议栈的方法,其特征在于,步骤(1)还包括C建立定时器链表,若协议动作时,在所述定时器链表中增设一定时器节点用以保存该协议的时限信息,若协议完成动作时,在所述定时器链表中删除所述协议动作所对应的定时器节点。
3.如权利要求2所述的采用单进程处理路由协议栈的方法,其特征在于,步骤(3)之后还包括(4)依次查找定时器链表的每一节点,当本节点对应的协议动作超时时,调用其回调函数,并复位定时器。
4.如权利要求1或3所述的采用单进程处理路由协议栈的方法,其特征在于,步骤A具体包括建立链路层的协议注册链表,初始化配置信息,并建立本链路层的收发缓冲队列,所述协议注册链表的每一节点保存该层上的一协议信息;建立网络层的协议注册链表,初始化配置信息,并建立本网络层的收发缓冲队列,所述协议注册链表的每一节点保存该层上的一协议信息;建立传输层的协议注册链表,初始化配置信息,并建立本传输层的收发缓冲队列,所述协议注册链表的每一节点保存该层上的一协议信息;建立应用层的协议注册链表,初始化配置信息,并建立本应用层的收发缓冲队列,所述协议注册链表的每一节点保存该层上的一协议信息。
5.如权利要求4所述的采用单进程处理路由协议栈的方法,其特征在于,所述协议信息包含协议的标识、协议名称、协议事件处理函数指针、协议MIB库操作函数指针、协议类型、协议使能标识、协议收发函数指针以及收发后续处理函数指针。
6.如权利要求1或5所述的采用单进程处理路由协议栈的方法,其特征在于,步骤(2)中还包括在进行本协议的收包和发包操作之前,判断所述协议使能标识是否使能,若是,进行本协议的收包和发包操作,否则,进行轮询下一个节点。
7.如权利要求1或3所述的采用单进程处理路由协议栈的方法,其特征在于,步骤(2)中的收包步骤具体包括当路由协议栈进程轮询至节点所对应的协议时,所述协议对应的协议注册链表的收包处理函数从本节点向前查看下层协议的接收缓冲队列,若存在包含属于本协议的报文时,从所述接收缓冲队列中取出所述报文数据进行本协议的解析,解析后的数据存在本协议对应的接收缓冲队列。
8.如权利要求1或3所述的采用单进程处理路由协议栈的方法,其特征在于,步骤(2)中的发包步骤具体包括当路由协议栈进程询到协议栈事件列队时,依次调用各层的发送函数进行处理。
9.如权利要求1所述的采用单进程处理路由协议栈的方法,其特征在于,步骤(1)中还包括读取协议栈配置文件信息;初始化系统缓冲池;初始化网络设备驱动程序。
10.如权利要求1所述的采用单进程处理路由协议栈的方法,其特征在于,所述协议事件链表的每一节点中包含一协议事件,该节点的信息格式包括事件链表前后向指针、端口号、指令字、套接字描述符、缓冲区首指针、缓冲区大小、数据首指针、目的地址、目的协议类型、源地址和源协议类型。
全文摘要
本发明公开了一种采用单进程处理路由协议栈的方法,包括(1)当路由协议栈的进程启动时,进行路由协议栈的初始化,初始化包括A建立每一层的协议注册链表,协议注册链表的每一节点保存本层所支持的一协议的信息,信息用于处理收发数据和协议事件;B建立协议事件链表,若协议收到应用层发送来指令时,在协议事件链表中增设一节点用以保存本协议事件;(2)依次查找协议注册链表的每一节点,对本节点对应的协议进行收包和发包操作;(3)依次查找协议事件链表的每一节点,调用节点对应的事件的处理函数进行处理。另外,本发明还采用统一的定时器管理策略。由此,提高了路由协议栈的运行效率和数据吞吐率,进而提高了CPU的运行效率。
文档编号H04L29/06GK1728701SQ200410070008
公开日2006年2月1日 申请日期2004年7月30日 优先权日2004年7月30日
发明者陈庶樵, 郭云飞, 李云涛, 伊鹏, 魏进武, 申涓 申请人:国家数字交换系统工程技术研究中心
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1