网络数据捕获方法和系统的制作方法

文档序号:7822930阅读:407来源:国知局
网络数据捕获方法和系统的制作方法
【专利摘要】本发明实施例提供一种网络数据捕获方法和系统。该方法包括:网卡捕获数据包,并缓存至网卡的接收先入先出队列中;通过PCI DMA控制器将队列中的数据包传输至内核态驱动中的预配置循环缓存区;基于预设中断触发策略,向内核态驱动发送中断请求;内核态驱动根据中断请求,停止接收所述网卡发送的新的中断请求,并更新循环缓存区的描述符,以及恢复接收所述网卡发送的新的中断请求;用户态数据分析装置根据循环缓存区的当前描述符,判断到循环缓存区有数据包时,提取数据包,并更新循环缓存区的描述符,实现了整个传输过程零拷贝,且无需系统调用,节约了CPU资源,提高了数据包的传输效率。
【专利说明】网络数据捕获方法和系统

【技术领域】
[0001]本发明实施例涉及计算机操作系统领域,尤其涉及一种网络数据捕获方法和系统。

【背景技术】
[0002]随着计算机和通信技术的发展,网络的应用迅速普及,与此同时,网络的安全性和可靠性日益受到人们的重视,安全性主要指网络上的信息不被窃取、泄露及破坏;可靠性主要指网络系统能够持续、稳定、可靠地运行,网络服务不被中断和破坏。网络数据包捕获、监听和分析技术是网络安全维护的一个基础技术,在当前流行的大多数网络流量及内容分析系统中,几乎都离不开网络数据的捕获。
[0003]网络数据捕获是指将通信数据通过分光或者镜像得到一份副本,然后经过以太网卡(以下简称为网卡)将数据捕获进入到数据分析装置中。
[0004]请参阅图1,为现有技术中一种网络数据捕获系统的结构示意图。该系统包括:网卡11、内核缓存区12、内核协议栈13、应用缓存区14和数据分析装置15,其中,应用缓存区14和数据分析装置15属于应用态。现有的网络数据捕获技术,一般是由网卡11捕获数据包,并通过数据拷贝将数据包传输到内核缓存区12中;内核缓存区12中的数据包利用内核协议栈13,通过多次数据拷贝逐级往上传递,具体地通过内核协议栈13的数据包套接字(packet socket)将数据包拷贝一份,并将数据包逐级往上传递;数据分析装置15通过系统调用,将传递到上层的内存缓存区12中的数据包拷贝至应用缓存区14中。
[0005]上述网络数据捕获技术存在的缺陷在于:从网卡捕获到数据包,并将数据包传递到数据分析装置的过程中,不仅存在多次数据拷贝,而且还需要系统调用,导致降低了数据包的传输效率,增加了系统和CPU (Central Processing Unit,中央处理器)资源开销。


【发明内容】

[0006]本发明实施例提供一种网络数据捕获方法和系统,以减少系统和CPU资源开销,并提高数据包的传输效率。
[0007]第一方面,本发明实施例提供了一种网络数据捕获方法,包括:
[0008]网卡捕获数据包,并将所述数据包缓存至网卡的接收先入先出队列中;
[0009]所述网卡通过外设部件互连接口直接内存访问PCI DMA控制器将所述接收先入先出队列中的数据包传输至内核态驱动中的预配置循环缓存区;
[0010]所述网卡基于预设中断触发策略,向所述内核态驱动发送中断请求;
[0011]所述内核态驱动根据所述中断请求,停止接收所述网卡发送的新的中断请求,以使在所述内核态驱动根据所述中断请求进行中断响应的过程中,不被所述网卡发送的新的中断请求再次中断;并更新所述循环缓存区的描述符;以及恢复接收所述网卡发送的新的中断请求,在接收到新的中断请求时,返回根据所述新的中断请求执行所述中断响应操作;
[0012]用户态数据分析装置根据所述循环缓存区的当前描述符,判断所述循环缓存区是否有数据包;
[0013]若是,则所述用户态数据分析装置从所述循环缓存区中提取数据包,并更新所述循环缓存区的描述符;
[0014]其中,所述内核态驱动和所述用户态数据分析装置通过内存映射技术共享所述循环缓存区;基于原子变量和原子操作的数据同步技术互斥使用所述循环缓存区。
[0015]第二方面,本发明实施例提供了一种网络数据捕获系统,所述系统包括:网卡、内核态驱动和用户态数据分析装置;
[0016]所述网卡用于捕获数据包,并将所述数据包缓存至网卡的接收先入先出队列中;还用于通过外设部件互连接口直接内存访问PCI DMA控制器将所述接收先入先出队列中的数据包传输至内核态驱动中的预配置循环缓存区;还用于基于预设中断触发策略,向所述内核态驱动发送中断请求;
[0017]所述内核态驱动用于预先配置循环缓存区;还用于根据所述网卡发送的所述中断请求,停止接收所述网卡发送的新的中断请求,以使在所述内核态驱动根据所述中断请求进行中断响应的过程中,不被所述网卡发送的新的中断请求再次中断;并更新所述循环缓存区的描述符;
[0018]所述用户态数据分析装置用于根据所述循环缓存区的当前描述符,判断所述循环缓存区是否有数据包;若是,则从所述循环缓存区中提取数据包,并更新所述循环缓存区的描述符;以及恢复接收所述网卡发送的新的中断请求,在接收到新的中断请求时,返回根据所述新的中断请求执行所述中断响应操作;
[0019]其中,所述内核态驱动和所述用户态数据分析装置通过内存映射技术共享所述循环缓存区;基于原子变量和原子操作的数据同步技术互斥使用所述循环缓存区。
[0020]本发明实施例提供的网络数据捕获方法和系统,通过外设部件互连接口为网卡提供连接接口,基于直接内存访问技术,将网卡的接收先入先出队列中数据包传输至内核态驱动中的预配置循环缓存区,仅需事先安排的少量CPU资源即可自动完成数据包从网卡到内核态驱动的传输,因此在大量数据包传输过程中节约了大量的CPU资源;通过内核态驱动和用户态数据分析装置共享及互斥使用循环缓存区,一方面,实现用户态和内核态之间共享循环缓存区以及循环缓存区的描述符,避免数据从内核态拷贝到用户态的大量拷贝过程,从而进一步节约了大量CPU资源,另一方面,保证用户态和内核态在循环缓存区的描述符的操作上是同步的,因此,解决了数据的生产和消费之间的同步问题,并且在数据包从网卡到内核态控制器的循环缓存区,以及从循环缓存区到用户态数据分析装置的整个过程中零拷贝,用户态不需要系统调用就可以访问到内核态捕获到的数据包,从而避免了不必要的系统调用和由内核同时服务于多个网卡时产生的上下文切换开销,同时提高了数据包的传输效率。

【专利附图】

【附图说明】
[0021]为了更清楚地说明本发明,下面将对本发明中所需要使用的附图做一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
[0022]图1为现有技术中一种网络数据捕获系统的结构示意图;
[0023]图2a为本发明实施例一提供的一种网络数据捕获方法的流程图;
[0024]图2b为本发明实施例一提供的网络数据捕获方法中一种用户态数据分析装置从所述循环缓存区中提取数据包,并更新所述循环缓存区的描述符的方法流程图;
[0025]图2c为本发明实施例一提供的一种网卡、内核态驱动和用户态数据分析装置共享循环缓存区的示意图;
[0026]图3为本发明实施例二提供的一种网络数据捕获方法的流程图;
[0027]图4为本发明实施例三提供的一种网络数据捕获系统的结构示意图;
[0028]图5为本发明实施例四提供的一种网络数据捕获系统的结构示意图。

【具体实施方式】
[0029]为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施例中的技术方案作进一步详细描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。可以理解的是,此处所描述的具体实施例仅用于解释本发明,而非对本发明的限定,基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部内容。
[0030]实施例一
[0031]请参阅图2a,为本发明实施例一提供的一种网络数据捕获方法的流程图。本发明实施例的方法适用于网络数据捕获系统,该系统包括:网卡、内核态驱动和用户态数据分析装置。其中,网卡属于硬件层,内核态驱动属于内核态,用户态数据分析装置属于用户态。
[0032]该方法包括:步骤210?步骤260。
[0033]步骤210、网卡捕获数据包,并将所述数据包缓存至网卡的接收先入先出队列中。
[0034]其中,接收先入先出队列(RX First Input First Output, RX FIFO)用于接收网卡捕获到的数据包。RX代表接收,先入先出队列(FIFO)是一种先进先出的数据缓存器,与普通存储器的区别在于:没有外部读写地址线,使用起来非常简单,先入先出队列的特点在于:只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针自动加I完成,而普通存储器是由地址线决定读取或写入某个指定的地址。
[0035]步骤220、所述网卡通过外设部件互连接口直接内存访问(Peripheral ComponentInterconnect Direct Memory Access,PCI DMA)控制器将所述接收先入先出队列中的数据包传输至内核态驱动中的预配置循环缓存区(RingBuffer)。
[0036]在本步骤中,具体是采用PCI为网卡提供连接接口,基于直接内存访问(DMA)技术,将网卡的接收先入先出队列中数据包传输至内核态驱动中的预配置循环缓存区,仅需事先安排的少量CPU资源即可自动完成数据包从网卡到内核态驱动的传输,因此在大量数据包传输过程中节约了大量的CPU资源。
[0037]其中,具体可以采用PCI插槽,该插槽可插接显卡、声卡、网卡、USB2.0卡、以及视频采集卡等多种扩展卡,通过插接不同的扩展卡可以实现相应功能。
[0038]直接内存访问(DMA)是用于快速数据交换的重要技术,具有独立于CPU的后台批量数据传输能力。
[0039]循环缓存区主要负责缓存网卡传输的数据包、以及内核态和用户态之间的数据交互。
[0040]步骤230、所述网卡基于预设中断触发策略,向所述内核态驱动发送中断请求。[0041 ] 本步骤具体可以是在由网卡传输至内核态驱动中的预配置循环缓存区的数据包达到设定数量时,触发网卡向所述内核态驱动发送中断请求。
[0042]本步骤中,除了根据数据包的数量触发网卡向所述内核态驱动发送中断请求之夕卜,还可以根据设定时间,触发网卡向所述内核态驱动发送中断请求,也即网卡捕获数据包,并将捕获的数据包传输至内核态驱动的循环缓存区,并再次捕获新的数据包,并将捕获的新数据包传输至内核态驱动的循环缓存区,如此循环往复,只要网卡执行捕获数据包,并将捕获的数据包传输至内核态驱动的循环缓存区的操作的时间达到设定时间,则触发网卡向所述内核态驱动发送中断请求。
[0043]步骤240、所述内核态驱动根据所述中断请求,停止接收所述网卡发送的新的中断请求,以使在所述内核态驱动根据所述中断请求进行中断响应的过程中,不被所述网卡发送的新的中断请求再次中断;并更新所述循环缓存区的描述符;以及恢复接收所述网卡发送的新的中断请求,在接收到新的中断请求时,返回根据所述新的中断请求执行所述中断响应操作。
[0044]需要说明的是,在执行本步骤时,网卡可以执行继续捕获新的数据包的操作。所述内核态驱动每接收到一次中断请求,即对中断请求进行响应,由于在对当前中断请求进行响应过程中,首先停止接收所述网卡发送的新的中断请求,使得在所述内核态驱动根据当前中断请求进行中断响应的过程中,不被所述发送的新的中断请求再次中断,由于在对当前中断请求进行响应后,恢复接收所述网卡发送的新的中断请求,能够使内核态驱动对每一次中断请求进行响应的过程中不被新的中断请求所打扰,这样,在每一次中断响应过程中,保证了更新的所述循环描述符的准确性。
[0045]步骤250、用户态数据分析装置根据所述循环缓存区的当前描述符,判断所述循环缓存区是否有数据包,若是,执行步骤260。
[0046]步骤260、所述用户态数据分析装置从所述循环缓存区中提取数据包,并更新所述循环缓存区的描述符。
[0047]步骤240具体可以是,所述内核态驱动根据所述中断请求,停止接收所述网卡发送的新的中断请求。
[0048]更新所述循环缓存区的头指针和尾指针,以及使用计数和空闲计数;
[0049]更新所述循环缓存区包含的缓存单元对应的状态。
[0050]其中,所述循环缓存区包含的缓存单元对应的状态,可以包括:空闲状态、使用中状态和可用状态。
[0051]其中,网卡根据头指针指向的缓存单元以及各缓存单元的次序关系,依次将捕获到的数据包传输至头指针指向的缓存单元以及该缓存单元的后序各缓存单元中;用户态数据分析装置根据尾指针指向的缓存单元以及各缓存单元的次序关系,依次从尾指针指向的缓存单元以及该缓存单元的后序各缓存单元中提取数据包;使用计数为存储有数据包的缓存单元总数/循环缓存区包含的缓存单元总数,一方面,网卡可以将捕获的数据包传输至从头指针指向的缓存单元开始的使用计数分子对应的缓存单元中,另一方面,用户态数据分析装置可以根据所述循环缓存区的当前描述符中的尾指针和使用计数,分别判断所述循环缓存区中从尾指针指向的缓存单元开始的使用计数分子对应的缓存单元中是否有数据包;空闲计数为未存储数据包的缓存单元总数/循环缓存区包含的缓存单元总数。
[0052]当前头指针指向的缓存单元(Buffer)的状态为空闲状态时,网卡可以将捕获的数据包传输至该Buffer中;当前头指针指向的Buffer的状态为使用中状态时,只有正在往该Buffer中传输数据包的网卡可以继续将捕获的数据包传输至该Buffer中;当前尾指针指向的Buffer的状态为使用中状态时,用户态数据分析装置判断到该Buffer中没有数据包,因此所述用户态数据分析装置不可以从所述循环缓存区中提取数据包,从而无需更新所述循环缓存区的描述符;当前尾指针指向的Buffer的状态为可用状态时,用户态数据分析装置判断到该Buffer中有数据包,因此所述用户态数据分析装置可以从所述循环缓存区中提取数据包,并更新所述循环缓存区的描述符。
[0053]其中,所述内核态驱动和所述用户态数据分析装置通过内存映射技术共享所述循环缓存区;基于原子变量和原子操作的数据同步技术互斥使用所述循环缓存区。
[0054]需要说明的是,在所述内核态驱动进行中断响应的过程中,所述网卡可以返回捕获新的数据包的操作,并将所述捕获的新的数据包传输至所述循环缓存区中当前头指针指向的、且当前状态为空闲状态的缓存单元中。
[0055]本实施例的技术方案,通过PCI为网卡提供连接接口,基于直接内存访问技术,将网卡的接收先入先出队列中数据包传输至内核态驱动中的预配置循环缓存区,仅需事先安排的少量CPU资源即可自动完成数据包从网卡到内核态驱动的传输,因此在大量数据包传输过程中节约了大量的CPU资源;通过内核态驱动和用户态数据分析装置共享及互斥使用循环缓存区,一方面,实现用户态和内核态之间共享循环缓存区以及循环缓存区的描述符,避免数据从内核态拷贝到用户态的大量拷贝过程,从而进一步节约了大量CPU资源,另一方面,保证用户态和内核态在循环缓存区的描述符的操作上是同步的,因此,解决了数据的生产和消费之间的同步问题,并且在数据包从网卡到内核态控制器的循环缓存区,以及从循环缓存区到用户态数据分析装置的整个过程中零拷贝,用户态不需要系统调用就可以访问到内核态捕获到的数据包,从而避免了不必要的系统调用和由内核同时服务于多个网卡时产生的上下文切换开销,同时提高了数据包的传输效率。
[0056]在本实施例的基础上,在步骤250之后,所述方法还可以包括:若否,则执行步骤270。
[0057]步骤270、所述用户态数据分析装置按预设睡眠时长睡眠,并在所述预设睡眠时长之后,返回根据所述循环缓存区的当前描述符,判断所述循环缓存区是否有数据包的操作。
[0058]也即,在判断到没有数据包时,所述用户态数据分析装置按预设睡眠时长(例如1s)睡眠,并在所述预设睡眠时长之后,返回步骤250。
[0059]还需要说明的是,在步骤260之后,可以返回步骤250,换言之,进行下一轮的数据包有无判断的操作。
[0060]本实施方式,通过用户态数据分析装置主动轮询循环缓存区是否有数据包,在有数据包时,能够使用户态数据分析装置及时捕获网卡传输的数据包,提高了数据包的传输效率,在没有数据包时,进行睡眠,减少了系统开销,并在设定的睡眠时长之后,再次主动轮询循环缓存区是否有数据包,有利于及时发现数据包。
[0061]请参阅图2b,为本发明实施例一提供的网络数据捕获方法中一种用户态数据分析装置从所述循环缓存区中提取数据包,并更新所述循环缓存区的描述符的方法流程图。
[0062]该方法包括:步骤261?步骤263。
[0063]步骤261、所述用户态数据分析装置判断循环缓存区的当前使用计数是否大于0,若是,则执行步骤262。
[0064]步骤262、所述用户态数据分析装置从当前尾指针指向的、且当前状态为可用状态的缓存单元中提取数据包。
[0065]步骤263、所述用户态数据分析装置将提取数据包后的该缓存单元的状态更新为空闲状态,并更新所述循环缓存区的尾指针、以及使用计数和空闲计数,并返回判断循环缓存区的当前使用计数是否大于O的操作。
[0066]示例
[0067]请参阅图2c,为本发明实施例一提供的一种网卡、内核态驱动和用户态数据分析装置共享循环缓存区的示意图。
[0068]内核态驱动预先配置循环缓存区(RingBuffer),该循环缓存区由多个缓存单元(Buffer)组成(如图2c所示),然后,内核态驱动初始化配置的循环缓存区,每个Buffer对应各自的初始化的描述符(RX Ring),如图2c中所示,每个Buffer对应各自接收描述符,具体可以包括第一接收描述符(RX Descl)、第二接收描述符(RX Desc2)以及第三接收描述符(RX Desc3)等。硬件层的网卡通过PCI DMA控制器并根据RX Ring中初始化的RXDesc,将捕获到的数据包传输至内核态驱动中的预配置循环缓存区(RingBuffer)中,可以供内核态驱动和用户态数据分析装置访问。
[0069]例如,以循环缓存区包括20个缓存区为例进行说明。内核态驱动配置并初始化循环缓存区之后,循环缓存区的描述符中的头指针(head)指向第一个缓存单元(Buffer),循环缓存区的描述符中的尾指针(tail)也指向第一个Buffer,同时将循环缓存区的描述符中的使用计数(used_cnt)初始化为0/20和空闲计数(free_cnt)初始化为20/20,并将20个缓存区的状态均初始化为空闲状态。
[0070]假设第一网卡捕获到2个数据包,之后第二网卡捕获到I个数据包,假设每个数据包占据一个Buffer,并假设第一网卡传输至内核态驱动中的预配置循环缓存区的数据包达到2个以上时,第一网卡向所述内核态驱动发送中断请求,以及第二网卡传输至内核态驱动中的预配置循环缓存区的数据包达到3个以上时,第二网卡向所述内核态驱动发送中断请求。
[0071]循环缓存区的初始化描述符中的头指针指向第一个Buffer,则第一网卡将捕获到的第一个数据包传输至内核态驱动的RingBuffer中的第一个Buffer中,并将捕获到的第二个数据包传输至第一个Buffer的后序第二个Buffer。在第二网卡将数据包传输至第三个Buffer中时,所述内核态驱动接收到第一网卡发送的中断请求,则内核态驱动更新所述循环缓存区的描述符(RingBufferDesc),具体地,将循环缓存区的描述符更新如下:头指针指向第四个Buffer,尾指针仍指向第一个Buffer,使用计数更新为3/20,空闲计数更新为17/20,将第一个Buffer和第二个Buffer状态均更新为可用状态,并将第三个Buffer的状态更新为使用中状态,以及将第四个Buffer及后序的第五个Buffer等的状态均更新为空闲状态。
[0072]由于所述内核态驱动和所述用户态数据分析装置通过内存映射技术共享所述循环缓存区;基于原子变量和原子操作的数据同步技术互斥使用所述循环缓存区,因此同一时刻只支持内核态驱动或用户态数据分析装置执行的所述描述符更新操作,此时,内核态驱动和用户态数据分析装置共享的循环缓存区的描述符为:头指针指向第四个Buffer,尾指针指向第一个Buffer,使用计数为3/20,空闲计数为17/20,第一个Buffer和第二个Buffer状态均为可用状态,第三个Buffer的状态为使用中状态,以及第四个Buffer及后序的第五个Buffer等的状态均为空闲状态。
[0073]用户态数据分析装置根据所述循环缓存区的当前描述符的尾指针和使用计数,具体执行下述操作:判断到循环缓存区的当前使用计数3/20大于0,根据当前尾指针指向的第一个Buffer,以及该第一个Buffer的状态为可用状态,则判断到第一个Buffer中存储有数据包,并从第一个Buffer提取数据包,在从第一个Buffer提取数据包之后,不更新头指针,也即头指针仍指向第四个Buffer,尾指针更新为指向第二个Buffer,使用计数更新为2/20,空闲计数更新为18/20,将第一个Buffer的状态更新为空闲状态,不更新其他Buffer的状态;之后,判断到循环缓存区的当前使用计数2/20大于0,根据当前尾指针指向的第二个Buffer,以及该第二个Buffer的状态为可用状态,则判断到第二个Buffer中存储有数据包,并从第二个Buffer提取数据包,在从第二个Buffer提取数据包之后,不更新头指针,也即头指针仍指向第四个Buffer,尾指针更新为指向第三个Buffer,使用计数更新为1/20,空闲计数更新为19/20,将第二个Buffer的状态更新为空闲状态,不更新其他Buffer的状态;之后,判断到循环缓存区的当前使用计数1/20大于0,根据当前尾指针指向的第三个Buffer,以及该第三个Buffer的状态为使用中状态,则判断到第三个Buffer中没有数据包,而是正在存储数据包,则不从第三个Buffer中提取数据包,此时不更新循环缓存区的描述符。
[0074]实施例二
[0075]请参阅图3,为本发明实施例二提供的一种网络数据捕获方法的流程图。本实施例的方法适用于网络数据捕获系统,该系统包括:驱动模块、配置于硬件层的网卡、配置于内核态的内核态驱动和网络适配器,以及配置于用户态的用户态数据分析装置。其中,网络适配器为网卡的硬件驱动,主要负责网卡的初始化和配置、以及数据包的收发等功能;整个方法流程包括两级循环体,分别为循环体一和循环体二,在循环体一中,由驱动模块加载(即图3所示的注册驱动模块)开始工作,直到驱动模块卸载(即图3所示的注销驱动模块)结束工作。
[0076]该方法包括:步骤310?步骤370。其中,循环体一包括步骤310?步骤370,循环体二包括步骤330?步骤350。
[0077]步骤310、注册驱动模块。
[0078]步骤320、内核态驱动注册并创建循环缓存区(RingBuffer)。在本步骤中,具体可以包括步骤321?步骤322。
[0079]步骤321、所述内核态驱动注册并创建循环缓存区。
[0080]步骤322、所述内核态驱动初始化所述创建的循环缓存区,作为预配置循环缓存区。
[0081]其中,RingBuffer可以设计为字符设备。
[0082]步骤330、打开网络适配器。
[0083]步骤340、网卡捕获数据包,并与内核态驱动和用户态数据分析装置交互捕获到的数据包。
[0084]本步骤中,同样适用于前述实施例中步骤210?步骤260,或者步骤210?步骤270,此处不再赘述。
[0085]需要说明的是,在步骤210之前,执行步骤320即可,从而网卡可以将捕获到的数据包传输至预配置循环缓存区中。
[0086]步骤350、关闭网络适配器。
[0087]步骤360、注销驱动模块。
[0088]步骤370、所述内核态驱动注销并释放所述创建的循环缓存区。
[0089]需要说明的是,在步骤260之后,执行步骤370即可。
[0090]步骤370具体可以包括:步骤371?步骤373。
[0091]步骤371中,清空循环缓存空间,也即清空各缓存单元;步骤372中,释放循环缓存空间,也即释放各缓存单元;步骤373中,注销循环缓存区(RingBuffer)。由前述可知,RingBuffer被设计为字符设备,因此步骤373也就是注销该RingBufTer字符设备。
[0092]需要说明的是,循环体二的循环次数通常大于循环体一的循环次数。换言之,并非在每次网卡捕获数据包,并通过PCI DMA控制器将所述接收先入先出队列中的数据包传输至内核态驱动中的预配置循环缓存区之前,都由所述内核态驱动执行注册并创建循环环缓存区;并初始化所述创建的循环缓存区,作为所述预配置循环缓存区的操作。
[0093]同样地,并非在每次在所述用户态数据分析装置从所述循环缓存区中提取数据包之后,都执行所述内核态驱动注销并释放所述创建的循环缓存区的操作。
[0094]本实施例的技术方案,在循环体一中,由驱动模块加载开始工作,直到驱动模块卸载结束工作。驱动模块加载后,首先注册并创建循环缓存区,注册过程中初始化循环缓存区区作为预配置循环缓存区,然后进入循环体二 ;驱动模块卸载时,首先清空和释放循环缓存区空间,注销RingBuffer设备;在循环体二中,网卡捕获数据包,并与内核态驱动和用户态数据分析装置交互捕获到的数据包,通过外设部件互连接口为网卡提供连接接口,基于直接内存访问技术,将网卡的接收先入先出队列中数据包传输至内核态驱动中的预配置循环缓存区,仅需事先安排的少量CPU资源即可自动完成数据包从网卡到内核态驱动的传输,因此在大量数据包传输过程中节约了大量的CPU资源;通过内核态驱动和用户态数据分析装置共享及互斥使用循环缓存区,一方面,实现用户态和内核态之间共享循环缓存区以及循环缓存区的描述符,避免数据从内核态拷贝到用户态的大量拷贝过程,从而进一步节约了大量CPU资源,另一方面,保证用户态和内核态在循环缓存区的描述符的操作上是同步的,因此,解决了数据的生产和消费之间的同步问题,并且在数据包从网卡到内核态控制器的循环缓存区,以及从循环缓存区到用户态数据分析装置的整个过程中零拷贝,用户态不需要系统调用就可以访问到内核态捕获到的数据包,从而避免了不必要的系统调用和由内核同时服务于多个网卡时产生的上下文切换开销,同时提高了数据包的传输效率。
[0095]实施例三
[0096]请参阅图4,为本发明实施例三提供的一种网络数据捕获系统的结构示意图。所述系统包括:网卡410、内核态驱动420和用户态数据分析装置430。
[0097]其中,所述网卡410用于捕获数据包,并将所述数据包缓存至网卡的接收先入先出队列(RX FIFO)中;还用于通过PCI DMA控制器将所述接收先入先出队列中的数据包传输至内核态驱动420中的预配置循环缓存区,具体可以通过PCI DMA控制器将所述接收先入先出队列中的数据包传输至网络适配器(adapter)的数据接收空间(rx ring)所指向的内核态驱动420中的预配置循环缓存区;还用于基于预设中断触发策略,向所述内核态驱动420发送中断请求;所述内核态驱动420用于预先配置循环缓存区;还用于根据所述网卡410发送的所述中断请求,停止接收所述网卡发送的新的中断请求,以使在所述内核态驱动根据所述中断请求进行中断响应的过程中,不被所述网卡发送的新的中断请求再次中断;并更新所述循环缓存区的描述符;以及恢复接收所述网卡发送的新的中断请求,在接收到新的中断请求时,返回根据所述新的中断请求执行所述中断响应操作;所述用户态数据分析装置430用于根据所述循环缓存区的当前描述符,判断所述循环缓存区是否有数据包;若是,则从所述循环缓存区中提取数据包,并更新所述循环缓存区的描述符,具体地,用户态中提供函数接口库,函数接口库主要提供初始化、接收数据包以及数据包统计的函数级接口,用户态数据分析装置430可以根据所述循环缓存区的当前描述符,通过相应的函数接口判断所述循环缓存区是否有数据包;若是,则通过函数接口库以及内存映射技术(mmap)从所述循环缓存区中提取数据包,并更新所述循环缓存区的描述符,其中,内存映射技术用于将数据包空间映射到用户态数据分析装置430中。
[0098]其中,所述内核态驱动和所述用户态数据分析装置通过内存映射技术共享所述循环缓存区;基于原子变量和原子操作的数据同步技术互斥使用所述循环缓存区。
[0099]本实施例的技术方案,通过PCI为网卡提供连接接口,基于直接内存访问技术,将网卡的接收先入先出队列中数据包传输至内核态驱动中的预配置循环缓存区,仅需事先安排的少量CPU资源即可自动完成数据包从网卡到内核态驱动的传输,因此在大量数据包传输过程中节约了大量的CPU资源;通过内核态驱动和用户态数据分析装置共享及互斥使用循环缓存区,一方面,实现用户态和内核态之间共享循环缓存区以及循环缓存区的描述符,避免数据从内核态拷贝到用户态的大量拷贝过程,从而进一步节约了大量CPU资源,另一方面,保证用户态和内核态在循环缓存区的描述符的操作上是同步的,因此,解决了数据的生产和消费之间的同步问题,并且在数据包从网卡到内核态控制器的循环缓存区,以及从循环缓存区到用户态数据分析装置的整个过程中零拷贝,用户态不需要系统调用就可以访问到内核态捕获到的数据包,从而避免了不必要的系统调用和由内核同时服务于多个网卡时产生的上下文切换开销,同时提高了数据包的传输效率。
[0100]需要说明的是,以上说明了网卡捕获到数据包之后,如何传输至用户态数据分析装置中,涉及网卡的接收先入先出队列(RX FIFO),网络适配器(adapter)的数据接收队列(rx ring),最终传输至用户态数据分析装置中。在用户态数据分析装置对数据包进行分析后,可以将分析结果,按照与上述网络捕获系统执行的网络数据捕获方法相反的操作流程传输至网卡的发送先入先出队列(TXFIFO),此处不再赘述。
[0101]在上述方案中,所述内核态驱动420具体可以用于:
[0102]根据所述中断请求,停止接收所述网卡发送的新的中断请求;
[0103]更新所述循环缓存区的头指针和尾指针,以及使用计数和空闲计数;
[0104]更新所述循环缓存区包含的缓存单元对应的状态。
[0105]进一步地,所述循环缓存区包含的缓存单元对应的状态,可以包括:空闲状态、使用中状态和可用状态。
[0106]进一步地,所述用户态数据分析装置430具体可以用于:判断循环缓存区的当前使用计数是否大于O;若是,则从当前尾指针指向的、且当前状态为可用状态的缓存单元中提取数据包;将提取数据包后的该缓存单元的状态更新为空闲状态,并更新所述循环缓存区的尾指针、以及使用计数和空闲计数,并返回判断循环缓存区的当前使用计数是否大于O的操作。
[0107]在上述方案中,所述用户态数据分析装置430还可以用于在根据所述循环缓存区的当前描述符,判断所述循环缓存区是否有数据包之后,若否,则按预设睡眠时长睡眠,并在所述预设睡眠时长之后,返回根据所述循环缓存区的当前描述符,判断所述循环缓存区是否有数据包的操作。
[0108]在上述方案中,所述内核态驱动420具体可以用于在所述网卡通过PCIDMA控制器将所述接收先入先出队列中的数据包传输至内核态驱动中的预配置循环缓存区之前,注册并创建循环缓存区;初始化所述创建的循环缓存区,作为所述预配置循环缓存区;所述内核态驱动420还可以用于在所述用户态数据分析装置从所述循环缓存区中提取数据包之后,注销并释放所述创建的循环缓存区。
[0109]本发明实施例提供的网络数据捕获系统可执行本发明任意实施例所提供的网络数据捕获方法,具备执行方法相应的功能模块和有益效果。
[0110]实施例四
[0111]请参阅图5,为本发明实施例四提供的一种网络数据捕获系统的结构示意图。本系统包括两套子系统,第一套子系统和第二套子系统分时共用网卡510和网络适配器520,第一套子系统还包括:循环缓存区对应的字符设备530、文件系统540和第一用户态数据分析装置550 ;第二套子系统还包括:内核协议栈560和第二用户态数据分析装置570。
[0112]其中,循环缓存区对应的字符设备530负责分配、释放循环缓存区(RingBuffer)空间,管理RingBuffer的生产消费关系,该字符设备对应前述各实施例中的循环缓存区,当循环缓存区被设计为字符设备时,对用户展现为循环缓存区对应的字符设备530。第一用户态数据分析装置550通过文件系统540中的/dev/ringbuffer_x(x为0,I, 2,3...)访问RingBuffer空间,从而实现数据包的接收和发送。
[0113]其中,循环缓存区对应的字符设备530与内核协议栈560中的网络设备(net_device)层平级,对于第二套子系统,网卡510将捕获的数据包传输至网络适配器520中,然后将网卡510捕获到的数据包经网络适配器520传输至内核协议栈560中,其中内核协议栈560通过套接字(socket)接口访问对应的net_device,然后再访问对应的网络适配器520中的数据包,第二用户态数据分析装置570通过系统调用将传递到内核协议栈560中的数据包拷贝至用户态应用缓存区中。
[0114]其中,第一套子系统工作在零拷贝模式,其工作原理可参阅实施例一,此处不再赘述,当工作在零拷贝模式下时,接收的数据包存放在接收循环缓存区中;第二套子系统工作在正常模式,其工作原理可参见前述图1及相应的介绍,此处不再赘述。用户可以根据实际需要在这种两种模式下进行切换。
[0115]最后应说明的是:以上各实施例仅用于说明本发明的技术方案,而非对其进行限制;实施例中优选的实施方式,并非对其进行限制,对于本领域技术人员而言,本发明可以有各种改动和变化。凡在本发明的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
【权利要求】
1.一种网络数据捕获方法,其特征在于,包括: 网卡捕获数据包,并将所述数据包缓存至网卡的接收先入先出队列中; 所述网卡通过外设部件互连接口直接内存访问PCI DMA控制器将所述接收先入先出队列中的数据包传输至内核态驱动中的预配置循环缓存区; 所述网卡基于预设中断触发策略,向所述内核态驱动发送中断请求; 所述内核态驱动根据所述中断请求,停止接收所述网卡发送的新的中断请求,以使在所述内核态驱动根据所述中断请求进行中断响应的过程中,不被所述网卡发送的新的中断请求再次中断;并更新所述循环缓存区的描述符;以及恢复接收所述网卡发送的新的中断请求,在接收到新的中断请求时,返回根据所述新的中断请求执行所述中断响应操作;用户态数据分析装置根据所述循环缓存区的当前描述符,判断所述循环缓存区是否有数据包; 若是,则所述用户态数据分析装置从所述循环缓存区中提取数据包,并更新所述循环缓存区的描述符; 其中,所述内核态驱动和所述用户态数据分析装置通过内存映射技术共享所述循环缓存区;基于原子变量和原子操作的数据同步技术互斥使用所述循环缓存区。
2.根据权利要求1所述的方法,其特征在于,所述内核态驱动根据所述中断请求,停止接收所述网卡发送的新的中断请求,并更新所述循环缓存区的描述符,包括: 所述内核态驱动根据所述中断请求,停止接收所述网卡发送的新的中断请求; 更新所述循环缓存区的头指针和尾指针,以及使用计数和空闲计数; 更新所述循环缓存区包含的缓存单元对应的状态。
3.根据权利要求2所述的方法,其特征在于,所述循环缓存区包含的缓存单元对应的状态,包括:空闲状态、使用中状态和可用状态。
4.根据权利要求3所述的方法,其特征在于,所述用户态数据分析装置从所述循环缓存区中提取数据包,并更新所述循环缓存区的描述符,包括: 所述用户态数据分析装置判断循环缓存区的当前使用计数是否大于O ; 若是,则所述用户态数据分析装置从当前尾指针指向的、且当前状态为可用状态的缓存单元中提取数据包; 所述用户态数据分析装置将提取数据包后的该缓存单元的状态更新为空闲状态,并更新所述循环缓存区的尾指针、以及使用计数和空闲计数,并返回判断循环缓存区的当前使用计数是否大于O的操作。
5.根据权利要求1-4任一所述的方法,其特征在于,在用户态数据分析装置根据所述循环缓存区的当前描述符,判断所述循环缓存区是否有数据包之后,所述方法还包括: 若否,则所述用户态数据分析装置按预设睡眠时长睡眠,并在所述预设睡眠时长之后,返回根据所述循环缓存区的当前描述符,判断所述循环缓存区是否有数据包的操作。
6.根据权利要求1-4任一所述的方法,其特征在于,在所述网卡通过PCIDMA控制器将所述接收先入先出队列中的数据包传输至内核态驱动中的预配置循环缓存区之前,所述方法还包括: 所述内核态驱动注册并创建循环缓存区; 所述内核态驱动初始化所述创建的循环缓存区,作为所述预配置循环缓存区; 在所述用户态数据分析装置从所述循环缓存区中提取数据包之后,所述方法还包括: 所述内核态驱动注销并释放所述创建的循环缓存区。
7.—种网络数据捕获系统,其特征在于,所述系统包括:网卡、内核态驱动和用户态数据分析装置; 所述网卡用于捕获数据包,并将所述数据包缓存至网卡的接收先入先出队列中;还用于通过外设部件互连接口直接内存访问PCI DMA控制器将所述接收先入先出队列中的数据包传输至内核态驱动中的预配置循环缓存区;还用于基于预设中断触发策略,向所述内核态驱动发送中断请求; 所述内核态驱动用于预先配置循环缓存区;还用于根据所述网卡发送的所述中断请求,停止接收所述网卡发送的新的中断请求,以使在所述内核态驱动根据所述中断请求进行中断响应的过程中,不被所述网卡发送的新的中断请求再次中断;并更新所述循环缓存区的描述符;以及恢复接收所述网卡发送的新的中断请求,在接收到新的中断请求时,返回根据所述新的中断请求执行所述中断响应操作; 所述用户态数据分析装置用于根据所述循环缓存区的当前描述符,判断所述循环缓存区是否有数据包;若是,则从所述循环缓存区中提取数据包,并更新所述循环缓存区的描述符; 其中,所述内核态驱动和所述用户态数据分析装置通过内存映射技术共享所述循环缓存区;基于原子变量和原子操作的数据同步技术互斥使用所述循环缓存区。
8.根据权利要求7所述的系统,其特征在于,所述内核态驱动具体用于: 根据所述中断请求,停止接收所述网卡发送的新的中断请求; 更新所述循环缓存区的头指针和尾指针,以及使用计数和空闲计数; 更新所述循环缓存区包含的缓存单元对应的状态。
9.根据权利要求8所述的系统,其特征在于,所述循环缓存区包含的缓存单元对应的状态,包括:空闲状态、使用中状态和可用状态。
10.根据权利要求9所述的系统,其特征在于,所述用户态数据分析装置具体用于: 判断循环缓存区的当前使用计数是否大于O ; 若是,则从当前尾指针指向的、且当前状态为可用状态的缓存单元中提取数据包; 将提取数据包后的该缓存单元的状态更新为空闲状态,并更新所述循环缓存区的尾指针、以及使用计数和空闲计数,并返回判断循环缓存区的当前使用计数是否大于O的操作。
【文档编号】H04L12/26GK104506379SQ201410771925
【公开日】2015年4月8日 申请日期:2014年12月12日 优先权日:2014年12月12日
【发明者】童克冬, 陶小龙 申请人:北京锐安科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1