在进行网络开发中,我们经常会通过抓包来定位分析问题,在不使用DPDK的情况下,Linux系统通常用tcpdump,windows用wireshark,但是如果我们使用了DPDK来收包,就无法用这两个工具来抓包了。
这个时候我们需要用DPDK对应的抓包工具,DPDK自带有两个抓包工具,分别是dpdk-pdump和dpdk-dumpcap,dpdk-pdump功能太简单,不支持按条件过滤报文,所以这里我们重点讲一下dpdk-dumpcap的用法。
前面的文章DPDK的源码编译安装已经讲过DPDK的源码安装方法,DPDK安装好后,dpdk-dumpcap也在系统上安装好了。
需要说明的是,DPDK有primary和second进程的说法,dpdk-dumpcap属于second进程,在抓包之前,必须先启动一个primary进程进行收包才行,primary进程可以使用前面提到过的dpdk-testpmd。
可以先使用dpdk-dumpcap -h查看帮助信息:

业务口抓包工具使用dpdk-dumpcap,参数说明如下:
|   选项  |   说明  |   示例  | 
|   -i  |   指定抓包网口,使用网口的pcie地址  |   '*': 表示所有业务网口 0000:01:00.1: 某个网口的pcie地址 可以用过指定多个-i参数来抓取多个网口的报文,例如:-i 0000:01:00.0 -i 0000:02:00.0  | 
|   -f  |   指定ip、port和协议等过滤条件 支持条件或或者条件与  |   源ip: src host 1.1.1.1 或 src host 1111::1 源端口: src port 5000 目的ip: dst host 2.2.2.2 或 dst host 2222::2 目的端口:dst port 80 协议: 如果是all,不用指定;如果是ipv6,ip,tcp和udp,分别指定ip6, ip,tcp,udp 条件与: and 条件或: ||  | 
|   -D  |   列出所有网卡的pcie地址  |   0. 0000:0b:00.0 1. 0000:13:00.0  | 
|   -c  |   指定抓包个数  | |
|   -a  |   自动结束条件  |   duration:10, 抓包10秒钟后自动结束抓包 filesize:100, 抓包文件达到100KB后自动结束抓包 packets: 1000, 抓包1000个报文后自动结束抓包  | 
|   -w  |   指定抓包的文件名称  |   例如1.pcap  | 
|   -v  |   显示版本号  |   dpdk-dumpcap 1.0 (DPDK 21.11.0)  | 
|   -n  |   使用pcapng格式保存抓包文件  |   pcapng格式的文件可以看到每个报文的网口id和队列id  | 
例如,抓取所有网卡上源ip为1.1.1.1,目的ip为2.2.2.2,源端口为5000,目的端口为80,协议为udp的1000个报文保存到1.pcap文件中,抓包命令为:
dpdk-dumpcap -i '*' -f "src host 1.1.1.1 and src port 5000 and dst host 2.2.2.2 and dst port 80 and udp" -c 1000 -w 1.pcap
需要说明的是,如果想要按方向来抓包,需要修改dumpcap的源码,在抓包的时候指定是抓收包方向还是发包方向的报文。
好了,关于dumpcap抓包工具的使用方法就讲到这里了。


















