网上有很多讲解pktgen的文章,但总是不够全面细致,看完之后自己还是不会写pktgen测试脚本,为此本文对pktgen进行详细的阐述,让大家看完本文后能够自己动手写pktgen shell.

1.pktgen简介

pktgen是一个位于linux内核层的高性能网络测试工具,由瑞士皇家理工大学的TSlab实验室的Robert Olsson开发的(现在应该不在皇家理工了),主要用来测试网络驱动与网卡设备,支持多线程,能够产生随机mac地址、IP地址、UDP端口号的数据包,pktgen 的作者使用多CPU处理器在不同的PCI总线(pci 、pcie等总线)上用千兆以太网卡做过测试(pktgen的表现依赖于CPU处理速率、内存延时、pci总线速率等硬件参数),发送数据速率甚至可以大于10GBit/s。可见是可以满足大多数的网卡等测试需求。

pktgen的配置与统计信息查看都使用/proc文件系统完成,/proc文件系统是一种特殊的,有软件创建的文件系统,内核使用/proc文件系统向外界导出信息,外界也可以通过它配置内核态的一些进程的参数,如ps top uptime等linux发行版中的很多工具就是通过/proc实现的.在大多情况下,我们只用/proc读出数据(用于调试内核驱动等),而在pktgen中配置命令就用到了/proc的写入数据功能。

2.使用pktgen进行发包实验

现在版本的linux发行版大多加入了pktgen,使用以下命令加载pktgen模块:

然后你将在你的电脑的/proc/net/pktgen看到以下文件:

其中kpktgen_*的多少是根据你的CPU的个数决定的,如我的机子的CPU数目为4,则有四个此文件。

通过命令cat /proc/net/pktgen/pgctrl可以查看pktgen的版本等信息:

2.1使用pktgen一些需要注意的地方

1)中断亲和力

当使用某个线程(kpktgend_x)通过某个端口(ethx)发送(接受)数据时,我们应该把这个端口所对应的中断绑定到某一个CPU上,从而防止CPU的变动(操作系统引起的)导致CPU缓存的丢失。具体做法如下

首先,通过以下命令查看ethx所对应的中断,在这里我们以eth3为例

47: 45836 0 0 0 PCI-MSI-edge eth3-TxRx-0

48: 45836 0 0 0 PCI-MSI-edge eth3-TxRx-1

49: 45836 0 0 0 PCI-MSI-edge eth3-TxRx-2

50: 45836 0 0 0 PCI-MSI-edge eth3-TxRx-3

51: 0 0 0 0 PCI-MSI-edge eth3:lsc

由上可以看出eth3使用了五个中断号,为47-51,我们在这里将其都绑定在CPU0上

当然若你分开绑定的话,在大数据流的时候可以均摊CPU的负担,可能对最高性能有所提升,具体就不清楚了,这个应该还和Intel网卡的多队列相关了,有关分析有待进一步实验。

Robert测试结果说明,正确的中断亲和力绑定,对发送速率有60%的提升。

2)clone_skb:限制内存的分配(clone_skb应该只是复制skb的结构体,不复制数据区)

此部分还没有看懂,应该是跟cpu高速缓存相关,先放着,不懂并不影响后面的实验。

3)延时:减小发送速率

在发送一个数据包后延时一会,延时的单位是ns级,从而达到减小发送速率的目的。若延时时间大于发送时间,应该是可以通过此功能达到每秒发送特定数据包个数的效果,即安特定的频率发送数据包。

2.2搭建实验环境

1)实验拓扑如下

首先我们看下一个简单代码,对pktgen的shell 控制有个直观感受,你可以先试着看看此代码,也可以直接跳过,先看看下面的内容,然后再回过来看此代码

#!/bin/sh

# pktgen.conf -- Sample configuration for send on two devices on a UP system

#modprobe pktgen

if [[ `lsmod | grep pktgen` == "" ]];then

modprobe pktgen

fi

if [[ $1 == "" ]];then

pktsize=550

else

pktsize=$1

fi

function pgset() {

local result

echo $1 > $PGDEV

result=`cat $PGDEV | fgrep "Result: OK:"`

if [ "$result" = "" ]; then

cat $PGDEV | fgrep Result:

fi

}

function pg() {

echo inject > $PGDEV

cat $PGDEV

}

# On UP systems only one thread exists -- so just add devices

# We use eth1, eth1

echo "Adding devices to run".

PGDEV=/proc/net/pktgen/kpktgend_0

pgset "rem_device_all"

pgset "add_device eth1"

pgset "max_before_softirq 1"

# Configure the individual devices

echo "Configuring devices"

PGDEV=/proc/net/pktgen/eth1

pgset "clone_skb 1000"

pgset "pkt_size $pktsize"

pgset "src_mac 00:1B:21:90:4B:E4"

pgset "flag IPSRC_RND"

pgset "src_min 10.0.0.2"

pgset "src_max 10.0.0.255"

pgset "dst 10.0.0.1"

pgset "dst_mac 00:4E:46:31:30:00"

pgset "count 0"

# Time to run

PGDEV=/proc/net/pktgen/pgctrl

echo "pkgsize:$pktsize"

echo "Running... ctrl^C to stop"

pgset "start"

echo "Done"

2)pktgen所有命令解释如下

pktgen命令

Pktgen控制命令

start

所有的线程开始发送

stop

停止

线程的控制命令

add_device

添加某个端口到某个线程

rem_device_all

删除绑定在某个线程的所有端口

max_before_softirq

在最多发送多少个数据包后,执行do_softirq()

端口命令

debug

调试

clone_skb

对每个skb进行多少个复制,0表示不复制。对于Dos等测试必须至零

clear_counters

清空计数器,一般程序自动清空

pkt_size

链路包的大小(前去CRC的值)

min_pkt_size

数据包最小值

max_pkt_size

最大值

flags

包的分片数量?

count

发送数据包的个数,0 表示一直发送

delay

发送两个数据包之间的延时

dst

目的IP

dst_min

目的IP的最小值

dst_max

最大值

src_min

源IP最小值

src_max

最大值

dst6

目的IPv6地址

src6

源IPv6地址

dstmac

目的mac

srcmac

源mac

src_mac_count

源mac的数量,从srcmac设置的mac开始轮询

dst_mac_count

同上

udp_src_min

最小源udp端口号

udp_src_max

最大源udp端口号

udp_dst_min

最小目的udp端口号

udp_dst_max

最大目的udp端口号

flows

并发流的个数

flowlen

流的长度

Flags

IPSRC_RND

IPDST_RND

TXSIZE_RND

UDPSRC_RND

UDPDST_RND

MACSRC_RND

MACDST_RND

PSRC_RND 源IP随机发送

3)配置实例

通过/proc接口配置pktgen,首先为了方便起见定义两个配置函数

local result

echo $1 > $PGDEV

result=`cat $PGDEV | fgrep "Result: OK:"`

if [ "$result" = "" ]; then

cat $PGDEV | fgrep Result:

fi

}

function pg() {

echo inject > $PGDEV

cat $PGDEV

}

pktgen.conf-1 :在当CPU系统中将eth1 eth2 绑定到线程0,部分代码如下

PGDEV=/proc/net/pktgen/kpktgend_0

pgset "rem_device_all"

pgset "add_device eth1"

pgset "add_device eth2"

pktgen.conf-2: eth1使用线程0 eth2使用线程1发送,部分代码如下

PGDEV=/proc/net/pktgen/kpktgend_0

pgset "rem_device_all"

pgset "add_device eth1"

PGDEV=/proc/net/pktgen/kpktgend_1

pgset "rem_device_all"

pgset "add_device eth2"

pktgen.conf-3:在双cpu系统中 eth1 eth2都使用线程0发送,部分代码如下

pgset "rem_device_all"

pgset "add_device eth1"

pgset "add_device eth2"

PGDEV=/proc/net/pktgen/kpktgend_1

pgset "rem_device_all"

pktgen.conf-4:用于Dos测试的脚本,注意clone_skb 0,部分代码如下

PGDEV=/proc/net/pktgen/eth1

pgset "clone_skb 0"

pgset "flag IPDST_RND"

pgset "dst_min 10.0.0.0"

pgset "dst_max 10.255.255.255"

pktgen.conf-5:用于路由流测试的脚本,同样注意 clone_skb 0

pgset "clone_skb 0"

pgset "flag IPDST_RND"

pgset "dst_min 10.0.0.0"

pgset "dst_max 10.255.255.255"

#8k concurrent flows at 4 pkts

pgset "flows 8192"

pgset "flowlen 4"

最后贴一个比较复杂的脚本:

#

# Note! 10 devices

PGDEV=/proc/net/pktgen/kpktgend_0

pgset "rem_device_all"

pgset "add_device eth3"

pgset "add_device eth5"

pgset "add_device eth7"

pgset "add_device eth9"

pgset "add_device eth11"

pgset "max_before_softirq 10000"

PGDEV=/proc/net/pktgen/kpktgend_1

pgset "rem_device_all"

pgset "add_device eth2"

pgset "add_device eth4"

pgset "add_device eth6"

pgset "add_device eth8"

pgset "add_device eth10"

pgset "max_before_softirq 10000"

# Configure the individual devices

for i in 2 3 4 5 6 7 8 9 10 11

do

PGDEV=/proc/net/pktgen/eth$i

echo "Configuring $PGDEV"

pgset "clone_skb 500000"

pgset "min_pkt_size 60"

pgset "max_pkt_size 60"

pgset "dst 192.168.3.10$i"

pgset "dst_mac 01:02:03:04:05:0$i"

pgset "count 0"

done

echo "Running... CTRL-C to stop"

PGDEV=/proc/net/pktgen/pgctrl

pgset "start"

tail -2 /proc/net/pktgen/eth*

相关链接:

tmac v6设置中文_(转载)pktgen使用详细教程相关推荐

  1. tmac v6设置中文_给升级到10.6.8后无线BCM43xx不能用的解决办法

    昨天更新了10.6.8后出现了很多问题,如: 1,在菊花转完后出现的蓝色背景后就卡住几秒钟时间才能登陆,虽然10.6.8加快了启动速度,不过这个卡住就托慢了. 2,整个系统运行很卡,网卡和无线不能用( ...

  2. tmac v6设置中文_如何修改网络连接的网卡MAC物理地址

    识别修改后的网卡物理地址 通过命令"ipconfig /all "可以看到输出如下信息,其中 02-7D-B1-C5-2E-5D便是修改后的物理网卡地址 无线局域网适配器 无线网络 ...

  3. tmac v6设置中文_支持ipv6类型的ddos测试工具thc-ipv6

    官网地址 https://www.thc.org/thc-ipv6/ 下载 wget https://www.thc.org/releases/thc-ipv6-2.7.tar.gz 安装 [root ...

  4. tmac v6设置中文_Technitium MAC Address Changer(mac地址修改器) 免费版v6.0.7

    Technitium MAC Address Changer是一款用于更改变换机器MAC地址的软件.此软件能分析你的网络连接状态和使用的MAC地址,通过软件能将本机真实的MAC地址进行伪装,保护你的机 ...

  5. badboy设置中文_[转载]Badboy使用教程

    Badboy-系列教程-资料整理: Badboy自动化测试工具1界面介绍 http://leafwf.blog.51cto.com/872759/1107079 Badboy自动化测试工具2录制 ht ...

  6. 海尔微型计算机一键还原怎么操作,电脑的一键还原在哪_电脑一键还原详细教程_电脑一键还原怎么操作...

    电脑的一键还原在哪_电脑一键还原详细教程_电脑一键还原怎么操作 电脑的一键还原在哪?这个问题是很多小伙伴都想知道的,电脑是可以自己一键还原的,但是很多小伙伴都不太清楚,那么小编来告诉大家吧. (1)一 ...

  7. 计算机桌面锁定了没设密码怎么解锁,win7设置和取消锁屏密码详细教程 win7锁屏密码忘了怎么办...

    如果我们长时间没有点击电脑,那么电脑就会进入自动锁屏状态,如果我们不想在离开的时候其他用户使用电脑,那么我们可以设置锁屏密码,只有密码才可以登录桌面,那么在win7系统的电脑中怎么设置和取消锁屏密码吗 ...

  8. vm ubuntu设置中文_如何在本地Ubuntu Linux机器或VM上设置LAMP服务器

    vm ubuntu设置中文 The purpose of this brief guide is to take you through the process of setting up a LAM ...

  9. origin9语言设置中文_《英雄联盟手游》界面翻译图 LOL手游界面设置全翻译图一览...

    导读 英雄联盟手游开始抢先测试,虽然很遗憾没有抢到初始测试的资格,不过下载其他的不同服务器来玩,这样语言就会成为一些麻烦,而且目前无法修改中文设置,虽然对于老玩家来说,大概能懂什么意思,但是有中文更好 ...

最新文章

  1. Jquery页面加载效果
  2. Redisson框架快速入门
  3. LeetCode 第 26 场双周赛(363/1971,前18.4%)
  4. RocketMQ的安装与启动
  5. StringBuffer,StringBuilder区别是啥
  6. Rpc远程调用框架的设计与实现(2)
  7. Java中double类型四舍五入的方法总结
  8. java8 stream 多个_java8 stream两个集体交集、差集、并集操作
  9. Android实现语音识别代码
  10. Java中面向对象三大特性及其各自的用处
  11. 怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串
  12. 使用python print打印函数返回值多一个None的问题探究
  13. 山西民生云认证工资_山西民生云养老资格认证手机版-山西民生云社会保险综合服务平台v2.2 最新版-007游戏网...
  14. 南京邮电大学嵌入式系统开发实验5:嵌入式Linux下LED报警灯驱动设计及编程
  15. 计算机上安装的网络协议,怎么安装网络协议
  16. Volumes 数据卷管理
  17. stat驱动_由机器学习驱动的stat arb对冲基金
  18. 【机器学习】类不平衡 class-imbalance
  19. How to create HANA live report in Webclient ui
  20. php源码icloud,通过PHP的iCloud CalDAV

热门文章

  1. 基于STM32F767通过STM32CubeMX实现ModbusTCP从站(后续)
  2. iOS开发中自带的图标库
  3. 电子信息工程专业就业形势分析
  4. 关于PlatformIO开发 Arduino,自定义库的设置
  5. EXCEL必备工具箱--瞬间去除…
  6. 原码、反码、补码及补码转原码
  7. 华为内部考核尺度大曝光
  8. Java 遍历Map常见的五种方法
  9. UVA 516 Prime Land
  10. vs2019 android,VS2019无法安装Android SDK 28的问题