如何使用自动化构造随机路由模型

为什么要仿真随机路由?

路由器测试中,为了最大程度还原现网路由情况,评估路由器在现网环境下稳定工作各项指标,需要对导入路由进行离散仿真,目前路由仿真可分为导入路由与生成路由两种方式,导入路由需要现网路由表导入,本文讨论重点为生成路由方式。

自动化生成路由能解决什么问题?

使用用户界面生成路由时,可根据离散模型生成路由,但生成路由与现网路由相比,只注重路由段离散,未体现AsPath、Community等BGP路由参数离散,使用自动化生成路由可根据定义规则进行生成。

如何使用自动化生成随机路由

信而泰Renix平台提供了python API接口,可使用python API进行路由灵活定义。假设路由需求如下:配置Port口1个,包含20个IBGP,个IBGP通告10个路由段、共10wIPv4+10wIPv6路由,要求路由掩码随机选择,AsPath随机选择、Connmity随机选择。
本文选择基础API使用信而泰API(renix_py_api、MiscLibrary),不另做定义,使用时需安装相关环境。代码解析如下:

导入相关库

#!/usr/bin/python

-- coding: UTF-8 -

import time
from renix_py_api.renix import *
from MiscLibrary.base import *
import logging
import random
import re

初始化Python环境及定义参数

if name == ‘main’:
# 初始化环境
print(‘######################初始化环境######################’)
print(time.strftime(‘%Y-%m-%d %H:%M:%S’, time.localtime(time.time())))
###############################################################
api = MiscAPI()
initialize(log=True, log_level=logging.INFO, log_handle=LogHandle.LOG_FILE)
###############################################################
# 占用测试仪端口
chassis_DY = “10.1.1.7”
port_DY_1 = “//10.1.1.7/3/1”
# 路由起始地址
start_ip1 = “20.0.0.0”
start_ipv61 = “2023::”
#bgp路由参数
RgpSessionCount = 20
BgpRouteBlock = 10
BgpRouteBlockv6 = 10
ipv4routecount = 100000
ipv6routecount = 100000
#ipv4路由掩码
MaskMin = 20
MaskMax = 30
# ipv6路由掩码
PrefixMin = 80
PrefixMax = 120
# bgp as_path&community限制
AsPathMaxLength = 8
CommunityMaxLength = 8
###############################################################
#其它参数
Ipv4RoutePerSession = int(ipv4routecount / RgpSessionCount)
ipv6PrefixPerSession = int(ipv6routecount / RgpSessionCount)
Ipv4CountRandonMax = int(Ipv4RoutePerSession / BgpRouteBlock)
Ipv4CountRandonMin = int(Ipv4CountRandonMax * 0.5)
Ipv6CountRandonMax = int(ipv6PrefixPerSession / BgpRouteBlockv6)
Ipv6CountRandonMin = int(Ipv6CountRandonMax * 0.5)
print(‘######################初始化完成######################’)
print(time.strftime(‘%Y-%m-%d %H:%M:%S’, time.localtime(time.time())))

创建端口及映射机箱

print(‘#######################连接机箱#######################’)
print(time.strftime(‘%Y-%m-%d %H:%M:%S’, time.localtime(time.time())))
sys_entry = get_sys_entry()
sys_entry.edit(ProductType=1)
chassis = ConnectChassisCommand(chassis_DY)
# chassis.execute()
# 占用端口、端口上线
port_1 = Port(upper=sys_entry, Location=port_DY_1, name=‘port_1’)
# BringPortsOnlineCommand(PortList=[port_1.handle,port_2.handle]).execute()
print(‘######################连接成功!######################’)
print(time.strftime(‘%Y-%m-%d %H:%M:%S’, time.localtime(time.time())))
print(‘#######################创建IBGP#######################’)
print(time.strftime(‘%Y-%m-%d %H:%M:%S’, time.localtime(time.time())))
# 参数生成器定义
GeneratorRouteridv4 = api.address_modifier(Start=r’192.168.0.1’, Step=1, Count=1000, Offset=0)
GeneratorRouteridv6 = api.address_modifier(Start=r’192:168::1’, Step=1, Count=1000, Offset=0)
GeneratorMacAddress = api.address_modifier(Start=r’00:10:94:00:00:01’, Step=1, Count=1000, Offset=0)
GeneratorIPv4Address = api.address_modifier(Start=r’10.0.0.2’, Step=1, Count=1000, Offset=8)
GeneratorIPv6Address = api.address_modifier(Start=r’2000::2’, Step=1, Count=1000, Offset=80)
#接口生成interface
for x in range(RgpSessionCount):
#接口参数定义
Routeridv4 = api.generator_next(GeneratorRouteridv4)
Routeridv6 = api.generator_next(GeneratorRouteridv6)
MacAddr = api.generator_next(GeneratorMacAddress)
IPv4Addr = api.generator_next(GeneratorIPv4Address)
IPv6Addr = api.generator_next(GeneratorIPv6Address)
IPv4GWAddr = api.ipv4_address_hopping(IPv4Addr, Mask=32, Type=‘decrement’, Step=1)
IPv6GWAddr = api.ipv6_address_hopping(IPv6Addr, Mask=128, Type=‘decrement’, Step=1)
# 创建IPv4接口
interface = Interface(upper=port_1, RouterId = Routeridv4, Ipv6RouterId = Routeridv6)
Interface_temp = “Interface_” + str(x+1)
build_Dual = BuildInterfaceCommand(InterfaceList=Interface_temp, NetworkLayers=[‘eth’, ‘vlan’], TopLayers=[‘ipv4’, ‘ipv6’])
build_Dual.execute()
eth_layer = interface.get_children(‘EthIILayer’)[0]
eth_layer.edit(Address = MacAddr)
vlan_layer = interface.get_children(‘VlanLayer’)[0]
vlan_layer.edit(VlanId = x+1 )
ipv4_layer = interface.get_children(‘Ipv4Layer’)[0]
ipv4_layer.edit(Address = IPv4Addr , Gateway=IPv4GWAddr)
ipv6_layer = interface.get_children(‘Ipv6Layer’)[0]
ipv6_layer.edit(Address = IPv6Addr , Gateway=IPv6GWAddr)

创建BGP协议及路由

创建BGP协议

    BgpSession = BgpProtocolConfig(upper=port_1)
    BgpSession.edit(AsNumber=65000)
    BgpSession.edit(DutAsNumber=65000)
    BgpSession.edit(UseGatewayAsDutIp=False)
    BgpSession.edit(DutIpv4Address=IPv4GWAddr)
    BgpSession.edit(DutIpv6Address=IPv6GWAddr)
    # 绑定Dual接口和协议
    select_interface = SelectInterfaceCommand(ProtocolList=[BgpSession.handle], InterfaceList=[interface.handle])
    select_interface.execute()
    # IPv4路由block创建
    FirstRoute = start_ip1
    Ipv4RouteCount = 0
    for y in range(BgpRouteBlock):
        mask = random.randint(MaskMin, MaskMax)
        if y == BgpRouteBlock-1:
            RouteCount = Ipv4RoutePerSession - Ipv4RouteCount
        else:
            RouteCount = random.randint(Ipv4CountRandonMin, Ipv4CountRandonMax)
        Ipv4RouteCount = Ipv4RouteCount+RouteCount
        offset = 32 - mask
        if x == 0 and y == 0:
            # bgp参数修改
            BgpRoute = BgpIpv4RoutepoolConfig(upper=BgpSession)
            BgpRoute.get()
            BgpRoute.edit(FirstRoute=FirstRoute)
            BgpRoute.edit(PrefixLength=mask)
            BgpRoute.edit(RouteCount=RouteCount)
            GeneratorIPv4Route = api.address_modifier(Start=FirstRoute, Step=RouteCount, Offset=offset, Count=1000)
            IPv4Route = api.generator_next(GeneratorIPv4Route)
            IPv4Route = api.generator_next(GeneratorIPv4Route)
        else:
            BgpRoute = BgpIpv4RoutepoolConfig(upper=BgpSession)

BgpRoute.get()
BgpRoute.edit(FirstRoute=IPv4Route)
BgpRoute.edit(PrefixLength=mask)
BgpRoute.edit(RouteCount=RouteCount)
Start = IPv4Route
GeneratorIPv4Route = api.address_modifier(Start=Start, Step=RouteCount, Offset=offset, Count=1000)
IPv4Route = api.generator_next(GeneratorIPv4Route)
IPv4Route = api.generator_next(GeneratorIPv4Route)
# bgp参数修改
as_path_length = random.randint(2, AsPathMaxLength)
community_length = random.randint(2, CommunityMaxLength)
as_path_list = list()
community_list = list()
AsPathIncrement_list = list()
as_path_tem = str()
community_tem = str()
communityIncrement_list = list()
for z in range(as_path_length):
as_path = random.randint(300, 64000)
as_path_list.append(as_path)
for z in range(community_length):
community1 = random.randint(1, 65535)
community2 = random.randint(1, 65535)
community = str(community1) + ‘:’ + str(community2)
community_list.append(community)
for i in range(len(community_list) - 1):
community = community_list[i]
community_tem += community
community_tem += ‘,’
community_tem += str(community_list[-1])
AsPathPerBlockCount = int(RouteCount / 6.5)
for z in range(len(as_path_list)):
AsPathIncrement_list.append(1)
for z in range(len(community_list)):
Temp = str(1) + ‘:’ + str(1)
communityIncrement_list.append(Temp)
BgpRoute.edit(AsPath=as_path_list)
BgpRoute.edit(AsPathIncrement=AsPathIncrement_list)
BgpRoute.edit(AsPathPerBlockCount=AsPathPerBlockCount)
BgpRoute.edit(Community=community_tem)
BgpRoute.edit(CommunityIncrement=communityIncrement_list)
BgpRoute.edit(CommunityPerBlockCount=AsPathPerBlockCount)
# IPv6路由block创建
FirstPrefix = start_ipv61
Ipv6PrefixCount = 0
for y in range(BgpRouteBlockv6):
mask = random.randint(PrefixMin, PrefixMax)

        if y == BgpRouteBlockv6 - 1:
            RouteCount = ipv6PrefixPerSession - Ipv6PrefixCount
        else:
            RouteCount = random.randint(Ipv6CountRandonMin, Ipv6CountRandonMax)
        Ipv6PrefixCount = Ipv6PrefixCount + RouteCount
        offset = 128 - mask
        if x == 0 and y == 0:
            # bgp参数修改
            BgpRoute = BgpIpv6RoutepoolConfig(upper=BgpSession)
            BgpRoute.get()
            BgpRoute.edit(FirstIpv6Route=FirstPrefix)
            BgpRoute.edit(PrefixLength=mask)
            BgpRoute.edit(RouteCount=RouteCount)
            GeneratorIPv6Route = api.address_modifier(Start=FirstPrefix, Step=RouteCount, Offset=offset, Count=1000)
            IPv6Prefix = api.generator_next(GeneratorIPv6Route)
            IPv6Prefix = api.generator_next(GeneratorIPv6Route)
              else:
            BgpRoute = BgpIpv6RoutepoolConfig(upper=BgpSession)
            BgpRoute.get()
            BgpRoute.edit(FirstIpv6Route=IPv6Prefix)
            BgpRoute.edit(PrefixLength=mask)
            BgpRoute.edit(RouteCount=RouteCount)
            Start = IPv6Prefix
            GeneratorIPv6Route = api.address_modifier(Start=Start, Step=RouteCount, Offset=offset, Count=1000)
            IPv6Prefix = api.generator_next(GeneratorIPv6Route)
            IPv6Prefix = api.generator_next(GeneratorIPv6Route)
            # bgp参数修改
        as_path_length = random.randint(2, AsPathMaxLength)
        community_length = random.randint(2, CommunityMaxLength)
        as_path_list = list()
        community_list = list()
        AsPathIncrement_list = list()
        as_path_tem = str()
        community_tem = str()
        communityIncrement_list = list()
        for z in range(as_path_length):
            as_path = random.randint(300, 64000)
            as_path_list.append(as_path)
        for z in range(community_length):
            community1 = random.randint(1, 65535)
            community2 = random.randint(1, 65535)
            community = str(community1) + ':' + str(community2)
            community_list.append(community)
        for i in range(len(community_list) - 1):
            community = community_list[i]
            community_tem += community
            community_tem += ','
        community_tem += str(community_list[-1])
        AsPathPerBlockCount = int(RouteCount / 6.5)
         for z in range(len(as_path_list)):
            AsPathIncrement_list.append(1)
        for z in range(len(community_list)):
            Temp = str(1) + ':' + str(1)
            communityIncrement_list.append(Temp)
        BgpRoute.edit(AsPath=as_path_list)
        BgpRoute.edit(AsPathIncrement=AsPathIncrement_list)
        BgpRoute.edit(AsPathPerBlockCount=AsPathPerBlockCount)
        BgpRoute.edit(Community=community_tem)
        BgpRoute.edit(CommunityIncrement=communityIncrement_list)
        BgpRoute.edit(CommunityPerBlockCount=AsPathPerBlockCount)
# Save the test case to D:\ as the name of bgp_random.xcfg
save_case = SaveTestCaseCommand(TestCase='D/:bgp_random.xcfg', ProductType=1)

随机路由生成测试

执行代码后,生成配置如下:

  • 接口参数:
    在这里插入图片描述
    在这里插入图片描述
  • BGP Session
    在这里插入图片描述
  • IPv4路由
    随机变化点:路由数量、路由前缀长度、AsPath、AsPath跳变步长、AsPath数量、Community、Community跳变步长、Community数量
    在这里插入图片描述
    在这里插入图片描述
  • IPv6路由
    随机变化点:路由数量、路由前缀长度、AsPath、AsPath跳变步长、AsPath数量、Community、Community跳变步长、Community数量
    在这里插入图片描述
    在这里插入图片描述

DarYu-X系列测试仪

DarYu-X系列高性能网络测试仪是信而泰推出的面向高端路由器等高端数通设备的测试产品,具有高性能、高密度、高速率等特点,配置信而泰基于PCT架构的新一代测试软件RENIX和X系列测试模块,可为提供路由哭喊组网测试解决方案,为建立一张高SLA保证、确定性时延、业务感知、灵活业务路径调优的下一代网络保驾护航。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/39860.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ceph对象存储和安装dashborad

一、ceph–RadosGW对象存储 数据不需要放置在目录层次结构中,而是存在于平面地址空间内的同一级别; 应用通过唯一地址来识别每个单独的数据对象; 每个对象可包含有助于检索的元数据; 在Ceph中的对象存储网关中,通过RESTful API在…

Stable Diffusion + EbSynth + ControlNet 解决生成视频闪烁

一、安装 1.1、安装ffmpeg 下载地址: 解压,配置环境变量 E:\AI\ffmpeg\bin 检查是否安装成功 1.2、安装SD的 EbSynth 插件 插件地址 https://github.com/s9roll7/ebsynth_utility 报错:ModuleNotFoundError: No module named extension…

降级npm后,出现xxx 不是内部或外部命令解决方法

比如我安装了anyproxy npm install anyproxy -g 之后在cmd中输入anyproxy 发现 anyproxy 不是内部或外部命令解决方法. 一般出现这样的问题原因是npm安装出现了问题,全局模块目录没有被添加到系统环境变量。 Windows用户检查下npm的目录是否加入了系统变量P…

短视频矩阵系统源码--开发实践

短视频矩阵系统源码开发技术: 1. 数据采集:使用Python的requests库进行数据爬取,使用Selenium模拟浏览器操作,解决抖音反爬虫机制。 2. 数据处理:使用Python的正则表达式、BeautifulSoup等库进行数据处理。 3. 关键…

【论文解读】2017 STGCN: Spatio-Temporal Graph Convolutional Networks

一、简介 使用历史速度数据预测未来时间的速度。同时用于序列学习的RNN(GRU、LSTM等)网络需要迭代训练,它引入了逐步累积的误差,并且RNN模型较难训练。为了解决以上问题,我们提出了新颖的深度学习框架STGCN,用于交通预测。 二、…

Unity 多相机 同屏显示

一 首先了解: 相机和Canvas 的渲染先后关系 什么是相机的渲染顺序? 答:简单理解就是 用毛刷 刷墙面,先刷的,会被后刷的 挡住 。 列如:相机01: 先渲染的大海,相机02:后…

如何使用DiskPart命令行格式化分区?

想要格式化磁盘分区,您可以使用磁盘管理工具,或在Windows文件资源管理器中右键单击驱动器并选择“格式化”。如果您更想使用命令行来格式化磁盘,那么Windows自带的DiskPart将是首选。 DiskPart有很多优点,例如,如果您想…

PyTorch 1.13简介

# 1.  PyTorch 1.13 据官方介绍,PyTorch 1.13 中包括了 BetterTransformer 的稳定版,且不再支持 CUDA 10.2 及 11.3,并完成了向 CUDA 11.6 及 11.7 的迁移。此外 Beta 版还增加了对 Apple M1 芯片及 functorch 的支持。 1.1 主要更新 Be…

Java虚拟机——字节码指令简介

Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码) 以及 跟随其后的零至多个代表此操作所需的参数(称为操作数)构成。大多数指令都不包括操作数,只有一个操作码,指令参数都存放…

【云原生】k8s安全机制

前言 Kubernetes 作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务。API Server 是集群内部各个组件通信的中介, 也是外部控制的入口。所以 Kubernetes 的安全机制基本就是围绕保护 API Server 来设计的。 比如 kubectl 如果想向 API…

记一次真实MySQL百万数据优化

证实下确实是150万+数据哈 原SQL 原SQL执行计划 原SQL执行时间 5秒左右 原SQL分析 思路来源 整体看下SQL好像没啥可优化的。那咱们就大错特错了。 可能有人会说B表为啥在A表后面不正常呀,因为这是内连接查询不是左右连接查询。A,B表的顺序是可以交换的(实测无影响) 首先我们…

JVM之内存与垃圾回收篇2

文章目录 3 运行时区域3.1 本地方法栈3.2 程序计数器3.3 方法区3.3.1 Hotspot中方法区的演进3.3.2 设置方法区内存大小3.3.3 运行时常量池3.3.4 方法区使用举例3.3.5 方法区的演进3.3.5 方法区的垃圾回收 3.4 栈3.4.1 几个面试题 3.5 堆3.5.1 Minor GC、Major GC和Full GC3.5.2…

linux之Ubuntu系列 find 、 ln 、 tar、apt 指令 软链接和硬链接 snap

查找文件 find 命令 功能非常强大,通常用来在 特定的目录下 搜索 符合条件的文件 find [path] -name “.txt” 记得要加 “ ” 支持通配符 ,正则表达式 包括子目录 ls 不包括 子目录 如果省略路径,表示 在当前路径下,搜索 软链接…

Python爬虫——urllib_微博cookie登陆

cookie登陆适用场景: 适用场景:数据采集的时候,需要绕过登陆,然后进入到某个页面 # 适用场景:数据采集的时候,需要绕过登陆,然后进入到某个页面 import urllib.requesturl https://weibo.cn/7…

Linux 学习记录52(ARM篇)

Linux 学习记录52(ARM篇) 本文目录 Linux 学习记录52(ARM篇)一、汇编语言相关语法1. 汇编语言的组成部分2. 汇编指令的类型3. 汇编指令的使用格式 二、基本数据处理指令1. 数据搬移指令(1. 格式(2. 指令码类型(3. 使用示例 2. 立即数(1. 一条指令的组成 3. 移位操作指令(1. 格式…

Revit中如何创建水的效果及基坑?

一、Revit中如何创建水的效果? 我们在创建建筑的时候会遇上小池塘啊小池子之类的装饰景观,Revit又不像专业的3D软件那样可以有非常真实的水的效果,那么我们该如何简单创建水呢?下面来看步骤: 1、 在水池位置创建一块楼板,并将该…

【DevOps】Atlassian插件开发指南

本文以Bamboo插件开发为例,记录一下插件开发过程。 一、简介 Atlassian Bamboo 6.9.1 是一款持续集成和持续交付(CI/CD)工具,支持使用插件扩展其功能。如果需要开发自己的 Bamboo 插件并添加到 Bamboo 中,则可以参考…

sqli-labs 堆叠注入 解析

打开网页首先判断闭合类型 说明为双引号闭合 我们可以使用单引号将其报错 先尝试判断回显位 可以看见输出回显位为2,3 尝试暴库爆表 这时候进行尝试堆叠注入,创造一张新表 ?id-1 union select 1,database(),group_concat(table_name) from informatio…

mac端好用的多功能音频软件 AVTouchBar for mac 3.0.7

AVTouchBar是来自触摸栏的视听播放器,将跳动笔记的内容带到触摸栏,触摸栏可显示有趣的音频内容,拥有更多乐趣,以一种有趣的方式播放音乐,该软件支持多种音频播放软件,可在Mac上自动更改音乐~ 音频选择-与内…

javascript实现久久乘法口诀表、document、write、console、log

文章目录 正序乘法口诀表倒序乘法口诀表logconsoledocumentwrite 正序乘法口诀表 function multiplicationTable() {for (let i 1; i < 9; i) {let val ;for (let j 1; j < i; j) {document.write(j * i (i * j) &nbsp );val ${j}*${i}${i * j} ;}consol…