概述
OpenFlow协议及其简单仿真
在讲述本文的主旨之前,先来说一说SDN的三大要素:
1. 转发与控制分离,这使得网络交换机的数据转发变得更加简单、快速;同时,控制变成了网络操作系统中一个相对集中的逻辑功能。
2. OpenFlow协议,它向交换机传送转发表,交换机依此转发报文。这种做法与传统网络完全不同。在传统网络架构中,交换机和路由器需要自己决定报文的转发路径,这可能会给网络运营商带来一些不可预知的负面影响,包括成本增加、性能降低、上市时间延缓 等。有了SDN,控制软件决定报文的转发路径,使得运营商可以“随心所欲”地控制网络。
3. 具有一致性的、全系统范围的网络操作系统可编程接口,它能让网络实现真正意义上的可编程或者软件定义。如果不能实现转发与控制分离,那么几乎所有SDN所能带来的好处都无法体现;如果能实现转发和控制分离,但没有OpenFlow协议,那么就需要通过其它途径,将所需要的流量表信息传递给交换机。OpenFlow就是实现这一功能的行业标准.
以上可以看出OpenFlow对于SDN的重要性不言而喻,本文将就OpenFlow的相关内容做一定总结,以及简单的OpenFlow仿真平台的搭建.
1 .OpenFlow简介
OpenFlow是由斯坦福大学的Nick McKeown教授在2008年4月ACM Communications Review上发表的一篇论文OpenFlow: enabling innovation in campus networks首先详细论述了OpenFlow的原理。由该论文课题可知OpenFlow提出的最初出发点是用于校园内网络研究人员实验其创新网络架构、协议,考虑到实际的网络创新思想需要在实际网络上才能更好地验证,而研究人员又无法修改在网的网络设备,故而提出了OpenFlow的控制转发分离架构,将控制逻辑从网络设备盒子中引出来,研究者可以对其进行任意的编程从而实现新型的网络协议、拓扑架构而无需改动网络设备本身。
OpenFlow的思路很简单,网络设备维护一个FlowTable并且只按照FlowTable进行转发,FlowTable本身的生成、维护、下发完全由外置的Controller来实现,注意这里的FlowTable并非是指IP五元组,事实上OpenFlow 1.0定义的了包括端口号、VLAN、L2/L3/L4信息的10个关键字,但是每个字段都是可以通配的,网络的运营商可以决定使用何种粒度的流,比如运营商只需要根据目的IP进行路由,那么流表中就可以只有目的IP字段是有效的,其它全为通配。
2.OpenFlow协议的四个规范
2.1 OpenFlow的端口:
物理端口:即设备上物理可见的端口
逻辑端口:在物理端口的基础上由switch设备抽象出来的逻辑端口,如为tunnel或者聚合等功能而实现的逻辑端口:
OpenFlow定义的端口:OpenFlow目前总共定义了ALL,CONTROLLER TABLE IN_PORT,ANY LOCAL 和FLOOD等8种端口,其中后3种为非必须的端口,只在混合型的OpenFlow Switch中存在.
2.2流表
OpenFlow通过用户定义的或者预设的规则来匹配和处理网络包.一条OpenFlow的规则由匹配域(Match Fields)优先(Priority)处理指令(Instructions)和统计数据(如Counters)等字段组成,如下图所示.
Ingress Port | Ether Source | Ether Dst | Ether Type | Vlan Id | IP Src | IP dst
| IP Tos Bits | TCP/UDP Src Port | TCP/UDP Dst Port |
在一条规则中,可以根据网络报在L2 L3 或者L4等网络报文头的任意字段进行匹配,比如以太网的源MAC地址,IP包的协议类型和IP地址,或者TCP/UDP的端口号等.目前OpenFlow的规范中还规定了Switch厂商可以选择性地支持通配符进行匹配.
2.3 通信通道
OpenFlow规范定义了一个OpenFlow Switch如何与Controller建立连接、通讯以及相关消息类型等。
OpenFlow规范中定义了三种消息类型:
a) Controller/Switch消息,是指由Controller发起、Switch接收并处理的消息,主要包括Features、Configuration、Modify-State、Read-State、Packet-out、Barrier和Role-Request等消息。这些消息主要由Controller用来对Switch进行状态查询和修改配置等操作
b) 异步(Asynchronous)消息,是由Switch发送给Controller、用来通知Switch上发 生的某些异步事件的消息,主要包括Packet-in、Flow-Removed、Port-status和Error等。例如,当某一条规则因为超时而被删除时,Switch将自动发送一条Flow-Removed消息通知Controller,以方便Controller作出相应的操作,如重新设置相关规则等。
c) 对称(Symmetric)消息,顾名思义,这些都是双向对称的消息,主要用来建立连接、检测对方是否在线等,包括Hello、Echo和Experimenter三种消息。
3.OpenFlow仿真平台mininet的搭建
Mininet是一个轻量级软件定义网络(SDN)和测试平台;它采用轻量级的徐立华技术使一个单一的系统看起来像一个王铮的网络运行相关的系统内核和用户代码,也可以理解为SDN网络系统中的一种基于进程虚拟化平台,它支持OpenFlow OpenvSwith等各种协议,Mininet也可以魔力一个完整的网络主机,链接和交换机在同一台计算机上且有助于互动开发、测试和演示,尤其是那些使用 OpenFlow 和 SDN 技术;同时也可将此进程虚拟化的平台下代码迁移到真实的环境中。
3.1 mininet的安装
本文所采用的系统环境为Ubuntu14.04,具体安装流程如下:
# git clone git://github.com/mininet/mininet
# cd mininet/util/
# ./install.sh -a
# ls
mininet of-dissector oflops oftest OpenFlow pox
3.2创建网络
由于 Mininet 支持自定义网络,这里先引用一个简单网络示例如图 1,在 Mininet 网络系统中直接输入 mn 命令,可以在此系统中创建单层的拓扑网络,从中默认创建了两台 host 和一个交换机,并且激活了控制器和交换机。同时也可以通过命令 net 查看到链路情况,先简单列出了示例,如在 Mininet 系统中启用 Web 服务器与客户端。
使用的命令为:
mininet> h1 python -m SimpleHTTPServer 80 &
#在主机 h1 开启 Web 服务
mininet> h2 wget -O - h1
运行结果如下图所示:
在mininet系统上,实现两主机互连测试.
查看节点和链接
输出各个节点的信息:
测试主机之间的连通性:
两个主机相互ping:
名字空间 namespace
通常情况下,主机界面有用独立的名字空间 namespace,而控制节点跟交换节点都在根名字空间(root namespace)中。如果想要让所有节点拥有各自的名字空间,需要添加 --innamespace 参数,即执行:mn --innamespace
另外一个例子:
网络的拓扑结构如下:
命令很简单:mininet@mininet-vm:~$ sudo mn --topo single,3 --mac --switch ovsk --controller remote
表明拓扑有三个虚机host,h1,h2,h3分别有独立的IP地址,三个host分别连接到本地kernel里的OpenFlow交换机的三个端口,然后OpenFlow交换机连接到remote的controller,其实就是在本地。
通过mininet net命令可以查看拓扑:
启动wireshark抓包软件,选择的端口为loopback,开启抓包,可以看到很多数据包,我们只想看OpenFlow的,就在filter里输入’of’来过滤一下,启动controller。
mininet@mininet-vm:~$ controller ptcp:
就可以在wireshark界面中得到如下的结果:
4.小结
本文主要是对SDN中采用的协议OpenFlow进行了简单的介绍,阐述了一下OpenFlow协议的几个规范,主要部分是在linux下搭建了OpenFlow的仿真平台mininet,并在此平台中搭建了简单的网络,进行了仿真。OpenFlow协议和该仿真平台的研究还可以进一步的深入研究。
最后
以上就是斯文皮卡丘为你收集整理的OpenFlow协议及其简单仿真 OpenFlow协议及其简单仿真的全部内容,希望文章能够帮你解决OpenFlow协议及其简单仿真 OpenFlow协议及其简单仿真所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复