一种基于Linux的高性能数据报文捕获方法和装置制造方法
【专利摘要】本发明涉及网络【技术领域】,尤其涉及一种基于Linux的高性能数据报文捕获方法和装置,包括根据触发信号以中断方式通知数据报文捕获程序处理所述触发信号;网络流量大则屏蔽触发信号,主动轮询网卡是否接收到数据报文;若是,则同步网卡的数据报文至内核内存;网络流量小则响应触发信号,同步网卡的数据报文至内核内存;获得内核内存中的数据报文存储首地址并通过内存映射函数mmap将数据报文存储首地址映射到用户虚拟地址空间。采用半轮询方式减少内核中断处理,改变网卡传送数据报文的路径并通过内存映射函数mmap减少数据报文的拷贝次数,在千兆和万兆环境下进行高性能网络抓包,减少丢包率且降低CPU占用率。
【专利说明】一种基于Linux的高性能数据报文捕获方法和装置
【技术领域】
[0001]本发明涉及网络【技术领域】,尤其涉及一种基于Linux的高性能数据报文捕获方法 和装置。
【背景技术】
[0002]数据报文捕获是利用网卡的混杂模式,捕捉经过网卡的所有数据报文,然后提供 给应用程序以作具体的用途,如用于网络故障问题的分析、网络质量的评测或者防火墙和 日志系统的实现。利用数据报文捕获的方式实现这些应用程序最大的优势在于捕获途经网 卡的所有数据报文的同时还给应用程序提供了最原始的数据报文。
[0003]高性能数据报文捕获特指千兆或者万兆环境下的网络抓包,这种环境的网络特点 是流量大,数据包多,每秒能达到几百万甚至几千万级别的数据包。现有的网络数据报文捕 获系统一般使用Libpcap来实现的。在Linux系统中,使用基于Libpcap实现的Tcpdump 工具抓包、调试网络。Libpcap提供了系统独立的用户级别网络数据包捕获接口,并充分考 虑到应用程序的可移植性。Libpcap可以在绝大多数类Unix平台下工作。
[0004]如图1所示,为Libpcap接口使用的流程示意图。Libpcap接口使用的流程具体如 下:
[0005]1、使用pcap open live函数打开设备;
[0006]2、使用pcap setfilter函数设置过滤器;
[0007]3、调用pcap loop函数进入循环,等待触发;
[0008]4、被触发后,调用pcap read函数读取数据包;
[0009]5、使用pcap loop函数回到主循环。
[0010]Libpcap处理数据报文的大部分时间用于系统调用、中断、PCI总线带宽以及内存 拷贝上。其中内存拷贝是Libpcap处理数据报文中占用处理时间最长的过程。通常一个数 据报文被用户空间应用程序处理至少需要两次内存拷贝,一次是从网卡缓冲区拷贝到系统 内核缓冲区,另一次是从内核缓冲区拷贝到用户层。可见,频繁的数据拷贝、内核中断处理 和系统调用,会使CPU的占用率极高,造成效率低下,丢包率上升。综上所述,如何减少丢包 率和降低CPU占用率是高性能数据报文捕获系统需要解决的主要问题。
【发明内容】
[0011]本发明的目的在于提出一种基于Linux的高性能数据报文捕获方法和装置,能够 在千兆和万兆网络环境下进行高性能网络抓包,相对于传统捕获系统在千兆和万兆网络环 境下的网络抓包而言,减少了丢包率且降低了 CPU占用率。
[0012]为达此目的,本发明采用以下技术方案:
[0013]第一方面,提供一种基于Linux的高性能数据报文捕获方法,包括:
[0014]接收网卡接收到数据报文后发出的处理数据报文的触发信号,以中断方式通知数 据报文捕获程序处理所述触发信号;[0015]当网络流量大于等于预设阈值时,数据报文捕获程序屏蔽所述触发信号,以轮询 方式查看网卡是否接收到数据报文;若是,则同步网卡接收到的数据报文至内核内存并获 得数据报文存储首地址;
[0016]当网络流量小于预设阈值时,数据报文捕获程序响应所述触发信号,同步网卡接 收到的数据报文至内核内存并获得数据报文存储首地址;
[0017]将内核内存中的数据报文存储首地址通过内存映射函数_ap映射到用户虚拟地 址空间,以便用户层通过接口直接处理内核内存中的数据报文。
[0018]其中,所述基于Linux的高性能数据报文捕获方法,还包括:数据报文捕获程序设 置内核内存中数据报文的状态,设置完毕后发出可处理数据报文通知信号。
[0019]其中,所述基于Linux的高性能数据报文捕获方法,还包括:用户层接收可处理数 据报文通知信号,通过内存映射函数mmap直接处理内核内存中的数据报文;用户层处理内 核内存中的数据报文完毕后,发出处理完毕信号。
[0020]其中,所述基于Linux的高性能数据报文捕获方法,还包括:数据报文捕获程序接 收用户层发出的处理完毕信号,清空内核内存中对应的已处理数据报文。
[0021]其中,所述接收网卡接收到数据报文后发出的处理数据报文的触发信号之前,还 包括:通过调用函数使网卡进入阻塞状态以等待数据报文的到达;通过调用函数使用户层 进入阻塞状态以等待可处理数据报文通知信号的到达。
[0022]其中,所述数据报文捕获程序为Pfring或Netmap。
[0023]其中,所述接口为支持标准Socket通讯方式的通讯接口。
[0024]其中,所述同步网卡接收到的数据报文至内核内存具体为:
[0025]把网卡接收到的数据报文拷贝到内核内存的内核缓冲区和/或,
[0026]根据预设的网卡存放数据报文地址把数据报文直接存储于指定的内核内存中。
[0027]第二方面,提供一种基于Linux的高性能数据报文捕获装置,包括内核层和用户 层;
[0028]所述内核层用于接收网卡接收到数据报文后发出的处理数据报文的触发信号,以 中断方式通知数据报文捕获程序处理所述触发信号;当网络流量大于等于预设阈值时,数 据报文捕获程序屏蔽所述触发信号,以轮询方式查看网卡是否接收到数据报文,若是,则同 步网卡接收到的数据报文至内核内存并获得数据报文存储首地址;当网络流量小于预设阈 值时,数据报文捕获程序响应所述触发信号,同步网卡接收到的数据报文至内核内存并获 得数据报文存储首地址;将内核内存中的数据报文存储首地址通过内存映射函数_ap映 射到用户虚拟地址空间,以便用户层通过接口直接处理内核内存中的数据报文;
[0029]所述用户层用于通过内存映射函数mmap直接处理内核内存中的数据报文。
[0030]其中,所述接口为支持标准Socket通讯方式的通讯接口。
[0031]本发明的有益效果在于:一种基于Linux的高性能数据报文捕获方法和装置,包 括根据触发信号以中断方式通知数据报文捕获程序处理所述触发信号;当网络流量大于等 于预设阈值时,屏蔽触发信号,主动轮询网卡是否接收到数据报文;若是,则同步网卡的数 据报文至内核内存;当网络流量小于预设阈值时,响应触发信号,同步网卡的数据报文至 内核内存;获得内核内存中的数据报文存储首地址并通过内存映射函数_ap将数据报文 存储首地址映射到用户虚拟地址空间,以便用户层通过接口直接处理内核内存中的数据报文。采用半轮询方式减少内核中断处理,改变网卡传送数据报文的路径并通过内存映射函 数mmap减少数据报文的拷贝次数,在千兆和万兆环境下进行高性能网络抓包,减少丢包率 且降低CPU占用率。
【专利附图】
【附图说明】
[0032]图1是Libpcap接口使用的流程示意图;
[0033]图2是本发明具体实施例1提供的基于Linux的高性能数据报文捕获方法流程示 意图;
[0034]图3是本发明具体实施例2提供的基于Linux的高性能数据报文捕获方法流程示 意图;
[0035]图4是本发明具体实施例3提供的基于Linux的高性能数据报文捕获方法流程示 意图;
[0036]图5是本发明具体实施例3提供的基于Linux的高性能数据报文捕获方法设计原理图。
【具体实施方式】
[0037]下面将结合附图对本发明实施例的技术方案作进一步的详细描述,显然,所描述 的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领 域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的 范围。
[0038]如图2所示,为本发明具体实施例1提供的基于Linux的高性能数据报文捕获方 法流程示意图;本实施例方法以内核层为主体。
[0039]一种基于Linux的高性能数据报文捕获方法,包括如下步骤:
[0040]S101、接收网卡接收到数据报文后发出的处理数据报文的触发信号,以中断方式 通知数据报文捕获程序处理所述触发信号;
[0041]S102、当网络流量大于等于预设阈值时,数据报文捕获程序屏蔽所述触发信号,以 轮询方式查看网卡是否接收到数据报文;若是,则同步网卡接收到的数据报文至内核内存 并获得数据报文存储首地址;
[0042]鉴于高性能数据报文捕获特指千兆或者万兆环境下的网络抓包,则预设阈值为 千兆,千兆或者万兆环境的网络特点是流量大,数据包多,每秒能达到几百万甚至几千万级 别的数据包。
[0043]S103、当网络流量小于预设阈值时,数据报文捕获程序响应所述触发信号,同步网 卡接收到的数据报文至内核内存并获得数据报文存储首地址;
[0044]S104、将内核内存中的数据报文存储首地址通过内存映射函数mmap映射到用户 虚拟地址空间,以便用户层通过接口直接处理内核内存中的数据报文。
[0045]一种基于Linux的高性能数据报文捕获方法,采用半轮询方式减少内核中断处 理,改变网卡传送数据报文的路径并通过内存映射函数_ap减少数据报文的拷贝次数,在 千兆和万兆环境下进行高性能网络抓包,减少丢包率且降低CPU占用率。
[0046]如图3所示,为本发明具体实施例2提供的基于Linux的高性能数据报文捕获方法流程示意图;本实施例方法增加了设备初始化步骤。
[0047]一种基于Linux的高性能数据报文捕获方法,包括如下步骤:
[0048]S201、通过调用函数使网卡进入阻塞状态以等待数据报文的到达;通过调用函数 使用户层进入阻塞状态以等待可处理数据报文通知信号的到达。
[0049]通过调用poll函数返回当前是否可读写信息的状态,如果当前可读写,则返回读 写信息;如果当前不可读写,则阻塞进程,并等待驱动程序唤醒。
[0050]S202、接收网卡接收到数据报文后发出的处理数据报文的触发信号,以中断方式 通知数据报文捕获程序处理所述触发信号;
[0051]中断方式是指当网卡接收到数据报文时会发送一个信号通知Linux内核层来处 理网卡中的数据报文,内核层被通知处理数据,会暂停正在处理中的其它事情,转而通知相 应的数据报文捕获程序来处理这个信号。
[0052]S203、当网络流量大于等于预设阈值时,数据报文捕获程序屏蔽所述触发信号,以 轮询方式查看网卡是否接收到数据报文;若是,则同步网卡接收到的数据报文至内核内存 并获得数据报文存储首地址;
[0053]屏蔽所述触发信号是指当网卡发送信号给内核层时,内核层不再响应这个信号。
[0054]同步网卡接收到的数据报文至内核内存具体可分为“普通模式”和“DMA模式”, 普通模式是从网卡处把数据报文拷贝到内核内存的内核缓冲区,DMA (Direct Memory Access,直接内存访问模式)模式是预先设定网卡存放数据报文的地址位于指定的内核内 存,把数据报文直接存储于指定的内核内存中。“DMA模式”不需拷贝数据报文,又称为“零 拷贝模式”。本实施例两种模式都支持,以此改变网卡传送数据报文的路径。
[0055]“DMA模式”下,CPU只须向DMA控制器下达指令,让DMA控制器来处理数据的传送, 数据传送完毕再把信息反馈给CPU,这样就很大程度上减轻了 CPU资源占有率,可以大大节 省系统资源。
[0056]其中,所述同步网卡接收到的数据报文至内核内存具体为:
[0057]把网卡接收到的数据报文拷贝到内核内存的内核缓冲区和/或,
[0058]根据预设的网卡存放数据报文地址把数据报文直接存储于指定的内核内存中。
[0059]S204、当网络流量小于预设阈值时,数据报文捕获程序响应所述触发信号,同步网 卡接收到的数据报文至内核内存并获得数据报文存储首地址;
[0060]本实施例采用“半轮询”方式,即“中断”+ “主动轮询”,当网络流量大于等于预设 阈值时,在接收到第一个中断信号时,就立刻屏蔽不再处理这个信号,转而不断去主动轮询 查看网卡是否有数据报文,当网络流量小于预设阈值时,采用由内核响应网卡中断的方式 处理网卡里的数据。采用“半轮询”方式可以很好的限制中断的频率。
[0061]S205、将内核内存中的数据报文存储首地址通过内存映射函数mmap映射到用户 虚拟地址空间,以便用户层通过接口直接处理内核内存中的数据报文。
[0062]内存映射函数_ap提供了一种机制,让用户程序直接访问设备内存,这种机制, 减少了数据报文的拷贝次数,相较在用户空间和内核空间互相拷贝数据,效率更高。_ap映 射内存必须是页面大小的整数倍,面向流的设备不能进行mmap,mmap的实现和硬件有关。
[0063]S206、数据报文捕获程序设置内核内存中数据报文的状态,设置完毕后发出可处 理数据报文通知信号。[0064]同步网卡接收到的数据报文至内核内存之后,需要设置数据报文的状态,以便对 数据报文的处理状态进行归类。例如:收到数据报文,设置该数据报文为“可读状态”,已读 取完数据报文,设置该数据报文为“回收状态”,要发送数据报文,设置数据报文为“就绪状 态”,已发送完毕数据报文,设置数据报文为“可写状态”。
[0065]S207、用户层接收可处理数据报文通知信号,通过内存映射函数mmap直接处理内 核内存中的数据报文;用户层处理内核内存中的数据报文完毕后,发出处理完毕信号。
[0066]S208、数据报文捕获程序接收用户层发出的处理完毕信号,清空内核内存中对应 的已处理数据报文。
[0067]用户层处理完数据报文后,首先要通知内核层已处理完数据,然后用户层进入阻 塞状态等待下次可处理数据报文通知信号的到达。
[0068]数据报文捕获程序接收到此通知后立即清空内核内存缓冲区中对应的已处理数 据报文,让内存重新可用。当下次网卡接收到数据报文并通知数据报文捕获程序处理时,数 据报文捕获程序能把数据报文存放到内存缓冲区中。
[0069]其中,所述数据报文捕获程序为Pfring或Netmap。
[0070]Pfring和Netmap都是解决高性能网络抓包的开源项目,优选的,在千兆环境下使 用Pfring,在万兆环境下使用Netmap。
[0071]其中,所述接口为支持标准Socket通讯方式的通讯接口。
[0072]本实施例开发出一套与标准Socket相似的通讯接口,支持标准Socket通讯方式, 最大程度地减少应用程序使用本方法的移植难度。
[0073]如图4所示,为本发明具体实施例3提供的基于Linux的高性能数据报文捕获方 法流程示意图。本实施例方法体现了内核层和用户层之间的关系。
[0074]一种基于Linux的高性能数据报文捕获方法,包括如下步骤:
[0075]S301、用户层需要接收数据报文,调用接口进入阻塞,等待被唤醒;
[0076]用户层初始化设备状态,调用poll接口进入阻塞,等待被唤醒。用户层初始化设 备状态包括加载Pfring或者Netmap的内核模块;加载Pfring或者Netmap对应的网卡驱 动;使用接口打开设备,激活网卡的DMA工作模式。
[0077]S302、网卡接收到数据报文,中断触发Prfing/Netmap处理;
[0078]网卡接收到数据报文后,用中断方式通知Pfring/Netmap来处理网卡的数据报 文。
[0079]S303、Prfing/Netmap屏蔽网卡中断,主动轮询处理网卡的数据报文;
[0080]Pfring/Netmap屏蔽网卡的中断,使用主动轮询方式控制网卡。
[0081]S304、Prfing/Netmap同步网卡的数据报文;
[0082]Pfring/Netmap设置好网卡拷贝到自身内核缓冲区的数据报文的各项状态信息。
[0083]S305、Prfing/Netmap设置完毕,通知用户层;
[0084]网卡的数据报文状态信息设置完毕后,通知用户层程序。
[0085]S306、用户层阻塞被唤醒,通过接口访问Prfing/Netmap内核缓冲区数据报文;
[0086]用户层程序被唤醒,通过read接口读取Pfring/Netmap内核缓冲区中的数据报 文。
[0087]S307、用户层处理完数据报文,通过接口通知Prfing/Netmap ;[0088]用户层程序处理数据报文完毕,通过接口通知Pfring/Netmap并调用poll接口重 新进入阻塞。
[0089]S308、Prfing/Netmap收到用户层处理完毕的消息,设置缓冲区状态。
[0090]Pfring/Netmap收到用户层处理完毕的消息,设置缓冲区状态,使网卡可以重新使 用该缓冲区。
[0091]本实施例使用Pfring和Netmap数据报文捕获程序,结合在千兆和万兆网络环 境下进行高性能网络抓包并开发出一套与标准Socket相似的通讯接口工作于Pfring/ Netmap与用户程序之间。
[0092]如图5所示,为本发明具体实施例3提供的基于Linux的高性能数据报文捕获方 法设计原理图。Pfring/Netmap主动控制网卡中断,数据报文从网卡直接拷贝到Pfring或 者Netmap的缓冲区,由内存映射函数_ap直接提供给用户层使用,用户层的应用程序通过 本方法提供的接口获取数据报文。
[0093]使用本实施例按照以下流程:
[0094]1、加载Pfring或者Netmap的内核模块
[0095]2、加载Pfring或者Netmap对应的网卡驱动
[0096]3、使用提供的接口开发程序获取和发送数据报文
[0097]一般网卡层,内核层的程序不具备可移植性或者通用性,本方法正是屏蔽这些平 台差异、接口差异和工作模式差异,为用户层程序提供统一的接口。
[0098]一种基于Linux的高性能数据报文捕获装置,包括内核层和用户层;
[0099]所述内核层用于接收网卡接收到数据报文后发出的处理数据报文的触发信号,以 中断方式通知数据报文捕获程序处理所述触发信号;当网络流量大于等于预设阈值时,数 据报文捕获程序屏蔽所述触发信号,以轮询方式查看网卡是否接收到数据报文,若是,则同 步网卡接收到的数据报文至内核内存并获得数据报文存储首地址;当网络流量小于预设阈 值时,数据报文捕获程序响应所述触发信号,同步网卡接收到的数据报文至内核内存并获 得数据报文存储首地址;将内核内存中的数据报文存储首地址通过内存映射函数_ap映 射到用户虚拟地址空间,以便用户层通过接口直接处理内核内存中的数据报文;
[0100]所述用户层用于通过内存映射函数mmap直接处理内核内存中的数据报文。
[0101]其中,所述接口为支持标准Socket通讯方式的通讯接口。
[0102]其中,所述内核层还用于加载数据报文捕获程序的内核和加载数据报文捕获程序 对应的网卡驱动。
[0103]一种基于Linux的高性能数据报文捕获装置,能够使程序在万兆环境下工作的 CPU占用率,甚至比传统捕获系统在千兆环境下的CPU占用率要低,极大的提高了数据报文 捕获率,极大的减少了 CPU占用率;以本方法接口开发程序,降低了移植程序的难度。
[0104]以上内容仅为本发明的较佳实施例,对于本领域的普通技术人员,依据本发明的 思想,在【具体实施方式】及应用范围上均会有改变之处,本说明书内容不应理解为对本发明 的限制。
【权利要求】
1.一种基于Linux的高性能数据报文捕获方法,其特征在于,包括:接收网卡接收到数据报文后发出的处理数据报文的触发信号,以中断方式通知数据报文捕获程序处理所述触发信号;当网络流量大于等于预设阈值时,数据报文捕获程序屏蔽所述触发信号,以轮询方式查看网卡是否接收到数据报文;若是,则同步网卡接收到的数据报文至内核内存并获得数据报文存储首地址;当网络流量小于预设阈值时,数据报文捕获程序响应所述触发信号,同步网卡接收到的数据报文至内核内存并获得数据报文存储首地址;将内核内存中的数据报文存储首地址通过内存映射函数mmap映射到用户虚拟地址空间,以便用户层通过接口直接处理内核内存中的数据报文。
2.根据权利要求1所述的基于Linux的高性能数据报文捕获方法,其特征在于,还包括:数据报文捕获程序设置内核内存中数据报文的状态,设置完毕后发出可处理数据报文通知信号。
3.根据权利要求2所述的基于Linux的高性能数据报文捕获方法,其特征在于,还包括:用户层接收可处理数据报文通知信号,通过内存映射函数mmap直接处理内核内存中的数据报文;用户层处理内核内存中的数据报文完毕后,发出处理完毕信号。
4.根据权利要求3所述的基于Linux的高性能数据报文捕获方法,其特征在于,还包`括:数据报文捕获程序接收用户层发出的处理完毕信号,清空内核内存中对应的已处理数据报文。
5.根据权利要求1所述的基于Linux的高性能数据报文捕获方法,其特征在于,所述接收网卡接收到数据报文后发出的处理数据报文的触发信号之前,还包括:通过调用函数使网卡进入阻塞状态以等待数据报文的到达;通过调用函数使用户层进入阻塞状态以等待可处理数据报文通知信号的到达。
6.根据权利要求1所述的基于Linux的高性能数据报文捕获方法,其特征在于,所述数据报文捕获程序为Pfring或Netmap。
7.根据权利要求1所述的基于Linux的高性能数据报文捕获方法,其特征在于,所述接口为支持标准Socket通讯方式的通讯接口。
8.根据权利要求1所述的基于Linux的高性能数据报文捕获方法,其特征在于,所述同步网卡接收到的数据报文至内核内存具体为:把网卡接收到的数据报文拷贝到内核内存的内核缓冲区和/或,根据预设的网卡存放数据报文地址把数据报文直接存储于指定的内核内存中。
9.一种基于Linux的高性能数据报文捕获装置,其特征在于,包括内核层和用户层; 所述内核层用于接收网卡接收到数据报文后发出的处理数据报文的触发信号,以中断方式通知数据报文捕获程序处理所述触发信号;当网络流量大于等于预设阈值时,数据报文捕获程序屏蔽所述触发信号,以轮询方式查看网卡是否接收到数据报文,若是,则同步网卡接收到的数据报文至内核内存并获得数据报文存储首地址;当网络流量小于预设阈值时,数据报文捕获程序响应所述触发信号,同步网卡接收到的数据报文至内核内存并获得数据报文存储首地址;将内核内存中的数据报文存储首地址通过内存映射函数_ap映射到用户虚拟地址空间,以便用户层通过接口直接处理内核内存中的数据报文;所述用户层用于通过内存映射函数mmap直接处理内核内存中的数据报文。
10.根据权利要求9所述的基于Linux的高性能数据报文捕获装置,其特征在于,所述接口为支持标准Socket通讯方式的通讯接 口。
【文档编号】H04L12/801GK103441941SQ201310352403
【公开日】2013年12月11日 申请日期:2013年8月13日 优先权日:2013年8月13日
【发明者】梁润强, 李坤祥, 刘杰, 闵宇 申请人:广东睿江科技有限公司