WEB开发网
开发学院操作系统windows 2008 深度剖析WinPcap之(四)——WinPcap的体系架构 阅读

深度剖析WinPcap之(四)——WinPcap的体系架构

 2009-09-11 00:00:00 来源:WEB开发网   
核心提示: 捕获过程依赖两个主要组件:1) 数据包过滤器一个数据包过滤器决定一个到来的数据包是否需要被接收与复制到一个应用程序,大多数使用NPF的应用程序拒收比它所接收多得多的数据包,深度剖析WinPcap之(四)——WinPcap的体系架构(6),因此对于普遍较好的性能,一个通用与有效率的数据包过滤器是关

捕获过程依赖两个主要组件:

1) 数据包过滤器

一个数据包过滤器决定一个到来的数据包是否需要被接收与复制到一个应用程序。大多数使用NPF的应用程序拒收比它所接收多得多的数据包,因此对于普遍较好的性能,一个通用与有效率的数据包过滤器是关键。

一个数据包过滤器是一个布尔值输出的函数,对一个数据包而言函数的值为true,捕获驱动器将复制数据包到应用程序,如果是false数据包将被丢弃。NPF数据包过滤器有一点复杂,因为它决定的不仅仅只是数据包是否应该保留,同时也包括应该保留的字节数。

NPF 驱动器所采用过滤系统来自于BSD数据包过滤器(BPF),一个虚拟处理器能够执行过滤程序,该程序采用伪汇编程序表达并在用户层创建。应用程序采用一个用户定义的过滤器(例如,获得所有的UDP数据包),利用wpcap.dll,并编译它们到一个BPF程序(例如,如果数据包是IP,同时协议类型字段值为17,那么返回true)。接着,应用程序使用BIOCSETF的 IOCTL把过滤器传给内核。到此为止,该程序对进来的所有数据包执行过滤,并只接受遵循过滤条件的数据包。

不像传统的解决方案,NPF不解释过滤器,但是它执行它们。为了性能的原因,在使用过滤器之前,NPF把它给JIT编译器,该编译器把它转换成一个本地80X86的函数。当一个数据包被捕获后,NPF调用该本地函数,而不是调用该过滤器的解释器,这使得处理过程很快。该优化的背后观念与JAVA jitters的一个优化非常相似。

2) 一个循环缓冲区来存储数据包并避免丢包

存储在缓冲区的一个数据包带有一个包头,该头维护如时间戳、包大小的信息。此外,为了提高应用程序访问数据的速度,数据包之间填充了一些填充数据。在单个读操作中,一组数据包能从NPF复制到应用程序。这提高了性能,因为最小化了读的次数。当一个新的数据包到来时,缓冲区已满,该包被丢弃,因此造成掉包。为了最大化多功能性(maximum versatility),内核与用户层的缓冲区在运行时能够被改变。packet.dll与wpcap.dll提供实现该功能的函数。

上一页  1 2 3 4 5 6 7 8  下一页

Tags:深度 剖析 WinPcap

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接