网络数据包读取方法、装置、设备及可读存储介质与流程

文档序号:21360960发布日期:2020-07-04 04:34阅读:179来源:国知局
网络数据包读取方法、装置、设备及可读存储介质与流程

本发明涉及数据包读取领域,尤其涉及一种网络数据包读取方法、装置、设备及可读存储介质。



背景技术:

防火墙在进行信息安全检测时,需要对网络数据包进行分析,这种分析的动作可以在内核也可以在应用层,但是,如果对网络数据包的分析在内核层处理,非常容易引发宕机的风险,可维护性及后续的扩展性都受到限制;如果对网络数据包的处理在应用层,虽然维护简单,但是数据在内核层与应用层间的拷贝动作,非常耗性能,使得数据的处理变慢,对用户直观感受,网络时延加大,体验变差。

上述内容仅用于辅助理解本发明的技术方案,并不代表承认上述内容是现有技术。



技术实现要素:

本发明的主要目的在于提供一种网络数据包读取方法、装置、设备及可读存储介质,旨在解决如何提高对网络数据包进行分析以及转发或拦截的效率的技术问题。

为实现上述目的,本发明提供一种网络数据包读取方法,所述网络数据包读取方法,包括:

基于第一映射关系,将预设缓冲区的物理内存空间映射为缓冲区进程地址空间;

基于所述缓冲区进程地址空间,读取所述预设缓冲区内存储的网络数据包相关的预设内容,以对所述预设内容进行分析后由内核层直接转发或拦截所述网络数据包。

可选地,所述预设内容为所述网络数据包中预设字段的内容,所述对所述预设内容进行分析,包括:

应用层直接对所述预设字段的内容进行分析,所述分析至少包括对所述预设字段的内容的合法性进行分析。

可选地,所述内核层在接收到网络数据包时将所述网络数据包的内核虚拟地址存储至所述预设缓冲区内,所述预设内容为所述网络数据包的内核虚拟地址,所述网络数据包读取方法,还包括:

基于第二映射关系,将所述内核虚拟地址转换为应用层可访问的进程虚拟地址,以基于所述进程虚拟地址直接访问所述网络数据包并进行分析。

可选地,所述缓冲区为环形缓冲区,所述环形缓冲区设置有写指针、读指针及发送指针;

所述内核层基于所述写指针将所述内核虚拟地址写入所述环形缓冲区;

所述应用层基于所述读指针读取所述环形缓冲区内的内核虚拟地址;

所述内核层基于所述发送指针直接发送所述发送指针指向的网络数据包。

可选地,所述内核层基于所述写指针将所述内核虚拟地址写入所述环形缓冲区的步骤,包括:

所述内核层获取所述网络数据包的内核虚拟地址;

将所述内核虚拟地址写入所述写指针指向的位置;

写入完成后更新所述写指针至所述环形缓冲区内下一可写位置。

可选地,所述应用层基于所述读指针读取所述环形缓冲区内的内核虚拟地址的步骤,包括:

所述应用层读取所述读指针指向的位置内容,以将所述内核虚拟地址通过第二映射关系转换为进程虚拟地址;

并在读取完成后更新所述读指针至所述环形缓冲区内下一可读位置,其中,所述下一可读位置包括所述写指针写入内核虚拟地址的位置。

可选地,所述内核层基于所述发送指针直接发送所述发送指针指向的网络数据包的步骤,包括;

所述内核层读取所述发送指针与所述读指针之间的所有内核虚拟地址;以及,

直接调用网卡驱动发送所读取的所有内核虚拟地址指向的网络数据包;

转发完成后,更新所述发送指针至所述环形缓冲区内下一可发送位置,其中,所述下一可发送位置包括所述读指针已读取完环形缓冲区内容的位置。

可选地,所述基于第二映射关系,将所述内核虚拟地址转换为应用层可访问的进程虚拟地址的步骤,包括:

通过所述第二映射关系,将内核物理内存空间映射为应用层可访问的所述内核物理内存空间对应的进程地址空间;

基于所述内核虚拟地址及所述应用层可访问的所述内核物理内存空间对应的进程地址空间,得到应用层可访问的所述网络数据包对应的进程虚拟地址。

可选地,所述基于所述内核虚拟地址及所述应用层可访问的所述内核物理内存空间对应的进程地址空间,得到应用层可访问的所述网络数据包对应的进程虚拟地址的步骤,包括:

基于内核虚拟地址及内核物理地址之间的线性关系,将所述内核虚拟地址转换为内核物理地址;

基于所述应用层可访问的所述内核物理内存空间对应的进程地址空间及内核物理地址之间的线性关系,将所述内核物理地址转换为所述应用层可访问的进程虚拟地址。

本发明还提供一种网络数据包读取装置,所述网络数据包读取装置包括:

映射模块,用于基于第一映射关系,将预设缓冲区的物理内存空间映射为缓冲区进程地址空间;

读取模块,用于基于所述缓冲区进程地址空间,读取所述预设缓冲区内存储的网络数据包相关的预设内容,以对所述预设内容进行分析后由内核层直接转发或拦截所述网络数据包。

此外,为实现上述目的,本发明还提供一种网络数据包读取设备,所述网络数据包读取设备包括存储器、处理器和存储在所述存储器上并可在所述处理器上运行的网络数据包读取程序,所述网络数据包读取程序被所述处理器执行时实现如上所述的网络数据包读取方法的步骤。

此外,为实现上述目的,本发明还提供一种计算机存储介质,计算机存储介质上存储有网络数据包读取程序,网络数据包读取程序被处理器执行时实现上述的网络数据包读取方法的步骤。

本发明实施例提出的一种网络数据包读取方法、装置、设备及可读存储介质,通过基于第一映射关系,将预设缓冲区的物理内存空间映射为缓冲区进程地址空间;基于所述缓冲区进程地址空间,读取所述预设缓冲区内存储的网络数据包相关的预设内容,以对所述预设内容进行分析后由内核层直接转发或拦截所述网络数据包。具体地,通过将预设缓冲区的物理内存空间映射为缓冲区进程地址空间,之后通过该缓冲区进程地址空间读取预设缓冲区内存储的网络数据包相关的预设内容,并对该预设内容进行分析,以直接对网络数据包进行转发或拦截处理,避免了对网络数据包相关的预设内容进行分析时需要从内核层拷贝出来,并且在分析网络数据包相关的预设内容完成之后再拷贝回内核层的过程损耗。实现了提高对网络数据包进行分析以及转发或拦截的效率的目的。

附图说明

图1是本发明实施例方案涉及的硬件运行环境的装置结构示意图;

图2为本发明网络数据包读取方法第一实施例的流程示意图;

图3为本发明网络数据包读取方法第一实施例中环形缓冲区原理示意图;

图4为本发明网络数据包读取方法第一实施例和第二实施例原理示意图。

本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。

具体实施方式

应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

本发明实施例的主要解决方案是:基于第一映射关系,将预设缓冲区的物理内存空间映射为缓冲区进程地址空间;基于所述缓冲区进程地址空间,读取所述预设缓冲区内存储的网络数据包相关的预设内容,以对所述预设内容进行分析后由内核层直接转发或拦截所述网络数据包。实现了提高对网络数据包进行分析以及转发或拦截的效率的目的。

由于现有技术在分析网络数据包相关的内容时需要先将网络数据包相关的内容从内核层拷贝到进行分析的地方,在分析完成之后,还需要拷贝回内核层。

本发明提供一种解决方案,使得分析网络数据包相关的内容时可直接在内核层进行,提高了对网络数据包进行分析以及转发或拦截的效率。

本发明实施例设备为防火墙,如图1所示,该防火墙可以包括:处理器1001,例如cpu,网络接口1004,网卡1003,存储器1005,通信总线1002。其中,通信总线1002用于实现这些组件之间的连接通信。网卡1003可以包括有线网卡、无线网卡、虚拟网卡。网络接口1004可选的可以包括标准的有线接口、无线接口(如wi-fi接口)。存储器1005可以是高速ram存储器,也可以是稳定的存储器(non-volatilememory),例如磁盘存储器。存储器1005可选的还可以是独立于前述处理器1001的存储装置。

本领域技术人员可以理解,图1中示出的防火墙结构并不构成对防火墙的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。

如图1所示,作为一种计算机存储介质的存储器1005中可以包括操作系统、网络通信模块以及网络数据包读取方法。

在图1所示的终端中,网络接口1004主要用于连接客户端,与客户端进行数据通信;而处理器1001可以用于调用存储器1005中存储的网络数据包读取程序,并执行以下操作:

基于第一映射关系,将预设缓冲区的物理内存空间映射为缓冲区进程地址空间;

基于所述缓冲区进程地址空间,读取所述预设缓冲区内存储的网络数据包相关的预设内容,以对所述预设内容进行分析后由内核层直接转发或拦截所述网络数据包。

进一步地,所述预设内容为所述网络数据包中预设字段的内容,所述对所述预设内容进行分析,包括:

应用层直接对所述预设字段的内容进行分析,所述分析至少包括对所述预设字段的内容的合法性进行分析。

进一步地,处理器1001可以调用存储器1005中存储的网络数据包读取程序,还执行以下操作:

所述内核层在接收到网络数据包时将所述网络数据包的内核虚拟地址存储至所述预设缓冲区内,所述预设内容为所述网络数据包的内核虚拟地址,所述网络数据包读取方法,还包括:

基于第二映射关系,将所述内核虚拟地址转换为应用层可访问的进程虚拟地址,以基于所述进程虚拟地址直接访问所述网络数据包并进行分析。

进一步地,所述缓冲区为环形缓冲区,所述环形缓冲区设置有写指针、读指针及发送指针;

所述内核层基于所述写指针将所述内核虚拟地址写入所述环形缓冲区;

所述应用层基于所述读指针读取所述环形缓冲区内的内核虚拟地址;

所述内核层基于所述发送指针直接发送所述发送指针指向的网络数据包。

进一步地,所述内核层基于所述写指针将所述内核虚拟地址写入所述环形缓冲区的步骤,包括:

所述内核层获取所述网络数据包的内核虚拟地址;

将所述内核虚拟地址写入所述写指针指向的位置;

写入完成后更新所述写指针至所述环形缓冲区内下一可写位置。

进一步地,所述应用层基于所述读指针读取所述环形缓冲区内的内核虚拟地址的步骤,包括:

所述应用层读取所述读指针指向的位置内容,以将所述内核虚拟地址通过第二映射关系转换为进程虚拟地址;

并在读取完成后更新所述读指针至所述环形缓冲区内下一可读位置,其中,所述下一可读位置包括所述写指针写入内核虚拟地址的位置。

进一步地,所述内核层基于所述发送指针直接发送所述发送指针指向的网络数据包的步骤,包括;

所述内核层读取所述发送指针与所述读指针之间的所有内核虚拟地址;以及,

直接调用网卡驱动发送所读取的所有内核虚拟地址指向的网络数据包;

转发完成后,更新所述发送指针至所述环形缓冲区内下一可发送位置,其中,所述下一可发送位置包括所述读指针已读取完环形缓冲区内容的位置。

进一步地,所述基于第二映射关系,将所述内核虚拟地址转换为应用层可访问的进程虚拟地址的步骤,包括:

通过所述第二映射关系,将内核物理内存空间映射为应用层可访问的所述内核物理内存空间对应的进程地址空间;

基于所述内核虚拟地址及所述应用层可访问的所述内核物理内存空间对应的进程地址空间,得到应用层可访问的所述网络数据包对应的进程虚拟地址。

进一步地,所述基于所述内核虚拟地址及所述应用层可访问的所述内核物理内存空间对应的进程地址空间,得到应用层可访问的所述网络数据包对应的进程虚拟地址的步骤,包括:

基于内核虚拟地址及内核物理地址之间的线性关系,将所述内核虚拟地址转换为内核物理地址;

基于所述应用层可访问的所述内核物理内存空间对应的进程地址空间及内核物理地址之间的线性关系,将所述内核物理地址转换为所述应用层可访问的进程虚拟地址。

参照图2,在本发明网络数据包读取方法第一实施例中,所述网络数据包读取方法包括:

步骤s10,基于第一映射关系,将预设缓冲区的物理内存空间映射为缓冲区进程地址空间;

传统读取数据的方法的实现过程是,首先,应用程序在访问某一块数据时,操作系统会先检查内核的缓冲区中是否存在该数据,若内核的缓冲区中存在该数据(最近访问过此数据),则操作系统直接将内核的缓冲区中该数据拷贝到应用程序的缓冲区中,之后再将用户的缓冲区的内容拷贝到相应的内核的缓冲区中,最后将内核的缓冲区的数据拷贝到网卡;若内核的缓冲区中不存在该数据,则操作系统需要先将磁盘上的数据拷贝到内核缓冲区,然后再将内核的缓冲区中的内容拷贝到应用程序的缓冲区,之后同样的将应用程序的缓冲区的内容拷贝到相应的内核的缓冲区中,最后将内核的缓冲区的数据拷贝到网卡。

而本发明则不需要这么多次的数据拷贝过程,如在内核的缓冲区中不存在应用程序访问的数据时,采用上述现有技术需要经过4次数据拷贝才能完成数据的转发,采用本发明则只需要将该数据从磁盘拷贝到内核的缓冲区,而不需要拷贝到应用程序的缓冲区,原因是,应用程序可直接获取内核的缓冲区中的数据实现内核的缓冲区数据与应用程序共享,使得应用程序处理数据的过程发生在内核层,相应的,也不需要再次将数据从应用程序的缓冲区拷贝到内核的缓冲区中,整个过程只需要经过2次数据拷贝即可完成数据的转发。

具体地,操作系统启动过程中,内核层会先分配一块物理内存空间作为预设缓冲区的物理内存空间,并根据第一映射关系,将该预设缓冲区的物理内存空间映射为缓冲区进程地址空间,给进程使用。其中,对于第一映射关系,应用程序可以把一段连续的物理内存映射到程序自己的地址空间,然后直接访问这段物理内存,比如:预设缓冲区的物理内存空间[pbase,pbase+size-1]经过映射后的缓冲区进程地址空间是[ubase,ubase+size-1],根据这个映射关系可以得出:

phys=uvirt-(ubase-pbase)。

其中,phys为预设缓冲区的物理内存空间对应的预设缓冲区的内核物理地址,uvirt为缓冲区进程地址空间对应的进程虚拟地址。

步骤s20,基于所述缓冲区进程地址空间,读取所述预设缓冲区内存储的网络数据包相关的预设内容,以对所述预设内容进行分析后由内核层直接转发或拦截所述网络数据包。

通过缓冲区进程地址空间,应用层直接读取存储在预设缓冲区内的网络数据包相关的预设内容,该预设内容为网络数据包中预设字段的内容时,应用层对该预设内容进行分析,该分析至少包括对预设字段的内容进行合法性分析,并由内核层根据合法性分析结果,对网络数据包进行转发或拦截。

具体地,内核层对合法的网络数据包进行转发,对不合法的网络数据包进行拦截。其中,预设字段的内容为从网络数据包中提取的特征内容,如url,预设字段的内容本质上是可以大致代表网络数据包是否具备合法性的内容;对预设字段的内容进行合法性分析的过程为:通过定义的规则来和预设字段的内容进行匹配,若匹配成功,则说明该网络数据包不合法。其中,定义的规则由正则表达式、字符串等进行描述,匹配成功可以是url中包含定义的规则中的字符串。

进一步地,所述内核层在接收到网络数据包时将所述网络数据包的内核虚拟地址存储至所述预设缓冲区内,所述预设内容为所述网络数据包的内核虚拟地址,所述网络数据包读取方法,还包括:

步骤s30,基于第二映射关系,将所述内核虚拟地址转换为应用层可访问的进程虚拟地址,以基于所述进程虚拟地址直接访问所述网络数据包并进行分析。

具体地,内核层在接收到网络数据包时将该网络数据包的内核虚拟地址存储至预设缓冲区内,上述预设内容还包括该网络数据包的内核虚拟地址,根据第二映射关系,将内核虚拟地址转换为应用层可访问的进程虚拟地址,之后通过进程虚拟地址直接访问该网络数据包并进行分析。其中,分析的过程为:通过定义的规则来和网络数据包内容进行匹配,若匹配成功,则说明该网络数据包不合法。其中,定义的规则由正则表达式、字符串等进行描述,匹配成功可以是网络数据包中的url存在定义的规则中的字符串。

进一步地,所述缓冲区为环形缓冲区,所述环形缓冲区设置有写指针、读指针及发送指针。

环形缓冲区,顾名思义,该缓冲区是一个环形的缓冲区,对于传统的队列缓冲区,在将某个指针位置的网络数据包读取完,指针进入下一个位置之后,该指针位置的数据会被清除并且该位置会处于空闲状态,后续的指针继续进入下一个位置,导致之前空闲状态的内存位置一直的得不到使用,造成内存浪费;而对于环形缓冲区来说,则不会出现上述问题,由于环形缓冲区是环形的,因此,在写指针从环形缓冲区的头写到尾之后,又能从最开始写入数据的位置开始写入,前提是该位置的数据已经被处理完毕并且被清除。

另外,环形缓冲区在使用前,必须将其读指针、写指针、发送指针进行初始化(当然,若操作系统所处终端存在多个cpu,则需要对每个cpu的环形缓冲区进行初始化),也就是读指针、写指针、发送指针的初始指向位置为同一位置。环形缓冲区初始化完毕之后,内核还需实现一个新的方法,以供应用初始化时调用该方法获取映射好的环形缓冲区进程地址空间。

此外,在操作系统启动完成之后,应用程序进行初始化,应用程序调用之前内核实现的新的方法,来获取环形缓冲区的进程虚拟地址。另外,内核在分配环形缓冲区内存时,分配的是空闲的以及大小合适的一块内存区域,并不关心具体的该内存区域内是否还有其他数据,而该环形缓冲区在使用时需要保证该内存区域是可用的,也就是需要保证该内存区域是没有其他数据的。所以,在应用程序将该内存区域的物理地址空间映射到应用程序的虚拟地址空间之后,需要通过修改读指针和写指针来清空环形缓冲区中的旧数据内容。

环形缓冲区工作原理,参照图3,200为环形缓冲区,201和202为发送指针s,s_cur为发送指针指向的位置,s_next为发送指针指向的下一个位置;203和204为读指针r,r_cur为读指针指向的位置,r_next为读指针指向的下一个位置;205和206为写指针w,w_cur为写指针指向的位置,w_next为写指针指向的下一个位置。具体地,网卡收到网络数据包后,内核把该网络数据包的内核虚拟地址写入w指针指向的位置(w_cur),并移动w到下一个位置(w_next),表示收到了一个包;应用程序作为第一个消费者,它从r指向的位置(r_cur)读取网络数据包进行处理,完毕后移动r到下一个位置(r_next),表示读取到一个网络数据包;发包驱动程序作为第二个消费者,专门把收到的网络数据包发送出去,它读取s指针指向的网络数据包位置(s_cur),将网络数据包从网卡发送出去后移动s到下一个位置(s_next)。其中,应用程序为能处理网络数据包的程序,发包驱动程序为能发送网络数据包的程序。

此外,环形缓冲区物理内存空间只要满足应用程序使用即可。

例,内核分配的环形缓冲区物理内存空间(物理地址:存储器每个字节对应一个唯一的存储器地址,地址从0开始线性增长。)为[100,200],在环形缓冲区初始化时,读指针、写指针、发送指针的初始指向位置为100,此后,网络数据包从100的位置开始写入,后续写入顺序往后推,直到环形缓冲区写满(写入指针追上发送指针),在发送指针往下一个位置移动之后,可以继续写入网络数据包。

具体地,在网卡接收到网络数据包后,内核层获取该网络数据包的内核虚拟地址,并将该网络数据包的内核虚拟地址写入到环形缓冲区中当前写指针指向的位置,写入完成后,更新写指针到下一位置,其中,下一位置为环形缓冲区中当前写指针所指位置顺序向下可写入数据的位置;应用层通过之前初始化时获取到的环形缓冲区的进程地址空间,直接定位到该环形缓冲区,并通过读指针获取到环形缓冲区中的网络数据包的内核虚拟地址,在读取完成后,更新读指针到下一位置,其中,下一位置为环形缓冲区中当前读指针所指位置顺序向下可读取数据的位置;内核层定时读取发送指针和读指针之间的所有内核虚拟地址,以及直接调用网卡驱动发送所有读取到的内核虚拟地址所指向的网络数据包,在转发完成后,更新写指针到下一可发送位置,其中,下一可发送位置为环形缓冲区中读指针已读取完环形缓冲区内容的位置,其中,定时可通过定时器实现。

在本实施例中,通过基于第一映射关系,将预设缓冲区的物理内存空间映射为缓冲区进程地址空间;基于所述缓冲区进程地址空间,读取所述预设缓冲区内存储的网络数据包相关的预设内容,以对所述预设内容进行分析后由内核层直接转发或拦截所述网络数据包。具体地,通过内核分配应用程序专用物理内存作为环形缓冲区使用区域,并将该环形缓冲区物理地址空间映射为进程虚拟地址空间给应用程序使用,当网络数据包的内核虚拟地址写入环形缓冲区后,应用程序可根据该进程虚拟地址空间定位到环形缓冲区中存储有网络数据包的内核虚拟地址的读指针位置,通过该读指针可直接获取网络数据包的内核虚拟地址以读取网络数据包,之后发包驱动程序定位到该环形缓冲区中存储有网络数据包的内核虚拟地址的发送指针位置,对网络数据包进行转发处理,避免了网络数据包从内核拷贝到应用,在该应用处理网络数据包完成之后再从应用拷贝回内核的过程损耗。实现了提高对网络数据包进行分析以及转发或拦截的效率的目的。

进一步地,基于上述第一实施例,在本发明第二实施例中,所述基于第二映射关系,将所述内核虚拟地址转换为应用层可访问的进程虚拟地址的步骤,包括:

步骤s40,通过所述第二映射关系,将内核物理内存空间映射为应用层可访问的所述内核物理内存空间对应的进程地址空间。

具体地,通过第二映射关系,将内核物理内存空间映射为应用层可访问的内核物理内存空间对应的进程地址空间。具体地,参照图4,将内核物理地址,也就是内核物理内存空间,通过第二映射关系映射到进程地址空间,得到应用程序只读访问的内核虚拟地址空间。其中,应用程序可只读访问的内核虚拟地址空间包括应用程序可读可写环形缓冲区内容。另外,将内核环形缓冲区映射为应用程序可读可写环形缓冲区内容,其实质上是将内核环形缓冲区的物理内存空间映射为内核环形缓冲区进程地址空间,其中,应用程序可读可写环形缓冲区内容为保存在内核环形缓冲区进程地址空间中的内容。其中,应用程序可读可写环形缓冲区内容为网络数据包的内核虚拟地址或网络数据包相关的预设字段的内容。另外,由于应用程序可只读访问的内核虚拟地址空间大于内核环形缓冲区进程地址空间,因此,通过第一映射关系访问内核环形缓冲区会比通过第二映射关系访问内核环形缓冲区的速度快。其中,对于第二映射关系,同样的,应用程序可以把一段连续的物理内存映射到程序自己的地址空间,然后直接访问这段物理内存,比如:内核物理内存空间[pbase,pbase+size-1]经过映射后的应用层可访问的内核物理内存空间对应的进程地址空间是[ubase,ubase+size-1],根据这个映射关系可以得出:

phys=uvirt-(ubase-pbase)。

其中,phys为内核物理内存空间对应的内核物理地址,uvirt为应用层可访问的内核物理内存空间对应的进程地址空间对应的进程虚拟地址。

步骤s50,基于所述内核虚拟地址及所述应用层可访问的所述内核物理内存空间对应的进程地址空间,得到应用层可访问的所述网络数据包对应的进程虚拟地址。

具体地,通过内核虚拟地址及应用层可访问的内核物理内存空间对应的进程地址空间,也就是应用程序可只读访问的内核虚拟地址空间,得到应用层可访问的网络数据包对应的进程虚拟地址。

具体地,参照图4,网卡在收到数据包(网络数据包)之后将该网络数据包存放在内核物理地址中,内核通过phy(内核物理地址)和virtual(内核虚拟地址)之间的线性关系以及该网络数据包的内核物理地址,得到该网络数据包的内核虚拟地址,并将该网络数据包的内核虚拟地址保存在内核环形缓冲区中。具体地,在读指针读取到环形缓冲区中的网络数据包的内核虚拟地址之后,通过上述phy(内核物理地址)和virtual(内核虚拟地址)之间的线性关系以及该网络数据包的内核虚拟地址,得到该网络数据包的内核物理地址,之后通过该内核物理地址和应用程序可只读访问的内核虚拟地址空间之间的线性关系,得到应用层可访问的网络数据包对应的进程虚拟地址,最后,应用层通过该网络数据包对应的进程虚拟地址直接读取该网络数据包;同样的,在发送指针读取到环形缓冲区中的网络数据包的内核虚拟地址之后,通过上述phy(内核物理地址)和virtual(内核虚拟地址)之间的线性关系以及该网络数据包的内核虚拟地址,得到该网络数据包的内核物理地址,之后通过该内核物理地址和应用程序可只读访问的内核虚拟地址空间之间的线性关系,得到应用层可访问的网络数据包对应的进程虚拟地址,最后,驱动程序通过该网络数据包对应的进程虚拟地址直接转发网络数据包。其中,驱动程序属于应用程序。其中,phy(内核物理地址)和virtual(内核虚拟地址)之间的线性关系可表示为:

phys=kvirt-page_offset;

其中phys表示内核物理地址,kvirt表示内核虚拟地址,page_offset是内核选项可配置的,一般情况下32位系统linux内核的page_offset=3g。

另外,根据phy(内核物理地址)和virtual(内核虚拟地址)之间的线性关系phys=kvirt-page_offset可知,只要知道内核虚拟地址,可以得到内核物理地址;由于linux操作系统内存保护机制,应用程序无法直接访问该内核物理地址,应用程序通过映射机制把内核物理地址映射为应用程序可访问的进程虚拟地址(应用层根据公式uvirt=phys+(ubase-pbase)把内核物理地址映射为进程虚拟地址),就能间接访问该应用程序可访问的进程虚拟地址。

具体地,参照图4,内核收到网络数据包,内核虚拟地址是skb_viraddr,根据phys=kvirt–page_offset,可知该网络数据包存储的内核物理地址skb_phyaddr=skb_viradd-page_offset,由于应用程序的进程虚拟地址和内核物理地址的映射关系是:phys=uvirt–(ubase–pbase),根据内核物理地址skb_phyaddr得出应用程序的进程虚拟地址是skb_useraddr,其中,skb_useraddr=skb_phyaddr+(ubase-pbase),最终应用程序根据skb_useraddr来访问网络数据包。

在本实施例中,通过第二映射关系,应用层可将内核虚拟地址直接转换为进程虚拟地址,以通过该进程虚拟地址直接访问网络数据包。实现了提高对网络数据包进行分析以及转发或拦截的效率的目的。

本发明还提供一种网络数据包读取装置,所述网络数据包读取装置包括:

映射模块,用于基于第一映射关系,将预设缓冲区的物理内存空间映射为缓冲区进程地址空间;

读取模块,用于基于所述缓冲区进程地址空间,读取所述预设缓冲区内存储的网络数据包相关的预设内容,以对所述预设内容进行分析后由内核层直接转发或拦截所述网络数据包。

本发明还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有网络数据包读取程序,所述网络数据包读取程序被处理器执行时实现上述网络数据包读取方法各实施例的步骤。

在本发明网络数据包读取装置、设备和计算机可读存储介质的实施例中,包含了上述网络数据包读取方法各实施例的全部技术特征,说明书拓展和解释内容与上述网络数据包读取方法各实施例基本相同,在此不做累述。

需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者系统不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者系统所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者系统中还存在另外的相同要素。

上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在如上所述的一个存储介质(如rom/ram、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本发明各个实施例所述的方法。

以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。

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