深度剖析WinPcap之(十)——数据包的内核过滤(1)

本文转自 http://eslxf.blog.51cto.com/918801/226693

 

WinPcap最强大的特性之一,就是拥有过滤数据包的引擎。它提供非常有效的方法去获取网络流量中的某些数据包,这也是WinPcap捕获机制中的一个重要组成部分。WinPcap的过滤引擎直接源自BSD Packet Filter (BPF),所以WinPcap的过滤机制与BPF的过滤机制类似。本章涉及理解WinPcap过滤机制所需的必要知识、包含具体的使用实例与WinPcap相关的实现细节。
                               图10-1函数调用关系

1.1. 基础知识

进行网络监控的程序具有各自的目的,所期望的数据包类型也不尽同,在绝大多数情况都只需要所有数据包的一(小)部分。例如:对邮件系统进行监控可能只需要端口号为25smtp)和 110pop3)  TCP 数据包,对 DNS 系统进行监控就只需要端口号为53UDP数据包。包过滤机制的引入就是为了解决上述问题,用户程序只需简单的设置一系列过滤条件,最终便能获得满足条件的数据包。
包过滤操作可以在用户空间执行,也可以在内核空间执行。数据包从内核空间拷贝到用户空间的开销很大,所以如果能够在内核空间进行过滤,会极大的提高数据包的捕获性能。在内核中进行过滤的优势在低速网络下表现并不明显,但在高速网络下是非常突出的。在理论研究和实际应用中,包捕获和包过滤从语意上并没有严格的区分,关键在于需要认识到捕获数据包必然有过滤操作。所以基本上可以认为,包过滤机制在包捕获机制中占中心地位。
包过滤机制在具体实现上与数据包的协议类型并无多大关系,它只是把数据包简单的看成一个字节数组,而谓词判断会根据具体的协议映射到数组特定位置的值。如判断ARP类型数据包,只需要判断数组中第 1314 个字节(以太网头中的数据包类型)是否为 0X0806。从理论研究上看,包过滤机制是一个数学问题,或者说是一个算法问题,其中心任务是如何使用最少的判断操作、最少的时间完成过滤处理,以提高过滤效率。
下面介绍理解WinPcap数据包过滤实现机制所必需的一些基础知识。本节难度较大,可首先粗略的浏览一下,看完本章之后再回过头来仔细阅读。

1.1.1.      flexbison的简介

一般语言的编译器在处理语言时,通常分为词法分析和语法分析两个阶段。词法分析阶段识别低级对象如数、操作符及特殊符号;语法分析阶段识别高级对象,如程序设计语言中的语句。无论是词法分析还是语法分析程序,用手工去编写程序都是十分繁琐的。因此在UNIX系统与类UNIX系统中,都提供了lex (lexical analyzer)yacc (Yet another Compiler Compiler)等软件工具。使用这些工具,不仅可以大大地简化词法分析和语法分析程序的开发工作,还可以帮助用户完成许多其它任务。GNU [1] 工程的lexyacc的替换版本为flexbison,同时这个版本也可以在win32平台上与Microsoft Visual Studio C++结合使用。
flex  和 bison 的功能非常强大,非常适合开发词法和语法解析器,尤其是语言编译器和解释器。
1.1.1.1.  flexbison的程序格式   
flex 程序分为三个段:第一段是Cflex的全局声明,第二段包括规则,第三段是补充的C函数。例如,第三段中一般都有main函数。这些段以%%来分界。flex的程序结构是:<定义段><规则段><子程序段><定义段>的内容主要包括C语言说明:括在%1%}之间的内容为C语言说明,所有C语言的说明语句和预处理语句都可以放在这一部分中,flex将把%《和%}之间的内容不加改变地抄写到它所生成的词法分析程序之中去。标识符定义:flex用标识符给某些重复出现次数较多的正则表达式命名,而在需要使用它们的地方代之以相应的标识符。开始状态说明:flex中提供了一种称为开始状态的机制,以解决左文相关问题。<规则段>中每一条规则都可分为正则表达式部分和C程序或动作部分。当输人流中出现与正则表达式相匹配的字符串时,就执行后面的动作。为了便于描述词法分析程序的动作,flex还提供了许多变量、子程序和宏替换供用户使用,详细可以参见用户手册阎。在<子程序段>,可以定义词法分析程序所需的各类过程和函数,比如主程序mainO或函数YYh'i'aP O。子程序段里的内容由flex原封不动复制到它所生成的词法分析程序里面。
bison 源程序结构也由<说明段><规则段><子程序段>三部分组成。<规则段>由一条或多条规则所组成,不包含任何规则的<规则段>是不合法的。每条规则以分号结尾。在逻辑上一条规则可分为两部分,一部分是一条巴科斯范式(BNF),另部分是一段C程序,称为一个动作。当从词法分析程序得来的单词序列可按某个BNF进行归约时,就可执行与该BNF相对应的动作。<说明段>中的说明有两类:一类是C程序说明;另一类是bison说明。C程序说明必须用配对的%{%}括在一起,它们将原封不动地复制到bison所生成的语法分析程序之中去。bison说明有多种,关键字%token的作用是说明终结符,没有在%token语句中出现的标识符都被认为是非终结符,每个非终结符必须至少在产生式的左部出现一次。在所有非终结符中,描述最一般结构的产生式左部非终结符,被称为开始符。%right , %left%nonassoc的作用是说明算符的结合性,以解决语法的二义性问题。在<子程序段>里,用户可以自己所需的各种子程序,比如说错误处理程序yyerror。子程序中的内容都会被bison如实地复制到bison所生成的语法分析程序之中去。


[1]  GNU ( Gnu's Not UNIX)项目,Stallman1983年创建,是自由软件基金会的工程,主要工作是创建开放源代码的类UNIX操作系统及其应用软件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值