SDN Experiment 3

2023-11-22 18:50
文章标签 sdn experiment

本文主要是介绍SDN Experiment 3,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

SDN Experiment 3


实验内容


第三次实验主要为设计性实验,要求各位在熟悉SDN的基本原理和RYU API的基础上解决下⾯问题

题⽬

假如你有⼀个笔友遍天下爱写信的朋友叫李华,她⽣活在1972年的UCLA,希望通过ARPANET(世界第⼀个数据包交换⽹络,互联⽹的⿐祖,接⼊了25个研究机构,共计55条链路。具体拓扑⻅下图)发送⼀封Email给位于MIT的李明同学,现在需要你借助Ryu控制器编写Ryu APP帮助她

  1. 为减少⽹络中节点的中转,希望找到⼀条从UCLA到MIT跳数最少的连接,输出经过的路线
  2. 为了尽快发送Email,希望能找到⼀条从UCLA到MIT时延最短的连接,输出经过的路线及总的时延,利⽤Ping包的RTT验证你的结果(此问题选做)

在这里插入图片描述

实验过程


1.建立topo

利用已经给出的Arpanet19723.py文件
sudo mn --custom Arpanet19723.py --controller=remote,ip=127.0.0.1,port=6633 --topo topoexp3
遇到错误:

  1. python版本问题,将topo代码改为python3代码后解决
  2. 遇到如下图问题在这里插入图片描述
    参考链接 MININET和PYTHON脚本运行出错:INVALID TOPO NAME
    在class RouterTopo定义前添加一行TOPOS = {'topoexp3':(lambda:GeneratedTopo())}
    将问题解决

正确截图如下:
在这里插入图片描述
ryu-manager test.py --observe-links
ryu-manager exp3_1.py --observe-links

查看链路信息

在这里插入图片描述

2.启动RYU控制器

ryu-manager exp3_1.py --ofp-tcp-listen-port 6633 --observe-links
交换机及其之间的链路
在这里插入图片描述

3.ULCA ping MIT

ULCA ping MIT

在这里插入图片描述

最短路径:
在这里插入图片描述

如上图所示,在“UCLA” 主机 ping“ MIT”主机 10 次之后,RYU 打印出了
两者之间跳数最小的路径,该路径共经过 7 台交换机,与实验指导书中给出的例子不同,但经过的交换机数目是一样的。下面对显示内容进行说明:
  上图中共有两组内容,上方是从 UCLA 到 MIT,下方是由 MIT 到 UCLA。显然两者是完全相反的关系。每组数据分为三行:
  [1]第一行为路径的源地址和目的地址
  [2]第二行为所经过的主机与交换机的个数
  [3]第三行为具体的路径信息,首尾分别为源地址和目的地址,中间”a : b : c”部分的含义为:“in_port:switch_id:out_port”

代码

from ryu.base import app_manager
from ryu.ofproto import ofproto_v1_3
from ryu.controller.handler import set_ev_cls
from ryu.controller.handler import MAIN_DISPATCHER, CONFIG_DISPATCHER
from ryu.controller import ofp_event
from ryu.lib import hub
from ryu.lib.packet import packet
from ryu.lib.packet import ethernet
from ryu.lib.packet import arp
from ryu.lib.packet import icmp
from ryu.lib.packet import ether_types
from ryu.lib import mac
from ryu.topology import event, switches
from ryu.topology.api import get_switch, get_link
from ryu.topology.api import get_all_host, get_all_link, get_all_switch
from ryu.app.wsgi import ControllerBase
import networkx as nxETHERNET = ethernet.ethernet.__name_ETHERNET_MULTICAST = "ff:ff:ff:ff:ff:ff" #ARP 请求的地址ARP = arp.arp.__name__class GETSHORT_1(app_manager.RyuApp):OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]#初始化类变量:def __init__(self, *args, **kwargs):super(GETSHORT_1, self).__init__(*args, **kwargs)self.mac_table = {} #交换机的 MAC 表self.arp_table = {} #arp 表self.topo_thread = hub.spawn(self._get_topology) #使用绿色线程来        执行_get_topology 函数self.graph = nx.DiGraph() #使用 networkx 创建一个图self.topology_api_app = selfself.switch_host_port = {} #交换机和主机连接的端口self.datapath_switch = {} #交换机及其对应的 datapathdef add_flow(self, datapath, priority, match, actions):dp = datapathofp = dp.ofprotoparser = dp.ofproto_parserinst = [parser.OFPInstructionActions(ofp.OFPIT_APPLY_ACTIONS, actions)]mod = parser.OFPFlowMod(datapath=dp, priority=priority, match=match, instructions=inst)dp.send_msg(mod)@set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)def switch_features_handler(self, ev):msg = ev.msgdp = msg.datapathofp = dp.ofprotoparser = dp.ofproto_parsermatch = parser.OFPMatch()actions = [parser.OFPActionOutput(ofp.OFPP_CONTROLLER, ofp.OFPCML_NO_BUFFER)]self.add_flow(dp, 0, match, actions)@set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)def packet_in_handler(self, ev):msg = ev.msgdp = msg.datapathofp = dp.ofprotoparser = dp.ofproto_parserpkt = packet.Packet(msg.data)dpid = dp.idin_port = msg.match['in_port']eth_pkt = pkt.get_protocol(ethernet.ethernet)dst = eth_pkt.dstsrc = eth_pkt.srcif dpid not in self.datapath_switch:self.datapath_switch[dpid] = dp#去除不需要的协议if eth_pkt.ethertype == ether_types.ETH_TYPE_LLDP:return Noneif eth_pkt.ethertype == ether_types.ETH_TYPE_IPV6:return Noneheader_list = dict((p.protocol_name, p) for p in pkt.protocols if type(p) != str)#将未学习的 ARP 包向所有交换机与主机相连的端口转发if dst == ETHERNET_MULTICAST and ARP in header_list:self.arp_table[header_list[ARP].src_ip] = srcarp_dst_ip = header_list[ARP].dst_ip#未被学习过if arp_dst_ip not in self.arp_table:#向其他所有交换机和主机相连接的端口转发for key in self.switch_host_port:if key != dpid:dp = self.datapath_switch[key]for out_port in self.switch_host_port[key]:out = parser.OFPPacketOut(datapath=dp,buffer_id=ofp.OFP_NO_BUFFER,in_port=ofp.OFPP_CONTROLLER,actions=[parser.OFPActionOutput(out_port)], data=msg.data)dp.send_msg(out)#已经学习过else:dst = self.arp_table[arp_dst_ip]self.mac_table.setdefault(dpid, {})if dst in self.mac_table[dpid]:out_port = self.mac_table[dpid][dst]else:out_port = ofp.OFPP_FLOOD#将主机与交换机之间的连接加入到图中if src not in self.graph:self.graph.add_node(src)self.graph.add_edge(dpid, src, weight=0, port=in_port)self.graph.add_edge(src, dpid, weight=0)#得到跳数最小的路径if src in self.graph and dst in self.graph and dpid in self.graph:#直接使用 networkx 得到最短路径path = nx.shortest_path(self.graph, src, dst, weight="weight")#如果当前的交换机不在最短路径上,丢弃该数据包if dpid not in path:return Nonenxt = path[path.index(dpid) + 1]out_port = self.graph[dpid][nxt]['port']self.mac_table[dpid][dst] = out_portactions = [parser.OFPActionOutput(out_port)]out = parser.OFPPacketOut(datapath=dp, buffer_id=ofp.OFP_NO_BUFFER, in_port=in_port, actions=actions, data=msg.data)dp.send_msg(out)#到达目的地则输出路径if nxt == dst and dpid == path[-2]:print( "path:",src,"->",dst)print("the length of the path is {}".format(len(path)))print(path[0],"->",end='')for item in path[1:-1]:index = path.index(item)print("{}:s{}:{}".format(self.graph[item][path[index - 1]]['port'],item,self.graph[item][path[index + 1]]['port']),end='')print("->",end='')print(path[-1])print('\n')#print('switch_host_port')#print(self.switch_host_port)#print('datapath_switch')#print(self.datapath_switch)#print('header_list')#print(header_list)#print(path)print('\n')return None#else:#actions = [parser.OFPActionOutput(out_port)]#out = parser.OFPPacketOut(#datapath=dp, buffer_id=ofp.OFP_NO_BUFFER, in_port=in_port, actions=actions, data=msg.data)#dp.send_msg(out)def _get_topology(self):hub.sleep(2) #模仿网络请求等待#获得整个网络的拓扑switch_list = get_switch(self.topology_api_app, None)switches = [switch.dp.id for switch in switch_list]self.graph.add_nodes_from(switches)link_list = get_link(self.topology_api_app, None)for link in link_list:self.graph.add_edge(link.src.dpid, link.dst.dpid, weight=1,port=link.src.port_no)self.graph.add_edge(link.dst.dpid, link.src.dpid, weight=1,port=link.dst.port_no)switch_all_port = {}for switch in switch_list:dpid = switch.dp.id #交换机 idflag = Falsefor port in switch.ports:if flag:switch_all_port[dpid].add(port.port_no) #获得端口            号continueif dpid not in switch_all_port:switch_all_port[dpid] = {port.port_no}flag = True#去除交换机之间连接的端口for link in link_list:Src = link.srcDst = link.dstif Src.dpid in switch_all_port:switch_all_port[Src.dpid].discard(Src.port_no)if Dst.dpid in switch_all_port:switch_all_port[Dst.dpid].discard(Dst.port_no)self.switch_host_port = switch_all_port#打印拓扑信息print("nodes:")print(self.graph.nodes())print("links:")print(self.graph.edges())print("topo:")print("node1      node2")for u, adj_u in self.graph.adj.items():for v, eattr in adj_u.items():if u < v:self.logger.info('s%2s     s%2s', u, v)print("--------------------------------")

参考文献

Ryu中基于时延的最短路径转发算法(SPF)

RYU基于跳数的最短路径转发

Ryu应用开发(流量监控原理与基于跳数的最短路转发

通信网系列实验(三)——基于Dijkstra算法的Ryu+Mininet应用

projects based on Mininet and Ryu

这篇关于SDN Experiment 3的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/412173

相关文章

SDN架构详解

目录 1)经典的IP网络-分布式网络 2)经典网络面临的问题 3)SDN起源 4)OpenFlow基本概念 5)Flow Table简介 6)SDN的网络架构 7)华为SDN网络架构 8)传统网络 vs SDN 9)硬件SDN与软件SDN 1)经典的IP网络-分布式网络 经典的IP网络是一个分布式的、对等控制的网络。每台网络设备存在独立的数据平台、控制平面和管理平面。

线段树+二分,CF 431E - Chemistry Experiment

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 431E - Chemistry Experiment 二、解题报告 1、思路分析 贪心的考虑,如

【网络安全】【深度学习】【入侵检测】SDN模拟网络入侵攻击并检测,实时检测,深度学习【二】

文章目录 1. 习惯终端2. 启动攻击3. 接受攻击4. 宿主机查看h2机器 1. 习惯终端 上次把ubuntu 22自带的终端玩没了,治好用xterm: 以通过 Alt+F2 然后输入 xterm 尝试打开xterm 。 然后输入这个切换默认的终端: sudo update-alternatives --config x-terminal-emulator 这之后就可以用

【网络安全】【深度学习】【入侵检测】SDN模拟网络入侵攻击并检测,实时检测,深度学习

文章目录 1. 前言2. Mininet 和 Ryu 的区别2.1 Mininet2.2 Ryu2.3 总结 3. 模拟攻击3.1 环境准备3.2 创建 Mininet 网络拓扑3.2 启动 Ryu 控制器3.3 模拟网络攻击3.4 捕获流量 4. 实时异常检测4.1 在 Ryu 控制器中4.2 在 h2 机器上的实验结果4.3 深度学习模型部署上h2机器 帮助、咨询 1. 前言

《软件定义安全》之一:SDN和NFV:下一代网络的变革

第1章 SDN和NFV:下一代网络的变革 1.什么是SDN和NFV 1.1 SDN/NFV的体系结构 SDN SDN的体系结构可以分为3层: 基础设施层由经过资源抽象的网络设备组成,仅实现网络转发等数据平面的功能,不包含或仅包含有限的控制平面的功能。控制层利用南向接口控制基础设施层的网络设备,构建并维护全局的网络视图,实现传统网络设备中控制平面的功能。应用层基于北向接口和控制层提供的网络

《软件定义安全》之二:SDN/NFV环境中的安全问题

第2章 SDN/NFV环境中的安全问题 1.架构安全 SDN强调了控制平面的集中化,从架构上颠覆了原有的网络管理,所以SDN的架构安全就是首先要解决的问题。例如,SDN实现中网络控制器相关的安全问题。 1.1 SDN架构的安全综述 从网络安全的角度,SDN带来了网络架构的革新,也引入了新的安全威胁和挑战。从架构层面来看,新引入的SDN控制器由于逻辑集中的特点,自然易成为攻击的对象;开放的A

The first experiment about digital filter 软件滤波初体验

软件滤波初体验 选择最好玩的方波 预设波形如下: 频谱,你懂的: 如果只对低频部分进行inverse-DFT,那么: 当 for frequency = -(circle/20):(circle/20)-1 取circle/20以下的部分,低频断: nice! 如果此时放宽滤波频段至circle/8 一个高频信号就会叠加

初识SDN(二)

初识SDN(二) SDN部分实现 REST API 是什么? REST API(Representational State Transfer Application Programming Interface,表述性状态传递应用程序接口)是一种基于HTTP协议的接口,广泛用于Web服务和应用程序之间的通信。REST API 通过标准的HTTP方法(如GET、POST、PUT、DELETE)

初识SDN

初识SDN 软件定义网络(SDN,Software-Defined Networking)是一种网络架构方法,它通过将网络控制平面与数据平面分离来实现网络的集中化控制和管理。 基本概念 以下是SDN的关键概念和组成部分: 1. SDN的基本概念 控制平面与数据平面分离:传统网络设备(如路由器和交换机)将控制平面(决定数据包如何转发)和数据平面(实际转发数据包)集成在一起。而在SDN

关于OpenFlow协议的运行机制和实践分析(SDN)

目录 OpenFlow运行机制 1 OpenFlow信道建立 1.1 OpenFlow消息类型  1.2 信道建立过程解析 2 OpenFlow消息处理 2.1 OpenFlow流表下发与初始流表 2.2 OpenFlow报文上送控制器 2.3 控制器回应OpenFlow报文 3 OpenFlow交换机转发 3.1 单播报文转发流程 OpenFlow的实践分析 1、实验目的