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

为什么要仿真随机路由?

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

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

使用用户界面生成路由时,可根据离散模型生成路由,但生成路由与现网路由相比,只注重路由段离散,未体现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_ip1Ipv4RouteCount = 0for y in range(BgpRouteBlock):mask = random.randint(MaskMin, MaskMax)if y == BgpRouteBlock-1:RouteCount = Ipv4RoutePerSession - Ipv4RouteCountelse:RouteCount = random.randint(Ipv4CountRandonMin, Ipv4CountRandonMax)Ipv4RouteCount = Ipv4RouteCount+RouteCountoffset = 32 - maskif 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 - Ipv6PrefixCountelse:RouteCount = random.randint(Ipv6CountRandonMin, Ipv6CountRandonMax)Ipv6PrefixCount = Ipv6PrefixCount + RouteCountoffset = 128 - maskif 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 = IPv6PrefixGeneratorIPv6Route = 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 += communitycommunity_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保证、确定性时延、业务感知、灵活业务路径调优的下一代网络保驾护航。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

think-on-graph: 基于知识图谱的大模型推理

概述 本文的研究背景是大规模语言模型在复杂推理任务中存在困难并展示了较低的性能,特别是在需要知识的追溯能力、及时性和准确性的场景中。 过去的方法主要面临两个问题:推理不负责任容易生成虚构或带有有害文本,以及模型在预训练阶段无法…

基于IPC-CFX的点对点通信C#

IPC-CFX有两种主要的通信方式,可以通过RabbitMQ发布和订阅,也可以通过request和response进行点对点的通信,本文主要讲的是点对点的通信方式。 在vscode里建立新的dotnet项目,可以通过终端输入dotnet new console来建立&#xff0c…

LCD—STM32液晶显示(2.使用FSMC模拟8080时序)

目录 使用STM32的FSMC模拟8080接口时序 FSMC简介 FSMC NOR/PSRAM中的模式B时序图 用FSMC模拟8080时序 重点:HADDR内部地址与FSMC地址信号线的转换(实现地址对齐) 使用STM32的FSMC模拟8080接口时序 ILI9341的8080通讯接口时序可以由STM32使…

北邮国院物联网 Microprocessor 微处理器笔记

Introduction-随便聊 嵌入式系统是什么?专用的计算机系统。为专门功能可能对计算机架构,外设等做出一些取舍。 通常的限制:Cost(比如大量部署传感器节点),Size and weight limits(特定应用场景…

配置Hadoop_0

配置Hadoop_0 1配置Hadoop100模板虚拟机1.1配置Hadoop100模板虚拟机硬件1.2配置Hadoop100模板虚拟机软件1.3配置Hadoop100模板虚拟机IP地址1.4配置Hadoop100模板虚拟机主机名称/主机名称映射1.5配置Hadoop100模板虚拟机远程操作工具 1配置Hadoop100模板虚拟机 Hadoop100 内存…

TRT4-trt-integrate - 1 YOLOV5导出、编译、推理

模型导出 修改Image的Input动态维度 首先可以看到这个模型导出的时候Input有三个维度都是动态,而我们之前说过只需要一个batch维度是动态,所以要在export的export onnx 进行修改,将 torch.onnx.export(model, im, f, verboseFalse, opset_ver…

华为云子网路由表作用及价值

子网路由表 子网路由表作用云专线、VPN的配置与子网路由表强关联,本质是在相应的子网路由表中添加了一条路由Nat路由表问题地址变更问题snat和dnat 子网路由表作用 子网内部作为一个二层网络,通过mac地址互通,不通过路由互通。跨子网&#x…

实时网络更改检测

未经授权的配置更改可能会对业务连续性造成严重破坏,这就是为什么使用实时更改检测来检测和跟踪更改是网络管理员的一项关键任务。尽管可以手动跟踪更改,但此方法往往非常耗时,并且通常会导致人为错误,例如在跟踪时错过关键网络设…

企业需要一个数字体验平台(DXP)吗?

数字体验平台是一个软件框架,通过与不同的业务系统喝解决方案集成,帮助企业和机构建立、管理和优化跨渠道的数字体验。帮助企业实现跨网站、电子邮件、移动应用、社交平台、电子商务站点、物联网设备、数字标牌、POS系统等传播内容,除了为其中…

文心一言 VS 讯飞星火 VS chatgpt (58)-- 算法导论6.4 2题

文心一言 VS 讯飞星火 VS chatgpt (58)-- 算法导论6.4 2题 二、试分析在使用下列循环不变量时,HEAPSORT 的正确性:在算法的第 2~5行 for 循环每次迭代开始时,子数组 A[1…i]是一个包含了数组A[1…n]中第i小元素的最大…

如果微信消息显示“已读”的话......

近日,一则 #如果微信显示已读的话# 话题冲上了微博热搜榜单。 “已读”是很多社交软件拥有的功能,如果对方接收并查看了消息,就会在消息上显示“已读”,但目前微信还没有推出这项功能。 对于“已读”功能,不少网友纷纷…

自动化用例编写思路 (使用pytest编写一个测试脚本)

目录 一,明确测试对象 二,编写测试用例 构造请求数据 封装测试代码 断言设置 三,执行脚本获取测试结果 四,总结 经过之前的学习铺垫,我们尝试着利用pytest框架编写一条接口自动化测试用例,来厘清接口…

【CNN记录】pytorch中BatchNorm2d

torch.nn.BatchNorm2d(num_features, eps1e-05, momentum0.1, affineTrue, track_running_statsTrue, deviceNone, dtypeNone) 功能:对输入的四维数组进行批量标准化处理(归一化) 计算公式如下: 对于所有的batch中样本的同一个ch…

商城-学习整理-基础-环境搭建(二)

目录 一、环境搭建1、安装linux虚拟机1)下载&安装 VirtualBox https://www.virtualbox.org/,要开启 CPU 虚拟化2)虚拟机的网络设置3)虚拟机允许使用账号密码登录4)VirtualBox冲突5)修改 linux 的 yum 源…

PyCharm 常用快捷键

目录 1、代码编辑快捷键 2、搜索/替换快捷键 3、代码运行快捷键 4、代码调试快捷键 5、应用搜索快捷键 6、代码重构快捷键 7、动态模块快捷键 8、导航快捷键 9、通用快捷键 1、代码编辑快捷键 序号快捷键作用1CTRLALTSPACE快速导入任意类2CTRLSHIFTENTER代码补全3SHI…

$.getScript()方法获取js文件

通过$.getScript(‘xxxx.js’)获取xxxx.js文件,这时的ajax是一个get请求的状态,如果进行了入参data的赋值那么他就会跟在url后面,同理获取json文件,css文件。 一开始没想起这茬。。。

曲师大2023大一新生排位赛-B.Sort题解

题目描述 插入排序是一种非常常见且简单的排序算法。王同学是一名大一的新生,今天许师哥刚刚在上课的时候讲了插入排序算法。 假设比较两个元素的时间为 ,则插入排序可以以 的时间复杂度完成长度为 n� 的数组的排序。不妨假设这 n 个数字分…

如何在PADS Logic中查找器件

PADS Logic提供类似于Windows的查找功能,可以进行器件的查找。 (1)在Logic设计界面中,将菜单显示中的“选择工具栏”进行打开,如图1所示,会弹出对应的“选择工具栏”的分栏菜单选项,如图2所示。…

IDE /字符串 /字符编码与文本文件(如cpp源代码文件)

文章目录 概述文本编辑器如何识别文件的编码格式优先推测使用了UTF-8编码?字符编码的BOM字节序标记重分析各文本编辑器下的测试效果Qt Creator的文本编辑器系统记事本VS的文本编辑器Notepad 编译器与代码文件的字符编码ANSI编码其他 概述 前期在整理 《IDE/VS项目属…

大数据存储架构详解:数据仓库、数据集市、数据湖、数据网格、湖仓一体

前言 本文隶属于专栏《大数据理论体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见大数据理论体系 思维导图 数据仓库 数据仓库是一个面向主题的&…