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

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

  • 相关阅读:
    读书笔记:C++ Primer系列(10)—— 数组与指针(2)
    读书笔记:C++ Primer系列(9)—— 数组与指针(1)
    牛人博客
    读书笔记:C++ Primer系列(8)—— 标准库类型之bitset
    读书笔记:C++ Primer系列(7)—— 标准库类型之iterator
    读书笔记:C++ Primer系列(6)—— 标准库类型之vector
    读书笔记:C++ Primer系列(5)—— 标准库类型之string
    读书笔记:C++ Primer系列(4)—— 关于const限定符
    读书笔记:C++ Primer系列(3)—— 关于变量
    黑色半透明镂空遮罩指引效果实现jQuery小插件
  • 原文地址:https://www.cnblogs.com/hugetong/p/9056925.html
Copyright © 2020-2023  润新知