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

news2024/9/22 5:04:58

作为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 example

Two directly connected switches plus a host for each switch:

 host --- switch --- switch --- host

Adding 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

class MyTopo( Topo ): # 用类继承的方式定义
  "Simple topology example."

  def build( self ):
      "Create custom topo."

      # Add hosts and switches
      leftHost = self.addHost( 'h1' )
      rightHost = self.addHost( 'h2' )
      leftSwitch = self.addSwitch( 's3' )
      rightSwitch = self.addSwitch( 's4' )

      # Add links
      self.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 --- host

Adding 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 switches
        leftHost = self.addHost( 'h1' )
        rightHost = self.addHost( 'h2' )
        leftSwitch = self.addSwitch( 's3' )
        rightSwitch = self.addSwitch( 's4' )

        # Add links
        self.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://www.coloradmin.cn/o/1436841.html

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

相关文章

Redis——事件

Redis服务器是一个事件驱动程序&#xff0c;服务器需要处理以下两种事件&#xff1a; 文件事件(file event)&#xff1a;Redis服务器通过套接字与客户端(或者其他Redis服务器)进行连接&#xff0c;而文件事件就是服务器对套接字操作的抽象(linux下一切皆文件&#xff0c;返回的…

TP框架 之think-auth权限认证

一、安装think-auth composer require 5ini99/think-auth二、数据表 -- ---------------------------- -- think_auth_rule&#xff0c;规则表&#xff0c; -- id:主键&#xff0c;name&#xff1a;规则唯一标识, title&#xff1a;规则中文名称 status 状态&#xff1a;为1正常…

【日志记录】——单片机可执行文件合并

一&#xff1a;需求场景 现在有一片单片机&#xff0c;执行程序包括自定义boot和应用程序app, 在将打包好的固件给到生产时有以下问题&#xff0c;由于要通过jlink烧录boot&#xff0c;然后上电启动boot&#xff0c;通过boot烧录初始化程序&#xff0c;过程过于复杂&#xff0…

基于ESP-WROOM-32的双串口通信并显示到OLED显示屏上

目录 开发板引脚图 Arduino环境配置1.ESP32开发版下载2.Arduino开发板选择 -> ESP32 Dev Module3.安装驱动库 接线图Arduino代码现象演示 开发板 ESP-WROOM-32 引脚图 Arduino环境配置 1.ESP32开发版下载 选择 esp32 by Espressif Systems 2.Arduino开发板选择 -> E…

一文读懂「四大主流计算芯片 CPU、GPU、ASIC、FPGA」特点和场景

纵观人类历史&#xff0c;从结绳计数、木制计数到巴比伦的粘土板上的刻痕&#xff0c;再到中国古代的算盘&#xff0c;社会生产力的提高与当时所采用的计算工具密切相关。计算工具能力越强&#xff0c;就能大幅缩短人类解决复杂问题的时间&#xff0c;社会生产力水平自然就会越…

微信小程序解决华为手机保存图片到相册失败

1.新增隐私设置 2.优化代码 新增uni.authorize判断 _saveCode() {let that this;console.log(点击了保存图片)console.log(this.result)uni.authorize({scope: scope.writePhotosAlbum,success(e) {console.log(e)if (this.result ! "") {uni.saveImageToPhotosAlb…

RCS系统之:界面设计

RCS Floor Manager设计的主要目的&#xff1a; 实时监控机器人状态实时查看货架状态查看机器人任务状态查看捡货站的任务状态地图的状态信息其他元素&#xff0c;如打包机&#xff0c;机械臂的状态动态的编辑地图元素信息等等 有兴趣的可以留言一起交流下

[office] Excel2007在工作簿中创建区域名称 #职场发展#经验分享

Excel2007在工作簿中创建区域名称 Excel 提供了几种不同的方法来创建区域名称。但在开始之前&#xff0c;必须注意关于可接受内容的重要规则: 名称不能含有空格。可以用一个下划线字符来代替空格(如Annual Total ) 。 可以使用字母和数字的任意组合&#xff0c;但是名称必须以…

Redis + Lua 实现分布式限流器

文章目录 Redis Lua 限流实现1. 导入依赖2. 配置application.properties3. 配置RedisTemplate实例4. 定义限流类型枚举类5. 自定义注解6. 切面代码实现7. 控制层实现8. 测试 相比 Redis事务&#xff0c; Lua脚本的优点&#xff1a; 减少网络开销&#xff1a;使用Lua脚本&…

C++ STL精通之旅:向量、集合与映射等容器详解

目录 常用容器 顺序容器 向量vector 构造 尾接 & 尾删 中括号运算符 获取长度 清空 判空 改变长度 提前分配好空间 代码演示 运行结果 关联容器 集合set 构造 遍历 其他 代码演示 运行结果​编辑 映射map 常用方法 构造 遍历 其他 代码演示1​编…

搜索与图论(一)(深搜,广搜,树与图的存储遍历,拓扑排序)

一、DFS 往深里搜&#xff0c;搜到叶子结点那里&#xff0c;回溯&#xff0c;到可以继续到叶子结点深搜的位置。 1、回溯一定要恢复现场 2、定义一个与当前递归层数有关的终止条件&#xff08;题目要求的东西&#xff09; 3、每层都用循环判断是否存在可以dfs的路 输出数字…

PbootCMS采集插件使用教程

这篇Pboot采集教程教你使用PbootCMS采集插件&#xff0c;自动批量采集网页文章数据&#xff0c;并发布到PbootCMS系统&#xff0c;快速丰富网站的内容。 1. 下载并安装PbootCMS采集插件 1-1&#xff09;PbootCMS采集插件免费下载&#xff1a;Pboot采集插件-PbootCMS发布模块下…

「Mybatis实战五」:Mybatis核心文件详解 - MyBatis常用配置environments、properties

一、MyBatis核心配置文件层级关系 ​ 本文代码在 Mybatis初体验&#xff1a;一小时从入门到运行你的第一个应用 所构建的基础代码结构之上&#xff0c;进行修改。 MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下&#xff1a; 二…

什么是大小端字节序存储?如何用代码判断当前的机器是大端字存储还是小端存储?

目录 什么是大端字节序存储与小端字节序存储 为什么会有大端和小端之分&#xff1f; 用代码判断当前机器是大端存储还是小端存储 什么是大端字节序存储与小端字节序存储 1.字节序&#xff1a;以字节为单位&#xff0c;讨论存储顺序 2.大端字节序存储&#xff1a;高位在低地…

C和C++面试--看的不多只看一篇

C和C面试 1. 语言基础1.1 C和C有什么区别&#xff1f;1.2 a和&a有什么区别&#xff1f;1.3 #define和const区别&#xff1f;&#xff08;编译阶段、安全性、内存占用等&#xff09;1.4 inline函数1.5 对于⼀个频繁使⽤的短⼩函数&#xff0c;应该使⽤什么来实现&#xff1f…

【C语言】三子棋游戏实现代码

目录 1.三子棋代码功能介绍 2.三子棋游戏实现步骤 ①打印菜单栏 ②判断是否进入三子棋游戏 ③三子棋游戏基本函数实现 &#xff08;1&#xff09;清空&#xff08;初始化&#xff09;棋盘函数实现 &#xff08;2&#xff09;打印棋盘函数实现 &#xff08;3&#xff0…

【HTML】MDN

文章目录 一、html元素1.1 <a>1.2 <abbr>1.3 <address>1.4<area>1.5 <article>1.6 <aside>1.7 <audio>1.8 <b>1.9 <base>1.10<bdi>1.11 <bdo>1.12 <blockquote>1.13 <body>1.14 <br>1.15…

计组学习笔记2024/2/4

1.计算机的发展历程 2.计算机硬件的基本组成 存储器 -> 就是内存. 3.各个硬件的部件 寄存器 -> 用来存放二进制数据. 各个硬件的工作原理视频留白,听完后边课程之后再来理解理解. 冯诺依曼计算机的特点: 1.计算机由五大部件组成 2.指令和数据以同等地位存于存储器,…

计算机视觉 | OpenCV 实现手势虚拟控制亮度和音量

Hi&#xff0c;大家好&#xff0c;我是半亩花海。在当今科技飞速发展的时代&#xff0c;我们身边充斥着各种智能设备&#xff0c;然而&#xff0c;如何更便捷地与这些设备进行交互却是一个不断被探索的课题。本文将主要介绍一个基于 OpenCV 的手势识别项目&#xff0c;通过手势…

Qt程序设计-导出PDF

本文讲解如何实现导出PDF,包含如何使用HTML格式和添加图片。 实例如下: 创建项目,添加两个按钮,并在D盘提前准备好图片。 窗体的头文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>#include <QPrinter> #include <QPainter> #i…