Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3785743
  • 博文数量: 880
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 6155
  • 用 户 组: 普通用户
  • 注册时间: 2016-11-11 09:12
个人简介

To be a better coder

文章分类

全部博文(880)

文章存档

2022年(5)

2021年(60)

2020年(175)

2019年(207)

2018年(210)

2017年(142)

2016年(81)

分类: LINUX

2019-08-10 16:54:21

[root@localhost /]# tcpdump --version
tcpdump version 4.6.2
libpcap version 1.6.2
OpenSSL 1.0.1k-fips 8 Jan 2015
[root@localhost /]# 

1.先创建socket,内核dev_add_packet()挂上自己的钩子函数

2.然后在钩子函数packet_recvmsg中,把skb放到自己的接收队列中,

3.接着系统调用recv取出skb来,把数据包skb->data拷贝到用户空间

4.最后关闭socket,内核dev_remove_packet()删除自己的钩子函数


 这个就是通过libpcap库来实现的,tcpdump调用libpcap的api函数,由libpcap进入到内核态到链路层来抓包,如下图。图中的BPF是过滤器,可以根据用户设置用于数据包过滤减少应用程序的数据包的包数和字节数从而提高性能。BufferQ是缓存供应用程序读取的数据包。我们可以说tcpdump底层原理其实就是libpcap的实现原理。



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