SDN实验报告
信息网络基础研讨专题实验(SDN网络部分)
姓名:单赟吉
学号:11211105
班级:通信1109班
指导教师:赵永祥
实验时间:第十周周二
(一) openflow交换机的手动配置
1、实验目的
1.数据openflow交换机的手动配置环境
2.配置openflow交换机初始信息
3.手动配置转发表,实现主机之间通信
2、实验原理
关于openflow交换机的实验系列由五个实验构成,这前四个实验须按顺序进行,因为后面的实验需要应用前面实验搭建的软件和硬件环境。第一个实验“openflow交换机的手动配置”熟悉交换机的手工配置环境,实现转发表的手工配置,配置交换机控制端口的地址;第二个实验搭建控制器的软件环境,实现控制器和交换机的互联,运行控制器应用程序,把openflow交换机的功能通过程序实现为一个二层交换机;第三个实验编写一个简单的控制器软件,实现一个简单的广播交换机功能;第四个实验编写一个控制器软件,实现流表的下发和删除,通过这个实验测试控制器提供的编程接口。
第五个实验研究在仿真软件中测试控制器程序和功能,同学们可以在自己计算机上调试好程序以后,再到真实的物理机器上实验,以提高实验设备的使用效率。
分组交换机按照转发表把某一个输入端口的分组搬移到另外一个输出端口上输出。转发表实现分组目的地址和交换机输出端口之间的映射。转发表决定了交换机的行为。
传统的交换机根据标准协议形成转发表,这部分代码封装在交换机的操作系统中,交换机的运营者不能对转发表的形成继续修改,这样做的好处是保证了交换机的速率和可靠性。但是,运营者不能根据网络的具体特点和业务特性对交换机的转发行为进行专门的定制和设计,影响新业务的提供和增加网络运营成本。
OpenFlow交换机把控制层面和转发层面分离,交换机的转发表可以由运营者手工本地配置,或者通过控制器远程修改和控制。在实际使用环境中,通过控制器远程修改和控制交换机流表。一个控制器就可以控制全网的交换机,控制器
可以从全网的角度对每一个交换机的流表进行配置,从而实现全局优化和快速提供新的业务,极大降低了人工运营成本。
国家标准化组织已经制定了交换机和控制器之间的消息格式和交互过程,基于OpenFlow交换机的网络又称为软件定义网络,在大的数据中心已经实用。
在OpenFlow网络中,所有的转发决策从各个交换机转移到控制器上,由控制器集中管理数据包的转发策略,通过OpenFlow协议负责与所有网络交换机进行交互,配置数据转发路径。
OpenFlow网络示意图如上图所示,所有的数据包在网络中的传输路径由控制器(Controller)统一控制决定,OpenFlow交换机只负责转发数据包。
控制器通过对交换机下发流(flow)来实现上述控制流程。一个OpenFlow 交换机通常包含多个流表,每个流表含有多条流表条目(flow entries),每条条目由匹配域(match fields),计数器(counters)和指令(instructions)组成。匹配域定义待匹配的数据包特征,如数据包到达的交换机入端口、源以太网地址、目的以太网地址、源IP地址、目标IP地址、VLAN标签。计数器用于对匹配流表的流量统计,更新进入OpenFlow与流匹配的数据包个数以及总字节数。指令用于修改匹配报文的动作集合,决定报文的转发操作,通常的操作有输出数据包到
某端口、修改数据包首部信息等。
控制器和OpenFlow交换机之间通过OpenFlow消息实现信息交互。当一个数据包到达交换机时,如果与流表中的某一条流相匹配,便顺序执行该条流指令的操作。如果没有匹配的流,则把整个数据包缓存在交换机中,并为该数据包配一个Buffer ID,随数据包一起作为Packet In消息发往控制器,控制器根据数据包的首部定义一条新的流决定该类数据包的处理策略,下发Flow Mod信息给交换机,Flow Mod消息用于在交换机中添加或删除流表条目,同时控制器以Packet Out消息作为载体将数据包返回交换机,Packet Out消息用于控制报文从指定端口发出,交换机依据随包的Buffer ID取出数据包,再根据新定义的流进行交换处理。
本实验实现手动配置交换机转发表。为后续的实验准备实验环境和交换机基本配置。
3、实验器材
1.盛科V330 openflow交换机
2.台式电脑(一台)
3.普通交换机一台
4、实验内容
1.连接交换机的控制端口和计算机以太网卡。
●交换机的控制端口位于交换机右上角,交换机的控制端口的地址已经初
始化为192.168.1.233,一般不允许学生再进行修改。
●配置计算机的以太网卡的地址也要设为192.168.1.0 网段,如
192.168.1.230。
●把交换机的控制端口和计算机都连接到一台普通交换机
如下图所示
2.登陆交换机并熟悉交换局配置环境
●在计算机上面打开命令行终端,输入telnet 192.168.1.233
●输入?获取交换机配置的帮助。如下图所示,可以获得交换机的各种命
令的列表
●在命令的名字后面输入?可以获得这个命令的功能和使用说明。例如
congfigure ?, 就会显示这个命令是配置终端所用
3.常用交换机命令
●Show命令显示交换机的工作状态。输入以下命令:show interface
status; show openflow controller status; show openflow ovsdb。观察结
果,并根据帮助对这些命令进行解释
●配置控制器地址
1.输入configure terminal, 进入配置状态。
2.输入: openflow set controller tcp 192.168.1.230 6633。在交换机上
面设置控制器的地址。这里假设控制器的地址为192.168.1.230,
默认端口6633。后面的实验中,需要按照控制器的实际地址在交
换机上设置。
3.输入end,推出配置状态
4.手动配置流表。Ovs-ofctl 指令实现openflow交换机上流表的添加、删除
和查询等动作。Ovs-ofctl指令集合的详细介绍见附录
●把测试计算机连接到openflow交换机的端口2,把openflow交换机的
端口8连接到内网交换机。openflow交换机的端口号在交换机的面板
上有数字标明。内网交换机地址设为192.168.1.1。
●telnet登陆交换机,执行如下命令
ovs-ofctl add-flow ovs-switch "in_port=2,actions=output:8" 这个命令把openflow 交换机第2个端口接收到的分组转发到第8个端口。
ovs-ofctl add-flow ovs-switch "in_port=8,actions=output:2" 这个命令把openflow 交换机第8个端口接收到的分组转发到第2个端口。
5.验证流表配置
输入如下命令观察配置的流表:
ovs-ofctl dump-flows br0
在测试计算机终端上面运行如下命令: ping 192.168.1.1,观察是否连通。
上述命令的实际执行过程如下图所示
其中,第一个“ovs-ofctl dump-flows br0”是在配置了流表,但是没有连接测试计算机时候得到的结果。第二个显示流表的命令是在连接了测试计算机以后观察到结果。可见流表确实实现了端口2和端口8之间的分组交换。
测试计算机上也能观察到ping确实有反映,如果把测试计算机连接到其它物理
端口,这ping没有响应。
(二)Openflow交换机和控制软件的互联及控制软件加载
1、实验目的
●Controller控制器的软件安装
●控制器和Openflow交换机的互联
●加载控制软件到Openflow交换机
●验证交换机预期功能
2、实验原理
把RYU控制器连接到Openflow交换机,把一个控制器软件加载到Openflow交换机,这个控制器软件的原理是:交换机接收到一个分组后,把这个分组报告给控制器终端,控制器终端显示;交换机把分组的源地址和接收到分组的物理端口关联起来;交换机查找目的地址对应的端口号,如果找到,把该分组转发到目的端口,否则在交换机的所有端口广播该分组。
控制器软件加载到交换机以后,将实现一个普通交换机的功能,通过一个普通计算机终端验证这个功能。
.
3、实验器材
1盛科V330 openflow交换机一台
2普通交换机一台台
3普通计算机2台
4、实验内容和步骤
1)连接网络拓扑
网络连接如下图所示。Openflow交换机的控制端口的地址设为
192.168.1.233,Openflow交换机控制端口和一个数据端口连接到内网交换机。RYU控制器连接到内网交换机。计算机终端连接到openflow交换机。
通过控制器实现对openflow交换机的控制,使openflow交换机实现一个普通交换机功能。
2)安装控制器软件
Ryu控制器由一个普通计算机实现。由于目前多数计算机采用windows操作系统,而Ryu控制器是有一个linux镜像实现,因此采用虚拟机的方法实现linux 操作系统。
●安装Vmware软件
●导入Ryu操作系统镜像
●配置虚拟机的网络为桥接模式,实现虚拟机直接访问物理网络
●验证控制器与交换机控制端口的互通性:ping 192.168.1.233
3)telnet 登陆交换机,配置模式控制器地址
●在命令行输入 telnet 192.168.1.233,登陆交换机控制台
●获取configure 帮助: configure ?
●进入配置终端状态:configure terminal
●在交换机控制台输入:openflow set controller tcp 192.168.1.230
6633
●退出配置状态:输入 end 命令
4)验证已经在交换机上面配置好控制器地址
5)加载控制器应用软件,通过控制器实现对交换机的控制。
Simple_switch.py 控制器软件采用反向路径学习的方法实现mac地址的学习,在控制器上面实现简单交换机的功能。该软件在ryu/app路径下面
●把交换机的一个数据端口接入到一个内网或者校园网(下面的实验假设交换
机数据端口连接到192.168.1.1的交换机
●在控制器的命令行终端执行如下命令:ryu-manager
simple_switch.py
●控制台出现如下结果:
交换机把接收到的分组发送到控制器,在控制台显示出相关信息:第
一个数字是交换机编号,第二个数字是源mac地址,第三个数字是目的
mac地址,第四个地址是交换机接收该分组的物理端口。
●改变内网连接到交换机的物理端口,观察最后一个数据域26变为其他数字●检查流表的学习情况。
从控制器远程登陆到交换机: telnet 192.168.1.233
执行命令: ovs-ofctl dump-flows br0
6)验证交换机功能
使用一台普通计算机发送命令: ping 192.168.1.1,证明该交换机完成转发功能
最后另一台交换机确实ping 通了。
(三)Openflow交换机控制软件的编写
1、实验目的
●编写一个广播型二层交换机
●加载控制软件到Openflow交换机并验证预期功能
2、实验原理
本实验由两个不同的任务构成:编制程序,把openflow交换机接收到的分组广播到所有的端口。
3、实验器材
●盛科V330 openflow交换机一台
●普通交换机一台台
●安装有winshark的普通计算机3台,一台作为控制器,两台作为测试终
端。
4、实验内容和步骤
1)连接网络拓扑
网络连接如下图所示。Openflow交换机的控制端口的地址设为
192.168.1.233,Openflow交换机控制端口和一个数据端口连接到内网交换机。RYU控制器连接到内网交换机。两个安装有winshark的计算机终端连接到openflow交换机。
验证winshark能够实现正确的分组侦听。
2)编写广播程序
使用文本编辑器,输入如下程序,把这个文件保存为l2.py。
/* 引入控制器提供的功能*/
from ryu.base import app_manager
from ryu.controller import ofp_event
from ryu.controller.handler import MAIN_DISPATCHER
from ryu.controller.handler import set_ev_cls
/* 建立一个广播交换机的类 */
class L2Switch(app_manager.RyuApp):
def __init__(self, *args, **kwargs):
super(L2Switch, self).__init__(*args, **kwargs) @set_ev_cls(ofp_event.EventOFPPacketIn,
MAIN_DISPATCHER)
/* 交换机接收到一个分组的处理函数 */
def packet_in_handler(self, ev):
msg = ev.msg /* 获取接收的分组 */
dp = msg.datapath /* 获取接收的分组的数据通路 */
ofp = dp.ofproto /* 获取接收到的分组的协议 */
ofp_parser = dp.ofproto_parser /* 解析接收的分组的协议*/
actions =
[ofp_parser.OFPActionOutput(ofp.OFPP_FLOOD)]
/* 定义接收的分组的处理动作为广播 */
out = ofp_parser.OFPPacketOut(
datapath=dp, buffer_id=msg.buffer_id,
in_port=msg.in_port,
actions=actions)
/* 生成发往交换机的openflow消息 */
dp.send_msg(out)
/* 把这个消息发往交换机 */
3)加载程序到控制器
在控制器的终端,进入到保存l2.py的目录,输入如下命令: ryu-manager l2.py
4)验证交换机功能
●使用一台普通计算机发送命令: ping 192.168.1.1-t,
●另外一台安装有winshark的计算机启动抓包,分析接收到的分组。
●改变端口,抓包分析
由于没有第三台具有抓包软件的计算机,所以只能大致的进行分析。
(四)Openflow控制器的接口函数的实验
1、实验目的
●编写程序,验证控制器软件的常见接口函数,体验软件定义网络的消息
类型
2、实验原理
通过编程,向交换机下发一个流转发表,删除流转发表,验证转发表的生存时间,关闭和启动交换机的物理端口,获取交换机各个颗粒度的统计值。
3、实验器材
●盛科V330 openflow交换机一台
●普通交换机一台台
●安装有winshark的普通计算机3台,一台作为控制器,两台作为测试终
端。
4、实验内容和步骤
1)连接网络拓扑,如实验三所示
2)编写接口函数的测试程序
完整的测试程序如附录所示,下面的测试步骤需要按照测试的需要对测试程序进行修改,删除不相关的程序。
下面介绍程序的框架结构
class Tester(app_manager.RyuApp):
def __init__(self, *args, **kwargs):
// 初始化函数
def stats_reply_handler(self, ev):
//统计信息处理函数
@set_ev_cls(ofp_event.EventOFPSwitchFeatures,
CONFIG_DISPATCHER)
//注册交换机特征处理消息
def switch_features_handler(self, ev):
//交换机特征消息的处理函数
@set_ev_cls(ofp_event.EventOFPPortStatsReply, MAIN_DISPATCHER)
//注册交换机物理端口处理消息
def port_stats_reply_handler(self, ev):
self.stats_reply_handler(ev)
//交换机物理端口消息的处理函数
def run_test():
//测试1:流表的增加和删除代码
def test_driver(): //测试程序的主程序
"""Will be scheduled by gevent"""
print 'Let\' go !'
global datapath
while True:
if datapath is None:
gevent.sleep(1)
else:
Tester.run_test()
break;
3)流表的下发和删除
在上述程序的测试1部分加入如下代码,实现流表的下发和删除
●下面给出了下发一个流表到交换机的程序,这个流表把端口2的分组转发到
端口三
●学生自行添加代码,实现把端口三的分组转发到端口2
●把测试计算机连接到openflow交换机的端口2,把openflow交换机的端口
3连接到内网交换机192.168.1.1
●从测试计算机上检测到内网交换机的连通性。Ping 192.168.1.1
●采用类似下面的代码,实现交换机流表的删除,并进行验证
●设置转发表的生存时间,并进行验证
match = ofproto_v1_3_parser.OFPMatch()
//获取一个匹配对象
match.set_in_port(1)
//规定从端口1输入的分组满足匹配规则
oa = ofproto_v1_3_parser.OFPActionOutput(2,
ofproto_v1_3.OFPCML_MAX)
oas = []
oas.append(oa)
inst =
ofproto_v1_3_parser.OFPInstructionActions(ofproto_v1_3.OF
PIT_APPLY_ACTIONS, oas)
insts = []
insts.append(inst)
定义对满足匹配规则的分组需要执行的动作:转发到输出端口3,动作可以是一
个链表,这里只有一个动作。
fm = ofproto_v1_3_parser.OFPFlowMod(datapath,
0, 0,
0, # table 0
ofproto_v1_3.OFPFC_ADD,
0, 0,
0,
0xffffffff,
ofproto_v1_3.OFPP_ANY,
0xffffffff,
0,
match,
insts)
openflow消息格式化
datapath.send_msg(fm)
发送这个消息
4)学生自选探索的部分
●获取端口信息
●获取流统计信息
●控制交换机发送分组
附录一 OVS Open vSwitch 基本操作命令
1.显示bridge的信息,连接到bridge上的interface,tap和端口号(port)
ovs-ofctl show ovs-switch (注:在本实验环境中,ovs-switch
均由br0代替)
2.显示flow entries
ovs-ofctl dump-flows ovs-switch。
3.添加flow
ovs-ofctl add-flow ovs-switch
"in_port=2,actions=output:8"。该命令有很多参数, 一般来说
actions之前都是流匹配条件的部分,常用的流匹配条件是
●in_port: switch的端口
●dl_src: 源mac地址
●dl_dst:目的mac地址
●dl_type:以太网协议类型, 0x0806是arp packet, 0x0800是ip
packet
●nw_src:源IP
●nw_dst:目的ip
●nw_proto:网络层协议类型,注意和dl_type区分,同时也需要和
dl_type一起使用,比如dl_type是ip(0x0800),nw_proto=1就
表示icmp packet
●tp_src: tcp udp源端口
●tp_dst: tcp udp目的端口
i p Same as dl_type=0x0800.
icmp Same
as dl_type=0x0800,nw_proto=1.
tcp Same
as dl_type=0x0800,nw_proto=6.
udp Same
as dl_type=0x0800,nw_proto=17.
arp Same as dl_type=0x0806.
rarp Same as dl_type=0x8035.
actions:满足匹配条件的处理方法,有如下三种可能
●转发到某个物理输出端口:output:port
●转发到控制器:controller(key=value)
●丢弃
●还可能包括如下动作:修改目的mac地址、源mac地址、目的ip地址、
源ip地址、目的端口号、源端口号等
4.删除所有flow
ovs-ofctl del-flows ovs-switch
附录二控制器接口函数实验的完整代码(实验四的实验)
import logging
import struct
import gevent