实验四 基于RYU控制器的网络控制器程序开发与实现
RYU开启后的监听情况
在安装RYU之前,作者建议大家先在root权限下apt get update更新一下自己的apt。
更新完之后,可以输入apt get install python3-pip 来获取最新版的python3的pip,以便自己下的ryu是最新版。
在获取完最新版的ryu之后, 可以输入pip3 install ryu来下载最新版的ryu。
下载完成之后,ryu应该是存放在usr/local/lib/python3.8/dist-packages里面,如图:
具体lib后的python文件夹是要看你的python版本是多少,最新版是3.12,可能就在3.12里面,作者这里是默认Python版本的,所以会存放在3.8中。
之后我们可以点进app里面进行ryu的测试。
这里我们选择simple_switch.py进行ryu的测试。
在app里面打开控制台输入指令:ryu-manager simple_switch.py,回车运行,控制台可能会出现以下内容:
出现这种情况可能是因为自己的eventlet版本过高,建议读者重新安装自己的evenlet,命令如下:
sudo pip3 install eventlet==0.30.2
这里作者用的清华镜像源,下载速度还是很快的。
下载完成后,我们再输入一次启动指令,发现可以了:
这时候可以打开一个新的控制台,输入netstat -an|grep 6633或者netstat -an|grep 6653来进行查看自己的ryu是否运行成功:
出现这样的内容说明成功运行了ryu的manager。
RYU和mininet的结合
如果我们想在mininet中启用ryu的控制器,我们需要在py文件中额外添加控制器并指定控制器的IP地址和端口。这里作者给出一份拓扑代码作为参考:
from mininet.topo import Topo
from mininet.net import Mininet
from mininet.cli import CLI
from mininet.node import RemoteController
class MyTopology(Topo):
def build(self):
# 创建交换机,同时进行交换机的协议配置,使用build()
switch = self.addSwitch('s0', protocols='OpenFlow13')
# 创建主机
host1 = self.addHost('h0')
host2 = self.addHost('h1')
# 创建链路
self.addLink(host1, switch)
self.addLink(host2, switch)
topo = MyTopology()
# 指定控制器的IP地址和端口
controller_ip = '127.0.0.1'
controller_port = 6633
# 创建Mininet网络,并指定控制器和OpenFlow协议版本
net = Mininet(topo, controller=RemoteController)
net.addController('controller', controller=RemoteController, ip=controller_ip, port=controller_port,protocols='OpenFlow13')
net.start()
CLI(net)
net.stop()
在这里,我们指定交换机的openflow版本为13,同时也把控制器的openflow版本指定为一样的版本。
指定完成后,我们不能直接在控制台打开该py文件,我们需要在原来打开ryu的那个控制台上先ctrl+c退出刚才在跑的ryu,并用同样的方法启动app文件里的simple_switch_13.py文件,否则控制器可能会无法自动学习。
开启后的情况如下:
这里启动完之后,我们再去启动刚才书写的拓扑文件,会发现ryu的控制台多出了一大串东西:
然后读者可以试着在mininet的命令框中pingall并观察ryu的控制台:
Ryu的控制台情况如下:
会多出一些新的packet。
实验五 基于SDN环境的广播风暴包分析与响应
利用RYU来处理广播风暴
什么是广播风暴
广播风暴是一种网络状况,发生在一个网络设备向所有其他设备发送大量的广播或多播数据包,从而导致网络拥塞,影响到网络的正常运行。这种现象通常是由于网络配置错误、设备故障或恶意攻击引起的。如果还是不理解,作者这里举一个简单的例子。
想象你参加了一个大型的派对,人们从各个地方聚集在一起,每个人都带着自己的话题和兴趣。派对的音乐声、谈笑声、交谈声在空气中混杂,非常热闹。每个人都试图分享自己的事情,而其他人也在聆听和回应。
然而,有一位非常兴奋的人站在中央,开始高声地宣布自己的消息。这个人的声音非常吸引人,因此其他人也开始聚集过来,想要听到他在说什么。但是,当更多的人围聚在他周围,就会有更多的人试图发表自己的意见,有人喊叫,有人开始争论,声音逐渐变得混乱。
随着人们越来越多地加入,派对的气氛逐渐失控。人们的声音越来越大,甚至开始争吵。最终,整个派对陷入了混乱,没有人能够听清楚其他人在说什么,整个场景变得一片混乱。
这个比喻可以帮助人们理解交换机广播风暴。在一个计算机网络中,交换机类似于派对,各个设备就像派对上的人。当一个设备发送广播帧(类似于宣布消息)时,交换机会将这个广播帧传递给所有其他设备。然后,其他设备可能也会发出广播帧,回应或者加入讨论,就像派对上的人们加入到声音交流中。
然而,如果太多的设备同时发送广播帧,交换机可能会被不断的广播流量所淹没。就像派对变得喧嚣、混乱,网络中的数据包也可能变得混乱,影响网络性能。这种情况就好像派对上的声音变得难以理解,网络中的数据包也变得难以传输和处理。
广播风暴的代码举例
作者在这里贴出代码进行广播风暴举例:
from mininet.topo import Topo
class MyTopo(Topo):
def __init__(self):
# Initialize topology 以下建立的是有环的拓扑,将可以观察到网络的广播风暴(openflow包风暴)
Topo.__init__(self)
# Add hosts
h1 = self.addHost('h1')
h2 = self.addHost('h2')
h3 = self.addHost('h3')
# Add switches
s1 = self.addSwitch('s1')
s2 = self.addSwitch('s2')
s3 = self.addSwitch('s3')
s4 = self.addSwitch('s4')
s5 = self.addSwitch('s5')
# Add links
self.addLink(h1, s1)
self.addLink(h2, s1)
self.addLink(h3, s5)
self.addLink(s1, s2)
self.addLink(s1, s3)
self.addLink(s2, s4)
self.addLink(s3, s4)
self.addLink(s4, s5)
topos = {'mytopo':( lambda: MyTopo() )}
代码里采用的是mininet自带的拓扑,我们启动该拓扑的话则是利用外部命令,顺便往其中添加控制器。启动命令如下:
mn --custom=/mnt/hgfs/vmshare/topo_37_ryu_of13.py --topo=mytopo --controller=remote,ip=127.0.0.1,port=6633 --switch=ovs,protocols=OpenFlow13
为了方便我就直接在root权限下创建py文件,添加代码和启动文件了。效果如下:
启动之后我们可以同步打开ryu的py文件来进行包的观察。因为使用的是openflow13,所以我们启动的时候也选择13的文件,如simple_switch_13.py,如下:
这时候我们不用动,过一会它自己就会刷屏了,如下:
出现该情况是由于交换机之间连线过多,网络拓扑搭建出现毛病导致的广播风暴。
此时在mininet上pingall也仅会出现几台主机是能通的,如下:
h1能Ping通h2是因为在同一个交换机上,像h3就会挂掉了。而且这h1能ping通h2也是因为作者这里挂了一会时间才行的,不然也会出现ping不通的现象。
想要停止ryu的刷屏现象的话在mininet上exit退出文件就行了。
如果要让该拓扑能正常运行的话,需要先开启ryu的stp类型的py文件,如simple_switch_stp_13.py。
开启效果如下:
开启之后,再在mininet的命令框中启动刚才的拓扑:
能看到ryu的命令框显示这些内容,说明不会出现广播风暴了。