Linux内核pktgen使用
本文最后更新于:2023年9月21日 下午
内核pktgen使用
什么是pktgen
pktgen 是一款 Linux 发包工具,可在内核高速发包。由于pktgen是内核内置的,使用内核空间,所以它可以达到高带宽、高发包速率,以此更好地测试路由器、交换机和其他网络设备。
一旦加载pktgen模块后,会自动为每一个CPU创建一个内核线程[1],并将该线程绑定在对应的CPU上。与此同时,在/proc/net/pktgen/目录下,为每一个线程创建一个kpktgend_X文件(其中的X为CPU编号),用来控制和监控这些线程,以及一个pgctrl文件,用来控制pktgen程序。当卸载pktgen模块时,/proc/net/pktgen文件夹会被自动删除。
同时,当将某个网卡绑定在某个线程时,也会在/proc/net/pktgen/目录下自动创建以该网卡名称为名的文件,用于记录此网卡设备的配置信息和运行信息。
测试程序可以配置成一直运行,或者在发送固定数量的包之后结束。也可以使用快捷键Ctrl+C终止运行。
使能 pktgen
使用pktgen需要在内核配置文件开启CONFIG_NET_PKTGEN,
内核在执行一下命令后:
1 | |
会在文件夹/proc/net/下创建一个pktgen文件夹
使用pktgen发包
在加载pktgen之后会在proc/net/pktgen下创建出如下几个文件:

添加设备
1 | |

设置报文
- 部分配置
1 | |

- 查看配置结果
1 | |

发送报文
1 | |
查看统计信息
1 | |

配置命令
控制命令
| 名称 | 含义 |
|---|---|
| start | 所有的线程开始发送 |
| stop | 停止 |
线程命令
| 名称 | 含义 |
|---|---|
| add_device | 添加某个端口到某个线程 |
| rem_device_all | 删除绑定在某个线程的所有端口 |
| max_before_softirq | 在最多发送多少个数据包后执行do_softirq() |
端口命令
| 名称 | 含义 |
|---|---|
| count | 发送数据包的个数,0 表示一直发送 |
| clone_skb | 对每个skb进行多少个复制,0表示不复制。对于Dos等测试必须至零 |
| debug | 调试 |
| frags | 数据包的片段数量 |
| delay | 发送两个数据包之间的延时 |
| src_mac_count | 源mac的数量,从src mac设置的mac开始轮询 |
| dst_mac_count | 目的mac的数量,从dst mac设置的mac开始轮询 |
| pkt_size | 链路包的大小(前去CRC的值) |
| min_pkt_size | 数据包最小值 |
| max_pkt_size | 数据包最大值 |
| udp_src_min | 最小源udp端口号 |
| udp_src_max | 最大源udp端口号 |
| udp_dst_min | 最小目的udp端口号 |
| udp_dst_max | 最大目的udp端口号 |
| flag IPSRC_RND TXSIZE_RND IPDST_RND UDPSRC_RND UDPDST_RND MACSRC_RND MACDST_RND |
PSRC_RND 源IP随机发送 |
| dst_min | 目的IP的最小值 |
| dst_max | 目的IP的最大值 |
| src_min | 源IP最小值 |
| src_max | 源IP最大值 |
| dst_mac | 目的mac |
| src_mac | 源mac |
| clear_counters | 清空计数器,一般程序自动清空 |
| dst6 | 目的IPv6地址 |
| src6 | 源IPv6地址 |
| flows | 并发流的个数 |
| flowlen | 流的长度 |
pktgen脚本
脚本实例
1 | |
执行结果

内核pktgen脚本
在仓库torvalds/linux/samples/pktgen中提供了多个pktgen的脚本例子,

脚本使用
1 | |

测试网络PPS性能指标,判断是否丢包
客户端安装pktgen来发包,接收端通过sar命令(linux系统)来查看端口统计信息,通过对比收发两端的速率来判断是否有丢包。

其他pktgen命令
查看版本
1 | |
查看kpktgend进程
1 | |
参考
pktgen | 孙勇峰的部落格 (sunyongfeng.com)
pktgen——the packet generator within linux kernel-CSDN博客
kernel.org/doc/Documentation/networking/pktgen.txt
networking:pktgen Wiki (linuxfoundation.org)
pktgen使用指南 - mrwuzs - 博客园 (cnblogs.com)
pktgen使用详细教程 - 可酷可乐 - 博客园 (cnblogs.com)
利用pktgen发包工具做性能测试_pktgen prbs_S100400507的博客-CSDN博客
network-testing/pktgen at master · netoptimizer/network-testing (github.com) pktgen测试脚本。
pktgen的使用 (jialeicui.github.io)
https://mp.weixin.qq.com/s/D7h2AnlrDrEGU_eGmWGXcA
↩