概述
最近项目需要,需要在千兆网下进行收包,带宽在800Mb左右,传统socket或者rawsocket很容易丢包,因而使用libpcap抓包。经测试,libpcap的接收速度远不如传统socket或者rawsocket,但是好处就是收包比较稳定,并没有丢包现象,据查,linux版本的libpcap是在应用层做的,内部使用的就是rawsocket(不知真假),怪不得时间那么慢。为了提示收取速度,引入pf_ring进行收包加速,过程略有些坑,特此记录。
下载pf_ring源码
源码链接
编译安装pf_ring内核
-
解压PF_RING-dev.zip;
-
cd PF_RING/kernel
-
make 生成 pf_ring.ko
-
sudo make install
-
insmod pf_ring.ko thansparent_mode=1 注意: thansparent_mode有三种模式, 越高的transparent_mod值,获得报文捕获的速度越快:
0: 缺省,不需要安装任何驱动, 利用标准的Linux接口接收报文, 任何驱动都能使用该模式. 1: 需要安装驱动. 2: 需要安装驱动, pfring以外程序抓不到数据包
安装 pf_ring 库
安装依赖
apt-get install flex bison
- cd PF_RING/userland/lib
- ./configure --prefix=/usr
- make;
- sudo make install
安装pf_ring网卡驱动
- 用ethtool查看你的网卡型号。如,ethtool -i eno1
- 卸载原网卡驱动:如,sodu rmmod e1000e
此时通过ifconfig -a已经查询不到这个网卡的信息了 - 进到驱动目录,driversintele1000ee1000e-3.4.0.2-zc
- make;
这里不make的话,下一步会提示make失败 - 进入源代码目录 src cd src/
- make 生成e1000e.ko文件
- sudo make install
此时提醒 无法在 catman 模式下对**** 写入 不用管它,继续下一步 - sodu insmod e1000e.ko 安装网卡驱动
- sodu modprobe e1000e 载入网卡驱动
通过 ifconfig -a 可以查看这个网卡的信息。
编译libpcap
查看是否安装了libpcap 如有,则卸载,如果源码make install安装,则在源码文件中进行 make uninstall
- rpm -qalibpcap // 查看安装的libpcap,如果有libpcap则强制卸载
编译源码内自带的libpcap1.8.1
-进入 cd userlandlibpcap
-
修改源码ring内核缓冲区设为10M ,默认2M
源代码:userland/libpcap/pcap-linux.c
函数:int activate_mmap(pcap_t*handle);代码片段: if(handle->opt.buffer_size == 0) { /* by defaultrequest 2M for the ring buffer */ handle->opt.buffer_size= 2*1024*1024; }
-
配置编译:
./configure --prefix=usr/
make -
sudo make install
测试
进入到userland/examples目录编译例子程序。
cd /userland/examples
make
./pfcount-i eno1 // 捕获eno1网口的数据报文使用pf_ring
./pcount –i eno1 // 捕获数据 没有使用pf_ring
使用
在应该程序中宏定义(这一步在makefile中加了 -DHAVE_PF_RING 时可以省略)
#define HAVE_PF_RING
最后
以上就是魁梧世界为你收集整理的在ubuntu16.04上利用pf_ring加速libpcap进行抓包,千兆网运行流畅,不丢包的全部内容,希望文章能够帮你解决在ubuntu16.04上利用pf_ring加速libpcap进行抓包,千兆网运行流畅,不丢包所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复