RYU+Mininet实现Hub泛洪
系统:Ubuntu20.10 ,已安装 ryu 和 mininet
在ryu/ryu/app下创建了文件hub.py,代码如下:
hub.py(含注释)

from ryu.base import app_manager
from ryu.ofproto import ofproto_v1_3 #openflow版本:1.3
from ryu.controller import ofp_event
from ryu.controller.handler import MAIN_DISPATCHER, CONFIG_DISPATCHER
from ryu.controller.handler import set_ev_cls#定义一个类hub,继承app_manager,位于ryu下的base内,版本选择openflow1.3,然后初始化操作。
class hub(app_manager.RyuApp):OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]#定义版本#类的初始化函数def __init__(self, *args, **kwargs):#最后一个是可变参数#super(hub, self).__init__(*args, **kwargs)#在Ryu控制器上,我们需要写一个函数去处理openvswitch的连接,同时需要开启一个监听,监听交换机事件。@set_ev_cls(ofp_event.EventOFPSwitchFeatures,CONFIG_DISPATCHER)def  switch_features_handler(self,ev):#解析数据#datapath如同数据平面的通道,可以等同于网桥datapath = ev.msg.datapathofproto = datapath.ofproto#版本ofp_parser = datapath.ofproto_parser#基于此版本的一些库类#接收到交换机的连接之后,要下发一条tableentrys,一个默认流表,来指挥所有匹配不到交换机的数据,将其上传至控制器#install the table miss flow entry,即在ryu控制器里安装流表项 #匹配域match = ofp_parser.OFPMatch()#动作域,OFPActionOutPut将数据包发送出去#第一个参数:发送端口:控制器(把那些没有匹配的东西给控制器)#第二个参数:数据包在交换机上缓存buffer_id,由于我们将数据包全部传送到控制器,所以不在交换机上缓存actions = [ofp_parser.OFPActionOutput(ofproto.OFPP_CONTROLLER, ofproto.OFPCML_NO_BUFFER)]self.add_flow(datapath,0,match,actions)#提高代码重用,对于添加流表,单独拿出了写一个函数。def add_flow(self,datapath,priority,match,actions):#add a flow entry and install it into datapath# 1\ datapath for the switch, 2\priority for flow entry, 3\match field, 4\action for packetofproto = datapath.ofprotoofp_parser = datapath.ofproto_parser#1.3版本交换机中需有指令# install flow# construct a flow_mod msg and sent itinst = [ofp_parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS, actions)]#inst指令的缩写mod = ofp_parser.OFPFlowMod(datapath=datapath, priority=priority, match=match, instructions=inst)datapath.send_msg(mod)#需要定义packet in函数,用来处理交换机和控制器的流表交互,在执行之前需要先对packetin事件进行监听。@set_ev_cls(ofp_event.EventOFPPackIn,MAIN_DISPATCHER)#MAIN_DISPATCHER:主状态下监听事件def packet_in_handler(self,ev):#数据解析msg = ev.msgdatapath = msg.datapathofproto = datapath.ofprotoofp_parser = datapath.ofproto_parser#match匹配域中提取in_portin_port = msg.match['in_port']#发送出去(通过加一个流表)#construct a flow entrymatch = ofp_parser.OFPMatch()#匹配项为空,因为所有取到的内容都要泛洪出去actions = [ofp_parser.OFPActionOutput(ofproto.OFPP_FLOOD)]#泛洪动作#调用添加流表的函数,把流表发送出去# install flow mode to avoid match in next timeself.add_flow(datapath,1,match,actions)#处理当下的pack_in,给他发出去#buffer_id是一个非常重要的参数,因为,数据包进入交换机,总得有个地方暂存,而取的时候就需要有id来指定# to output the current packet. for install rules only output later packetsout = ofp_parser.OFPPacketOut(datapath=datapath, buffer_id=msg.buffer_id, in_port=in_port, actions=actions)# buffer id: locate the buffered packetdatapath.send_msg(out) 

hub.py(建议使用此版本运行)

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_clsclass hub(app_manager.RyuApp):OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]def __init__(self, *args, **kwargs):super(hub, self).__init__(*args, **kwargs)@set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)def switch_feathers_handler(self, ev):datapath = ev.msg.datapathofproto = datapath.ofprotoofp_parser = datapath.ofproto_parser# install flow table-miss flow entrymatch = 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 packetofproto = datapath.ofprotoofp_parser = datapath.ofproto_parser# install flowinst = [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.msgdatapath = msg.datapathofproto = datapath.ofprotoofp_parser = datapath.ofproto_parserin_port = msg.match['in_port']  # get in port of the packet# add a flow entry for the packetmatch = ofp_parser.OFPMatch()actions = [ofp_parser.OFPActionOutput(ofproto.OFPP_FLOOD)]self.add_flow(datapath, 1, match, actions)# to output the current packet. for install rules only output later packetsout = ofp_parser.OFPPacketOut(datapath=datapath, buffer_id=msg.buffer_id, in_port=in_port, actions=actions)# buffer id: locate the buffered packetdatapath.send_msg(out)

运行hub.py成功:

启动mininet ,创建一个最简单的拓扑,pingall命令成功:

说实话还没get到这个实验核心…还是很懵

RYU+Mininet实现Hub泛洪相关推荐

  1. RYU+Mininet的SDN架构-设计校园网络(三)

    这是基于RYU+Mininet的SDN架构设计仿真校园网络的第一部分 总体详见:[基本中型网络的仿真(RYU+Mininet的SDN架构)-以校园为例]​​​​​​ 章节: [RYU+Mininet的 ...

  2. RYU+Mininet的SDN架构-设计校园网络(四)

    这是基于RYU+Mininet的SDN架构设计仿真校园网络的第四部分 总体详见:[基本中型网络的仿真(RYU+Mininet的SDN架构)-以校园为例]​​​​​​ 上一章:[RYU+Mininet的 ...

  3. RYU+Mininet的SDN架构-设计校园网络(五)

    这是整个项目的代码部分,对大家来说都很重要 总体详见:[基本中型网络的仿真(RYU+Mininet的SDN架构)-以校园为例]​​​​​​ 章:[RYU+Mininet的SDN架构-设计校园网络(一) ...

  4. RYU+Mininet的SDN架构-设计校园网络(一)

    这是基于RYU+Mininet的SDN架构设计仿真校园网络的第一部分 总体详见:[基本中型网络的仿真(RYU+Mininet的SDN架构)-以校园为例] 前言: 本次设计基于虚拟机以及Ubuntu18 ...

  5. 利用mininet模拟SDN架构并进行DDoS攻击与防御模拟(Ryu+mininet+sflow+postman)

    1.知识概述 (1)软件定义网络: (2)mininet: Mininet是一个强大的网络仿真平台,通过这个平台,我们可以很方便的模拟真实环境中的网络操作与架构.特别是SDN,在真实网络中进行相关的网 ...

  6. RYU+mininet——RYU

    1. 使用RYU做mininet的控制器 1.1 RYU介绍与安装 RYU是一款基于python的控制器,你可用Ryu实现各种想要实现的网络功能,它可以下发或接收流表进行各种路由运算. 建议使用高版本 ...

  7. Ubuntu18.04 安装SDN ryu+mininet

    一.安装Mininet apt-get install git 这是最好的方式.git下载方式安装容易出错. 二.安装并测试Ryu控制器 1.安装并更新pip sudo apt-get update ...

  8. 基本中型网络的仿真(RYU+Mininet的SDN架构)-以校园为例

    目录 ​​​​​​​具体问题可以私聊博主 一.设计目标 1.1应用场景介绍 1.2应用场景设计要求 网络配置方式 网络技术要求 网络拓扑要求 互联互通 二.课程设计内容与原理 (1)预期网络拓扑结构和 ...

  9. RYU+mininet——mininet

    1. mininet基本操作 Mininet是一个网络仿真器,它在单个Linux内核上运行一组终端主机,交换机,路由器和链接.它使用轻量级虚拟化使单个系统看起来像一个完整的网络,运行相同的内核,系统和 ...

最新文章

  1. R语言使用lm构建线性回归模型、并将目标变量对数化(log10)实战:可视化模型预测输出与实际值对比图、可视化模型的残差、模型预测中系统误差的一个例子 、自定义函数计算R方指标和均方根误差RMSE
  2. ssh免密登录配置(两行命令搞定)
  3. c语言的0变成奇怪的图形,Word打开后图片中的文字变成了奇怪的符号
  4. module 'paddle.fluid' has no attribute 'data'
  5. Matlab | Matlab从入门到放弃(16)——二维图和三维图
  6. django ORM创建数据库方法
  7. Windows端口占用情况?
  8. mvc 扫描jar jsp_SpringBoot+jsp项目启动出现404
  9. 分析lammps文件_LAMMPS学习系列(24)
  10. 上海技术计算机学校学费多少,上海web前端学校学费一般是多少
  11. JavaScript文档对象模型document对象改变Html表单属性(4)
  12. Linux源码阅读(Web在线阅读)
  13. RealMedia Analyzer(mp4修复软件)v0.30绿色版
  14. 微信公众平台开发【素材管理】上传临时素材
  15. 矩阵分解在推荐系统中的应用及实践
  16. 如何提高文案策划能力?
  17. 【哈利波特全集】哈利波特1-7
  18. Roman to Integer/Integer to Roman
  19. MySQL-Parser
  20. termux无法安装引导程序包_分享一个小玩意儿Termux

热门文章

  1. 小程序 页面 中 截取字符串长度 超过显示 多余的 用省略号
  2. Python3快速入门(十四)——Pandas数据读取
  3. CZoneSoft iBooker手机电子书阅读器开发
  4. Oracle中until的用法,Java LocalTime until()用法及代码示例
  5. 昆明理工大学计算机面试题,昆明理工大学复试英语口语面试 资料 常考口语题目.doc...
  6. Facebook:每天数千次配置更新,如何实现用户零干扰
  7. Dell计算机装Win8,戴尔笔记本用U盘重装原版win8操作系统图文详解
  8. 常见数据结构排序算法时间复杂度
  9. Origin 绘制生存曲线图
  10. 梦幻手游服务器维护摆摊公示时间,梦幻西游手游4月13日维护公告 摆摊调整