SDN实验报告 (1) (5)_第1页
SDN实验报告 (1) (5)_第2页
SDN实验报告 (1) (5)_第3页
SDN实验报告 (1) (5)_第4页
SDN实验报告 (1) (5)_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 信息网络基础研讨专题实验(SDN网络部分)姓 名: 单赟吉学 号: 11211105班 级: 通信1109班指导教师: 赵永祥实验时间: 第十周周二(一) openflow交换机的手动配置1、 实验目的1. 数据openflow交换机的手动配置环境2. 配置openflow交换机初始信息3. 手动配置转发表,实现主机之间通信2、 实验原理关于openflow交换机的实验系列由五个实验构成,这前四个实验须按顺序进行,因为后面的实验需要应用前面实验搭建的软件和硬件环境。第一个实验“openflow交换机的手动配置”熟悉交换机的手工配置环境,实现转发表的手工配置,配置交换机控制端口的地址;第二个实

2、验搭建控制器的软件环境,实现控制器和交换机的互联,运行控制器应用程序,把openflow交换机的功能通过程序实现为一个二层交换机;第三个实验编写一个简单的控制器软件,实现一个简单的广播交换机功能;第四个实验编写一个控制器软件,实现流表的下发和删除,通过这个实验测试控制器提供的编程接口。第五个实验研究在仿真软件中测试控制器程序和功能,同学们可以在自己计算机上调试好程序以后,再到真实的物理机器上实验,以提高实验设备的使用效率。分组交换机按照转发表把某一个输入端口的分组搬移到另外一个输出端口上输出。转发表实现分组目的地址和交换机输出端口之间的映射。转发表决定了交换机的行为。传统的交换机根据标准协议形

3、成转发表,这部分代码封装在交换机的操作系统中,交换机的运营者不能对转发表的形成继续修改,这样做的好处是保证了交换机的速率和可靠性。但是,运营者不能根据网络的具体特点和业务特性对交换机的转发行为进行专门的定制和设计,影响新业务的提供和增加网络运营成本。OpenFlow交换机把控制层面和转发层面分离,交换机的转发表可以由运营者手工本地配置,或者通过控制器远程修改和控制。在实际使用环境中,通过控制器远程修改和控制交换机流表。一个控制器就可以控制全网的交换机,控制器可以从全网的角度对每一个交换机的流表进行配置,从而实现全局优化和快速提供新的业务,极大降低了人工运营成本。国家标准化组织已经制定了交换机和

4、控制器之间的消息格式和交互过程,基于OpenFlow交换机的网络又称为软件定义网络,在大的数据中心已经实用。在OpenFlow网络中,所有的转发决策从各个交换机转移到控制器上,由控制器集中管理数据包的转发策略,通过OpenFlow协议负责与所有网络交换机进行交互,配置数据转发路径。OpenFlow网络示意图如上图所示,所有的数据包在网络中的传输路径由控制器(Controller)统一控制决定,OpenFlow交换机只负责转发数据包。控制器通过对交换机下发流(flow)来实现上述控制流程。一个OpenFlow交换机通常包含多个流表,每个流表含有多条流表条目(flow entries),每条条目由

5、匹配域(match fields),计数器(counters)和指令(instructions)组成。匹配域定义待匹配的数据包特征,如数据包到达的交换机入端口、源以太网地址、目的以太网地址、源IP地址、目标IP地址、VLAN标签。计数器用于对匹配流表的流量统计,更新进入OpenFlow与流匹配的数据包个数以及总字节数。指令用于修改匹配报文的动作集合,决定报文的转发操作,通常的操作有输出数据包到某端口、修改数据包首部信息等。控制器和OpenFlow交换机之间通过OpenFlow消息实现信息交互。 当一个数据包到达交换机时,如果与流表中的某一条流相匹配,便顺序执行该条流指令的操作。如果没有匹配的流

6、,则把整个数据包缓存在交换机中,并为该数据包配一个Buffer ID,随数据包一起作为Packet In消息发往控制器,控制器根据数据包的首部定义一条新的流决定该类数据包的处理策略,下发Flow Mod信息给交换机,Flow Mod消息用于在交换机中添加或删除流表条目,同时控制器以Packet Out消息作为载体将数据包返回交换机,Packet Out消息用于控制报文从指定端口发出,交换机依据随包的Buffer ID取出数据包,再根据新定义的流进行交换处理。本实验实现手动配置交换机转发表。为后续的实验准备实验环境和交换机基本配置。3、 实验器材1. 盛科V330 openflow交换机 2.

7、台式电脑 (一台)3. 普通交换机一台4、 实验内容1. 连接交换机的控制端口和计算机以太网卡。l 交换机的控制端口位于交换机右上角,交换机的控制端口的地址已经初始化为192.168.1.233,一般不允许学生再进行修改。l 配置计算机的以太网卡的地址也要设为192.168.1.0 网段,如192.168.1.230。l 把交换机的控制端口和计算机都连接到一台普通交换机如下图所示内网交换机 192.168.1.1openflow交换机配置计算机192.168.1.230计算机终端 192.168.1.220控制端口192.168.1.233数据端口2. 登陆交换机并熟悉交换局配置环境l 在计算

8、机上面打开命令行终端,输入telnet 192.168.1.233l 输入?获取交换机配置的帮助。如下图所示,可以获得交换机的各种命令的列表l 在命令的名字后面输入?可以获得这个命令的功能和使用说明。例如congfigure ?, 就会显示这个命令是配置终端所用3. 常用交换机命令l Show命令显示交换机的工作状态。输入以下命令: show interface status; show openflow controller status; show openflow ovsdb。观察结果,并根据帮助对这些命令进行解释l 配置控制器地址1. 输入configure terminal, 进入配

9、置状态。2. 输入: openflow set controller tcp 192.168.1.230 6633。在交换机上面设置控制器的地址。这里假设控制器的地址为192.168.1.230,默认端口6633。后面的实验中,需要按照控制器的实际地址在交换机上设置。3. 输入end,推出配置状态4. 手动配置流表。Ovs-ofctl 指令实现openflow交换机上流表的添加、删除和查询等动作。Ovs-ofctl指令集合的详细介绍见附录l 把测试计算机连接到openflow交换机的端口2,把openflow交换机的端口8连接到内网交换机。openflow交换机的端口号在交换机的面板上有数字标

10、明。内网交换机地址设为192.168.1.1。l 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 b

11、r0在测试计算机终端上面运行如下命令: ping 192.168.1.1,观察是否连通。上述命令的实际执行过程如下图所示其中,第一个“ovs-ofctl dump-flows br0”是在配置了流表,但是没有连接测试计算机时候得到的结果。第二个显示流表的命令是在连接了测试计算机以后观察到结果。可见流表确实实现了端口2和端口8之间的分组交换。测试计算机上也能观察到ping确实有反映,如果把测试计算机连接到其它物理端口,这ping没有响应。 (二)Openflow交换机和控制软件的互联及控制软件加载1、 实验目的l Controller控制器的软件安装l 控制器和Openflow交换机的互联l 加

12、载控制软件到Openflow交换机l 验证交换机预期功能2、 实验原理把RYU控制器连接到Openflow交换机,把一个控制器软件加载到Openflow交换机,这个控制器软件的原理是: 交换机接收到一个分组后,把这个分组报告给控制器终端,控制器终端显示;交换机把分组的源地址和接收到分组的物理端口关联起来;交换机查找目的地址对应的端口号,如果找到,把该分组转发到目的端口,否则在交换机的所有端口广播该分组。控制器软件加载到交换机以后,将实现一个普通交换机的功能,通过一个普通计算机终端验证这个功能。. 3、 实验器材1 盛科V330 openflow交换机一台2 普通交换机一台台3 普通计算机2台4

13、、 实验内容和步骤1) 连接网络拓扑网络连接如下图所示。Openflow交换机的控制端口的地址设为192.168.1.233,Openflow交换机控制端口和一个数据端口连接到内网交换机。RYU控制器连接到内网交换机。计算机终端连接到openflow交换机。通过控制器实现对openflow交换机的控制,使openflow交换机实现一个普通交换机功能。内网交换机 192.168.1.1openflow交换机 Ryu 控制器192.168.1.230计算机终端 192.168.1.220控制端口192.168.1.233数据端口数据端口2) 安装控制器软件Ryu控制器由一个普通计算机实现。由于目前

14、多数计算机采用windows操作系统,而Ryu控制器是有一个linux镜像实现,因此采用虚拟机的方法实现linux操作系统。l 安装Vmware软件l 导入Ryu操作系统镜像l 配置虚拟机的网络为桥接模式,实现虚拟机直接访问物理网络l 验证控制器与交换机控制端口的互通性:ping 192.168.1.2333) telnet 登陆交换机,配置模式控制器地址l 在命令行输入 telnet 192.168.1.233, 登陆交换机控制台l 获取configure 帮助: configure ?l 进入配置终端状态:configure terminall 在交换机控制台输入:openflow set

15、 controller tcp 192.168.1.230 6633l 退出配置状态:输入 end 命令4) 验证已经在交换机上面配置好控制器地址5) 加载控制器应用软件,通过控制器实现对交换机的控制。Simple_switch.py 控制器软件采用反向路径学习的方法实现mac地址的学习,在控制器上面实现简单交换机的功能。该软件在ryu/app路径下面l 把交换机的一个数据端口接入到一个内网或者校园网(下面的实验假设交换机数据端口连接到192.168.1.1的交换机l 在控制器的命令行终端执行如下命令:ryu-manager simple_switch.pyl 控制台出现如下结果: 交换机把接

16、收到的分组发送到控制器,在控制台显示出相关信息: 第一个数字是交换机编号,第二个数字是源mac地址,第三个数字是目的mac地址,第四个地址是交换机接收该分组的物理端口。l 改变内网连接到交换机的物理端口,观察最后一个数据域26变为其他数字l 检查流表的学习情况。从控制器远程登陆到交换机: telnet 192.168.1.233执行命令: ovs-ofctl dump-flows br06) 验证交换机功能使用一台普通计算机发送命令: ping 192.168.1.1, 证明该交换机完成转发功能最后另一台交换机确实ping 通了。(三)Openflow交换机控制软件的编写1、 实验目的l 编写

17、一个广播型二层交换机l 加载控制软件到Openflow交换机并验证预期功能2、 实验原理本实验由两个不同的任务构成:编制程序,把openflow交换机接收到的分组广播到所有的端口。3、 实验器材l 盛科V330 openflow交换机一台l 普通交换机一台台l 安装有winshark的普通计算机3台,一台作为控制器,两台作为测试终端。4、 实验内容和步骤1) 连接网络拓扑网络连接如下图所示。Openflow交换机的控制端口的地址设为192.168.1.233,Openflow交换机控制端口和一个数据端口连接到内网交换机。RYU控制器连接到内网交换机。两个安装有winshark的计算机终端连接到

18、openflow交换机。验证winshark能够实现正确的分组侦听。内网交换机 192.168.1.1openflow交换机 Ryu 控制器192.168.1.230计算机终端 192.168.1.220控制端口192.168.1.233数据端口计算机终端 192.168.1.221数据端口2) 编写广播程序使用文本编辑器,输入如下程序,把这个文件保存为l2.py。/* 引入控制器提供的功能*/from ryu.base import app_managerfrom ryu.controller import ofp_eventfrom ryu.controller.handler impor

19、t MAIN_DISPATCHERfrom 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

20、): 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_por

21、t=msg.in_port, actions=actions)/* 生成发往交换机的openflow消息 */ dp.send_msg(out)/* 把这个消息发往交换机 */3) 加载程序到控制器在控制器的终端,进入到保存l2.py的目录,输入如下命令: ryu-manager l2.py4) 验证交换机功能l 使用一台普通计算机发送命令: ping 192.168.1.1-t, l 另外一台安装有winshark的计算机启动抓包,分析接收到的分组。l 改变端口,抓包分析由于没有第三台具有抓包软件的计算机,所以只能大致的进行分析。 (四)Openflow控制器的接口函数的实验1、 实验目的l

22、 编写程序,验证控制器软件的常见接口函数,体验软件定义网络的消息类型2、 实验原理通过编程,向交换机下发一个流转发表,删除流转发表,验证转发表的生存时间,关闭和启动交换机的物理端口,获取交换机各个颗粒度的统计值。3、 实验器材l 盛科V330 openflow交换机一台l 普通交换机一台台l 安装有winshark的普通计算机3台,一台作为控制器,两台作为测试终端。4、 实验内容和步骤1) 连接网络拓扑,如实验三所示2) 编写接口函数的测试程序完整的测试程序如附录所示,下面的测试步骤需要按照测试的需要对测试程序进行修改,删除不相关的程序。下面介绍程序的框架结构class Tester(app_

23、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)/注册交换机物理端口处

24、理消息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.slee

25、p(1) else: Tester.run_test() break;3) 流表的下发和删除在上述程序的测试1部分加入如下代码,实现流表的下发和删除l 下面给出了下发一个流表到交换机的程序,这个流表把端口2的分组转发到端口三l 学生自行添加代码,实现把端口三的分组转发到端口2l 把测试计算机连接到openflow交换机的端口2,把openflow交换机的端口3连接到内网交换机192.168.1.1l 从测试计算机上检测到内网交换机的连通性。Ping 192.168.1.1l 采用类似下面的代码,实现交换机流表的删除,并进行验证l 设置转发表的生存时间,并进行验证match = ofproto_

26、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.OFPIT_APPLY_ACTIONS, oas)insts = insts.append(inst)定义对满足匹配规则的分组需要执行的动作:转发到输出端口3,动

27、作可以是一个链表,这里只有一个动作。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) 学生自选探索的部分l 获取端口信息l 获取流统计信息l 控制交换机发送分组附录一 OVS Open vSwitch 基本操作命

28、令1. 显示bridge的信息,连接到bridge上的interface,tap和端口号(port)ovs-ofctl show ovs-switch (注:在本实验环境中,ovs-switch均由br0代替)2. 显示flow entriesovs-ofctl dump-flows ovs-switch。3. 添加flowovs-ofctl add-flow ovs-switch "in_port=2,actions=output:8"。该命令有很多参数, 一般来说actions之前都是流匹配条件的部分,常用的流匹配条件是 l in_port: switch的端

29、口l dl_src: 源mac地址l dl_dst:目的mac地址l dl_type:以太网协议类型, 0x0806是arp packet, 0x0800是ip packetl nw_src:源IPl nw_dst:目的ipl nw_proto:网络层协议类型 ,注意和dl_type区分,同时也需要和dl_type一起使用,比如dl_type是ip(0x0800),nw_proto=1就表示icmp packetl tp_src: tcp udp源端口l tp_dst: tcp udp目的端口ipSame as dl_type=0x0800.icmpSame as dl_t

30、ype=0x0800,nw_proto=1.tcpSame as dl_type=0x0800,nw_proto=6.udpSame as dl_type=0x0800,nw_proto=17.arpSame as dl_type=0x0806.rarpSame as dl_type=0x8035.actions:满足匹配条件的处理方法,有如下三种可能l 转发到某个物理输出端口:output:portl 转发到控制器:controller(key=value)l 丢弃l 还可能包括如下动作:修改目的mac地址、源mac地址、目的ip地址、源ip地址、目的

31、端口号、源端口号等4. 删除所有flowovs-ofctl del-flows ovs-switch附录二 控制器接口函数实验的完整代码(实验四的实验)import loggingimport structimport geventfrom ryu.base import app_managerfrom ryu.controller import ofp_eventfrom ryu.controller.handler import MAIN_DISPATCHER, CONFIG_DISPATCHERfrom ryu.controller.handler import set_ev_clsfr

32、om ryu.ofproto import ofproto_v1_3from ryu.ofproto import ofproto_v1_3_parserfrom ryu.lib import mac#mac.haddr_to_binLOG = logging.getLogger('ryu.app.Tester')datapath = Nonetester = Noneclass Tester(app_manager.RyuApp): def _init_(self, *args, *kwargs): super(Tester, self)._init_(*args, *kwa

33、rgs) self.waiters = global tester tester = self def stats_reply_handler(self, ev): msg = ev.msg dp = msg.datapath if dp.id not in self.waiters: print 'dp id is not in the waiters, maybe the request is timeout' return if msg.xid not in self.waitersdp.id: print 'msg xid is not in the waite

34、rs, maybe the request is timeout' return lock, msgs = self.waitersdp.idmsg.xid msgs.append(msg) print 'stats_reply_handler:', msgs if msg.flags & dp.ofproto.OFPSF_REPLY_MORE: print 'more flag present, wait for the continued reply' return del self.waitersdp.idmsg.xid lock.set(

35、) set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER) def switch_features_handler(self, ev): msg = ev.msg datapath = msg.datapath ev.msg.datapath.ev_q.set_dispatcher(MAIN_DISPATCHER) set_ev_cls(ofp_event.EventOFPPortStatsReply, MAIN_DISPATCHER) def port_stats_reply_handler(self, ev): sel

36、f.stats_reply_handler(ev) set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER) def switch_features_handler(self, ev): msg = ev.msg global datapath datapath = msg.datapath staticmethod def run_test(): global datapath print 'Test begins.' print 'Test0: test switch config.' s

37、c = ofproto_v1_3_parser.OFPSetConfig(datapath, ofproto_v1_3.OFPC_FRAG_NORMAL, 1518) datapath.send_msg(sc) gcr = ofproto_v1_3_parser.OFPGetConfigRequest(datapath) datapath.send_msg(gcr) print 'Test1: test flow(in_port=1, instructions=apply_actions(actions=output 2) add/delete.' match = ofprot

38、o_v1_3_parser.OFPMatch() match.set_in_port(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.OFPIT_APPLY_ACTIONS, oas) insts = insts.append(inst) fm = ofproto_v1_3_parser.OFPFlowMod(datapath, 0,

39、0, 0, # table 0 ofproto_v1_3.OFPFC_ADD, 0, 0, 0, 0xffffffff, ofproto_v1_3.OFPP_ANY, 0xffffffff, 0, match, insts) datapath.send_msg(fm) # delete the just-installed flow. # NB: match can' be reused because ryu add some class data dynamically. match = ofproto_v1_3_parser.OFPMatch() match.set_in_por

40、t(1) fm = ofproto_v1_3_parser.OFPFlowMod(datapath, 0, 0, 0, # table 0 ofproto_v1_3.OFPFC_DELETE, 0, 0, 0, 0xffffffff, ofproto_v1_3.OFPP_ANY, 0xffffffff, 0, match, insts) datapath.send_msg(fm) # reinstall the flow with timeout match = ofproto_v1_3_parser.OFPMatch() match.set_in_port(1) oas = oao = of

41、proto_v1_3_parser.OFPActionOutput(2, ofproto_v1_3.OFPCML_MAX) oas.append(oao) mted = ofproto_v1_3_parser.MTEthDst(ofproto_v1_3.OXM_OF_ETH_DST, mac.haddr_to_bin("01:00:00:00:D4:8F") oasf = ofproto_v1_3_parser.OFPActionSetField(mted) oas.append(oasf) inst = ofproto_v1_3_parser.OFPInstruction

42、Actions(ofproto_v1_3.OFPIT_APPLY_ACTIONS, oas) insts = insts.append(inst) fm = ofproto_v1_3_parser.OFPFlowMod(datapath, 0, 0, 0, # table 0 ofproto_v1_3.OFPFC_ADD, 3, 3, 0, 0xffffffff, ofproto_v1_3.OFPP_ANY, 0xffffffff, ofproto_v1_3.OFPFF_SEND_FLOW_REM, # send flow removal. match, insts) datapath.sen

43、d_msg(fm) print 'Test2: test port config.' pm = ofproto_v1_3_parser.OFPPortMod(datapath, 1, mac.haddr_to_bin("01:00:00:00:D4:8F"), ofproto_v1_3.OFPPC_NO_RECV, ofproto_v1_3.OFPPC_NO_RECV, 0) datapath.send_msg(pm) # restore the config. pm = ofproto_v1_3_parser.OFPPortMod(datapath, 1, mac.haddr_to_bin("01:00:00:00:D4:8F"), 0, ofproto_v1_3.OFPPC_NO_RECV, 0) datapath.send_msg(pm) print 'Test3: test multipart message.' dr = ofproto_v1_3_parser.OFPDescStatsRequest(datapath,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论