热门标签 | 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文件夹下



推荐阅读
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
  • 本文详细介绍了如何通过现代化工具快速、高效地安装Python第三方模块,帮助开发者简化安装流程并提高开发效率。 ... [详细]
  • Python包管理工具pip的使用指南
    本文详细介绍了如何使用pip进行Python包的安装、管理和常见问题的解决方法,特别针对国内用户提供了优化建议。 ... [详细]
  • Symfony是一个功能强大的PHP框架,以其依赖注入(DI)特性著称。许多流行的PHP框架如Drupal和Laravel的核心组件都基于Symfony构建。本文将详细介绍Symfony的安装方法及其基本使用。 ... [详细]
  • 本文详细介绍了如何将 Python 3.6.3 程序转换为 Windows 可执行文件(.exe),并解决了使用 py2exe 和 cx_Freeze 时遇到的问题。推荐使用 PyInstaller 进行打包,提供完整的安装和打包步骤。 ... [详细]
  • 嵌入式开发环境搭建与文件传输指南
    本文详细介绍了如何为嵌入式应用开发搭建必要的软硬件环境,并提供了通过串口和网线两种方式将文件传输到开发板的具体步骤。适合Linux开发初学者参考。 ... [详细]
  • 解决Appium Doctor在Python自动化测试中的SyntaxError问题
    本文详细介绍了如何解决在使用Appium Doctor进行环境检查时遇到的SyntaxError: Unexpected token ...问题,并提供了完整的解决方案和最佳实践。 ... [详细]
  • 在编译BSP包过程中,遇到了一个与 'gets' 函数相关的编译错误。该问题通常发生在较新的编译环境中,由于 'gets' 函数已被弃用并视为安全漏洞。本文将详细介绍如何通过修改源代码和配置文件来解决这一问题。 ... [详细]
  • Python自动化测试入门:Selenium环境搭建
    本文详细介绍如何在Python环境中安装和配置Selenium,包括开发工具PyCharm的安装、Python环境的设置以及Selenium包的安装方法。此外,还提供了编写和运行第一个自动化测试脚本的步骤。 ... [详细]
  • 搭建Jenkins、Ant与TestNG集成环境
    本文详细介绍了如何在Ubuntu 16.04系统上配置Jenkins、Ant和TestNG的集成开发环境,涵盖从安装到配置的具体步骤,并提供了创建Windows Slave节点及项目构建的指南。 ... [详细]
  • 在Linux系统上构建Web服务器的详细步骤
    本文详细介绍了如何在Linux系统上搭建Web服务器的过程,包括安装Apache、PHP和MySQL等关键组件,以及遇到的一些常见问题及其解决方案。 ... [详细]
  • Ubuntu下系统负载与程序状态的监控方法
    本文介绍了在Ubuntu操作系统中,通过不同工具来监控系统负载及程序运行状态的方法。包括文本模式下的top和htop,图形界面下的gnome-system-monitor,以及针对NVIDIA Jetson开发板的jetson-stats工具。 ... [详细]
  • 本文介绍了如何利用Python进行批量图片尺寸调整,包括放大和等比例缩放。文中提供了详细的代码示例,并解释了每个步骤的具体实现方法。 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • 在树莓派Ubuntu(ARM64)上安装Node.js
    本文详细介绍了如何在树莓派Ubuntu系统(ARM64架构)上安装Node.js,包括下载、解压、移动文件以及创建软链接等步骤。 ... [详细]
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社区 版权所有