文档章节

TRex 学习(8)---- Stateless (API)

terry_hding
 terry_hding
发布于 2017/05/12 11:39
字数 1225
阅读 343
收藏 0

本文是TRex学习的最后一篇,之所以选择TRex,源于一个项目定制了‘DNS PROXY’功能,该功能主要是由DUT对来自客户端的DNS Query进行代理,并发送到指定的DNS Server上,这是一个代为转发的过程,如何测试该功能的性能成为了一个头大的问题,本文借助TRex试图解决这么一个难题。

Project Of DSLite

DSLite技术的本质是在IPv6的网络中部署IPv4-in-IPv6隧道完成IPv4的业务传输,而IPv6业务直接通过IPv6网络传输,由于DSLite在IPv6网络中不仅可以提供IPv4与IPv6双栈业务,而且可以提供IPv6单栈业务,随着IPv6业务增长,最终成为主流,因此它是当前IPv4演进到IPv6的最佳方案。

  • AFTR (DS-Lite Address Family Transition Router Element)该网元终结IPv4-in-IPv6隧道,并实现IPv4-IPv4 NAT业务
  • B4 (Base Bridging BroadBand Element) 该网元具备双栈功能以及向AFTR创建IPv4-in-IPv6 Tunnel

原理: 家庭网关在收到一个IPv4到IPv4的请求后,会在这个IPv4报文头部前加上一个IPv6报文头,IPv6报文头的源IPv6地址为家庭网关WAN连接的IPv6地址,目的IPv6地址则为AFTR IPv6地址,这样这个报文就可以在IPv6网络中传输了,当AFTR接收到这个报文后,会把IPv6报文头剥离掉,此时这个报文就是当初用户端主机发送的IPv4请求报文,该请求报文的源IPv4地址为用户端主机的IPv4地址,是一个由家庭网关分配的私网IPv4地址,既然家庭网关没有对这个私网IPv4地址进行转换,那么就需要AFTR服务器对这个私网IPv4地址进行转换,AFTR将私网IPv4地址转换为公网IPv4地址后发送到IPv4网络中,这样对端的IPv4服务器就能正常接收并处理这个报文了,而且还不知道这个报文其实已经穿越了IPv6网络了
问题:B4需要知道AFTR服务器的地址,它需要通过DHCPv6 Solicit报文中添加一个Option64字段请求AFTR的域名,DS-Lite服务器在Advertise报文中回复了AFTR的域名,此时B4还需要通过DNS解析到AFTR的IPv6地址。 输入图片说明
**解决方案:**DUT是B4, V4的客户端DNS Server也是v4的地址,而本端只有v6的DNS Server,没有v4的DNS Server, 此时就需要B4能够做DNS Proxy把v4的请求直接发到v6的DNS Server上进行解析,从而完成对AFTR的域 名解析,建立IPv4-in-IPv6 Tunnel, 这就是我们增加 DNS Proxy 的初衷

Requirement Of DNS Proxy Test Tool

  • 大量的DNS Query的域名要是有效的,且互不相同
  • 持续的以一定的速率进行发送
  • DNS Server可以指定

TRex Stateless Solution

  • 域名来自于文件
  • scapy 去构造不同的DNS Query包
  • Trex 来设定速率,以一定的速率持续发送,测试性能
  1 from trex_stl_lib.api import *
  2 from dns import *
  3 
  4 def get_dns_name():
  5 
  6     path = 'dns_list1.txt'
  7     dns_list = []
  8     fp = open(path)
  9     for line in fp.readlines():
 10         dns_list.append(line.strip())
 11     fp.close()
 12     return dns_list
 13 
 14 client = '16.0.0.13'
 15 server = '192.168.10.168'
 16 ether=Ether()
 17 ip=IP(src=client,dst=server)
 18 udp=UDP(sport=1529)
 19 
 20 dns_list = get_dns_name()
 21 
 22 streams = []
 23 for i in dns_list:
 24     pkt_base = Ether()/IP(src=client,dst=server)/UDP(sport=1045)/DNS(id=48,qd=DNSQR(qn
    ame=i))                   # 建立DNS查询包
 25     pkt=STLPktBuilder(pkt = pkt_base)                 #封装成TRex的包结构
 26     stream = STLStream(packet=pkt,mode = STLTXCont())    #建TRex流
 27     streams.append(stream)
 28 
 29 c = STLClient()
 30 
 31 try:
 32     # turn this on for some information
 33     #c.set_verbose("high")
 34 
 35   
 36 
 37     
 38 
 39 
 40     # connect to server
 41     c.connect()
 42 
 43     # prepare our ports
 44     c.reset(ports=[0])
 45 
 46     # add both streams to ports
 47     c.add_streams(streams, ports = [0])
 48 
 49     # clear the stats before injecting
 50     c.clear_stats()
 51 
 52     # here we multiply the traffic lineaer to whatever given in rate
 53     print("Running {:} on ports {:}, {:} for 10 seconds...".format(rate, port_a, port_
    b))
 54     c.start(ports = [0], mult = '1pps', duration = 10)
 55 
 56     # block until done
 57     c.wait_on_traffic(ports = [0])
 58 
 59     # read the stats after the test
 60     stats = c.get_stats()
 61 
 62     print(json.dumps(stats[port_a], indent = 4, separators=(',', ': '), sort_keys = Tr
    ue))
 63     print(json.dumps(stats[port_b], indent = 4, separators=(',', ': '), sort_keys = Tr
    ue))
 64 
 65     lost_a = stats[port_a]["opackets"] - stats[port_b]["ipackets"]
 66     lost_b = stats[port_b]["opackets"] - stats[port_a]["ipackets"]
 67 
 68     print("\npackets lost from {0} --> {1}:   {2} pkts".format(port_a, port_b, lost_a)
    )
 69     print("packets lost from {0} --> {1}:   {2} pkts".format(port_b, port_a, lost_b))
 70 
 71     if c.get_warnings():
 72         print("\n\n*** test had warnings ****\n\n")
 73         for w in c.get_warnings():
 74             print(w)
 75 
 76     if (lost_a == 0) and (lost_b == 0) and not c.get_warnings():
 77         passed = True
 78     else:
 79         passed = False
 80 
 81 except STLError as e:
 82     passed = False
 83     print(e)
 84 
 85 finally:
 86     c.disconnect()
 87 
 88 if passed:
 89     print("\nTest has passed :-)\n")
 90 else:
 91     print("\nTest has failed :-(\n")

Result

输入图片说明

参考:

http://trex-tgn.cisco.com/trex/doc/trex_stateless.html

© 著作权归作者所有

terry_hding
粉丝 38
博文 133
码字总数 139248
作品 0
杨浦
QA/测试工程师
私信 提问
trex发包时,执行stateful发包命令系统报错。

@terry_hding 你好,想跟你请教个问题: 你好,按照https://my.oschina.net/hding/blog/889441您这个链接中所述, 进行stateful发包,系统提示如下错误: root@Tester-SDN:/opt/trex/v2.28#...

段锦星
2017/10/18
110
2
TRex运行过程中,物理网卡找不到

@terry_hding 你好,想跟你请教个问题:在运行TRex进程时候,ifconfig中看不到物理网卡的信息。停掉进程也没有。只有重启系统才会出现。包括发包过程中抓包啊什么的都没法做。请教一下您,有...

段锦星
2017/07/25
68
1
如何实现一个允许中断/恢复传输的视频推流方案

关键是允许中断/恢复传输视频,所以我第一想法是使用fragment mp4. 方案是: 1. ffmpeg -f dshow -i ** -vcodec libx264 -acodec aac -f mp4 -movflags empty_moov+default_base_moof+frag_......

yk_cqq
2017/06/26
123
0
顶级 Linux 间谍木马潜伏多年,监控45国政府

近日卡巴斯基和赛门铁克的安全专家发现了一个极其隐秘的Linux间谍木马,专门窃取全球政府部门和重要行业的敏感数据。 最新发现的Linux间谍木马是卡巴斯基和赛门铁克今年8月份发现的高级持续攻...

oschina
2014/12/16
14.5K
80
MP4文件格式详解——结构概述

MP4文件格式详解(ISO-14496-12/14) 一、基本概念 1、 文件,由许多Box和FullBox组成。 2、 Box,每个Box由Header和Data组成。 3、 FullBox,是Box的扩展,Box结构的基础上在Header中增加8...

szfhy
2018/05/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

0.01-Win10安装linux子系统

一、安装Debian子系统 -1、控制面板设置: -1.1、打开“控制面板” —— “程序” —— “启用或关闭Windows功能” —— 勾选 “适用于Linux的Windows子系统” -2、设置: -2.1、打开“设置”...

静以修身2025
昨天
2
0
init 0-6 (启动级别:init 0,1,2,3,4,5,6)

启动级别: init 0,1,2,3,4,5,6 这是个很久的知识点了,只是自己一直都迷迷糊糊的,今天在翻出来好好理解下。。 0: 停机 1:单用户形式,只root进行维护 2:多用户,不能使用net file system...

圣洁之子
昨天
2
0
Android Camera HAL浅析

1、Camera成像原理介绍 Camera工作流程图 Camera的成像原理可以简单概括如下: 景物(SCENE)通过镜头(LENS)生成的光学图像投射到图像传感器(Sensor)表面上,然后转为电信号,经过A/D(模数转...

天王盖地虎626
昨天
2
0
聊聊Elasticsearch的ProcessProbe

序 本文主要研究一下Elasticsearch的ProcessProbe ProcessProbe elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/monitor/process/ProcessProbe.java public class ProcessProb......

go4it
昨天
3
0
mysql PL(procedure language)流程控制语句

在MySQL中,常见的过程式SQL语句可以用在存储体中。其中包括IF语句、CASE语句、LOOP语句、WHILE语句、ITERATE语句和LEAVE语句,它们可以进行流程控制。 IF语句相当于Java中的if()...else if(...

edison_kwok
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部