热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SDN初步:Mininet(SDN测试平台)&Ryu(SDN控制器)

Mininet:SDN测试平台&Ryu:SDN控制器Mininet:SDN测试平台&Ryu:SDN控制器(均是在64位Ubuntu16.04.7虚拟机中安装)64位Ubuntu16




Mininet:SDN测试平台&Ryu:SDN控制器


  • Mininet:SDN测试平台&Ryu:SDN控制器(均是在64位Ubuntu 16.04.7虚拟机中安装)
    • 64位Ubuntu 16.04.7光盘映像文件
    • Mininet的安装
    • Ryu的安装
    • Mininet的使用
    • Ryu的使用


Mininet:SDN测试平台&Ryu:SDN控制器(均是在64位Ubuntu 16.04.7虚拟机中安装)

64位Ubuntu 16.04.7光盘映像文件


链接:https://pan.baidu.com/s/1epMw5oBSBWZW1IeBi0VQWw
提取码:1234



Mininet的安装

Step1(如果没有git需要安装,如果有则忽略): sudo apt install git
在获取Mininet源代码时,需要替换国内镜像,首先点击设置,接着如下操作,替换后请务必重启虚拟机
在这里插入图片描述

Step2(获取Mininet源代码): git clone http://github.com/mininet/mininet.git
在这里插入图片描述

Step3(安装Mininet,保守起见,这选择完整安装,标签-a,该过程时间较久): mininet/util/install.sh -a
Step4(测试安装是否成功): sudo mn --test pingall
Step5(查看版本): mn --version
在这里插入图片描述


Ryu的安装

Step1(这里使用python3.6版本进行安装ryu,因此首先先安装python3.6,自带的python2.7/3.5都不可以,会出现问题):
ubuntu16.04默认的软件repository中并不包含python3.6(最高到python3.5),所以无法通过apt-get install直接安装python3.6,否则会出现Couldn’t find xxx,因此首先在repository中添加,接着安装python3.6,如下:
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get update
sudo apt-get install python3.6

接着需要将pip3指向python3.6(没有pip3,sudo apt-get install python3-pip),这里参考了两个博客的方法,前一个我用了好像不行,然后再接着用了第二个就可以了,不知道是两个都要,还是只要用第二个,最好两个都用吧
首先要将pip3指向python3.6,先删除原先的pip:
apt-get remove python3-pip
apt-get autoremove

接着重新安装pip3,然后用python3.6指定升级一下pip3:
apt-get install python3-pip
python3.6 -m pip install --upgrade pip

接着使用pip -V命令查看是否已经指向python3.6,如果没有,则使用第二种方法,首先删除之前的软连接:
sudo rm -rf /usr/bin/python3
sudo rm -rf /usr/bin/pip3

查看python3.6的安装路径:
which python3.6
创建新的软连接:
sudo ln -s python3.6的安装路径(即上一条命令查找的) /usr/bin/python3
sudo ln -s python3.6的安装路径/pip3.7 /usr/bin/pip3
测试一下是否安装成功:
python3 --version
接着就可以正常安装,不会出现由于python版本不同对代码的不兼容

Step2(获取Ryu源代码): git clone git://github.com/osrg/ryu.git
在这里插入图片描述
Step3(获取安装所需要的库包): sudo pip3 install -r tools/pip-requires
Step4(开始安装): sudo python3 setup.py install
Step5(检查是否安装成功): ryu-manager
在这里插入图片描述


Mininet的使用

这里只介绍一种比较简单的方法(鄙人也只会这种),就是通过miniedit这个可视化工具,能够快速对mininet上手
首先将目录切到miniedit.py下:
cd mininet/mininet/examples
运行miniedit.py文件,记得要使用超级用户权限:
sudo ./miniedit/py
接着就会出现以下界面:
在这里插入图片描述
我们就可以通过在这里绘制拓扑图(topo.mn),搭建一个SDN的测试平台,比如以下一个拓扑图:
在这里插入图片描述
最上方的c0为控制器Controlller,它运行着某些程序,而在SDN中,这些程序我们可以自行手动编写,即SDN具有可编程性,灵活性高;将鼠标放置在器件上,长按右键选择properties,可以进入配置IP等
当控制器开启,开始运行应用程序后,我们才能开始运行我们的测试平台,在右下角有一个run:
在这里插入图片描述
而在拓扑中的每一个host图标都是一台虚拟终端,可以通过xterm 终端名(后面可跟多个,用逗号隔开)打开每一个终端的shell(且与本虚拟机的shell一致),可以在各自的shell中运行程序等
且在使用-a标签完整安装mininet时,同时也会安装wireshark抓包工具,当我们在虚拟终端运行网络应用程序,所发送的TCP报文段、UDP数据报都能被清楚地统计并呈现;通过wireshark中I/O graph选项,可以导出、获取网络流量数据,作为基于SDN的实验数据


Ryu的使用

Ryu作为SDN的Controller,即数据控制平面,我们可以在其下编写多样的应用程序,比如像一个自学习交换机的实现,我们可以基于ryu编写代码,能够表现出与传统网络设施相同的功能
我们编写的代码需要放置在app文件夹下,首先切换目录:
cd ryu/ryu/app
ryu很好的一点,是基于python编写应用代码,例如如下的自学习交换机的代码实现:

from ryu.base import app_manager
from ryu.ofproto import ofproto_v1_3
from ryu.controller import ofp_event
from ryu.controller.handler import MAIN_DISPATCHER, CONFIG_DISPATCHER
from ryu.controller.handler import set_ev_cls
from ryu.lib.packet import packet
from ryu.lib.packet import ethernet

class Learning_switch(app_manager.RyuApp):
# Example Switch
OFP_VERSIOnS=[ofproto_v1_3.OFP_VERSION]

def __init__(self, *args, **kwargs):
super(Learning_switch, self).__init__(*args, **kwargs)
self.mac_to_port={}

@set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)
def switch_feathers_handler(self, ev):
datapath=ev.msg.datapath
ofproto=datapath.ofproto
ofp_parser=datapath.ofproto_parser

# install flow table-miss flow entry
match=ofp_parser.OFPMatch()
actiOns=[ofp_parser.OFPActionOutput(ofproto.OFPP_CONTROLLER, ofproto.OFPCML_NO_BUFFER)]
# 1\OUTPUT PORT, 2\BUFF IN SWITCH?
self.add_flow(datapath, 0, match, actions)

def add_flow(self, datapath, priority, match, actions):
# 1\ datapath for the switch, 2\priority for flow entry, 3\match field, 4\action for packet
ofproto=datapath.ofproto
ofp_parser=datapath.ofproto_parser
# install flow
inst=[ofp_parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS, actions)]
mod=ofp_parser.OFPFlowMod(datapath=datapath, priority=priority, match=match, instructiOns=inst)
datapath.send_msg(mod)

@set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
def packet_in_handler(self, ev):
msg=ev.msg
datapath=msg.datapath
ofproto=datapath.ofproto
ofp_parser=datapath.ofproto_parser

# get datapath id to identify openflow switch

dpid=datapath.id #dpid=datapath id
self.mac_to_port.setdefault(dpid,{})
# save info
# parser and analyse the received packets

pkt=packet.Packet(msg.data)
eth_pkt=pkt.get_protocol(ethernet.ethernet)
dst=eth_pkt.dst
src=eth_pkt.src
in_port=msg.match['in_port']

self.logger.info("packet in %s %s %s %s",dpid,src,dst,in_port)
# learn the relationship between source mac address and ports to avoid Flood next time
self.mac_to_port[dpid][src]=in_port
# if the dst mac address exists, decide which port to send the packet
# otherwise Flood (Don't know which port lead to the dest port)
if dst in self.mac_to_port[dpid]:
out_port=self.mac_to_port[dpid][dst]
else:
out_port=ofproto.OFPP_FLOOD
# build actions
actiOns=[ofp_parser.OFPActionOutput(out_port)]
# install a new flow rule
if out_port != ofproto.OFPP_FLOOD:
match=ofp_parser.OFPMatch(in_port=in_port,eth_dst=dst)
self.add_flow(datapath, 1, match, actions)
# send a packet-out
out=ofp_parser.OFPPacketOut(datapath=datapath, buffer_id=msg.buffer_id, in_port=in_port, actiOns=actions)
datapath.send_msg(out)

而运行的方法也很简单,如下命令行(一定要切到ryu/ryu/app下):
ryu-manager learning_switch.py --verbose

!!!编写的应用代码一定要放置在ryu/ryu/app文件夹下



推荐阅读
  • Ubuntu安装常用软件详细步骤
    目录1.GoogleChrome浏览器2.搜狗拼音输入法3.Pycharm4.Clion5.其他软件1.GoogleChrome浏览器通过直接下载安装GoogleChro ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的步骤和方法
    本文介绍了在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的详细步骤和方法。首先需要下载最新的Java SE Development Kit 9发行版,然后按照给出的Shell命令行方式进行安装。详细的步骤和方法请参考正文内容。 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 本文介绍了解决github无法访问和克隆项目到本地的问题。作者建议通过修改配置文件中的用户名和密码来解决访问失败的问题,并提供了详细步骤。同时,还提醒读者注意输入的用户名和密码是否正确。 ... [详细]
author-avatar
mobiledu2502907117
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有