2013年(1)
分类: LINUX
2013-06-01 14:09:36
原文地址:linux下的数据报文截获机制(转载) 作者:wwm
很多数据包截获软件都使用特定的库,在windows下一般使用winpcap,而在linux和unix下一般都选用libpcap,使用这些库能在一定程度上减少工作量,加快程序的进程,但往往容易忽略了一些本质的东西,例如libpcap又是怎样来截获数据报文的。
分析和了解数据报文截获的机制对于了解如何才能截获到无线网络的管理报文有着重要的意义。
通常的数据报文是如何被处理的呢?如图3-1所示。当数据到达网卡时,网卡就把数据交给网卡的驱动程序,当驱动程序处理完数据时就把经过处理的数据交给上层的协议栈,当然也会丢弃一部分,上层一般是操作系统内核的一部分。
图3-1
要截获到MAC层的数据报文就必须尽可能早的截获数据,也就是在尽可能在底层截获数据报文。
Linux和unix系统提供了一种称为Packet filter的服务,它可以用来截获数据报文,它是作为内核的一部分存在的,它的层次及工作方式如图3-2所示。
图3-2
没有程序使用Packet filter时,数据还是像图3-1那样由驱动程序传给协议栈,而当有程序使用Packet filter时,情况则会不同。驱动程序首先将数据报文拷贝给Packet filter,然后Packet filter经过程序定义的过滤方式将不需要的数据报文过滤掉,然后将报文放到应用程序的缓冲区中,这时截获数据报文的应用程序就完成了报文截获的工作。随后驱动程序再进行正常的处理,将数据报文传给协议栈。这就是Packet filter的工作原理。
不同的操作系统提供了不同Packet filter。
BSD系统:BPF(Berkeley Packet Filter)
Solaris: DLPI(Data Link Provider Interface)
Linux: LSF(Linux Socket filter)
不同Packet filter的实现细节都不相同,但是大致的工作原理是相同的。
要截获数据报文,可以编写应用程序使用Packet filter,但是由于不用操作系统上的Packet filter又有差别,因此想要编写的应用程序能在不同操作系统上使用,就必须对不同Packet filter进行识别并使用。
Libpcap是一个在linux和unix操作系统下被广泛使用的数据报文截获的库,他被大量有名的软件所使用,例如tcpdump,ethereal等等。那它又是如何工作的呢?
Libpcap能识别不同操作系统的不同Packet filter,并正确的使用它们,而它向上提供了一个统一的接口让应用程序调用。他类似于一个抽象层,让应用程序可以无视底层的Packet filter而只要使用统一的接口就可以实现数据报文截获,做到了操作系统无关性。分析到这里也就可以知道linux和unix下基于libcap的数据报文截获工具本质上是使用了Packet filter来完成数据报文截获功能的,Ethereal也不例外。