[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测试需求.

看来... 只能自己写一个了...

原文地址:https://www.cnblogs.com/hugetong/p/9056925.html