一种基于零拷贝技术的无线网络数据包捕获方法与流程

文档序号:15567224发布日期:2018-09-29 03:37阅读:1179来源:国知局

本发明具体涉及一种针对linux环境下基于零拷贝技术的无线网络数据包捕获方法,属于网络数据分析和信息安全技术领域。



背景技术:

随着无线局域网(wlan:wirelesslocalareanetwork)技术的发展,全球的无线局域网市场呈现着如火如荼的扩张态势,wlan的应用领域也扩展到军事和金融、交通等涉及国民经济的各行各业,人们越来越倾向于使用这种方便快捷的网络。但是,由于无线网络传输媒介固有的开放性,无线网络暴露出越来越多的安全问题,为了应对这些潜在的安全威胁,对无线网络数据进行捕获和分析就变得十分重要。

在无线数据包的捕获中,由于windows把802.11帧转为以太网的帧交给内核,windows通常需要特定网卡或软件才能捕获完整的802.11数据帧。而linux相比windows,可以使用常见的无线网卡捕获完整的802.11数据帧,因此在linux环境下,使用wireshark(现有的一种网络分析工具)捕获无线数据包具有更好的通用性。wireshark是世界上最重要和最广泛使用的网络协议分析器,可以对数百个协议进行深入的检查,并不断添加更多的协议。它拥有实时捕获和离线分析并且有强大的显示过滤器、读/写许多不同的捕获文件格式。对许多协议的解密支持。它用简洁的可视化图形界面清晰地将监听和分析的数据包的内容显示给使用者。而tshark作为wireshark的终端模式(命令行工具),更方便用在脚本中,也可以通过ssh连接用在远程计算机上,方便远程调用。tshark是一种高效的抓包分析软件,但是在高速网络流量的环境下,抓包过程中的高丢包率成为了难以解决的问题。高丢包率容易引发丢失重要信息的问题从而影响结果的准确度。

tshark的抓包技术还在不断成熟的过程中,当前最核心的问题是如何提高在实际环境下它的抓包率,这里的环境包括系统使用环境和系统应用环境。在实际应用中,各种环境因素对tshark的抓包率都有一定的影响,系统内核缓冲区的空间有限以及传输数据包时的流程复杂且内存拷贝次数多会严重影响抓包率,增加丢包率。

因此,在现在无线网络环境条件下,一种针对linux环境的基于零拷贝技术的数据包捕获方法至关重要。



技术实现要素:

本发明的目的在于克服现有技术中tshark在高速网络环境下的高丢包率问题,提出了一种基于零拷贝技术的无线网络数据包捕获方法,采用基于libpcap的双零拷贝技术方法,简化libpcap的抓包流程方法,能够有效降低丢包率。

为解决上述技术问题,本发明提供了一种基于零拷贝技术的无线网络数据包捕获方法,在linux系统中安装libpcap库来捕获无线网络数据包,其特征是,包括以下步骤;

步骤s1,在捕包时,采用零拷贝技术将数据包由网卡寄存器直接送入用户缓冲区;

步骤s2,在存储时,通过零拷贝技术将用户缓冲区内捕获的数据包直接存放到硬盘上。

进一步的,步骤s1,在接收数据包时,网卡驱动程序通过dma方式从网卡内部寄存器读取数据包,然后将接收到的数据封装成lwip协议的格式写到网卡接收缓冲区中;

通过把网卡内部寄存器指针映射到lwip内核内存空间,erxst为接收缓冲区起始地址,erxnd为接收缓冲区结束地址,etxst为发送缓冲区起始地址,etxnd为发送缓冲区结束地址,erdpt为mcu读缓冲器指针,ewrpt为mcu写缓冲器指针,将erdpt映射到lwip协议缓存包中的数据指针,实现直接对网卡寄存器内的数据包进行存储操作。

进一步的,通过半轮询中断方式,读取数据包到用户缓冲区。

进一步的,在捕获数据包的时候,通过tshark工具包中-s参数设置抓取数据包的长度。

进一步的,对linux内核socket参数更改so_rcvbuf参数,以增加libpcap缓冲区长度。

进一步的,将数据包拷贝到用户缓冲区和硬盘上时,多组数据包一起拷贝。

进一步的,调用开发包packet32中的packetreceivepacket()函数实现多组数据包拷贝。

与现有技术相比,本发明所达到的有益效果是:本发明使用双零拷贝技术和半轮询方法对抓包过程进行优化,减少了数据拷贝次数,降低了系统资源的消耗,有效提高了系统利用效率,提高抓包性能。本发明针对linux系统的内核利用情况,通过协议栈和开发包优化系统,有效地提高了系统使用效率。本发明方法简单易行,大大增强了抓包软件应对实际应用环境的能力,对网络行为监控有着很重要作用。

附图说明

图1为本发明数据包捕获方法的流程图;

图2为传统拷贝方式和零拷贝方式的对比;

图3为网卡内部寄存器指针映射;

图4为libpcap传统抓包流程;

图5为本发明实施例中抓包流程改进前后的效率对比。

具体实施方式

下面结合附图对本发明作进一步描述。以下实施例仅用于更加清楚地说明本发明的技术方案,而不能以此来限制本发明的保护范围。

本发明包含的技术术语如下:

内核:是一个操作系统的核心,是基于硬件的第一层软件扩充,提供操作系统的最基本的功能,是操作系统工作的基础,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。

内核缓冲区:内核的一部分,为文件系统层提供了一个通用函数集(与具体文件系统无关)。这个缓存层通过将数据保留一段时间(或者随即预先读取数据以便在需要时就可用)优化了对物理设备的访问。

零拷贝技术:通过减少或消除关键通信路径影响速率的操作,减少数据拷贝和共享总线操作的次数,消除通信数据在存储器之间不必要的中间拷贝过程,有效地提高通信效率,是设计高速接口通道、实现高速服务器和路由器的关键技术之一。数据拷贝受制于传统的操作系统或通信协议,限制了通信性能。采用零拷贝技术,通过减少数据拷贝次数,简化协议处理的层次,在应用和网络间提供更快的数据通路,可以有效地降低通信延迟,增加网络吞吐率。

lwip:是瑞典计算机科学院(sics)的adamdunkels开发的用于嵌入式系统的开源tcp/ip协议栈。lwip的含义是轻量级的tcp/ip协议,专注于减少资源消耗。

远程直接内存存取(rdma):它允许网络中的计算机在主存贮器里交换数据,而不用涉及任何一台计算机的处理器、高速缓冲存贮器或者操作系统。像本地直接内存存取(dma)一样,远程直接内存存取改进了吞吐量和性能,因为它释放了资源。远程直接内存存取同时也让一个更快的数据传输率变得容易。

半轮询方式:是一种中断和轮询方式的集成。在高负载时使用轮询,在轻负载时使用中断驱动。很好的解决了低负载时,轮询方式响应时间和处理器资源消耗的问题,高负载时,中断方式的接收活锁问题,同时利用了两种方式的特点。

回调函数:回调函数就是一个通过函数指针调用的函数。如果一个函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,这就是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

本发明的应用环境是linux下基于libpcap库来捕获无线网络数据包。现有技术中,libpcap传统抓包流程可见图4,libpcap函数库中采用循环截包函数pcap_loop()来捕获数据包,pcap_loop函数每抓一个数据包之后就调用callback函数pcap_callback()来处理,频繁调用会产生大量系统开销,影响系统性能。

本发明方法对其进行改进,利用双零拷贝技术即零拷贝捕包和零拷贝拷贝存储,以及采用半轮询中断方式,在linux环境下简化libpcap抓包的流程,尽可能减少系统调用次数。本发明的一种基于零拷贝技术的无线网络数据包捕获方法,如图1所示,包括以下步骤:

步骤s1,在捕包时,采用零拷贝技术将数据包由网卡寄存器直接送入用户缓冲区。

图2为传统捕包方式(左)和本发明改进后的捕包方式(右)的对比。传统捕包方式中,每一个数据包被捕获后都要向cpu发出中断处理数据包,由网卡->内核buffer->用户buffer进行多次拷贝。本发明采用零拷贝捕包技术,接收的数据包由网络接口直接将数据包送入用户缓冲区。

具体实现过程为:在网卡驱动程序接收数据包时,网卡驱动程序向网卡发送数据包传送指令,网卡把边界寄存器处的一个网卡格式的数据包数据一次性全部发送到dma端口,网卡驱动程序会在dma端口读取所有字节数据,自动将边界寄存器值调整为下一个数据包地址,以准备下一次读取所有字节数据。然后lwip协议栈将接收到的数据封装成lwip协议的格式并且写到网卡接收缓冲区中。

通过把网卡内部寄存器指针映射到lwip内核内存空间,如图3,erxst为接收缓冲区起始地址,erxnd为接收缓冲区结束地址,etxst为发送缓冲区起始地址,etxnd为发送缓冲区结束地址,erdpt为mcu读缓冲器指针,ewrpt为mcu写缓冲器指针,将erdpt映射到lwip协议缓存包中的数据指针,就可以直接对网卡寄存器内的数据包进行存储等操作,来避免物理网卡到lwip内核空间的数据拷贝。

通过半轮询中断方式,如图1中右侧的图,当第一个数据包到达内核层时,采用中断的方式告知系统,关闭对该设备的中断的响应。同时,激活一个软中断,按照轮询频率轮询队列中的数据报文,从中读取数据包到用户缓冲区。每次轮询时,如果网络设备接收队列中接收了p个或以上数据包(p值是设定值),就继续对后续数据包采用轮询机制处理;如果多轮轮询之后网络设备接收队列数据报文个数依旧少于p个,就开启中断方式来处理后续数据报文。

在捕获数据包的时候,可以设置抓取数据包的长度。在linux环境下,用户可通过tshark工具包中-s参数,根据网络速度控制抓取数据包的长度,范围是0~65536。例如,在百兆网络环境中,可以设置抓取数据包的前100个字节,命令行如下:

root@kami:~#tshark–s100

为了linux内核socket参数调优,增加libpcap缓冲区长度。对linux内核socket参数用sysctl命令更改so_rcvbuf参数,增加libpcap缓冲区长度,提升linux性能,实现优化。so_rcvbuf默认的值是由/proc/sys/net/core/rmem_default文件和最大值设置的,允许的值是由/proc/sys/net/core/rmem_max文件设置的,最小的值则为256bit。

步骤s2,在存储时,通过零拷贝技术将用户缓冲区内捕获的多组数据包直接存放到硬盘上。

在用户缓冲区中不再采用把数据包逐个提取出来送到callback回调函数的处理方式,而是把一组数据包直接存放到硬盘上,提高用户缓冲区处理数据包的效率,同时通过零拷贝技术减少多余报文的拷贝。

实施例

将本发明方法应用到具体实施例实现的具体流程参见图1,在linux系统下安装libpcap库来捕获无线网络数据包,先完成网卡寄存器指针映射,然后调用开发包packet32中的packetsetmintocopy()函数和packetsetbuff()函数设置合适的接收内核缓冲区的大小和内核缓冲区中激发本事件的最小数据大小。在调用packetreceivepacket()函数,根据网卡的工作模式,可以从系统内核页缓冲区拷贝一组数据包而不是逐个的到用户缓冲区中,然后将这组数据包不作任何处理就存放到硬盘上,通过循环直到用户按键终止抓包过程。

为了验证方法的有效性,使用发包器进行测试,软件平台为kali,ip数据包长度选取了512byte,背景流量分别取30.23mbps、71.24mbps和89.56mbps,改进前后的抓包情况对比如图5,可看到本发明方法有效提高了网络数据包的捕获率。

以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变型,这些改进和变型也应视为本发明的保护范围。

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