1-3 mininet中使用python API直接拓扑定义以及启动方式对比

作为SDN网络中搭建拓扑非常重要的仿真平台,我们可以使用mininet默认的库内拓扑文件,也可以使用python语言进行自定义拓扑。使用python进行拓扑定义时,不同的定义方式将导致其启动的方式由所不同。
一、采用最原始的命令启动方式:
sudo mn --custom <custom_example.py> --topo mytopo
sudo mn --custom <custom_example.py> --topo mytopo 的意思是,以超级用户权限运行 Mininet 命令行工具,使用自定义拓扑文件 <custom_example.py> 来创建一个名为 mytopo 的拓扑,例如官网中的
脚本例子(官网)topo_3.py:

"""Custom topology exampleTwo directly connected switches plus a host for each switch:host --- switch --- switch --- hostAdding the 'topos' dict with a key/value pair to generate our newly defined
topology enables one to pass in '--topo=mytopo' from the command line.
"""from mininet.topo import Topoclass MyTopo( Topo ): # 用类继承的方式定义"Simple topology example."def build( self ):"Create custom topo."# Add hosts and switchesleftHost = self.addHost( 'h1' )rightHost = self.addHost( 'h2' )leftSwitch = self.addSwitch( 's3' )rightSwitch = self.addSwitch( 's4' )# Add linksself.addLink( leftHost, leftSwitch )self.addLink( leftSwitch, rightSwitch )self.addLink( rightSwitch, rightHost )topos = { 'mytopo1': ( lambda: MyTopo() ) }  

在这个示例代码中,定义了继承自Topo的自定义拓扑类 MyTopo。最后的topos字典中定义相应的键值对,其中键是拓扑的名称,而值是一个函数。这个函数就是执行创建拓扑对象。在sudo mn 中使用mytopo1拓扑时,Mininet会调用lambda函数来创建MyTopo对象,并使用该对象来构建网络。如图1
在这里插入图片描述
图1 原始启动方式
二、使用简化的sudo mn方式启动
每次都调用 sudo mn --custom <custom_example.py> --topo mytopo 比较麻烦,可以将代码改为如下,使用 sudo mn --custom <custom_example.py>方
式,具体的命令修改如下topo_31.py:“”"Custom topology example


Two directly connected switches plus a host for each switch:host --- switch --- switch --- hostAdding the 'topos' dict with a key/value pair to generate our newly defined
topology enables one to pass in '--topo=mytopo' from the command line.
"""from mininet.topo import Topo
from mininet.net import Mininet  # 引入net模块class MyTopo( Topo ):"Simple topology example."def build( self ):"Create custom topo."# Add hosts and switchesleftHost = self.addHost( 'h1' )rightHost = self.addHost( 'h2' )leftSwitch = self.addSwitch( 's3' )rightSwitch = self.addSwitch( 's4' )# Add linksself.addLink( leftHost, leftSwitch )self.addLink( leftSwitch, rightSwitch )self.addLink( rightSwitch, rightHost )
#topos = { 'mytopo1': ( lambda: MyTopo() ) }
topo = MyTopo()  #
net = Mininet(topo)  #启动topo

因为在代码中已经把创建的拓扑传递给net模块,所以不用带–topo 参数,如下图在这里插入图片描述
上一篇博文1-2 Mininet启动参数以及应用实践我们价绍了使用python脚本定义拓扑,然后把定义好的拓扑py文件使用sudo mn --custom 拓扑文件 的方式进行启用。当然我们也可以直接使用python3 接口调用,当然我们需要在原来代码的基础上进行优化,如果直接改成python3 进行调用,会出错
在这里插入图片描述

三、 使用python代码创建mininet网络并直接进入mininet CLI
修改代码 topo_32.py


from mininet.topo import Topo
from mininet.net import Mininet
from mininet.cli import CLI #导入模块class MyTopology(Topo):def build(self):# 创建交换机switch = self.addSwitch('s1')# 创建主机host1 = self.addHost('h1')host2 = self.addHost('h2')# 创建链路self.addLink(host1, switch)self.addLink(host2, switch)topo = MyTopology()
net = Mininet(topo)
net.start() #会自动启用mininet内置的控制器
CLI(net)  #调用cli
net.stop()

在这里插入图片描述
这种采用python直接运行的方式,需要在代码中进行拓扑说明和mininet
中CLI函数启用(需要引入相应的模块)
值得注意的是,在遵循脚本语法规则的前提下,我们也可以直接用函数定义的方式进行(没有引用Topo类,使用net模块直接定义)
如:

#mininet_ovs_mac_0.py
from mininet.net import Mininet
from mininet.node import Controller, OVSSwitch
from mininet.cli import CLI
#from mininet.log import setLogLevel
def mininet_ovs_mac():net = Mininet(controller=Controller, switch=OVSSwitch)c0 = net.addController('c0')
# 添加三个交换机和三个主机s1 = net.addSwitch('s1')s2 = net.addSwitch('s2')h1 = net.addHost('h1',ip='10.0.0.10')h2= net.addHost('h2',ip='10.0.0.20')h3= net.addHost('h3',ip='10.0.0.30')
# 连接交换机和主机net.addLink(h1, s1,port2=1)net.addLink(h2, s2,port2=1)net.addLink(h3, s2,port2=2)
#net.addLink(h4, s3,port2=2) #s3用端口2与h4连接
# 连接交换机net.addLink(s1, s2,port1=4,port2=4)#s1的4端口与s2的4端口连接net.build()c0.start()s1.start([c0])s2.start([c0])#net.start()#以上四句启动的命令也可以直接用net.start(),表示一键启动net中的所有节点CLI(net)  #决定了使用python3启动 而不是使用mn启动,否则会嵌套mn出错net.stop()
if __name__ == '__main__':#setLogLevel('info')mininet_ovs_mac()

如果没有CLI(net),直接用python3启动则无法打开mininet CLI在这里插入图片描述
注意当在py代码中没有启用CLI(net)代码进行mininet CLI启用时,只能用 sudo mn --custom +py文件方式(如下图)
在这里插入图片描述
在这里插入图片描述

总结:
使用py编写的拓扑脚本依据代码中的模块调用不同,其对应的启动方式也不同:
1 在代码中对hosts,switchs,links网络拓扑的元素进行定义,没有对mininet的其他调用说明,则必须使用sudo mn --custom <custom_example.py> --topo mytopo1
2 使用Topo类定义的只是逻辑拓扑,仍需要把拓扑传递给net模块启动(分配资源运行),Topo类可以更加详细设计拓扑
3使用net创建的是直接运行的网络环境。
在这里插入图片描述

mininet拓扑的main class
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Python 视频转场特效处理笔记

本文参考Python-OpenCV 实现美图秀秀视频剪辑效果【特效】_opencv 多张图片 视频 特效-CSDN博客 最近研究了点python处理视频相关的东西&#xff0c;本文展示特效包括&#xff0c;竖向开幕/横向开幕&#xff0c;渐隐/渐显&#xff0c;推近/拉远&#xff0c;方形开幕&#xff0…

yolo层数连接

head [-1,6]连接的是第六层 [-1,4连接的是第四层

在虚拟机上完成Centos安装

Linux学习和使用 前言如何安装Centos初始化操作 使用VMware备份操作系统快照克隆 内容总结参考链接 本人介绍:2023年全国大学生数学建模竞赛国家二等奖,2022年蓝桥杯省二等奖,这里是一个和你一起不断努力,不断前进的程序猿一枚 前言 简单介绍一下本片文章将会讲到的内容:本章节…

大模型训练所需的硬件配置

1. 引入 训练一个大模型&#xff0c;到底需要投入多少块GPU&#xff0c;需要多少数据&#xff0c;训练多长时间能达到一个不错的效果&#xff1f; 本文引用靠谱的数据&#xff0c;来回答这些问题。 2. 全流程训练 大模型的训练&#xff0c;简单来说&#xff0c;分为Pretrain…

Peter算法小课堂—单调队列

祝大家新年快乐&#xff01; 今天这一次有点简单。 单调队列有两个要点&#xff0c;一个是单调&#xff0c;另一个就是我们的队列。 听到队列&#xff0c;我相信大家一定会想到它的好朋友BFS吧。但是……今天……可……没……那么……简单哦。 西佳佳偶像天团1 题目描述 …

第74讲Breadcrumb 面包屑实现

Breadcrumb 面包屑实现 为了实现二级路由&#xff0c;我们搞成搞个子路由&#xff0c;对于二级菜单 const routes [{path: /,name: 首页,component: () > import(../views/layout),redirect:/home,children:[{path: /home,name: 首页,component: () > import(../views…

vtkActor 设置特定图层 显示及置顶显示

问题&#xff0c;有时我们需要显示某个 Actor 在相机最前面&#xff0c;可以遮盖后面的物体;显示在顶层有点不准确&#xff1b;因为这个还相机位置也有关系&#xff1b; 这里讲三种情况&#xff1a; 1. 设置 Mapper 顶层&#xff0c;尝试了一下&#xff0c;可以用于某些场景&…

对话模型Demo解读(使用代码解读原理)

文章目录 前言一、数据加工二、模型搭建三、模型训练1、构建模型2、优化器与损失函数定义3、模型训练 四、模型推理五、所有Demo源码 前言 对话模型是一种人工智能技术&#xff0c;旨在使计算机能够像人类一样进行对话和交流。这种模型通常基于深度学习和自然语言处理技术&…

七、热身仪式(Warm-Up Rituals)

5.Warm Up Rituals 五、热身仪式 A warm up ritual is your per flight checklist you go through before you start focusing for a big session.It may be checking that you have water, that you don’t need to use the bathroom, that your phone is turned off or you’…

基于微信小程序的校园故障维修管理系统的研究与实现

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Sodinokibi(REvil)勒索病毒黑客组织攻击姿势全解

前言 2021年6月 11日&#xff0c;国外媒体 threatpost 发布文章宣称美国能源部 (DOE) 的分包商同时也是美国国家核安全局 (NNSA) 核武器开发合作商的 Sol Oriens 公司遭受到网络攻击&#xff0c;并且 Sol Oriens 公司人员已证实该公司于上月发现被勒索病毒攻击&#xff0c;而国…

Java图形化界面编程——组件绘图原理 笔记

2.8 绘图 ​ 很多程序如各种小游戏都需要在窗口中绘制各种图形&#xff0c;除此之外&#xff0c;即使在开发JavaEE项目时&#xff0c; 有 时候也必须"动态"地向客户 端生成各种图形、图表&#xff0c;比如 图形验证码、统计图等&#xff0c;这都需要利用AWT的绘图功…

深入理解Netty及核心组件使用—下

目录 ChannelHandler ChannelHandler 接口 ChannelInboundHandler 接口 ChannelHandler 的适配器 Handler 的共享和并发安全性 资源管理和 SimpleChannelInboundHandler Bootstrap ChannelInitializer ChannelOption ChannelHandler ChannelHandler 接口 从开发人员的…

重构利器:如何用 Immer 优雅地管理应用状态

1. immer immer 是一个 JavaScript 库,用于处理不可变数据的状态更新。不可变数据意味着一旦创建,数据结构就不能被修改。在编写复杂的应用程序时,不可变性可以带来一系列好处,比如更容易追踪数据的改变、更容易实现撤销/重做功能以及更简单的状态管理。 然而,处理不可变…

更新win11后无法上网

问题描述 系统提示可以更新win11了&#xff0c;然后我就想着更新一下试试。等了好久终于下载完了准备更新&#xff0c;结果提示更新失败&#xff0c;再次更新时下载到一半就停了&#xff0c;然后就发现连不上网了&#xff08;真服了&#xff0c;win11没更新成功&#xff0c;还…

MATLAB环境下一维时间序列信号的同步压缩小波包变换

时频分析相较于目前的时域、频域信号处理方法在分析时变信号方面&#xff0c;其主要优势在于可以同时提供时域和频域等多域信号信息&#xff0c;并清晰的刻画了频率随时间的变化规律&#xff0c;已被广泛用于医学工程、地震、雷达、生物及机械等领域。 线性时频分析方法是将信…

「C++ 类和对象篇 10」初始化列表

目录 一、什么是初始化列表&#xff1f; 二、为什么需要初始化列表&#xff1f; 三、初始化列表怎么使用&#xff1f; 3.1 在构造函数中使用初始化列表 3.2 注意 3.3 结论 3.4 应用场景 四、初始化列表的初始化顺序 五、另一种初始化成员变量的方法 【总结】 一、什么是初始化…

快速幂的应用

1.非递归的解法 #include <iostream> using namespace std; int main(){int a,b,c,t1;cin>>a>>b>>c;if(a>2&&a<1e3&&b>0&&a<1e7&&c>2&&c<1e5)for(int i0;i<b;i)tt*a%c;cout<<t;r…

Python算法题集_随机链表的复制

Python算法题集_随机链表的复制 题138&#xff1a;随机链表的复制1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【双层循环】2) 改进版一【字典哈希】3) 改进版二【单层哈希】4) 改进版三【递归大法】 4. 最优算法 本文为Python算法题集之一的…

Verilog刷题笔记24

题目&#xff1a; Verilog has a ternary conditional operator ( ? : ) much like C: (condition ? if_true : if_false) This can be used to choose one of two values based on condition (a mux!) on one line, without using an if-then inside a combinational alwa…