Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4464611
  • 博文数量: 1148
  • 博客积分: 25453
  • 博客等级: 上将
  • 技术积分: 11949
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-06 21:14
文章分类

全部博文(1148)

文章存档

2012年(15)

2011年(1078)

2010年(58)

分类: Mysql/postgreSQL

2011-08-13 13:41:47

    libpcap是unix/linux平台下的网络数据包捕获函数库。它是一个独立于系统的用户级数据包捕获API接口,为底层网络测试提供了一个可移植的框架。

1. 工作原理
 
     一个捕获机制包含3个主要部分,分别是面向底层的包捕获引擎、面向中间层的数据包过滤器、面向应用层的用户级接口。
  
     linux操作系统对于数据包的处理流程是从底到上得方式,依次经历网络接口卡、网卡驱动层、数据链路层、IP层、传输层、最后达到应用程序。

     而捕获机制是在数据链路层增加一个旁路处理,对发送和接收到的数据包通过linux内核做过滤/缓冲等处理,最后直接传递与上层应用程序进行交互。
 
     libpcap也是基于这种原理,libpcap的捕获机制并不影响linux操作系统中网络协议栈低数据包的处理。
 
     对应用程序而言,libpcap包捕获机制只是提供了一个统一的API接口,用户只需要按照相关的变成流程,简单的调用若干函数就可捕获感兴趣的数据包。

     具体来说,libpcap库主要由3部分组成,网络分接头、数据包过滤器和用户API。

    1. 网络分接头
    网络分接头Network Tap 是一种链路层旁路机制,负责采集网卡数据包
  
    2. 数据包过滤器
    数据包过滤器Packet Fillter是针对数据包的一种过滤机制,在libpcap中采用BPF(BSD Packet Filetr) 算法对数据包执行过滤操作,这种算法的基本思想是基于规则匹配,对于符合条件的数据包进行放行。

    3. 用户API
    用户API是libpcap面向上层应用程序提供的编程接口,用户通过相关的函数实现数据包的捕获或发送。

   libpcap的工作流程可描述为: 当一个数据包到达网卡时,libpcap利用创建的套接字从链路层驱动程序中获得 该数据包的拷贝,即旁路机制,同时通过Tap函数将数据包发给BPF过滤器。
    BPF过滤器根据用户已经定义好的过滤规则对数据包进行逐一匹配,若匹配成功则放入内核缓冲区,并传递给用户缓冲区,匹配失败则直接丢弃。如果没有设置过滤匹配,所有数据包都将放入内核缓冲区,并传递给用户缓冲区。


 



2. 抓包流程


    编程流程

1. 网络设备查找
   网络设备查找的目的是发现可用的网卡,他的实现是 pcap_lookupdev() ,如果当前有多个网卡,它会返回一个网络设备名指针列表。

2. 打开网络设备
   利用第一步的返回值,用户可以决定libpcap使用哪个网卡,当然打开这个网络设备的函数是 pcap_open_live() 它返回用于捕获网络数据包的数据包捕获描述字。对于此网络设备的任何操作都要基于这个描述字。

3. 获得网络参数
   利用 pcap_lokkupnet()函数,可以获得指定网络设备的IP地址和子网掩码,当然这个步骤并不是必须得,但为了显示的完整性,有时还是需要标记这些参数。

4. 编译过滤策略
   libpcap 的一个功能是提供数据包过滤,即只采集符合规则的数据包,此项功能由函数pcap_compile() 实现,这个函数的功能时将用户指定的过滤策略编译到过滤程序中。

5. 设置过滤器
   这是上个步骤的继续,pacp_setfilter() 函数用于设置第4步配置好的过滤器,当然要注明一点,步骤4和5不是必须得,如果不采用过滤,意味着程序会抓取所有的网络数据包。

6. 利用回调函数捕获数据包。
   libpcap提供的一种回调的机制是获得数据包,可以采用pcap_loop()  和 pcap_dispatch() 函数来抓取数据包,当然也可以利用pcap_next()  和 pacp_next_ex()函数完成同样的工作。
    若数据包捕获到后,应用程序可以采用相应的方式进行数据包解析,分析其中感兴趣的信息,当然分析工作往往是整个程序的关键。

7. 关闭网络设备
    当应用程序工作完毕时,可以调用pcap_close()函数关闭网络设备,释放资源

             设备查找
                、
             设备打开
             
             参数读取
  
             规则编译
      
              过滤器设置
 
             数据包到来

             数据包分析


            关闭设备


阅读(2086) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~