目录
实验名称
SDN网络简单管理及开发实验
实验目的
基于RYU及Mininet管理网络、开发管理网络应用程序
实验内容
1、结合Mininet及RYU组建SDN网络
运行RYU远程控制器,在mininet上开发实现如图1所示的一个包含两个交换机、两个客户端主机(每个交换机连接一个主机)的简单拓扑,并连接运行的RYU控制器。
2、基于RYU及Mininet管理网络、开发简单网络管理程序
使用mininet命令操作流表项,使主机h1和h2之间不能通信;使用RYU开发简单网络管理程序,使主机h1和h2之间不能通信。
实验步骤
1、结合Mininet及RYU组建SDN网络
1.1 开发基于mininet的网络,编写python程序。
import os
from mininet.net import Mininet
from mininet.node import RemoteController
from mininet.cli import CLI
from mininet.log import setLogLevel
from mininet.link import TCLink
from mininet.topo import Topo
class linearTopo(Topo):
def __init__(self):
self.switchList = []
self.hostList = []
Topo.__init__(self)
def create_topo(self):
self.create_switch()
self.create_host()
self.create_link()
def create_switch(self):
self.switchList.append(self.addSwitch('s1'))
self.switchList.append(self.addSwitch('s2'))
def create_host(self):
self.hostList.append(self.addHost('h1'))
self.hostList.append(self.addHost('h2'))
def create_link(self):
self.addLink(self.switchList[0], self.switchList[1], bw=100, delay='5ms', loss=0)
self.addLink(self.switchList[0], self.hostList[0], bw=100, delay='5ms', loss=0)
self.addLink(self.switchList[1], self.hostList[1], bw=100, delay='5ms', loss=0)
def create_topo():
topo = linearTopo()
topo.create_topo()
net = Mininet(topo=topo, link=TCLink, controller=None, autoSetMacs=True)
controller_ip = "127.0.0.1"
controller_port = 6633
net.addController('controller',controller=RemoteController,ip=controller_ip,port=controller_port)
net.start()
CLI(net)
net.stop()
if __name__ == '__main__':
setLogLevel('info')
if os.getuid() != 0:
logger.debug("You are NOT root")
elif os.getuid() == 0:
create_topo()
1.2 运行RYU控制器
1.3 运行mininet程序
1.4 查看运行结果
(1)查看创建的网络的组成部分
(2)使用ICMP会话测试h1和h2之间的连通性,分析原因
2、基于RYU及Mininet管理网络、开发简单网络管理程序
2.1 使用mininet命令操作流表项,使主机h1和h2之间不能通信
(1)中断h1和h2之间的ICMP会话;
(2)查看交换机s1上的流表项;
xterm s1
ovs-ofctl dump-flows s1
(3)修改交换机s1上的流表项,使主机h1和h2之间不能通信:
所添加的流表项match域设置为:源IP地址为h1的IP地址,目的IP地址为h2的IP地址。同时,将该流表项优先级设置为最高(65535),actions设置为drop,使用的命令为:
ovs-ofctl add-flow s1 priority=65535,icmp,nw_src=10.0.0.1,nw_dst=10.0.0.2,actions=drop
注意:1、未打“空格”的地方不能输入空格!2、此命令需在交换机上运行!
(4)查看交换机s1上的流表项是否发生了变化;
(5)使用ICMP会话测试h1和h2之间的联通性;
(6)中断ICMP会话,再次查看交换机s1上的流表项,分析与上次抓获的流表项的不同点
分析2.1中抓获流表项的不同点:
修改后抓获的流表项
①增加了一条流表项
②增加的流表项额外设置了优先级(65535)和匹配协议类型(ICMP)
③增加的流表项中动作字段为丢弃,而不是从某端口转发
(7)分析h1和h2之间不能通信的原理。
分析h1和h2之间不能通信的原理:
匹配流表项时选择优先级最高的优先匹配,故进行h1、h2的ICMP会话时,一直与优先级最高的流表项匹配,并且该流表项的动作字段为丢弃,即ICMP报文一直被丢弃。故h1和h2之间不能通信。
2.2 使用RYU开发简单网络管理程序,使主机h1和h2之间不能通信
(1)关闭mininet、ryu程序;
(2)运行编写的mininet程序;
(3)阅读并分析ryu.ryu.app.simple_switch.py程序;
def _packet_in_handler(self, ev): #交换机向控制器上交packet-in消息
msg = ev.msg #获取事件消息
datapath = msg.datapath #获取数据通路
ofproto = datapath.ofproto #获取数据通路的协议
#提取数据包的信息
pkt = packet.Packet(msg.data)
eth = pkt.get_protocol(ethernet.ethernet)#获取以太网协议信息
if eth.ethertype == ether_types.ETH_TYPE_LLDP:
# 忽略 lldp packet
return
dst = eth.dst #获取源MAC地址
src = eth.src #获取目的MAC地址
dpid = datapath.id #即交换机的id
self.mac_to_port.setdefault(dpid, {}) #设置mac_to_port的默认值
self.logger.info("packet in %s %s %s %s", dpid, src, dst, msg.in_port) #日志信息
# learn a mac address to avoid FLOOD next time.
self.mac_to_port[dpid][src] = msg.in_port
#交换机连接的主机的端口信息,即输入端口
#若通往目的主机的端口号找得到,设置为输出端口号,即单播
if dst in self.mac_to_port[dpid]:
out_port = self.mac_to_port[dpid][dst]
else:#找不到,设置输出端口为其他所有端口,即洪泛
out_port = ofproto.OFPP_FLOOD
# 动作为从输出端口转发
# actions = [datapath.ofproto_parser.OFPActionOutput(out_port)]
actions = [] #动作为空
# install a flow to avoid packet_in next time安装流表项
if out_port != ofproto.OFPP_FLOOD: #不是洪泛的情况
self.add_flow(datapath, msg.in_port, dst, src, actions)
data = None #数据部分为空
if msg.buffer_id == ofproto.OFP_NO_BUFFER:
data = msg.data
#下发流表项
out = datapath.ofproto_parser.OFPPacketOut(
datapath=datapath, buffer_id=msg.buffer_id, in_port=msg.in_port,actions=actions, data=data)
datapath.send_msg(out)
(4)阻断h1和h2之间的通信:将程序第81行的“actions = [datapath.ofproto_parser.OFPActionOutput(out_port)]”修改为“actions = []”;注:可先将原第81行的代码注释,另起一行再重新写“actions = []”。
(5)使用ICMP会话测试h1和h2之间的联通性;
(6)分析h1和h2之间不能通信的原理。
程序中action设为空,则在s1中无法安装流表项。由于交换机s1没有流表项,所有ping操作不可达,故h1和h2之间不能通信。
总结
此次实验初步学习RYU控制器,了解流表项的字段的设置和作用,主机之间无法通信的几种情况。