数据包捕获、处理和发送方法及系统的制作方法

文档序号:7774817阅读:168来源:国知局
数据包捕获、处理和发送方法及系统的制作方法
【专利摘要】本发明提出一种数据包捕获、处理和发送方法,包括以下步骤:根据系统的页面大小分配一个预定大小的内存空间;将内存从内核空间映射到用户地址空间以使用户程序与内核空间的内存相关联;将接收到的数据包通过直接内存存取方式依次存储到内存空间中连续的多个DMA缓冲区;用户程序通过m个线程对N个DMA缓冲区中的数据包进行并行处理,其中m为处理器的内核数;依次将N个DMA缓冲区中处理完成的数据包向外发送。本发明实现了快速捕获、并行处理、线速发送的有机结合,从而解决了零拷贝技术不能及时处理捕获的数据包的缺点,为安全审计系统提供一定的技术支持。本发明还提出一种数据包捕获、处理和发送系统。
【专利说明】数据包捕获、处理和发送方法及系统
【技术领域】
[0001]本发明涉及互联网网络安全【技术领域】,尤其涉及一种数据包捕获、处理和发送的方法及系统。
【背景技术】
[0002]随着互联网的快速发展,对互联网内容进行安全审计越来越重要,网络安全技术也得以快速的发展。现有的基于内容的安全审计主要分为数据包的捕获、过滤和处理。快速的数据包捕获机制是安全审计的前提,捕获数据包的速率直接影响整个系统的性能。
[0003]现有的数据包捕获机制有的基于软件实现,也有的基于硬件实现。随着千兆网卡的普及,虽然硬件的性能得以快速提升,但从性价比的角度,人们更多地考虑从软件的角度来实现高速的数据包的捕获。
[0004]现阶段比较成熟的软件实现方案有传统的Iibpcap数据包捕获机制、基于RF_RING的数据包捕获机制和基于零拷贝的快速数据包捕获。随着零拷贝的提出,千兆网络数据包的捕获已经得以实现,但是网络安全系统处理数据包的速率能否跟上捕获数据包的速率成为影响整个安全系统性能的关键。现有零拷贝技术的实现大多是基于nopage的内存映射方法,而这种机制很难满足并行处理数据包的要求,一旦系统无法及时地处理捕获的数据包,系统的内存很快就被耗尽。与此同时,现有的捕获机制都修改了网卡驱动程序,影响了系统正常的协议栈使用,使得捕获的数据包只能由特定的程序使用,系统其他的用户程序无法通过网卡正常收发数据包。

【发明内容】

[0005]本发明旨在至少解决上述技术问题之一。
[0006]为此,本发明的第一个目的在于提出一种数据包捕获、处理和发送方法。
[0007]本发明的第二个目的在于提出一种数据包捕获、处理和发送系统。
[0008]为了实现上述目的,本发明第一方面实施例的数据包捕获、处理和发送方法包括以下步骤:根据系统的页面大小分配一个预定大小的内存空间;将内存从内核空间映射到用户地址空间以使用户程序与所述内核空间的内存相关联;将接收到的数据包通过直接内存存取方式依次存储到所述内存空间中连续的多个DMA缓冲区;所述用户程序通过m个线程对N个DMA缓冲区中的数据包进行并行处理,其中m为处理器的内核数;依次将所述N个DMA缓冲区中处理完成的数据包向外发送。
[0009]根据本发明实施例的数据包捕获、处理和发送方法,实现了快速捕获、并行处理、线速发送的有机结合,从而解决了零拷贝技术不能及时处理捕获的数据包的缺点,为网络安全审计提供一定的技术支持。
[0010]在本发明的一个实施例中,所述根据系统的页面大小分配一个预定大小的内存空间,具体包括:初始化网卡驱动程序并创建字符设备;通过所述字符设备分配连续的多个整页内存以得到所述内存空间。[0011]在本发明的一个实施例中,所述根据系统的页面大小分配一个预定大小的内存空间,还包括:对所述整页内存设置预留位以使所述整页内存不被置换。
[0012]在本发明的一个实施例中,在所述将接收到的数据包通过直接内存存取方式依次存储到所述内存空间中连续的多个DMA缓冲区之前,还包括:对所述多个DMA缓冲区建立流式DMA映射。
[0013]在本发明的一个实施例中,所述多个DMA缓冲区具有标志位,以便所述用户程序通过m个线程对N个DMA缓冲区中的数据包进行并行处理时,根据所述多个DMA缓冲区具有标志位对所述N个DMA缓冲区进行读、写操作。
[0014]为了实现上述目的,本发明第二方面实施例的数据包捕获、处理和发送系统,包括:分配模块,用于根据系统的页面大小分配一个预定大小的内存空间;映射模块,用于将内存从内核空间映射到用户地址空间以使用户程序与所述内核空间的内存相关联;存储控制模块,用于将接收到的数据包通过直接内存存取方式依次存储到所述内存空间中连续的多个DMA缓冲区;处理器,用于执行用户程序,以通过m个线程对N个DMA缓冲区中的数据包进行并行处理,其中m为处理器的内核数;发送模块,用于依次将所述N个DMA缓冲区中处理完成的数据包向外发送。
[0015]根据本发明实施例的数据包捕获、处理和发送系统,有效地解决了现有使用零拷贝技术的系统,在捕获数据包后无法在有限的时间内进行处理和发送,从而导致的丢包、内存资源消耗等问题。
[0016]在本发明的一个实施例中,所述分配模块用于对网卡驱动程序继续并初始化并创建字符设备,以及通过所述字符设备分配连续的多个整页内存以得到所述内存空间。
[0017]在本发明的一个实施例中,所述分配模块还包括:所述处理器还用于对所述整页内存设置预留位以使所述整页内存不被置换。
[0018]在本发明的一个实施例中,在所述将接收到的数据包通过直接内存存取方式依次存储到所述内存空间中连续的多个DMA缓冲区之前,所述存储控制模块还用于对所述多个DMA缓冲区建立流式DMA映射。
[0019]在本发明的一个实施例中,所述多个DMA缓冲区具有标志位,以便所述处理器执行所述用户程序,以通过m个线程对N个DMA缓冲区中的数据包进行并行处理时,根据所述多个DMA缓冲区具有标志位对所述N个DMA缓冲区进行读、写操作。
[0020]本发明附加的方面和优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明的实践了解到。
【专利附图】

【附图说明】
[0021]本发明上述的和/或附加的方面和优点从下面结合附图对实施例的描述中将变得明显和容易理解,其中,
[0022]图1是本发明实施例的数据包捕获、处理和发送方法流程示意图;
[0023]图2是数据包捕获过程示意图;
[0024]图3是DMA环大小对捕获速率的影响的仿真结果示意图;
[0025]图4是利用多线程对数据包并行处理过程示意图;
[0026]图5是采用单双线程处理数据包的速率对比结果示意图;和[0027]图6是本发明实施例的数据包发送过程示意图。
【具体实施方式】
[0028]下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能理解为对本发明的限制。相反,本发明的实施例包括落入所附加权利要求书的精神和内涵范围内的所有变化、修改和等同物。
[0029]在本发明的描述中,需要理解的是,术语“第一”、“第二”等仅用于描述目的,而不能理解为指示或暗示相对重要性。在本发明的描述中,需要说明的是,除非另有明确的规定和限定,术语“相连”、“连接”应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或一体地连接;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连。对于本领域的普通技术人员而言,可以具体情况理解上述术语在本发明中的具体含义。此外,在本发明的描述中,除非另有说明,“多个”的含义是两个或两个以上。
[0030]流程图中或在此以其他方式描述的任何过程或方法描述可以被理解为,表示包括一个或更多个用于实现特定逻辑功能或过程的步骤的可执行指令的代码的模块、片段或部分,并且本发明的优选实施方式的范围包括另外的实现,其中可以不按所示出或讨论的顺序,包括根据所涉及的功能按基本同时的方式或按相反的顺序,来执行功能,这应被本发明的实施例所属【技术领域】的技术人员所理解。
[0031]下面参考附图描述根据本发明第一方面实施例的数据包捕获、处理和发送方法。
[0032]图1是本发明的数据包捕获、处理和发送方法流程图。具体实现过程如下:
[0033]SI,在初始化网卡驱动程序时,创建字符设备,该字符设备根据系统的页面大小分配一个预定大小的内存空间。
[0034]具体地,在本发明的一个实施例中,初始化网卡驱动程序时,创建字符设备Datammap, Datammap在初始化过程中主要根据系统的页面大小(Linux默认为4K),通过调用—get_free_pages函数分配一个预定大小的内存空间。这样在一次性分配大块内存的同时,分配到的内存空间大小为页面大小的整数倍,使得每一页内存都可以分成2k的大小,便于数据包的接收。
[0035]S2,将内存从内核空间映射到用户地址空间以使用户程序与内核空间的内存相关联。
[0036]在内存空间分配成功后,数据包捕获程序过调用SetPageReserved函数,设置内存空间的每一页的页面预留位,保证这些页面不会从内存中被换出,在上述步骤完成后,将内存从内核空间映射到用户地址空间以使用户程序与内存空间相关联。
[0037]具体地,为实现内存从内核空间到用户地址空间的映射,Datammap还需注册一个mmap函数。用户程序通过open函数打开字符设备Datammap后,完成对mmap函数的调用,mmap函数通过调用remap_pfn_range函数实现数据包捕获设备的内存从内核空间到用户地址空间的映射,使得用户程序可以直接访问内核态的内存空间。这样通过内存分配和共享机制,实现了高速的数据包捕获。
[0038]S3,将接收到的数据包通过直接内存存取方式(Direct Memory Access,DMA)依次存储到内存空间中连续的多个DMA缓冲区。
[0039]事实上,在前述步骤中,字符设备Datammap中通过调用—get_free_pages分配的内存即DMA缓冲区。具体地,DMA缓冲区以页面为单位进行分配,网卡驱动程序在接收数据包时,设置网卡驱动程序可接收的数据包最大长度为1522字节,因此可以将分配的DMA缓冲区中的每页平均分成2k大小,用于数据包的接收。
[0040]在实际运行中,DMA缓冲区在接收数据包之前需要对该缓冲区进行流式DMA映射,即为DMA缓冲区生成一个网卡可访问的总线地址,该总线地址用dma_addr_t表示。由于在许多硬件中流式映射可以被优化,因此在网卡驱动程序中,调用dma_map_Single函数为每个DMA缓冲区建立流式DMA映射。一般情况下,在建立流式DMA映射时,需要通过dma_map_single函数的direction参数来指示数据的流动方向,由于本发明实施例的数据是由网卡发出的,因此将该参数设置为DMA_FROM_DEVICE。在DMA缓冲区在建立流式DMA映射后,网卡驱动程序只可通过调用dma_unmap_single函数,才能访问该DMA缓冲区的内容。具体地,在数据包被发往上层协议栈之前调用dma_unmap_Single函数,同时在该函数被调用后设置DMA缓冲区的标志位,通知用户程序读取该DMA缓冲区的内容。
[0041]在为每个DMA缓冲区设置标志位的同时对每一个DMA缓冲区进行编号,指示其:
[0042](I)可写:所有的用户程序处理完毕,可以清空该DMA缓冲区,接收新的数据;
[0043](2)可读:网卡数据已经接收完毕,应用层程序可以进行处理;
[0044](3)可发:经过处理可以通过的数据包加入到发送队列中。
[0045]在本发明实施例的网卡驱动程序中,采用字符设备Datammap用于将接收数据包的DMA缓冲区映射给用户程序,使得用户程序可以直接访问这些DMA缓冲区。网卡驱动程序在接收数据包时,这些DMA缓冲区是可以被重复使用的,即DMA缓冲区中的数据会不断更新,因此用户程序和网卡驱动程序在对这些DMA缓冲区访问时需要保持同步性。将每个DMA缓冲区的最后8字节设置成标志位。网卡驱动程序在向DMA缓冲区写入数据后设置该标志位为可读,表明用户程序在判断一个DMA缓冲区的标志位为可读时,对这个DMA缓冲区进行访问,并在访问结束后设置标志位为可写,可实现对DMA缓冲区的重复使用,节省内存空间。
[0046]在DMA缓冲区建立流式DMA映射后,网卡驱动程序通过DMA缓冲环管理字符设备Datammap分配的DMA缓冲区,来实现数据包的传送。如图2所示,DMA缓冲环即用于接收数据包的rx_ring环(即流式DMA映射的虚拟地址,用于存储skb地址空间的指针),rx_ring环的每个节点都通过skb关联着一个2k大小的缓冲区。在正常模式下,网卡收到一个数据包后,会将这个数据包放入rx_ring环中的下一个可用缓冲区中,之后弓丨发中断,通知驱动程序将这个数据包发给上层协议进行处理,并为rx_ring环分配一个新的DMA缓冲区。但是在NAPI模式中,网卡会一次接收多个数据包放入rx_ring环的可用缓冲区中,在引发中断后,一次性将这些数据包发送给上层协议栈进行处理。
[0047]为了更好地管理网卡驱动程序分配的skb,需在网卡驱动程序初始化后创建了一个可用skb池和一个在用skb池。可用skb池,为网卡驱动程序的rx_ring环提供skb,当rx_ring环的节点需要关联一个新的skb时,网卡驱动程序会从可用skb池中取出一个skb关联给rx_ring的节点。若在用skb池在创建后为空,当网卡驱动程序从可用skb池中取出skb时,将把该skb放入在用skb池中。网卡驱动程序在运行中,若可用skb池的skb被分配完,网卡驱动程序将从在用skb池中查找skb->data被处理过的skb,并将其重新初始化后放入可用skb池中。当网卡驱动程序向上层协议栈提交数据包时,网卡驱动程序还需要通过检查skb的users计数和skb_>data的dataref计数判断skb是否仍被上层协议栈使用,在判断它们被上层协议栈使用完后,再将它们重新初始化放入可用skb池中。这样保证了上层协议栈对数据访问的一致性。
[0048]在实际运行中,DMA缓冲环的大小会影响到数据包捕获的性能,如图3所示,随着rx_ring环的大小的增加,数据包的捕获速率明显提高。直至rx_ring环大小超过8192时,数据包的捕获速率不再发生变化,此时网卡主要产生的是接收定时器中断。因此可以根据系统负荷和对数据包捕获速率的需求选择实际操作的DMA缓冲环的大小。
[0049]S4,用户程序通过m个线程对N个DMA缓冲区中的数据包进行并行处理。
[0050]数据包捕获成功后,需要对数据包进行分析检查和存储,因此CPU处理速率必须要跟上网卡的捕获速率。在现实中,单核CPU的处理能力极其有限,多核CPU的出现,提高了网络安全系统对数据包的处理速率。网络安全系统可以通过多核CPU的并行处理机制实现对捕获数据包的并行处理,以此提高对数据包的处理速率。
[0051]在本发明的实施例中,被捕获的数据包是按捕获顺序放入地址连续的内存中的,这样在多核系统中,数据包处理程序中可以根据多核CPU的核数m将共享内存虚拟的划分为m块,通过多线程方式实现m核对该共享内存的并行处理。假设共享内存有N个DMA缓冲区用于接收数据包,对它们从I到N进行编号,核Ci需要处理的DMA缓冲区可以表示为:
[0052]
【权利要求】
1.一种数据包捕获、处理和发送方法,包括以下步骤: 根据系统的页面大小分配一个预定大小的内存空间; 将内存从内核空间映射到用户地址空间以使用户程序与所述内核空间的内存相关联; 将接收到的数据包通过直接内存存取方式依次存储到所述内存空间中连续的多个DMA缓冲区; 所述用户程序通过m个线程对N个DMA缓冲区中的数据包进行并行处理,其中m为处理器的内核数; 依次将所述N个DMA缓冲区中处理完成的数据包向外发送。
2.根据权利要求1所述的数据包捕获、处理和发送方法,其特征在于,所述根据系统的页面大小分配一个预定大小的内存空间,具体包括: 初始化网卡驱动程序并创建字符设备; 通过所述字符设备分配连续的多个整页内存以得到所述内存空间。
3.根据权利要求2所述的数据包捕获、处理和发送方法,其特征在于,还包括:对所述整页内存设置预留位以使所述整页内存不被置换。
4.根据权利要求1所述的数据包捕获、处理和发送方法,其特征在于,在所述将接收到的数据包通过直接内存存取方式依次存储到所述内存空间中连续的多个DMA缓冲区之前,还包括:对所述多个DMA缓冲区建立流式DMA映射。
5.根据权利要求1所述的数据包捕获、处理和发送方法,其特征在于,所述多个DMA缓冲区具有标志位,以便所述用户程序通过m个线程对N个DMA缓冲区中的数据包进行并行处理时,根据所述多个DMA缓冲区具有标志位对所述N个DMA缓冲区进行读、写操作。
6.一种数据包捕获、处理和发送系统,其特征在于,包括: 分配模块,用于根据系统的页面大小分配一个预定大小的内存空间; 映射模块,用于将内存从内核空间映射到用户地址空间以使用户程序与所述内核空间的内存相关联; 存储控制模块,用于将接收到的数据包通过直接内存存取方式依次存储到所述内存空间中连续的多个DMA缓冲区; 处理器,用于执行用户程序,以通过m个线程对N个DMA缓冲区中的数据包进行并行处理,其中m为处理器的内核数; 发送模块,用于依次将所述N个DMA缓冲区中处理完成的数据包向外发送。
7.根据权利要求6所述的数据包捕获、处理和发送系统,其特征在于,所述分配模块用于对网卡驱动程序继续并初始化并创建字符设备,以及通过所述字符设备分配连续的多个整页内存以得到所述内存空间。
8.根据权利要求7所述的数据包捕获、处理和发送系统,其特征在于,还包括:所述处理器还用于对所述整页内存设置预留位以使所述整页内存不被置换。
9.根据权利要求6所述的数据包捕获、处理和发送系统,其特征在于,在所述将接收到的数据包通过直接内存存取方式依次存储到所述内存空间中连续的多个DMA缓冲区之前,所述存储控制模块还用于对所述多个DMA缓冲区建立流式DMA映射。
10.根据权利要求6所述的数据包捕获、处理和发送系统,其特征在于,所述多个DMA缓冲区具有标志位,以便所述处理器执行所述用户程序,以通过m个线程对N个DMA缓冲区中的数据包进行并行处理时,根据所述多个DMA缓冲区具有标志位对所述N个DMA缓冲区进行读、写操 作。
【文档编号】H04L29/06GK103581181SQ201310517176
【公开日】2014年2月12日 申请日期:2013年10月28日 优先权日:2013年10月28日
【发明者】赵有健, 裴昶华, 全成斌 申请人:清华大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1