一种加速网卡报文捕获的方法

文档序号:7660220阅读:170来源:国知局

专利名称::一种加速网卡报文捕获的方法
技术领域
:本发明涉及一种网络网卡,尤其是涉及一种加速网卡报文捕获的方法。技术背景有关网卡报文捕获已有一些相关的报道,国内在这方面处于领先的是哈尔滨工业大学的计算机网络与信息安全技术研究中心,有3篇代表文章《RTLinux下基于半轮询驱动的用户级报文传输机制》、《基于半轮询驱动的网络入侵检测单元的设计与实现》和《零拷贝报文捕获平台的研究与实现》。前两篇的第一作者是田志宏,第三篇的第一作者是王佰玲。国外在这方面研究具有突出成就的代表人物是LucaDeri。主要有两篇代表文章《ImprovingPassivePacketCapture:BeyondDevicePolling》禾卩《nCap:Wire-speedPacketCaptureandTransmission》。在提高网络报文流采集和处理方面,文章《RTLinux下基于半轮询驱动的用户级报文传输机制》和《基于半轮询驱动的网络入侵检测单元的设计与实现》提出了"半轮询驱动"概念。而实际上,2003年底发布的Linux内核2.4.236已经通过NAPI实现了类似概念。两者的共同点都是首先采用中断唤醒数据接收的服务程序,然后通过POLL方法来轮询网卡,其差别在于田志宏的"半轮询"概念需要确定网络报文的输入速率是否达到一个稳定状态,当达到稳定状态时,持续通过轮询的方式采集网卡接收到的网络报文,反之则恢复中断方式;而应用NAPI的Linux网卡驱动程序,如elOOPRO/100,则在轮询失败(失败表示网卡目前没有新的网络报文等待Linux内核接收)后,休眠一段很短时间(时间长度可定制),再对网卡轮询一次,若轮询成功(表示有新的网络报文到达),则保持在轮询模式,反之恢复中断方式。田志宏基于他提出的"半轮询"概念,实现了"用户级报文传输机制UMPS"。而基于NAPI机帝lj,LucaDeri在《ImprovingPassivePacketCapture:BeyondDevicePolling》中,提出了一种新的被动网络报文捕获机制-网络套接字PF_RING,PF—RING和UMPS都在内核空间中申请一块物理上连续的地址空间作为缓冲区,把内核接收到的网络报文复制到该缓冲区中,利用地址映射,上层应用程序直接读取存放在内核空间的网络报文,网络报文无须从内核空间发送到用户空间,从而避免网络报文从内核空间传送到用户空间过程中的内存拷贝操作。在结构上,王佰玲的HPPCP比Luca的PF_RING更优化,PF_RING保留传统网卡驱动程序中内核接收网络报文的模式,gP,在每条网络报文到达后内核临时申请堆缓冲的模式。网路报文被存放到堆缓冲后,PF_RING把报文拷贝到上层应用程序通过地址映射能够直接访问的内核地址空间(RING);而HPPCP则让网卡直接把网络报文以DMA方式存储到上层应用程序通过地址映射能够直接访问的内核地址空间,比PF—RING少了在网络报文在内核空间的一次内存拷贝。实现PF_RING之后,Luca在《nCap:Wire-speedPacketCaptureandTransmission》中,提出了一个新的网络报文捕获/接收及传输方案一nCap。nCap实现了不需要内核干涉的网络报文接收和传输。在这个方案中,网卡的寄存器和内存被映射到上层应用程序所在的用户地址空间。运行在用户地址空间的网络报文处理程序以控制linux操作系统的"设备"的形式直接与物理网卡交互,在接收和发送报文的过程中,完全地旁路了内核。在网络报文接收方面,物理网卡把报文送到上层应用程序通过地址映射可以直接访问的内核地址空间,不仅实现了"零拷贝",而且由网卡通过DMA直接完成,不需要内核干涉;在报文传输方面,用户空间程序通过直接存取物理网卡控制寄存器的方式,指挥网卡发送报文。报文接收和传输过程中的延迟被降低到了同样硬件条件下可能达到的最低程度,接近"零延迟"。通过nCap提供的应用接口,现有的网络报文实时处理程序只要经过简单的重新编译,就可以在性能上得到极大的提升。同时,新的应用程序可以完全在用户空间开发,不需要另外开发内核空间的支持组件。开发人员甚至不需要具备Linux内核知识,这极大地降低了基于PC的高速网络报文处理系统的技术门槛和开发成本。DAG卡的生产厂家Endace公司于2005年底收购nCap,添加了DAG的某些核心功能后,于2006年3月推出了其最新的网卡加速软件enCap。在enCap销售发布公告中,Endace公司指出enCap是一套高速报文捕获软件,它使一台市场上普通的PC变成一个高效且廉价的网络测量系统,成为一个很好的网络流分析平台。Endace声称enCap的推出目的是针对更广泛的用户群进一步降低网络监视和安全方案的门槛。enCap每套售价499美元。无论是nC叩还是enCap,其市场价值都是非常可观的。由于它们的产生,市场上的普通PC才有可能成为高速网络实时报文处理系统的硬件平台。nCap和enCap解决了一个门槛问题。目前,nCap和enCap的源代码都没有公开,技术细节是保密的。
发明内容本发明的目的在于提供一种加速网卡报文捕获的方法。本发明的技术方案是通过对千兆网卡驱动模块和网卡接收控制程序两个层次的改进,减少了数据包在内核和用户空间传递过程中的拷贝,缓存以及系统调用等开销,从而使得千兆网卡捕获报文达到线速。本发明包括以下步骤-1)修改接收缓冲环初始化函数在intel000—up(structel000_adapter*adapter)函数中将for(i=0;i<adapter->num—rx—queues;{structe1000—rx—ring*ring=&adapter->rx—ring[i];adapter->alloc—rx_buf(adapter,ring,E1000—DESC—UNUSED(ring));修改为for(i=0;i<adapter->num—rx—queues;i++){structel000_rx—ring*ring=&adapter->rx—ring[i];adapter->alloc—rx—buf(adapter,ring,E1000—DESC—UNUSED(ring)+1);本修改完成每个接收描述符结构(receivedescriptor)对应一块内存缓冲区(MemoryBuffer),内存缓冲区存放接收到的网络数据包。2)屏蔽中断在inte1000—up(structe1000—adapter*adapter)函数中力卩入disable—irq(adapter->pdev->irq),函数disablejrq是专门的中断屏蔽函数。3)用户空间内存映射(1)査看/proc/iomem取得网卡上寄存器的首地址和地址范围,通过内存映射函数mmap将网卡上寄存器的首地址映射到用户虚拟地址空间,达到在用户空间对网卡上的寄存器进行直接读写;(2)通过网卡物理首地址和网卡上寄存器的偏移地址获得网卡上特定寄存器的物理地址,将网卡上特定寄存器物理地址映射到用户虚拟地址空间;(3)用户空间内存映射建立过程和用户空间控制网卡初始化voidelOOO—device_init(structel000—device*ether—dev,unsignedintaddr)intmem—fdsunsignedchar*mem;unsignedintrdbal,tdbal;unsignedintrctl,tctl,Ctrl;unsignedshortrdh,rdt,tdh,tdt;mem—fd二open(7dev/mem",O—RDWR);ether—dev->fd二mem—fd;if(mem—fd==-l)printf("Cannotopen/dev/mem\n,,);return;mem=mmap(O,0x20000,PROT—READ|PROT—WRITE,MAP—SHARED,mem—fd,addr);ether—dev->write—register=mem;if(mem==MAP—FAILED)printf("Cannotmmapmem\n");return;rdbal=*(unsignedint*)&mem[El000—RDBAL;ether_dev->rx—desc=mmap(O,4096,PROT一READ|PROT—WRITE,MAP—SHARED:mem—fd,rdbal》if(ether—dev->rx—desc=MAP—FAILED)printf("Cannotmmapether—dev->rx_desc\n");return;ether—dev->mem_skb=mmap(O,0x40000000,PROT—READ|PROT—WRITE:MAP—SHARED,mem—fd,0x0);if(ether—dev->mem—skb==MAP—FAILED)printf("Cannotmmapether—dev->rx_desc\n,,);return;ether—dev->count=256;ether—dev->next—to_clean=0;ether_dev->next—to_use=255;ether—dev->rdh=E1000—RDH;ether—dev->rdt=ElOOO—RDT;rctl=*(unsignedint*)&mem[E1000_RCTL];(unsignedint*)&mem[E1000—RCTL]=rctl&~E1000—RCTL一EN;rdh=*(unsignedshort*)&mem[E1000_RDH];rdt=*(unsignedshort*)&mem[E1000—RDT];(unsignedint*)&mem[E1000—RDLEN]=4096;(unsignedshort*)&mem[E1000—RDH]=0;(unsignedshort*)&mem[E1000—RDT]=254;*(unsignedint*)&mem[El000—RCTL]=rctl|E1000—RCTL_EN;(4)用户空间内存映射解除过程voidel000—device—exit(structel000—device*ether_dev)munmap(ether一dev->write—register,0x20000);munmap(ether一dev->mem—skb,0x4000000);munmap(ether—dev-〉rx—desc,4096);closc(cthcr—dcv->fd)54)用户空间接收处理过程inte1000—clean一rx—irq(structel000—device*ether_dev,unsignedchar*buf—in,int*length)structelOOO—rx—desc*rx—desc;unsignedinti,j;intcleaned—count=0;intcount=0;unsignedchartdt;structe1000—tx—desc*tx—desc;i=ether—dev陽〉next—to—clean;rx—desc=ElOOO—RX—DESC(*ether—dev,i);while(rx一desc->status&ElOOO—RXD—STAT—DD)if(++i==ether—dev-〉count)i=0;cleaned—count+十;"ength=rx—desc->length+4+20;rx—desc-〉status二0;if((cleaned—count>=16))e1000—alloc—rx—buffers(ether—dev,cleaned—count);count+=cleaned—countjcleaned—count=0;rx—desc=ElOOO—RX—DESC(*ether_dev,i);ether—dev->next—to—clean=i;cleaned—count=ElOOO—DESC—UNUSED(ether—dev);if(cleaned—count)<formula>formulaseeoriginaldocumentpage14</formula>u一int16—tspecial;};structel000—deviceintfd;structe1000—rx—desc*rx—desc;unsignedintnext—to—use;unsignedintnext—to—clean;u—intl6—trdh;u—intl6—trdt;unsignedintcount;unsignedchar*write—register;unsignedchar*mem—skb;本发明主要是通过内存映射在用户空间直接对接收缓冲环进行操作,以达到只需要一次网卡和缓冲环之间的DMA传输就可以实现数据的接收过程。同时由于网卡的接收控制过程由内核空间转移到了用户空间,因此旁路了内核,减少了数据包在内核和用户空间传递过程中的拷贝、缓存和系统调用等的开销,使得采用轮询机制基本上达到了千兆网卡的线速,为更好地研究入侵检测系统提供了一个开发平台。图1为本发明实施例的接收原理图。图2为本发明实施例的接收描述符队列环结构图。图3为本发明实施例的测试网络拓扑图。具体实施方式以下实施例将结合附图对本发明作进一步的说明。接收原理图(参见图1)相关术语介绍如下UserSpace:用户空间,Application:用户空间应用程序,就是使用此技术得程序。mmap:内存映射眼熟,在用户空间内存映射建立过程有调用此函数。Kernel:内核空间。DMA:(DirectMemoryAccess),即直接存储器存取,是一种快速传送数据的机制。NetworkAdpater:网卡。RDBAL,RDBAH,RDLEN,RDH,RDT,MemoryBuffer,receivedescirptor等在下面的网卡相关技术细节介绍中有解释说明。网卡相关技术细节介绍如下,其中接收描述符结构参见表l。表1接收描述符结构<table>tableseeoriginaldocumentpage16</column></row><table>在表l中,BufferAddress指向内存缓冲区,就是用来存放接收到的网络数据包。Errors表示一个错误的数据包被接收。Status表示这个描述符是否己经被使用,也就是说是否网卡已经在BufferAddress所指内存缓冲区存放了数据包。PacketChecksum表示对数据包的硬件冗余计算。Length表示数据包的长度。接收描述符结构(receivedescriptor)主要用来对应一个接收到的网络数据包。接收描述符队列环结构说明如下接收描述符队列环结构(参见图2)是由一定数量的接收描述符组合而成的一个环形队列结构。硬件控制这个环行队列结构,其中每个方框代表一个接收描述符,RDH和RDT分别为环的头索引和尾索引。当有数据包到的时候,硬件将数据包放在RDH对应的接收描述符BufferAddress所指地址中,同时根据具体情况修改Length,PacketChecksum,Status,Errors,Special字段。接收描述符环所用到的寄存器说明如下RDBAL和RDBAH指示接收描述符环的起始地址,其中RDBAL指示低32位,RDBAH指示高32位。RDLEN指示接收描述符环的长度。RDLEN=单个接收描述符结构的长度x接收描述符的个数。RDH指示接收描述符环的头索引指针。RDT指示接收描述符环的尾索引指针。MemoryBuffer指示用来存放接收到的数据包。测试网络拓扑图如图3所示,其中发包机Lenovo1和Lenovo2配置为P4XEON3.0G,512m内存,Intel82541GI千兆电口网卡。收包机Dell1配置为P42.4G,512m内存,Intel82541GI千兆电口网卡。交换机Ciscoswitch为思科WS-C3750-48TS-S千兆交换机。发包机和收包机的操作系统都是RHEL4.0,内核版本为2.6.16.19。以下给出实验数据。计算带宽的时候要加上InterframeGap,Pre&Postamble,FrameHeader,FrameFCS,所以发包流量和收包流量的计算公式为(InterframeGap+Pre&Postamble+FrameHeader+FrameFCS+IPPacket)xpps;其中,InterframeGap为12字节,Pre&Postamble为8字节,FrameHeader为14字节,FrameFCS为4字节,pps为packetpersecond,bps为bitpersecond就是每秒接收或发送的数据包,这里的数据包指IP数据包。接收数据参见表2。表2接收数据表<table>tableseeoriginaldocumentpage17</column></row><table>以下给出实验结果的分析。1)Sar命令是用来对系统接收性能进行采样的系统命令,通过对Sar列进行分析,Sar命令并不能达到网卡的接收线速1Gbps。这是因为网卡的接收速度除了受网卡本身性能的影响外,还受计算机体系结构以及PCI总线频率等的影响。而Sar命令的结果基本上就是测试电脑在其体系结构下的接收线速,而Libpcap在1500字节情况下也只有线速的85%。2)Libpcap是传统的数据包捕获平台,目前涉及到数据包捕获的程序都是基于此接口开发的。可以发现其接受性能相对Sar来说还有很大差距。尤其是在捕获小数据包的时候(64字节和128字节),其捕获性能只有线速的30%左右。3)本发明在采用轮询机制的情况下,当捕获64字节数据包时,其捕获性能就可以达到线速的75%以上,而当捕获128字节以上数据包时,其捕获性能可以达到线速的85%以上,尤其是1500字节数据包,捕获性能可以达到线速的95%。4)通过对实验数据进行分析,可以发现本发明相对于Libpcap平台接收性能有了非常大的提高。无论是在64字节数据包150%的性能提升,还是在1500字节数据包12%的的性能提升,都充分说明了本发明的优越性,而且本发明非常接近网卡的接收线速。由此可见,本发明主要是通过内存映射在用户空间直接对接收缓冲环进行操作,以达到只需要一次网卡和缓冲环之间的DMA传输就可以实现数据的接收过程,同时网卡的接收控制过程由内核空间转移到了用户空间,因此旁路了内核,减少了数据包在内核和用户空间传递过程中的拷贝、缓存和系统调用等的开销,使得采用轮询机制基本上达到了千兆网卡的线速,为更好的研究入侵检测系统提供了一个开发平台。本发明的测试主要是与Intel8254x系列千兆网卡绑定,软件修改设计到两个层次,一个是在linux平台下的Intel8254x系列千兆网卡驱动模块的修改,另一个是用户空间对网卡接收的控制程序。权利要求1.一种加速网卡报文捕获的方法,其特征在于包括以下步骤1)修改接收缓冲环初始化函数;2)屏蔽中断;3)用户空间内存映射(1)查看/proc/iomem取得网卡上寄存器的首地址和地址范围,通过内存映射函数mmap将网卡上寄存器的首地址映射到用户虚拟地址空间,达到在用户空间对网卡上的寄存器进行直接读写;(2)通过网卡物理首地址和网卡上寄存器的偏移地址获得网卡上特定寄存器的物理地址,将网卡上特定寄存器物理地址映射到用户虚拟地址空间;(3)用户空间内存映射建立过程和用户空间控制网卡初始化;(4)用户空间内存映射解除过程;4)用户空间接收处理过程;5)相关数据结构定义。2.如权利要求1所述的一种加速网卡报文捕获的方法,其特征在于所述的修改接收缓冲环初始化函数是在intel000_up(structe1000—adapter*adapter)函数中将for(i=0;i<adapter->num_rx_queues;i++){structel000_rx_ring*ring=&adapter->rx_ring[i];adapter->alloc_rx—buf(adapter,ring,E1000—DESC一UNUSED(ring));修改为for(i=0;i<adapter->num—rx_queues;{structelOOO一rx一ring*ring=&adapter->rx_ring[i];adapter->alloc_rx—buf(adapter,ring,E1000一DESC—UNUSED(ring)+1);本修改完成每个接收描述符结构(receivedescriptor)对应一块内存缓冲区(MemoryBuffer),内存缓冲区存放接收到的网络数据包。3.如权利要求1所述的一种加速网卡报文捕获的方法,其特征在于所述的屏蔽中断是在inte1000—up(structe1000—adapter*adapter)函数中加入disable—irq(adapter->pdev->irq),函数disable—irq是专门的中断屏蔽函数。4.如权利要求1所述的一种加速网卡报文捕获的方法,其特征在于所述的用户空间内存映射建立过程和用户空间控制网卡初始化是voide1000—device一init(structel000—device*ether_dev,unsignedintaddr)intmem—f山unsignedchar*mem;unsignedintrdbal,tdbal;unsignedintrctl,tctl,Ctrl;unsignedshortrdh,rdt,tdh,tdt;mem—fd二open('7dev/mem',,O—RDWR);ether—dev->fd=mem_fd;if(mem—fd==-1)printf("Cannotopen/dev/mem\n',);return;mem=mmap(O,0x20000,PROT—READ|PROT—WRITE,MAP_SHARED,mem_fd,addr);ether—dev->write_register=mem;if(mem=MAP—FAILED)printf("Cannotmmapmem\n");return;rdbal=*(unsignedint*)&mem[E1000—RDBAL;ether—dev->rx—desc=,ap(O,4096,PROT—READ|PROT_WRITE,MAP—SHARED,mem_fd,rdbal);if(ether—dev->rx—desc==MAP—FAILED)printf("Cannotmmapether—dev->rx—desc\n,,);return;ether—dev->mem—skb=腿ap(O,0x40000000,PROT—READ|PROT—WRITE,MAP—SHARED,mem—fd,0x0);if(ether—dev隱〉memskb==MAP—FAILED)printf("Cannotmmapether—dev->rx—desc\n");return;ether—dev->count=256;ether—dev->next—to—clean=0;ether—dev->next—to—use=255;ether—dev->rdh=E1000—RDH;ether_dev->rdt=ElOOO—RDT;rctl=*(unsignedint*)&mem[E1000—RCTL];*(unsignedint*)&mem[E1000_RCTL]=rctl&~E1000—RCTL—EN;rdh=*(unsignedshort*)&mem[E1000—RDH];rdt=*(unsignedshort*)&mem[E1000—RDT];(unsignedint*)&mem[E1000—RDLEN]=4096;(unsignedshort*)&mem[E1000_RDH]=0;*(unsignedshort*)&mem[E1000_RDT]=254;*(unsignedint*)&mem[E1000—RCTL]=rctl|ElOOO—RCTL_EN;5.如权利要求1所述的一种加速网卡报文捕获的方法,其特征在于所述的用户空间内存映射解除过程是-voidelOOO—device—exit(structel000—device*ether—dev)munmap(ether—dev->write—register,0x20000);munmap(ether一dev->mem—skb,0x4000000);munmap(ether一dev->rx—desc,4096);close(ether一dev->fd);6.如权利要求1所述的一种加速网卡报文捕获的方法,其特征在于所述的用户空间接收处理过程是intelOOO—clean_rx—irq(structelOOO_device*ether—dev,unsignedchar*buf—in,int*length)structelOOO—rx—desc*rx—desc;unsignedinti,j;intcleaned—count=0;intcount=0;unsignedchartdt;structelOOO—tx—desc*tx—desc;i=ether—dev->next—to—clean;rx一desc=ElOOO—RX—DESC(*ether—dev,i);while(rx一desc->status&ElOOO—RXD—STAT—DD)'if(++i==ether—dev->count)i=0;cleaned—count+十j*length=rx—desc->length+4+20;rx—desc->status=0;if((cleaned—count>=16))e1000—alloc—rx—buffers(ether—dev,cleaned—count);count+=cleaned—countycleaned—count=0;rx—desc=ElOOO—RX_DESC(*ether—dev,i);ether—dev->next—to—clean=i;cleaned—count=ElOOO—DESC—UNUSED(ether—dev);if(cleaned—count)e1000—alloc—rx—buffers(ether—dev,cleaned—count);count+=cleaned—co皿;rcturncountyvoide1000—alloc—rx—buffers(structel000—device*ether—dev,intcleaned—count)structe1000—rx—desc*rx—desc;unsignedinti;i=ether—dev-〉next一to—us^while(cleaned—count—)if((++i==ether—dev->count》i=0;if((ether—dev->next—to—use!=i))ether—dev-〉next—to—use=i;if((i國一O))i=(ether—dev->count隱1);*(unsignedshort*)&ether—dev->write_register[ether—dev->rdt]=i;7.如权利要求1所述的一种加速网卡报文捕获的方法,其特征在于所述的相关数据结构定义是structelOOO—rx—desc{u—int64—tbuffer—addr;/*Addressofthedescriptor'sdatabuffer*/u—intl6—tlength;/*LengthofdataDMAedintodatabuffer*/u—intlG_jtcsun^/氺Packetchecksum承/u—int8—tstatus;/*Descriptorstatus*/u—int8—terrors;;/*DescriptorErrors*/u—intl6—tspecial;};structel000—deviceintfd;structel000—rx—desc*rx—desc;unsignedintnext—to—use;unsignedintnext—to—clean;u—intl6—trdh;u—intl6—trdt;unsignedintcount;unsignedchar*write—register;unsignedchar*mem—skb;全文摘要一种加速网卡报文捕获的方法,涉及一种网络网卡。提供一种加速网卡报文捕获的方法。1)修改接收缓冲环初始化函数;2)屏蔽中断;3)用户空间内存映射;(1)查看/proc/iomem取得网卡上寄存器的首地址和地址范围,通过内存映射函数mmap将网卡上寄存器的首地址映射到用户虚拟地址空间,达到在用户空间对网卡上的寄存器进行直接读写;(2)通过网卡物理首地址和网卡上寄存器的偏移地址获得网卡上特定寄存器的物理地址,将网卡上特定寄存器物理地址映射到用户虚拟地址空间;(3)用户空间内存映射建立过程和用户空间控制网卡初始化;(4)用户空间内存映射解除过程;4)用户空间接收处理过程;5)相关数据结构定义。文档编号H04L29/12GK101217573SQ20071014415公开日2008年7月9日申请日期2007年12月29日优先权日2007年12月29日发明者峰刘,黄凯明,黎忠文申请人:厦门大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1