发明内容
有鉴于此,本发明的主要目的在于提供一种报文流量控制方法,以在硬件处理模块FIFO容量较小的情况下,在传入硬件处理模块的数据流量突发增高时,降低报文的丢包率。
本发明的技术方案是这样实现的:
一种报文流量控制方法,包括:
设置流量控制桶和缓存队列;当需要向硬件处理模块发送请求报文时执行步骤A,当收到硬件处理模块的回应报文时执行步骤E;
A、判断缓存队列中是否有被缓存报文,如果有则执行步骤C,否则执行步骤B;
B、判断流量控制桶的当前桶深是否大于或等于当前需要发送的请求报文的长度,如果是则发送该请求报文,并将当前桶深减去所发送报文的长度得到新的桶深,结束本流程;否则执行步骤C;
C、在缓存队列的尾部缓存当前需要发送的请求报文,之后执行步骤D;
D、判断流量控制桶的当前桶深是否大于或等于缓存队列头部的请求报文的长度,如果是则发送该头部的请求报文,将当前桶深减去所发送报文的长度得到新的桶深,并结束本流程;否则结束本流程;
E、将所述桶深增加所述回应报文的长度得到新的桶深,之后执行步骤D。
优选的,当收到回应报文之后、并在所述步骤E之前,进一步包括:判断所收到的回应报文是否为已发送的请求报文对应的回应报文,如果是,则执行步骤E,否则丢弃该回应报文,结束本流程。
优选的,该方法进一步包括:如果在请求报文发送后的指定时间内没有收到该请求报文对应的回应报文,判定该请求超时,则将流量控制桶的桶深增加该请求报文的长度得到新的桶深。
优选的,该方法进一步设置请求队列,且在发送请求报文时在该请求队列中创建对应的请求节点,该请求节点中包括该请求报文的序列号;并且所述判断回应报文是否为已发送的请求报文对应的回应报文的具体方法为:从回应报文的头部信息中提取序列号,查询所述请求队列中是否存在与所述回应报文序列号匹配的请求节点序列号,如果存在则判定该回应报文为该请求节点所标记的请求报文对应的回应报文,并且进一步删除该请求节点;否则判定该回应报文不是已发送的请求报文对应的回应报文。
优选的,所述请求节点中进一步包括上层软件信息和调用信息,在收到回应报文并查询到该回应报文对应的请求节点后,进一步根据该请求节点中的上层软件信息和调用信息将所述回应报文调用至对应的上层软件。
优选的,所述流量控制桶的最大桶深大于所述硬件处理模块中的先入先出FIFO队列容量。
优选的,该方法的执行装置为数据处理设备的中央处理器。
优选的,所述数据处理设备为路由器。
优选的,所述硬件处理模块为硬件加解密模块。
与现有技术相比,本发明通过一个流量控制桶和缓存队列之间的控制配合机制来完成流量整形及报文的缓存,在硬件处理模块FIFO队列容量较小的情况下(通常是几K或十几K),以较低的硬件成本,在传入硬件处理模块的数据流量突发增高时降低报文的丢包率,以满足数据流量突发增高这种对性能要求较高的场合的要求。
具体实施方式
下面结合附图及具体实施例对本发明再作进一步详细的说明。
在一种实施例中,本发明所述方法的执行装置可以为数据处理设备的CPU,所述数据通信设备可以为路由器或其他数据通信设备。所述CPU在向硬件处理模块发送请求报文时、以及收到硬件处理模块返回的回应报文时,通过执行本发明的方法来控制发往硬件处理模块的报文流量,从而满足数据流量突发增高这种对性能要求较高的场合的要求。
本发明的方法首先需要设置流量控制桶和缓存队列。通过监控所述流量控制桶来控制发送到硬件处理模块但还未收到回应报文的所有请求报文的总字节数,从而避免硬件FIFO队列的溢出造成丢包。本发明所述流量控制桶为一虚拟的逻辑容量,其容量值被称为桶深,桶深根据请求报文的发送情况和回应报文的接收情况调整,其初始桶深为最大桶深,该流量控制桶的最大桶深需大于硬件处理模块中的FIFO队列容量,具体数值需要试验得出经验值。
所述缓存队列为一报文缓存队列,用于流量控制桶的桶深小于待发送的请求报文的长度时,缓存该请求报文到该缓存队列,在等待流量控制桶的桶深满足要求时再进行处理。
为了便于验证硬件处理模块返回的回应请求的合法性,即该回应请求是否为已发送的请求报文对应的回应报文,以及为了在本地保存请求报文的一些基本信息以方便进行CPU内部驱动软件的后续处理,在一种实施例中,还可以进一步设置一个请求队列,用于将请求报文发送到硬件处理模块后,在该请求队列中创建一个请求节点,该请求节点中包括该请求报文的基本信息(如序列号、上层软件信息、调用信息、数据长度、请求类型等),以便在收到硬件处理模块的回应报文后,从请求队列中取出该回应报文对应的请求节点中的信息,以进行后续操作,例如可以根据该请求节点中的上层软件信息和调用信息将所述回应报文调用至对应的上层软件。
在本发明的一种实施例中,可以在CPU中设置驱动软件,上层软件调用驱动软件提供的功能,将发往硬件处理模块的报文会首先发送到该驱动软件中,由该驱动软件执行本发明的方法,对发向硬件处理模块的报文的流量进行控制。并且,本发明不限制CPU与硬件处理模块间通信的数据总线类型,只需要最底层的驱动软件提供对于数据总线的读写函数,方便软件的移植。
图3为本发明所述方法的一种实施例流程图。参见图3,该实施例中设置了流量控制桶31、缓存队列32以及请求队列33,该方法主要包括两个处理流程,即发送流程和接收流程,其中线条-1→表示正常情况下不需要缓存时的发送处理分支,线条-2→表示发送方向需要缓存时的处理分支,线条-3→表示接收方向处理缓存队列的处理分支。下面分别介绍。
(一)发送流程:
当驱动软件收到上层软件的处理请求报文时执行步骤301,该请求报文即需要发送到硬件处理模块处理的请求报文,假设该请求报文的数据长度为Y。
步骤301、判断缓存队列中是否有被缓存的报文,如果有则执行步骤303,否则执行步骤302。
步骤302、判断当前流量控制桶中的桶深是否大于或等于所述当前需要发送的请求报文的数据长度,如果是,表示桶深满足要求,则收集请求报文的基本信息,例如包括收集该请求报文的序列号、上层软件信息、调用信息、数据长度、请求类型等,并可以利用所收集的信息创建一个请求节点,将该请求节点存于所述请求队列中,同时将该请求报文发送到硬件处理模块进行处理,并将流量控制桶的当前桶深减去该请求报文的数据长度Y,得到最新的桶深,结束本流程。
如果当前流量控制桶中的桶深小于所述当前需发送的请求报文的数据长度,表示桶深不满足要求,则执行步骤303。
步骤303、当前需要发送的请求报文暂时不发送给硬件处理模块,而是将该请求报文缓存到缓存队列的尾部,然后执行步骤304。
步骤304、判断当前流量控制桶中的桶深是否大于或等于缓存队列头部的请求报文的数据长度(假设该头部请求报文的数据长度为Z),如果是,则从缓存队列中的头部取出该请求报文,收集请求报文的基本信息,例如包括收集该请求报文的序列号、上层软件信息、调用信息、数据长度、请求类型等,利用所收集的基本信息创建一个请求节点,将该请求节点存于所述请求队列中,同时将该请求报文发送到硬件处理模块进行处理,并将流量控制桶的当前桶深减去该请求报文的数据长度Z,得到最新的桶深,结束本流程。
如果当前流量控制桶中的桶深小于缓存队列头部的请求报文的数据长度,则结束本流程。
(二)接收流程:
当驱动软件收到硬件处理模块返回的回应报文后,则执行步骤311,此处假设该回应报文的数据长度为X。
步骤311、首先检查回应报文的合法性,即判断所收到的回应报文是否为已发送的请求报文对应的回应报文,如果是则合法,执行步骤312,否则不合法,丢弃该回应报文,并结束本流程。
所述检查回应报文合法性的具体方法可以是:从回应报文的头部信息中提取序列号,查询所述请求队列中是否存在与所述回应报文序列号匹配的请求节点序列号,所述匹配一般是指相同,如果存在则判定该回应报文为该请求节点所标记的请求报文对应的回应报文,是合法回应报文;否则判定该回应报文不是已发送的请求报文对应的回应报文,是非法回应报文。
步骤312、根据该回应报文对应的请求节点中的上层软件信息和调用信息将所述回应报文调用至对应的上层软件,并从请求队列中删除该回应报文对应的请求节点,并执行步骤313。
步骤313、将流量控制桶的桶深加上该回应报文的数据长度X得到新的桶深,更新桶深后执行所述步骤304,即检查当前流量控制桶的桶深是否大于或等于报文缓存队列头部的请求报文的数据长度(假设该头部请求报文的数据长度为Z),如果大于,则从缓存队列中的头部取出该请求报文,创建该请求报文对应的请求队列节点、发送该请求报文、并将流量控制桶的桶深减去该请求报文的数据长度Z得到新的桶深;如果当前流量控制桶中的桶深小于报文缓存队列头部的请求报文的数据长度,则结束本流程。
所述检查回应报文合法性的具体方法也可以不依赖于请求队列,也可以采用其他方法检查,例如可以在发送请求报文时在请求报文中添加一特殊标记,只要回应报文中也有该特殊标记,就可以判定该回应报文为已发送的请求报文对应的回应报文。在这种情况下,如果上层软件只有一个且调用方式固定,不需要请求节点的上层软件信息和调用信息将所述回应报文调用至对应的上层软件,则也可以省略掉请求队列。
当然,上述检查回应报文合法性的步骤在其他实施例中也可以省去,即收到回应报文就执行步骤312及后续步骤,同样可以降低报文的丢包率,达到本发明的目的,只是效果稍差。
在本发明的另一种实施例中,还进一步包括超时处理流程,即:
对于发送到硬件处理模块的请求报文进行超时检查,即设定一定时器,在请求报文发送后即启动该定时器,当在该请求报文发送后一定时间内没有收到硬件处理模块针对该请求报文的回应报文,则认为该请求报文超时,将该请求的数据长度返还到流量控制桶中,即将流量控制桶的当前桶深加上该请求报文的数据长度,得到最新的桶深。如果设置了请求队列,则进一步从请求队列中删除该请求报文的请求节点。
下面介绍一个利用本发明进行流量控制的一个具体设备的性能数据,例如在某款路由器中包含CPU和硬件处理模块,该硬件处理模块为一个硬件加解密模块,CPU与加解密处理模块间采用以太链路通信,硬件加解密模块的FIFO队列大小为8K,CPU利用本发明的方法控制发往加解密处理模块的流量,软件根据试验确定流量控制桶的最大桶深为16K,实现了因特网协议安全性(IPSEC)使用该硬件加密模块1024字节大小报文可满足转发性能200Mbps。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。