收藏 分销(赏)

基于Linux的一种快速数据包捕获方法论文.doc

上传人:仙人****88 文档编号:9234348 上传时间:2025-03-18 格式:DOC 页数:49 大小:821.50KB 下载积分:10 金币
下载 相关 举报
基于Linux的一种快速数据包捕获方法论文.doc_第1页
第1页 / 共49页
基于Linux的一种快速数据包捕获方法论文.doc_第2页
第2页 / 共49页


点击查看更多>>
资源描述
毕业设计(论文) 第 IV 页 基于Linux的一种快速数据包捕获方法 摘 要 随着网络规模的不断扩大,网络异构程度不断加深,计算机网络变得日益复杂,迫切需要对网络的流量进行实时、在线的监控和管理。网络流量监测分析可以获得详细的流量特征,如流量大小、协议分布、数据包大小分布等信息,从而指导网络运维、管理与规划设计。 网络流量监测分析必须解决的一个技术难点是如何实现高速链路的数据包捕获。采用专用硬件价格比较昂贵,且缺乏灵活性;传统的基于软件实现的捕包方法由于受到硬件性能和操作系统开销的影响,只适用于百兆及以下速率的低速链路中。除去硬件系统—CPU, PCI, Memory, Cache机制等本身固有的处理能力限制外,本文分析了传统基于软件的数据包捕获方法所存在的局限性,研究如何控制其实现过程中的开销,进而实现了一种基于Linux内核的高速链路数据包捕获方法,该方法在通用PC上实现,适应Gigabits级高速链路环境。实验表明,基于内核的捕包方法降低了系统调用和内存拷贝,提高了流量分析的能力,与libpcap捕包能力相比有明显的提高。 关键字:数据包捕获,libpcap,内存拷贝,系统调用,内核模块 An Efficient Packet Capture Method Based On Linux Abstract With the rapid development of network technologies, networks are becoming more and more complicated as the scale of networks are expanding, new applications are emerging, and the heterogeneity of networks is deepening. It is necessary to monitor networks traffic in real time and manage networks on-line. Through network traffic measurement, we can obtain the details of the traffic, such as link utilization, the distribution of the different protocols, the distribution of packet size, and so on. It will guide the maintenance and management of networks and facilitate the design of networks. There are many challenges in high-speed network traffic monitoring; one of the most important bottlenecks is packet capturing. But it is too expensive and lack of flexibility to use the special hardware. Because of hardware capability and operating system overhead limitations, the existing network traffic monitoring tools based on software can only perform well at low speed network with the link rate below 100Mbps.Except the limit of hardware system like CPU, PCI, Memory, Cache. This thesis analysis the limit of traditional methods of captured data packet. We also analysis the overhead of its process of Implementation and then Implement a methods which is based on common PC and linux kernel and suit for GE high-speed network. The method which makes use of the characters of kernel module, reduces the overhead of system calls and memory copy times. The experiments show that the method which makes use of the characters of kernel module can enhance the performance much than one traffic analysis tool based on Libpcap. Key Words: Packet Capture,libpcap,Memory Copy,system call,kernel module 目 录 1.绪论 1 1.1 研究背景 1 1.2 研究意义 2 1.3 研究现状 2 1.4 本文结构 3 2.网络流量监测概述 5 2.1 网络流量的基本概念 5 2.1.1 网络流量的基本定义 5 2.1.2数据包监测的定义 5 2.1.3中断活锁的概念 6 2.2 网络监听原理 6 2.2.1 以太网监听原理 6 2.2.2 网卡的四种工作模式 7 2.3 Linux操作系统数据包捕获方法 8 2.3.1 Linux系统接收数据包的过程 9 2.3.2 Linux系统中流量分析性能影响因素 10 3.基于内核捕包方案的分析 12 3.1 常规的数据包捕获方案 12 3.1.1 Libpcap 12 3.1.2 Libpcap的传统捕获机制影响 12 3.1.3 Libpcap捕包方法的不足 13 3.2存在的性能提升空间 14 3.3 基于内核捕包方案原理 15 3.3.1 Linux内核的数据包处理 15 3.3.2 基于Linux内核的捕包方案原理 16 3.4基于内核捕包方案性能分析 17 4.基于内核捕包方案的设计与实现 19 4.1设计概述 19 4.2 实现方案 20 4.2.1 实现的环境 20 4.2.2 方案的实现 20 4.3实现结果 24 5.实验结果分析 27 5.1 实验环境 27 5.1.1 libnet简介 27 5.1.2实验室环境配置 28 5.2数据包捕获能力测试 29 5.3数据包深度分析能力测试 30 5.4 结论 31 6.总结与展望 33 致谢 34 参考文献 35 附录A 主要源程序 36 毕业设计(论文) 第 45 页 1.绪论 1.1 研究背景 在网络规模日益庞大的今天,网络链路速率迅速增长,已经开始从Mbit/s迈向Gbit/s,不久的将来可能还会发展至40Gbit/s甚至Tbit/s。千兆网卡和千兆交换机已经相当的便宜,几乎每个新的局域网用户都会采用此项技术,一个普通的家庭用户所能够获得的带宽比两年前一个公司获得的带宽还要大[1]。 随着网络技术的不断发展,人们对网络的依赖程度越来越大,Internet已经逐渐成为社会生活的基础设施。网络技术的发展也同时带动了高效网络服务需求,如实时语音以及多媒体通信、网上交易、网上银行等等。但是网络在带给人们便捷的同时,电子犯罪、计算机病毒和黑客入侵等网络安全事件层出不穷,严重的影响人们正常的生活秩序,甚至危害到国家的安全。人们也逐渐认识到对网络行为的深入理解是保障网络健康运行的决定性因素之一,是网络容量规划、流量工程、故障诊断、性能提升的科学决策依据,是保障网络高可靠、低延迟/丢包、降低操作复杂性的基础。网络监测作为时下流行的一种方法和手段是获得网络行为特征的重要手段之一报文捕获和分析技术作为网络管理和网络安全中使用的基本技术正得到广泛的应用。入侵检测系统、防火墙、流量统计以及网络计费等网络管理系统都是基于网络数据包捕获的方式实现的。数据包捕获和分析是网络管理中使用的基本技术,可用于网络测试(如校验网络设置)、重构端到端的会话(如监视网络连接的安全工具)及监测网络负载等。通过对捕获的数据包进行分析,可以实时了解网络的使用状况(如响应时间、丢包率、某一时刻的网路负载及平均负载),发现网络运行瓶颈以及分析网络数据包中携带的非法内容。对网管人员来说,通过对网络流量的测量与预测,可以制定网络拥塞控制策略。这样就可以降低因网络拥塞带来的信息丢失和延迟,充分利用网络资源,提高服务质量。 近几年,有很多研究人员和硬件生产厂商试图通过专用硬件实现被动流量监测和分析,如DAG[2]。虽然目前这种硬件平台的捕包性能很高,但是价格比较昂贵,且系统缺乏足够的灵活性。通用平台上大多数的捕包方法是基于libpcap[3]的,但是系统调用,内存拷贝成为它性能提高的瓶颈,已经不能满足高速链路的要求。因此为了满足当今高速链路的要求,需要用一种新的方法进行数据包的捕获,提高流量分析的性能。 1.2 研究意义 随着网络流量的不断增长,对网络流量分析提出了新的挑战。在高速网络链路环境中,设计高效率的流量监测分析系统的一个关键点就在于如何线速捕获和分析所有的网络数据包。 传统的数据包捕获方案,不仅要为数据包动态的分配和释放缓存,更重要的是需要将数据包从操作系统的内核空间拷贝到用户空间,这些操作将产生大量的系统调用开销,耗费CPU资源,因此基于此种架构实现的流量监测分析系统很难适用于高速网络链路环境的监测需求。 基于内核的数据包捕获方法在网卡驱动收到数据包会直接把数据包存储在结构为SKBuffer的链表中,然后直接在内核处理SKbuffer中的数据包。因此基于内核的方法只需要一次拷贝(从网卡到内核空间),并且由于不需要把数据包送入用户空间,系统调用的开销大大减少。除了网卡发起的硬件中断外,基于内核的方法大大降低了其他几个相关部分(如内存访问、系统调用)的开销。 所以基于内核的捕包方案基本上能够解决传统的基于libpcap捕包方法带来的问题,满足了在高速链路下数据包捕获的要求,并且提高了数据包深度分析的能力,为网络流量测量和预测提供了有力的支持。 1.3 研究现状 近几年来,伴随着互联网上层出不穷的应用和服务,网络技术高速发展,网络监测需求也不断多样化,作为主流监测技术的被动网络流量监测分析越来越受到国内外研究机构和组织的普遍关注。被动流量监测是网络流量监测的一种重要方法,该方法通过观察经过监测点上的所有数据包,解码进行协议分析获得相关的流量统计信息。由于其被动的特征所以不需要向网络中注入流量,从而不会对网络造成负面的影响,在低速率低带宽的网络环境下其表现优越。但是近年来由于网络速率的不断提高,网络带宽的增加以及高带宽需求的实时业务的出现,使得被动测量技术面临高带宽、大规模、实时分析以及提供符合各种粒度需求的指标的挑战,基于数据包级的被动流量监测呈现出了诸多的问题。网络应用的普及与网络技术的发展导致网络流量也日益庞大,在面对高速链路时流量监测和分析技术所依赖的传统数据包捕获方法开始受到诸多条件的限制,如PCI(Periphery Component Interconnect)总线吞吐量、存储容量、内存访问速度、磁盘阵列访问速率、内存拷贝开销、系统调用开销、中断开销以及操作系统中的任务调度机制等都对数据包在高速链路条件下的捕获产生影响。 一般的,在普通PC上基于Linux实现的数据包分析相关的工具如tcpdump[4], ethereal[5],sniffer,snort[6]等的实现大多是在用户空间利用LIBPCAP[3]等函数库提供的函数方法,经系统调用通过SOCKET(RAW SOCKET)接口从内核空间将NIC获得数据包拷贝然后从内核空间拷贝到用户空间来,然后再在用户空间做进一步的分析处理。在高速链路(Gigabits)链路环境下,常规方法数据包捕获性能的表现不尽如人意,不能适应高速链路的要求。 目前,为了克服操作系统、PCI总线带宽和系统资源所带来的性能限制,一些研究人员和硬件生产厂商已经开始进行了一番探索。首先进行的一种尝试是采用网络处理器NP[7] (Network Processor)的系统架构替代通用硬件平台来实现数据包捕获、完成流量监测和分析功能,通常采用网络处理器的方法价格非常昂贵,且开发和升级周期较长,大量部署不太现实;第二种尝试方案是试图通过专用硬件来实现数据包捕获进而完成被动流量监测分析,如OC3MON及DAG[2],然而这种实现方式价格比较昂贵,且系统缺乏足够的灵活性,很难跟上当今瞬息万变的网络发展现状与具体的流量监测分析需求。 1.4 本文结构 高速链路环境下的流量监测分析逐渐成为一个热门的研究领域。因此,可在通用硬件平台上实现、能够达到更高性能、可满足高速网络链路监测需求的数据包捕获方法在流量监测分析领域中具有极其重要的应用价值。 本文所实现的高速链路数据包捕获方法目前已经应用到下一代互联网网络监控管理系统项目中并且取得良好效果。本文结构如下: 第2章阐述了什么是网络流量和数据包监测以及数据包监测的意义。网络流量监测的实现前提是网卡模式的设置,说明网络监听的原理并阐述了以太网能够监听的原因。另外还阐述了Linux操作系统捕获数据包的方法以及流量分析性能的影响。 第3章介绍基于内核捕获数据包方案的分析。为了能更好的说明基于内核捕获数据包方案的优越性分析了普通基于libpcap捕包方案的原理以及不足,并且对基于内核捕获数据包方案的性能进行了分析。 第4章对所完成该方案的大体设计框架作了简单的介绍,对于程序所实现的功能模块作了详细的分析和解释。 第5章根据实验结果对基于内核捕获数据包方案的进行性能评价。 第6章设计总结和对今后工作的展望。 2.网络流量监测概述 数据包的捕获的目的是为了网络监测和管理,而且在网络中,数据包的捕获本身就是一种监测。本章,首先针对于相关于数据包的监测的一些概念理论作了阐述,然后对Linux操作系统数据包捕获方法以及性能影响做了阐述。 2.1 网络流量的基本概念 2.1.1 网络流量的基本定义 网络流量简而言之就是网络上传输的数据量,是衡量网络运行负荷和状态的重要参数。进行网络流量管理和控制是保证网络高效运行、合理地分配网络资源、避免拥塞和拥塞恢复的有效方法。分组交换网络中的流量管理功能分别位于OSI模型的几个相关层次中,目的各不相同。数据链路层中的流量管理表现为“流量控制”功能;网络层的流量管理表现为“拥塞控制”的功能;传输层流量管理采用“窗口控制”的方法,不同之处在于控制的是联网主机之间的传输流量,避免网络拥塞也是其目的之一。 2.1.2数据包监测的定义 数据包监测可以被认为是一根窃听电话线在计算机网络中的等价物。当某人在“监听”网络时,他们实际上是在阅读和解释网络上传送的数据包。 如果你在互联网上,正通过其它计算机发送数据。发送一封电子邮件或请求下载一个网页都会使数据通过你和数据目的地之间的许多计算机。这些你传输信息时经过的计算机都能够看到你发送的数据。数据包监测工具可以在网上的任何一个位置实施,如局域网中的一台主机、网关上或远程网的调制解调器之间等,他允许某人截获数据并且查看它。 当然数据包监测可以是一个重要的管理工具,也可以成为一项邪恶的黑客技术。事实上,它两者皆是,一个好的数据包监测软件通常可以在网络管理和黑客技术工具包中同时找到。黑客可以用数据包监测软件监听互联网,并且追踪一些敏感数据的交换如登录对话和财经交易。网络管理员可以用数据包监测软件检测错误布线,网络运行状况,损坏的数据包和其它网络问题。 这里需要说明的是,进行流量监测的前提是捕获别人的包,也即我毕业设计的工作――数据包的捕获。 2.1.3中断活锁的概念 中断活锁[8]是指高速网络设备每秒钟接收到的数据包数目超过系统最大无丢包接收速率MLFRR(Max Loss-Free Receive Rate)时,随着接收速率的进一步增加导致IP处理线程根本没有机会从系统中取走数据包。在传统意义上中断是为一些低频率的I/O设备如键盘、磁盘等设计的,这些低速设备通常每秒钟产生几百个中断,在750Mbps背景流量,包长64Byte情况下,理论上千兆网卡每秒钟将会产生约1,116,000个硬件中断,因为中断的处理优先级较高,大量产生的中断将导致CPU持续响应中断服务请求、执行中断服务例程ISR(Interrupt Service Routine),CPU时钟将完全被网卡驱动程序的ISR垄断,从而无法正常处理CPU Backlog队列中缓存的数据包,同样也无法响应其他所有进程的调度请求。 2.2 网络监听原理 2.2.1 以太网监听原理 Ethernet(以太网)是一种适用于小型机及微型机的总线型局部网络系统。Ethernet在逻辑上一条总线和一群挂在总线上的节点组成,网络上所有节点(包括网络接口,控制器和主机)都通过收发器连接到公共总线上,总线是一条共享信道,通过它来实现不同节点之间的信息传输。 Ethernet协议的工作方式是将要发送的数据包发往连接在一起的所有主机,所以在报头中包括有应该接收数据包的主机的正确地址。一般情况下只有与数据包中目标地址一致的那台主机才能接收到信息包。但如果主机工作在监听模式下(网卡设置为混杂模式下),那么不管数据包中的目标物理地址是什么,主机都将可以接收到。 在 Ethernet实际传送过程中,填写了物理地址的数据包从网络接口(也就是从网卡)传送到物理的线路上,当数字信号到达一台主机的网络接口时,在正常情况下,网络接口读入数据包进行检查,如果数据包中携带的物理地址是自己的,或者物理地址是广播地址,则将数据数据包交给上层协议软件,也就是IP层软件,否则就将这个数据包丢弃。对于每一个到达网络接口的数据包,都要进行这个过程。然而,当主机工作在监听模式下,则所有的数据包都将被交给上层协议软件处理。 Ethernet的这种工作方式,举一个例子来说,有很多人在一个大房间内,大房间就像是一个共享的信道,里面的每个人好像是一台主机。人们所说的话是信息包,在大房间中到处传播。当我们对其中某个人说话时,所有的人都能听到。但只有名字相同的那个人,才会对这些话语做出反映,进行处理。如果有人想了解大家谈话的主题,他也可以对所有的谈话内容作出反应。 2.2.2 网卡的四种工作模式 要想进行网路流量监测,首先就得了解网卡的四种工作模式:广播模式(Broadcast)多播模式(Multicast)直接模式(Directed)混杂模式(Promiscuous)。 广播模式:目的物理地址是0xFFFFFF的数据包为广播数据包,工作在广播模式的网卡接收广播数据包。 多播传送(组内广播):D类IP地址是用于组内广播的,也就是一个人发出的包可以同时被其他多个有资格的人接收,这个人和那些有资格的人就形成了一个组,他们在组内的通信是广播式的。与此相对应,在物理层也存在着组内广播(或多播传送),以多播传送地址作为目的物理地址的数据包可以被组内的其它主机同时接收,而组外主机却接收不到。但是,如果将网卡设置为多播传送模式,它可以接收所有的多播传送数据包,而不论它是不是组内成员。 直接模式:工作在直接模式下的网卡只接收目的地址是自己的地址的数据包。 混杂模式:工作在混杂模式下的网卡接受所有的流过网卡的数据包,监控程序就是在这种模式下运行的。 图2-1 缺省模式与混杂模式的区别 图2-1描述网卡的硬件过滤器工作在缺省模式和混杂模式下的区别。通常,网卡硬件过滤器被设置为识别接收单播模式、广播模式和组播模式(多投点置1)的数据包,能够通过过滤器的数据包目的MAC地址只能是网卡自身地址、广播地址(0xFFFFFFFFFFFF)或者多投点置1地址(例:0x 01005E000001)。 要想实现网络流量监测,首先就得将网卡设置为混杂模式。 2.3 Linux操作系统数据包捕获方法 Linux操作系统是Internet中使用非常普遍的操作系统,其主要原因包括如下几点:Linux操作系统是开放源代码的操作系统,提供强大的开发环境,友好的GUI,可以获得许多免费的应用软件,能够支持许多种的硬件平台实现,可以用于多种CPU平台,并提供强大的网络功能等等。网络功能是Linux内核中非常重要的部分,具有如下特点: (1)为用户提供SOCKET接口; (2)支持多种网络协议,如IP、IPX、AppleTalk、X.25等; (3)支持多种底层协议,如以太网、令牌环网、FDDI、震中继、ATM等 (4)提供几乎所有网络控制器(网卡)驱动程序 (5)提供丰富的IP功能,如IP过滤、IP计费、IP转发、IP伪装等 调查发现有超过30%的Web服务器是采用基于Linux操作系统实现的。 2.3.1 Linux系统接收数据包的过程 图2-2是Linux操作系统中数据包接收简单流向图,其中BPF[10](Berkeley Packet Filter)表示内核中所实现的数据包过滤器。Linux网络接口包括四个重要部分:网络设备接口,网络核心接口,网络协议栈和网络socket接口,其中前两个部分是实现网络通信的基础。网络设备接口主要是指网络设备驱动,如网卡驱动,是实现网络通信最关键也是最基础的部分,可以屏蔽各种不同的底层传输介质,提供统一的数据包发送和接收端口。对于数据包的接收过程来讲,网络设备接口层负责从网络设备获得网络数据包并缓存在内核的SKBUF中,如图2-2中所示的网络接口部分。网络核心接口层则根据用户或者系统缺省注册的处理函数对SKBUF链表中的数据包进行分发处理。网络socket接口是用户空间应用程序和内核空间之间的接口,实现了操作系统提供的socket系统调用,通过不同的参数实现对底层不同功能的调用。网络协议栈则实现对不同协议数据包的处理和分析,并能够对用户空间应用程序的系统调用,如UDP数据包的接收/发送,TCP数据包的接收/发送等进行响应。 图2-2 Linux系统下数据包接收过程流程图 一个新的数据包到达网卡,首先通过一个硬中断通知系统可以从网卡缓冲区获得新的数据包,网卡驱动的工作一般包括了对数据包正确性的检验,包括长度和CRC校验和等,如果是对新的数据包验证无误,则会分配一个SKBUF缓冲区并调用netif_rx()函数交由上层,及网络核心接口层进行处理。SKBUF是Linux操作系统中网络协议的缓存管理方式,使用连续内存存储完整的数据包。在类似TCP/IP的分层协议中,当数据包通过上层协议时,上层协议的头被加在数据包头部,而当数据包通过下层协议到达上层协议层是的下层协议的头部被剥离。在分配SKBUF空间时,首先计算存储数据包所需要的最大内存数,其中包括各层头部,当数据包通过不同的协议层时,只需要把指针指向SKBUF的不同位置即可。因此在整个内核空间内对数据包的分析处理都可以通过对数据包所在的SKBUF链表中的结点中的存储数据进行处理实现,不需要在进行内存拷贝操作。 所有类型的网络数据包都存储在SKBUF链表中,但是各种数据包的类型不同,需要网络协议栈中的不同协议,如IP协议、ARP协议IPX、APPLETALK等进行处理。Linux操作系统中通过一个存储各种处理函数入口的数组(packet_ptype_base)实现对不同协议的分发处理。缺省Linux协议栈中支持各种常规的协议函数的处理,在系统启动时自动加载到协议处理函数入口数组中。对SKBUF中的数据包的上层协议处理时通过软中断实现,首先根据数据包的类型在协议处理函数列表中查找相应的处理入口函数,然后交由协议栈不同的函数后即完成了网络核心接口层的功能。为了方便灵活性,Linux内核中的程序也可以自己按照需求增加或者删除如果需要增加到协议处理函数入口数组中。 2.3.2 Linux系统中流量分析性能影响因素 如果在用户空间通过libpcap实现数据包捕获,则完成一次完整的数据包捕获,至少包括一次硬中断延迟,一次网卡到内核的内存拷贝,一次系统调用和一次内核空间到用户空间的内存拷贝。因此影响网络监测或者数据包捕获性能的因素主要包括系统调用时间、中断延迟、系统I/O带宽等。首先对Linux操作系统中对数据包接收处理中的中断、系统调用等影响数据包处理性能的关键过程进行分析。 当一个数据包到达的时候,网卡首先接收到数据到达信号,并产生一个硬中断通知CPU进行调度处理。硬中断在系统中具有非常高的优先级,通常情况下将会立即响应。中断服务程序首先判断数据包的有效性,如果有效则分配一个缓冲结构,并把数据包插入到内核的SOCKET队列中;否则直接返回。硬中断一旦开始执行,则任何情况无法中止,必须等待其正常退出,因此SOCKET队列中的数据包的处理大部分是通过软中断的方式进行处理。软中断可以保证响应时间足够短,并且可以完成硬中断无法及时完成的上层协议操作。 网卡的输入输出硬中断是影响高速网络接口性能的关键因素。举例来说,在GE链路上(假设包大小为最大1518字节),如果每个数据包的到达将产生一个硬中断,则系统产生硬中断的间隔至少为12us。而真正互联网的实际以太网平均包大小远比1518要小,大约为576字节,因此系统产生硬中断的监测可能只有几个微秒。大部分的主机系统很难满足这个速率的中断速率。当数据包较小时,超额的中断切换甚至都可能消耗100%的CPU资源。 系统调用是用户空间程序请求内核服务的一种常用方式。而系统调用开销是影响性能的另外一个关键因素。每个系统调用都需要大约100个时钟周期保存和恢复硬件状态、软件状态以及大约四次的上下文切换。在Linux操作系统中,每个上下文切换都需要大约3.2微秒。在GE网络中对于1500字节数据包,在线速情况下,每个包的处理延迟最大为12微秒。对于GE链路,在12微秒那完成如此多的硬件中断和系统调用几乎是不可能的。 内存拷贝是另外一个影响性能的重要因素。图2-2表示用户空间程序从网卡接收数据包的流向图。通常一个数据包被用户空间应用程序处理需要两次内存拷贝,一次是从网卡缓冲区到系统内核缓冲区,另一次是从内核缓冲区到用户应用程序。而每次对1024字节内存的内存拷贝时间大约为1us。对高速网络环境,内存拷贝消耗的时间是影响性能的非常重要的因素。 另外,PCI总线带宽也可能成为流量分析的瓶颈。如果使用32位/66MHZ的PCI总线,PCI总线带宽大约为32*66Mbit/s。对全双工千兆以太网链路,最大需求处理速率为2Gbps。而在普通的PC上,大部分外围设备,如网卡,显卡等均需要通过PCI总线和CPU通信。在大部分操作系统中,CPU采用轮询方式为各个外设服务。也就是说,网卡实际可能获得的PCI总线带宽远远小于PCI总线最大提供的带宽。因此为了避免PCI总线带宽可能带来的性能瓶颈,最好的解决办法时增加PCI总线宽度(32bit升级为64位)以及增加处理频率。 综上所述,系统调用、中断、PCI总线带宽以及内存拷贝都是影响流量分析的重要因素,但是减少中断的次数,如采用适度中断法必须依赖专用的网卡设备,并且如果采用该方法也存在着无法为每个数据包精准计时的缺点;而PCI总线带宽的影响只能通过增加总线宽度和处理频率改善。因此如何减少内存拷贝次数及系统调用次数是提升被动流量捕获分析性能的关键。 3.基于内核捕包方案的分析 常规的捕包方案存在着很多在缺陷已经不能再适应现在快速增长的网络了,本章通过对常规方法的介绍,然后分析它的不足点以及存在的性能提升空间上对基于内核的捕包方案原理进行概述并且进行了性能分析。 3.1 常规的数据包捕获方案 3.1.1 Libpcap Libpcap的英文意思是 Packet Capture library,即数据包捕获函数库。该库提供的C函数接口可用于需要捕获经过网络接口(只要经过该接口,目标地址不一定为本机)数据包的系统开发上。由Berkeley大学Lawrence Berkeley National Laboratory研究院的Van Jacobson、Craig Leres和Steven McCanne编写,该函数库支持Linux、Solaris和*BSD系统平台。利用该库可以向开发人员屏蔽底层网络链路所采用技术,并且libpcap集成了对BPF的支持,提供灵活、高效的数据包过滤功能,为网络数据包捕获应用的开发提供了很好的遍历,因此目前大部分的流量分析工具是基于libpcap实现。 使用Libpcap可以带来很多优点,第一、众多基于Libpcap开发的网络工具在各种版本的Unix平台上很容易移植;第二、Libpcap有良好的兼容性,能够屏蔽底层网络的不同,方便用户使用;第三、Libpcap拥有高效的包过滤器BPF(Berkeley Packet Filter)。能够通过BPF把用户期望获得的数据包方便的传递到用户空间进行处理。BPF被认为是Unix中实现数据包过滤组件中最好的一种实现。BPF包括两个主要部分:数据包复制器和数据包过滤器。数据包复制器负责从网络设备驱动获得网络链路中数据包的备份,并把该备份传送给数据包过滤器。过滤器则根据过滤规则决定数据包取舍。非常重要的一点,BPF只把符合规则要求的数据包传递到用户空间。同时,BPF也支持只把所需要的部分数据包,如数据包的前64字节,传递到用户空间,以降低数据包拷贝开销。举例来讲,对于以太网数据包,前64字节足以满足对以太网头与IP/TCP头的分析。 3.1.2 Libpcap的传统捕获机制影响 Libpcap利用工作在数据链路层的套接字SOCK_PACKET来完成网络数据包的读取。同样以Intel l00M 网卡eepml0为例,分析Libpcap的捕获数据包流程如下所示: (1)当网络数据包到达后,eepm10 网卡通过DMA方式将数据包传输到网卡驱动程序缓冲环中并在数据传输结束时产生硬件接收中断。系统根据中断类型调用相应的硬中断处理程序。 (2)在硬中断处理程序speedo_rx()中,内核处理接收到的数据包并通过调用netif_rx()函数将驱动程序缓冲环中的数据添加到系统接收队列中。操作系统在空闲时机调用中断处理下半部分即软中断处理函数net_rx_action()。此函数的主要功能是,检查系统中已注册的数据包类型并调用相应的处理函数。对应Libpcap的注册包类型为ETH—P_AIJL, 其处理函数为packet_rev()。packet_rcv()仍然工作在数据链路层。 (3)在packet_rev函数中,直接调用skb_queue_tail()将数据包存放在sk{}->receive queue队列中。这样数据包在接收过程中就绕过了TCP层和IP层的处理。 (4)由休眠在队列sk{}->receive_queue上的函数packetrecvmsg()接收链路层数据包并将数据包拷贝到应用层缓冲区中。在传统的Libpcap捕包过程中,系统调用、数据拷贝和中断处理仍然是系统主要的性能瓶颈。 3.1.3 Libpcap捕包方法的不足 在传统的Libpcap捕包过程中,系统调用、内存拷贝和中断处理仍然是系统主要的性能瓶颈。 (1)系统调用:Libpcap提供用户空间数据包访问能力,调用Libpcap接口函数pcap_read()从内核空间获取数据包,该函数实际上是通过recv_from()系统调用访问内核空间。Libpcap每次从内核中获取数据包就会产生一次系统调用,系统调用将导致进程切换,粗略估计在Linux中执行一次系统调用大约需要四次上下文切换,假设先忽略切换之外的其他开销,每次切换大约需要3.2us,因此使用基于Libpcap的数据包捕获分析机制每个数据包至少需耗时3.2*4=12.8usec才能完成数据包从内核空间到用户空间的转移。千兆链路流量监测应用中数据包速率最高可达148.8万pps,平均分配到每个数据包的处理时间为6.72usec,所以从理论上分析基于Libpcap的数据包捕获方案就无法满足千兆链路监测需求; (2)内存拷贝:由于网络协议栈在操作系统内核中实现,Libpcap提供用户空间数据包访问能力,所以用户程序在访问数据包时必须将数据包缓存从内核空间拷贝到用户空间,消耗了很大的内存。 (3)中断活锁:中断的处理优先级较高,大量产生的中断将导致CPU持续响应中断服务请求、执行中断服务例程ISR(Interrupt Service Routine),CPU时钟将完全被网卡驱动程序的ISR垄断,从而无法正常处理CPU Backlog队列中缓存的数据包,同样也无法响应其他所有进程的调度请求 。 3.2存在的性能提升空间 针对libpcap捕包的几个耗时环节以及Linux系统中流量分析性能影响因素,本文分析可以从以下几个方面进行优化: (1)增加内核过滤机制 内核过滤机制就是相当于软中断处理程序的部分判断接受的数据包是否是应用程序感兴趣的报文。如果是则复制到缓冲区内,否则丢弃。这样可以大大降低系统实际处理的报文的数量,从而提高捕包的效率。但是这种方法只对某些应用起作用,对某些应用如流量统计就不会起太大的作用了。 (2)一次复制多个报文到用户的缓冲区 Libpcap通过系统调用rexfrom()读取数据包,而且每调用一次该函数,它只向用户传递一个数据包。因此可以在内核缓冲区中保存一定数量的报文,在报文到达一定数量的时候唤醒用户进程读取内核缓冲区中的所有的数据包。这样就节省了用户进程切换的时间。在对大流量的数据报文进行处理时,是一个很有效的方法。不过这样会延迟报文到达用户进程的时间。当报文到达的速率很大时,时间延迟就会明显增加。 (3)将主要的应用处理移至内核模块处理程序中 Linux操作系统最显著的一个特征就是对用户空间和内核空间的区分。运行在内核模式下的操作系统内核提供底层最高权限且最基本的操作和服务,如访问硬件设备,内存管理,进程调度等;一般的,应用程序运行在用户模式下,出于保护内核安全等因素的考虑,它拥有最小的权限。这种区分给操作系统带来了安全相,但是同时也带了不便。因为操作系统的很多工作需要访问系统的资源和服务,由于用户进程仅能对系统资源拥有最低权限的访问控制权力,所以他们无法直接完成这些工作,而必须交由内核进程来完成。系统调用即提供了使得用户空间的进程可以通过调用一些系统函数在从用户空间进入到内核空间取得内核的资源或者服务的机制。由于系统涉及到0x80号中断现场保存和进程切换,在大流量网络环境下频繁的系统调用时很费时的工作。所以许多应用将主要的应用层处理部分作为内核模块放在内核中处理,从而可以减少系统调用的次数,但是这样做需要将应用处理写在驱动模块内或者内核代码中,在内核中写代码与应用层写代码有很大的区别。 (4)降低系统硬件中断频率 当网络报文到达系统速率过于频繁的时候,会出现CPU处理时间全部用于中断处理的情况。这时系统频繁运行硬中断处理程序,导致上层软中断处理得不到运行。硬中断处理程序将网络报文填充到系统缓冲区中,这样系统缓冲区很快就被添满,多余的数据包将被丢弃。同时其他进程也无法获得CPU的控制权。
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服