一种网络数据包处理方法和装置与流程

文档序号:16630620发布日期:2019-01-16 06:32阅读:261来源:国知局
一种网络数据包处理方法和装置与流程

本发明涉及计算机技术领域,特别是涉及一种网络数据包处理方法和装置。



背景技术:

互联网上面存在大量的设备,其中,以网络服务器为例,其最底层网卡驱动会把网络上面收到的数据包交给系统上层的程序(例如:http服务、dpi服务)。

其中,网卡收到数据包之后把数据包交给上层程序进一步处理,这是目前计算机操作的基本步骤。网卡芯片在收到一堆数据包之后会发出中断、通知cpu开始接受、整理数据包、再把数据包送到协议栈中去。

传统的处理方法如图1所示,硬件中断(interruptrequest,简写为:irq)执行中断请求的动作,唤醒网卡驱动函数napi_schedule,napi_schedule进一步的将网卡中用于存储各数据包的网卡队列清单poll_list导入,然后激活软中断,从而将网卡驱动获取的数据包经由软中断转交给协议栈tcp/ipstack进行数据包解析(即利用图1中的net_rx_action函数完成),然后驱动poll函数完成数据的进行解析出来后数据的i/o操作。

现有技术,在某些情况下有如下弊端:

如果网络上面流量很大,同时又是小包(例如:64字节),此时网卡会频繁的产生中断通知cpu进行处理,这样大量的性能消耗都浪费在中断上面了,往往会出现丢包的情况。

鉴于此,克服该现有技术所存在的缺陷是本技术领域亟待解决的问题。



技术实现要素:

本发明要解决的技术问题是解决传统网卡收包在处理大流量尤其是网络小包的时候,出现吞吐低,延迟大,丢包厉害的情况

本发明采用如下技术方案:

第一方面,本发明提供了一种网络数据包处理方法,网卡驱动状态默认的初始化,网卡开始工作,其特征在于,方法包括:

创建收包线程rx_thread,通过所述收包线程rx_thread中的遍历操作,判断网卡驱动中对应的各网卡队列下是否有收到数据包;其中,收包线程内部包含休眠调度策略函数rx_schedu_policy,所述休眠调度策略函数rx_schedu_policy设置有预设访问次数,以便在包线程rx_thread中确认没有接收到数据包时,仍然执行所述预设访问次数的各网卡队列下是否有收到数据包的遍历操作后,才执行判断结果;

其中,若判断结果为确认网卡中有收到数据包,则调用接收数据处理策略函数,将相应收到的数据包交由预设的协议栈或者应用程序处理;若判断结果为确认网卡中没有收到数据包,则调用接收数据处理策略函数会将收包线程阻塞,以便放弃对cpu的使用。

优选的,所述收包线程rx_thread的主体函数内容为死循环函数,其中,所述死循环函数的跳出机制设定为根据所述休眠调度策略函数rx_schedu_policy的返回参数值作为条件设置的,以if判断该条件后执行阻塞操作;具体的:一旦休眠调度策略函数rx_schedu_policy返回的值满足第一预设条件,便执行if判断内的收包线程的阻塞操作;

其中,每次rx_thread内部调用一次所述休眠调度策略函数rx_schedu_policy,所述rx_schedu_policy的内部计数变量schedu_times便执行自加1操作;直到满足所述计数变量schedu_times与预设访问次数相同,便返回满足第一预设条件的参数值。

优选的,所述通过所述收包线程rx_thread中遍历网卡驱动中对应的各网卡队列下是否有收到数据包,具体包括收包线程rx_thread预先建立网卡队列结构体变量rx_ring,具体的:

在一轮遍历过程中,通过网卡队列结构体变量rx_ring获取网卡驱动中各网卡队列的数据包接收情况;

并将所述网卡队列结构体变量rx_ring,作为输入参数导入poll方法函数poll_proc_packet,以便通过逐一的将网卡队列结构体变量rx_ring中各队列位的状态字节与标识是否收到数据包的标识stat_dd进行与逻辑运算,若运算结果为真,则执行数据包计数变量rx_cnt的自加操作,以便poll方法函数poll_proc_packet的最后根据所述数据包计数变量rx_cnt确定是否将数据包交由预设的协议栈或者应用程序处理。

优选的,所述poll方法函数poll_proc_packet确定将数据包交由预设的协议栈或者应用程序处理,具体是分别通过函数push_pkt_statck()和push_pkt_app()完成。

优选的,rx_schedu_policy函数中设置的计数变量schedu_times为静态变量;直到包线程rx_thread被阻塞为止,所述计数变量schedu_times才被内存释放。

优选的,所述预设访问次数的参数值的取值范围位于区间[64,256]之间。

优选的,当物理网卡接收到数据包的时候,网卡驱动向cpu发送中断,此时中断处理服务程序把收包线程唤醒。

优选的,所述方法还包括:

以系统程序软件触发方式或者硬件触发方式,周期性的进行收包线程rx_thread的状态判断,若判断结果为收包线程rx_thread处于阻塞状态,则激活相应的收包线程rx_thread。

优选的,所述激活相应的收包线程rx_thread的函数为wake_up_interruptible。

第二方面,本发明还提供了一种网络数据包处理装置,用于实现第一方面所述的网络数据包处理方法,所述装置包括:

至少一个处理器;以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被程序设置为执行第一方面所述的网络数据包处理方法。

第三方面,本发明还提供了一种非易失性计算机存储介质,所述计算机存储介质存储有计算机可执行指令,该计算机可执行指令被一个或多个处理器执行,用于完成第一方面所述的网络数据包处理方法。

本发明通过在收包线程rx_thread中增加了预设访问次数的重复遍历机制,从而克服了现有技术中收包线程频繁被挂起,并且频繁触发终端的问题,例如:避免了现有技术中,在网络上面流量很大,同时又是小包(64字节),此时网卡会频繁的产生中断通知cpu做事情,这样大量的性能消耗都浪费在中断上面了,往往会出现丢包的问题。

进一步的,本发明对在提升性能、增加功能方面,可以适当的增加硬件功能,使软件+硬件共同完成某些功能。例如,本发明优选方案中,采用的硬件驱动的收包线程rx_thread的唤醒机制。

【附图说明】

为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例中所需要使用的附图作简单地介绍。显而易见地,下面所描述的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1是现有的一种基于软中断实现的数据包接收和处理方法流程图;

图2是本发明实施例提供的一种网络数据包处理方法的简约流程图;

图3是本发明实施例提供的一种网络数据包处理方法详尽流程信令图;

图4是本发明实施例提供的一种网络数据包处理装置的结构示意图。

【具体实施方式】

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

在本发明的描述中,术语“内”、“外”、“纵向”、“横向”、“上”、“下”、“顶”、“底”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明而不是要求本发明必须以特定的方位构造和操作,因此不应当理解为对本发明的限制。

此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。

实施例1:

本发明实施例1提供了一种网络数据包处理方法,在本发明实施例所提出的方法被执行之前,通常需要做好准备工作,其中包括网卡驱动状态默认的初始化,网卡开始工作,如图2所示,为参考背景技术的硬件触发网卡驱动函数napi_schedule的实体环境后,呈现的本发明实施例所提出方法在应用于相应的架构环境下的示意图,用于更为清晰的比较本发明实施例所提出的方法,在运用于背景技术中所描述的应用环境下,所带来的技术实现的变化。本发明实施例的网络数据包处理方法包括:

创建收包线程rx_thread,通过所述收包线程rx_thread中的遍历操作,判断网卡驱动中对应的各网卡队列下是否有收到数据包;其中,收包线程内部包含休眠调度策略函数rx_schedu_policy,所述休眠调度策略函数rx_schedu_policy设置有预设访问次数,以便在包线程rx_thread中确认没有接收到数据包时,仍然执行所述预设访问次数的各网卡队列下是否有收到数据包的遍历操作后,才执行判断结果;其中,所述预设访问次数的参数值的取值范围可以根据经验值设定于区间[64,256]之中;还可以根据实际情况中流量包的历史经验间隔时间来进行动态设定,从而进一步提高本发明实施例所提出技术方案的复杂环境适应度。

其中,若判断结果为确认网卡中有收到数据包,则调用接收数据处理策略函数,将相应收到的数据包交由预设的协议栈或者应用程序处理;若判断结果为确认网卡中没有收到数据包,则调用接收数据处理策略函数会将收包线程阻塞,以便放弃对cpu的使用。

本发明实施例通过在收包线程rx_thread中增加了预设访问次数的重复遍历机制,从而克服了现有技术中收包线程频繁被挂起,并且频繁触发终端的问题,例如:避免了现有技术中,在网络上面流量很大,同时又是小包(64字节),此时网卡会频繁的产生中断通知cpu做事情,这样大量的性能消耗都浪费在中断上面了,往往会出现丢包的问题。

同时,本发明实施例可以应用在dpi串行领域,在提升整机性能的情况下,帮客户减少设备投入;应用在安全领域,提高防火墙处理性能、节省客户成本;应用在bras领域,可以低延迟有利于提升pope拨号用户上网体验。

通过对比图1和图2可以发现,本发明实施例所提出的技术方案,在被运用到如背景技术所描述的架构中去时,收包线程rx_thread(即背景技术中的napi_schedule)不再是每一次处理完数据(例如背景技术中的小包的接收和处理)就进行阻塞操作,而是将数据包通过poll方法推送给协议栈或者app后,进一步又回到由休眠调度策略函数rx_schedu_policy控制的对应于预设访问次数的缓冲区间,从而避免涉及大量的、分散的数据包的应用环境下,需要硬件中断频繁的激活napi_schedule,造成了资源的浪费和因为相应效率变差,可能带来的丢包现象。

基于本发明实施例所提出的技术方案,为了实现上述在包线程rx_thread中确认没有接收到数据包时,仍然执行所述预设访问次数的各网卡队列下是否有收到数据包的遍历操作的功能内容,结合本发明实施例还存在一种具体的实现方案,其中,所述收包线程rx_thread的主体函数内容为死循环函数,其中,所述死循环函数的跳出机制设定为根据所述休眠调度策略函数rx_schedu_policy的返回参数值作为条件设置的,以if判断该条件后执行阻塞操作;具体的:一旦休眠调度策略函数rx_schedu_policy返回的值满足第一预设条件,便执行if判断内的收包线程的阻塞操作;

其中,每次rx_thread内部调用一次所述休眠调度策略函数rx_schedu_policy,所述rx_schedu_policy的内部计数变量schedu_times便执行自加1操作;直到满足所述计数变量schedu_times与预设访问次数相同,便返回满足第一预设条件的参数值。进一步为了支撑上述的死循环遍历过程,结合本发明实施例的实现,存在一种优选的实现方案,其中,rx_schedu_policy函数中设置的计数变量schedu_times为静态变量;直到包线程rx_thread被阻塞为止,所述计数变量schedu_times才被内存释放。

在本发明实施例中,所述通过所述收包线程rx_thread中遍历网卡驱动中对应的各网卡队列下是否有收到数据包,具体包括收包线程rx_thread预先建立网卡队列结构体变量rx_ring,具体的:

在一轮遍历过程中,通过网卡队列结构体变量rx_ring获取网卡驱动中各网卡队列的数据包接收情况;

并将所述网卡队列结构体变量rx_ring,作为输入参数导入poll方法函数poll_proc_packet,以便通过逐一的将网卡队列结构体变量rx_ring中各队列位的状态字节与标识是否收到数据包的标识stat_dd进行与逻辑运算,若运算结果为真,则执行数据包计数变量rx_cnt的自加操作,以便poll方法函数poll_proc_packet的最后根据所述数据包计数变量rx_cnt确定是否将数据包交由预设的协议栈或者应用程序处理。

在本发明实施例中,所述poll方法函数poll_proc_packet确定将数据包交由预设的协议栈或者应用程序处理,具体是分别通过函数push_pkt_statck()和push_pkt_app()完成。其中,push_pkt_statck()函数可以是通过,以下程序代码实现:

push_pkt_app()函数可以是通过,以下程序代码实现:

在本发明实施例中,对于收包线程rx_thread的唤醒方式,提供了两种可选的方案,具体包括:

方案一、当物理网卡接收到数据包的时候,网卡驱动向cpu发送中断,此时中断处理服务程序把收包线程唤醒。

方案二、以系统程序软件触发方式或者硬件触发方式,周期性的进行收包线程rx_thread的状态判断,若判断结果为收包线程rx_thread处于阻塞状态,则激活相应的收包线程rx_thread。在本发明实施例实现过程中,所述激活相应的收包线程rx_thread的函数为wake_up_interruptible。

对上述涉及的各函数及其相关参数变量的描述,本发明将在实施例2中给与一个切实可行的实现方案进行完整性的描述,通过具体的代码程序进行功能说明,其中,相关函数名将承袭到实施例2中,与实施例1中相关函数名及其功能对应起来。

实施例2:

本发明实施例是在实施例1所公开的技术方案基础上,沿用实施例1中所涉及的相关函数名称和变量名称,并通过一套较为完整的代码,将各函数的功能实现有机的串联起来,进一步描述出本发明的实现机制。

在本发明实施例所描述的架构中,主要涉及一下几个主要函数:

rx_schedu_policy----休眠调度策略函数;

poll_proc_packet----poll方法函数;

rx_thread----收包线程;

msix_clean_rings----中断处理函数;

对于上述几个主要函数,本发明实施例线通过一个较为宏观的信令关系图,表述各自之间的调度关系,如图3所示:

在步骤201中,收包线程rx_thread中,利用poll方法函数poll_proc_packet遍历网卡的各个队列。

在步骤202中,所述poll方法函数poll_proc_packet进行各队列内所包含数据包的遍历操作,并在确认队列中包含有数据包时,执行步骤203;否则执行步骤204。

在步骤203中,poll方法函数poll_proc_packet按照预设策略将所述数据包发送出去。在本发明实施例1中提到的预设策略,包括发送给协议栈和/或app。

在步骤204中,poll方法函数poll_proc_packet返回遍历结果给收包线程rx_thread;在具体实现时,所述遍历结果可以表现为0,即告诉收包线程rx_thread,poll方法函数poll_proc_packet没有在各队列中遍历到数据包的意思。

在步骤205中,收包线程rx_thread,根据返回的遍历结果,确认当前队列中没有数据包,则执行步骤206。

在步骤206中,收包线程rx_thread调用休眠调度策略函数rx_schedu_policy,进行一轮阻塞操作判断,进入步骤207。

在步骤207中,休眠调度策略函数rx_schedu_policy进行一次预设访问次数的计数过程,其中,用于计数的变量schedu_times为静态变量类型。其中,每进行一次访问次数的计数过程,所述变量schedu_times就会在原本参数值基础上累加1。

在步骤208中,休眠调度策略函数rx_schedu_policy,判断schedu_times的值是否到达预设访问次数。

在步骤209中,若判断结果为否则休眠调度策略函数rx_schedu_policy返回预设第一标识给收包线程rx_thread;若判断结果为是则休眠调度策略函数rx_schedu_policy返回预设第二标识给收包线程rx_thread,并清零schedu_times。在本发明实施例中,所述预设第一标识和预设第二标识,最简单的方式便是取互斥的“1”和“0”,从而能够让收包线程rx_thread直观的了解当前连续未收到数据包的计数值是否达到预设访问次数。

在步骤210中,收包线程rx_thread确认,若返回的是预设第一标识,则进行下一轮的队列中有没数据包的分析(包括201-209);若返回的是预设第二标识,则进行阻塞操作。其中,若连续执行步骤206,相应的静态变量schedu_times便会一直被累加,直到到达

实施例3:

为了对实施例2中相关步骤进行进一步的理论支撑,在本发明实施例中,具体列举了各主要函数的程序代码,具体如下:

1、休眠调度策略函数rx_schedu_policy;

2、poll方法函数poll_proc_packet;

其中,语句“rx_desc->state&stat_dd”用于判断网卡是否接受了数据包;stat_dd代表某一位是否收到了数据包。是硬件自己改变。相当于一个64位的数值。

某一个队列的某一个资源的dd位是否置了1,是1就数据包到来。

3、收包线程rx_thread;

4、中断处理函数msix_clean_rings,其为硬件自己触发调用的函数;

实施例3:

如图4所示,是本发明实施例的网络数据包处理装置的架构示意图。本实施例的网络数据包处理装置包括一个或多个处理器21以及存储器22。其中,图4中以一个处理器21为例。

处理器21和存储器22可以通过总线或者其他方式连接,图4中以通过总线连接为例。

存储器22作为一种网络数据包处理方法和装置非易失性计算机可读存储介质,可用于存储非易失性软件程序和非易失性计算机可执行程序,如实施例1中的网络数据包处理方法。处理器21通过运行存储在存储器22中的非易失性软件程序和指令,从而执行网络数据包处理方法。

存储器22可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实施例中,存储器22可选包括相对于处理器21远程设置的存储器,这些远程存储器可以通过网络连接至处理器21。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。

所述程序指令/模块存储在所述存储器22中,当被所述一个或者多个处理器21执行时,执行上述实施例1中的网络数据包处理方法,例如,执行以上描述的图2和图3所示的各个步骤。

值得说明的是,上述装置内的单元之间的信息交互、执行过程等内容,由于与本发明的处理方法实施例1和实施例2基于同一构思,具体内容可参见本发明方法实施例中的叙述,此处不再赘述。

本领域普通技术人员可以理解实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(rom,readonlymemory)、随机存取存储器(ram,randomaccessmemory)、磁盘或光盘等。

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

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