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

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(检查python的版本): 需要使用python版本3.6以上,建议使用ubuntu20.04 LTS的虚拟机安装,自带的python版本就是可以安装ryu的

Step2(获取Ryu源代码): git clone https://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文件夹下

  • 8
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 开源代码是指源代码在开放的许可下公开发布,任何人都可以从源代码免费获得、复制、修改和分发。 在SDN控制平台领域,有许多开源代码可供选择,如:OpenDaylight、ONOS、Ryu等。这些项目的代码都可以从相应的代码仓库获得,例如:GitHub、GitLab等。 ### 回答2: SDN控制平台开源代码是指以开源的方式提供给用户SDN(软件定义网络)控制平台的源代码。这意味着用户可以免费获取、查看和修改这些源代码,以满足其特定的需求。 开源代码的出现对于SDN领域来说具有重要的意义。首先,开源代码促进了SDN技术的创新和发展。通过开源,任何人都可以参与到SDN控制平台的开发和改进来,使得更多的人才能够为该领域做出贡献。这样有助于推动SDN技术的不断进步,提高其性能和稳定性,满足不断变化的网络需求。 其次,开源代码提供了更大的自由度和灵活性。用户可以根据自己的需要对源代码进行修改和定制,以适应不同的业务场景。这使得SDN控制平台可以更好地满足个性化需求,提供更加优化和定制化的解决方案。 此外,开源代码还可以促进SDN技术的标准化和共享。通过开源,不同的SDN控制平台之间可以相互学习和借鉴,共同推动技术的进步。这有助于建立起一个更加开放和协作的SDN生态系统,促进各方的合作和交流。 当然,开源代码也存在一些挑战和风险。例如,由于源代码的公开性,可能会面临安全性和隐私性方面的风险。此外,部分用户可能会因为技术门槛较高而无法充分利用开源代码。 总体来说,SDN控制平台的开源代码对推动SDN技术的发展具有积极的作用,为用户提供了更多灵活性和自由度,有助于推动SDN技术的标准化和共享,但也需要注意解决安全性和技术门槛等问题。 ### 回答3: SDN(软件定义网络)控制平台开源代码是指可以在开源许可证下获取、使用和修改的软件定义网络控制器代码。 SDN控制平台是一个关键的组件,用于管理和控制整个软件定义网络。它允许网络管理员通过程序化方式集管理和控制网络资源,从而提供更高的网络灵活性和可编程性。 开源代码的好处在于可以免费获得和使用,同时也可以根据自己的需求进行自定义修改和扩展。这使得开源SDN控制平台成为各种规模的组织和企业部署SDN的首选。 开源SDN控制平台具有以下几个重要特点: 1. 可定制性:开源代码允许用户根据自己的需求进行定制和修改。用户可以根据特定的网络环境和应用场景进行扩展和改进,从而更好地适应实际需求。 2. 社区支持:开源SDN控制平台通常有一个活跃的社区,用户可以在社区获取技术支持、交流经验和分享问题。这样可以通过社区来共同解决问题,提高系统的稳定性和性能。 3. 多样性:开源SDN控制平台的种类繁多,用户可以选择适合自己的控制器。这样可以满足不同的需求,包括网络规模、应用场景和可扩展性等方面的需求。 不过,使用开源SDN控制平台也存在一些挑战和注意事项。首先,用户需要具备一定的技术能力来理解和定制开源代码。此外,开源项目的可靠性和稳定性也需要经过充分验证和测试,以确保其在实际网络环境的可靠性。 综上所述,开源SDN控制平台代码的开放性、灵活性和可定制性,使其成为部署SDN的理想选择。用户可以基于开源代码构建自己的SDN控制平台,以满足不同的网络需求和应用场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值