具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
介绍本发明技术方案之前,先介绍一下各类操作系统的数据链路层报文访问接口和开发库,如下:
各种网络操作系统均提供了报文捕获机制,技术原理基本相同,均为在内核态从网卡上获取数据报文然后传送到用户态应用程序,访问接口根据具体实现技术的不同而略有差别,例如:类Unix系统中主要提供了三种常见的数据链路层报文访问接口,分别是BSD中的BPF(Berkeley Packet Filter),SVR4中的DLPI(Data Link Provider Interface)和Linux中的SOCKET_PACKET。在Windows中数据链路层报文访问接口需要编写VxD程序或网卡设备驱动程序实现。在不同操作系统提供的这些不同接口之上,有一套Libpcap开发库(其windows版本为winpcap),为报文捕获应用程序提供了一套平台无关的统一编程接口。
图2为本发明所述报文捕获方法实施例的流程图,如图所示,该方法包括如下步骤:
步骤110,网络硬件接收报文。
具体地,在所述网络硬件接收报文之前,可以根据用户态中的报文捕获程序的数量,在内核态中设置相应数量的捕获通道。其中,所述报文捕获程序是用户态中用于对接收到的报文执行报文捕获的程序。为了提高报文捕获的效率,在用户态中同时设置有多个可并行执行的报文捕获程序。相应地,在内核态中设置相应数量的捕获通道,每个捕获通道具有唯一的通道编号。其中,网络硬件可以为物理网卡。
步骤120,根据从网络硬件接收到的报文的地址信息确定该报文在内核态中所属的捕获通道。
具体地,可以根据所述报文的源IP地址和目的IP地址进行哈希运算得到通道编号,将内核态中具有相应通道编号的捕获通道选定为该报文所属的捕获通道。具体的运算过程将在后续内容进行说明。
步骤130,将所述报文经相应的捕获通道从内核态发送到用户态,由该用户态中与所述捕获通道对应的报文捕获程序对所述报文进行报文捕获。
以下具体说明上述步骤120中所述的哈希运算的具体过程,如图3所示,包括:
步骤121,将所述源IP地址与所述目的IP地址进行异或运算得到异或结果值。
步骤122,将所述异或结果值与所述内核态中设置的捕获通道的数量进行取模运算得到余数值,作为所述通道编号。
通过使用源IP地址和目的IP哈希取模的分流算法,可以确保每条会话的全部报文都能正确分流到同一个捕获通道上,其实,只要是能够保证数据流能够均衡分流到各个捕获通道的算法都是可行的,例如:采用五元组、IP优先级、TOS、DSCP、IP协议类型等信息,实现分流,这里只是以源IP地址和目的IP进行哈希计算实现分流为例。
如图4所示,本实施例所述方法采用内核分流方式实现了与网卡数量无关的并行报文捕获,图中的内核模块根据系统平台的不同而不同,例如:BSD系统中为BPF(Berkeley Packet Filter),SVR4系统中为DLPI(Data LinkProvider Interface),Linux系统中为SOCKET_PACKET,Windows系统中为访问数据链路层信息的VxD程序(虚拟设备驱动程序)或网卡设备驱动程序。另外,对于Windows系统,图中的数据包捕获函数库需要替换为winpcap。
通过本实施例的技术方案,既不需要外部分流设备支持,也不需要在进程间传递大量数据,而且能很好地兼容现有的各种并行捕获模型。具体地,可以达到如下技术效果:
1、根据从网络硬件接收到的报文的地址信息确定该报文在内核态中所属的捕获通道,实现了捕获报文的内核态分流,无重复报文拷贝;
只有符合分流策略的报文才会进入指定捕获通道,从内核态到用户态之间无重复报文拷贝;由于每个捕获进程均可获得会话的完整报文,无需做进程间报文拷贝;
2、由于整个分流是在内核态下完成的,所以无需要外部分流设备支持;
物理网卡等网络适配器获得的流量在系统内的内核态进行分流处理,因此无需在前端另行架设分流设备;
3、由于内核模块完成分流,因此捕获通道不受网卡数的限制,可支持大通道数的并行捕获;
对于每个物理网卡上获取的流量,可以分成多份进行并行拷贝,可充分发挥多核处理优势;其中具体的份数可以等于每个物理网卡所允许的最大逻辑网卡数量;
4、支持多进程及多线程编程模型,完美兼容现有各种基于报文捕获的应用;
报文捕获程序可以为多进程也可以为多线程。由于用户态中对应用层数据处理的复杂性,现有技术中与应用相关代码并不支持多线程调用,而本实施例所述方法对多进程并行捕获的支持可以满足这种应用场景的需求,从而可以极大地提高遗留代码的重用率;
图5为本发明所述内核模块实施例的结构示意图,如图所示,该内核模块10至少包括确定单元11和发送单元12,其工作原理如下:
网络硬件接收到报文后,该内核模块10中的确定单元11根据从网络硬件接收到的报文的地址信息确定该报文在内核态中所属的捕获通道。具体地,如图5所示,该内核模块10中还可以进一步包括设置单元13,用于根据用户态中的报文捕获程序的数量,在内核态中设置相应数量的捕获通道,然后由确定单元11根据从网络硬件接收到的报文的地址信息确定该报文在设置单元13在内核态中设置的捕获通道中所属的捕获通道。其中,所述报文捕获程序是用户态中用于对接收到的报文执行报文捕获的程序。
此后,由发送单元12将所述报文经确定单元11所确定的相应的捕获通道从内核态发送到用户态,由该用户态中与所述捕获通道对应的报文捕获程序对所述报文进行报文捕获。
具体地,如图6所示,上述确定单元11可以包括运算单元1101和选定单元1102,当确定单元11根据从网络硬件接收到的报文的地址信息确定该报文在内核态中所属的捕获通道时,可以先由运算单元1101根据所述报文的源I P地址和目的IP地址进行哈希运算得到通道编号,具体地,如图7所示,可以由异或运算单元1101A将所述报文的源IP地址与所述目的IP地址进行异或运算得到异或结果值,并由取模运算单元1101B将异或运算单元得到的所述异或结果值与所述内核态中设置的捕获通道的数量进行取模运算得到余数值,作为所述通道编号。
然后,由选定单元1102将内核态中具有相应通道编号的捕获通道选定为该报文所属的捕获通道。通过使用源IP地址和目的IP哈希取模的分流算法,可以确保每条会话的全部报文都能正确分流到同一个捕获通道上。
本实施例所述内核模块10采用内核分流方式实现了与网卡数量无关的并行报文捕获,既不需要外部分流设备支持,也不需要在进程间传递大量数据,而且能很好地兼容现有的各种并行捕获模型。具体的技术效果描述可参见上述方法实施例的相关内容。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。