[dpdk] 使用pktgen生成tcp三次握手的测试流量
pktgen: http://dpdk.org/browse/apps/pktgen-dpdk/refs/
git clone git://dpdk.org/apps/pktgen-dpdk
pktgen doc:http://pktgen-dpdk.readthedocs.io/en/latest/
OS:Linux D128 3.10.0-693.el7.x86_64
OS2: Linux D129 3.10.0-327.el7.x86_64
dpdk: dpdk-stable-18.02.1/
pktgen: pktgen-3.5.0/
为了让彼此兼容,选了官网上最新的两个版本。
可以用:
lua脚本
或 seq命令
指定包序列,但是不能指定seq,ack等,所以还是无法模拟一个tcp握手过程。
http://pktgen-dpdk.readthedocs.io/en/latest/commands.html#runtime-options-and-commands
http://pktgen-dpdk.readthedocs.io/en/latest/lua.html#lua
tcpreplay:
http://tcpreplay.appneta.com/wiki/overview.html
可以用netmap驱动做高流量。
----------------------------------- update @ 20180602 ---------------------
Pktgen Ver: 3.5.1 (DPDK 18.05.0-rc6)
不指定core和端口map时,不好用
[root@D129 pktgen]# ./app/x86_64-native-linuxapp-gcc/pktgen -l1,2,3 --master-lcore 1 -- -m 2.0
查看seq:
Pktgen:/> page seq
加载seq,lua脚本
Pktgen:/> script /root/tong.lua
可以看见如下更新:
/ <Sequence Page> Copyright (c) <2010-2017>, Intel Corporation Port: 0, Sequence Count: 2 of 16 GTPu Seq: Dst MAC Src MAC Dst IP Src IP Port S/D Protocol:VLAN CoS ToS Size TEID * 0: 00:11:44:55:66:77 00:11:12:34:56:78 1.1.1.1 0.0.0.0/0 9999/80 IPv4/TCP:0001 5 6 128 0 * 1: 00:11:12:34:56:78 00:11:44:55:66:77 2.2.2.2 0.0.0.0/0 80/9999 IPv4/TCP:0001 5 6 128 0
tong.lua
[root@D129 ~]# cat tong.lua -- Lua uses '--' as comment to end of line read the -- manual for more comment options. local seq_table_0 = { -- entries can be in any order ["eth_dst_addr"] = "0011:4455:6677", ["eth_src_addr"] = "0011:1234:5678", ["ip_dst_addr"] = "1.1.1.1", ["ip_src_addr"] = "2.2.2.2", -- the 16 is the size of the mask value ["sport"] = 9999, -- Standard port numbers ["dport"] = 80, -- Standard port numbers ["ethType"] = "ipv4", -- ipv4|ipv6|vlan ["ipProto"] = "tcp", -- udp|tcp|icmp ["vlanid"] = 1, -- 1 - 4095 ["pktSize"] = 128, -- 64 - 1518 ["teid"] = 3, ["cos"] = 5, ["tos"] = 6 }; pktgen.seqTable(0, "0", seq_table_0 ); local seq_table_1 = { -- entries can be in any order ["eth_dst_addr"] = "0011:1234:5678", ["eth_src_addr"] = "0011:4455:6677", ["ip_dst_addr"] = "2.2.2.2", ["ip_src_addr"] = "1.1.1.1", -- the 16 is the size of the mask value ["sport"] = 80, -- Standard port numbers ["dport"] = 9999, -- Standard port numbers ["ethType"] = "ipv4", -- ipv4|ipv6|vlan ["ipProto"] = "tcp", -- udp|tcp|icmp ["vlanid"] = 1, -- 1 - 4095 ["pktSize"] = 128, -- 64 - 1518 ["teid"] = 3, ["cos"] = 5, ["tos"] = 6 }; pktgen.seqTable(1, "0", seq_table_1 ); pktgen.set("0", "seq_cnt", 2);
发包:
Pktgen:/> page main Pktgen:/> start 0
正常情况下,能正常的发出了包。
20:55:57.233082 IP 0.0.0.0.9999 > 1.1.1.1.80: Flags [.], seq 0:70, ack 1, win 8192, length 70: HTTP 20:55:57.233088 IP 0.0.0.0.9999 > 1.1.1.1.80: Flags [.], seq 0:70, ack 1, win 8192, length 70: HTTP 20:55:57.233094 IP 0.0.0.0.9999 > 1.1.1.1.80: Flags [.], seq 0:70, ack 1, win 8192, length 70: HTTP 20:55:57.233100 IP 0.0.0.0.80 > 2.2.2.2.9999: Flags [.], seq 0:70, ack 1, win 8192, length 70: HTTP
目的IP,与预期不符。
--------------------- update @ 20180603 ----------------------
配置方法二:
创建文件cfg/tong.cfg
[root@D129 pktgen]# cat cfg/tong.cfg setup = { 'devices' : ['00:04.0'], 'opts' : ['-b igb_uio'] } run = { 'app_name': 'pktgen', 'app_path': [ './app/%(target)s/%(app_name)s', '%(sdk)s/%(target)s/app/%(app_name)s', ], 'dpdk' : ( '-l 1,2', '--master-lcore 1', '-w 00:04.0' ), 'app' : ( '-T', '-m 2.0', '-f workspace/tong.lua' ), }
使用 脚本启动:
[root@D129 pktgen]# ./tools/dpdk-run.py tong
-------------------- update @ 2018-08-23 --------------
dpdk: git::v18.08
pktgen: git::vpktgen-3.5.2
1. make dpdk
2. make pktgen
3. run:
[root@T9 pktgen-dpdk.git]# ./tools/run.py tong
4. 使用pcap
修改配置文件:
[root@T9 pktgen-dpdk.git]# cat cfg/tong.cfg setup = { 'devices' : ['00:04.0'], 'opts' : ['-b igb_uio'] } run = { 'app_name': 'pktgen', 'app_path': [ './app/%(target)s/%(app_name)s', '%(sdk)s/%(target)s/app/%(app_name)s', ], 'dpdk' : ( '-l 1,2', '--master-lcore 1', '-w 00:04.0' ), 'app' : ( '-T', '-m 2.0', '-f tong.lua' # '-s 0:/root/80-client.pcap' ), 'misc': ( '-f', 'themes/black-yellow2.theme' ) }
这个时候,就可以把pcap中的包重放出来了.
5. random
执行命令:
Pktgen:/> enable 0 random Pktgen:/> set 0 rnd 1 26 111111111111xxxx
源IP被修改为了 255.255.255.xxx, xxx为随机数.
查看输出结果:
但是, 不能做基于流的修改....
------------------- update @ 2018-08-04 ----------------------
[tcpreplay] tcpreplay高级用法--使用tcpreplay-edit进行循环动态发包
即使netmap + tcpreplay-edit 也不能满足需求. 因为 --unique-ip 参数的做法是源IP加一, 目的IP减一. 当时不能保证目的IP不变. 也不满足我们的LB测试需求.
看来... 只能自己写一个了...