概述
根据前面的SDN初探,我们知道SDN由哪些内容组成,并且知道了,使用SDN能带来什么好处,以及在什么情况下使用SDN等。下面,我们来剖析SDN架构。
SDN的三个主要特征
网络开放可编程
控制平面与数据平面分离
逻辑上的集中控制
SDN简易架构
即应用程序通过北向接口,再到南向接口,对数据平面/转发层的控制。
事实上,当网络足够庞大的时候,一个控制器是满足不了需求的,这时候就成了控制器集群,东西接口,主要用于控制器集群之间的通信,用于增强整个控制平面的可靠性和可拓展性。
SDN控制平面通过下发指令到SDN数据平面,SDN数据平面反馈信息到控制平面,包括数据平面自己的一些参数,规格等等。
SDN控制平面只关心如何编程去控制网络,不关心底层协议,而SDN数据平面将不同协议整合到匹配表,由SDN控制器负责调用。
SDN出现的原因
SDN出现的原因是值得关心的,毕竟一个新事物的诞生,总要带来点什么,和解决一些什么问题。
对于传统网络,需要手动用命令来配置,这导致效率低下,当需要快速部署的时候,通过人工配置难以达到要求。
对于传统的网络设备,如果要提升某方面的性能,由于设备的紧密耦合,这导致升级困难,如果要升级,就要将整个设备进行升级,甚至要联系厂商才能进行升级。
所以就有了一个组织站出来定义了一套规则,ForCES,定义来一套新规则来实现控制平面对数据平面的安装,但大多人不习惯使用。
后来RCP吸取了ForCES的教训,既然大家没难么容易接受一个新事物,他们就再旧事物的基础上,也就是使用BGP协议来实现对数据平面转发规则的安装。
后来甚至实现了协议无关的规则安装,并非基于已有的协议来实现报文的匹配和转发。而是基于一种{offset,length}的方式来实现对数据的控制。
狭义的SDN南向编程接口–OpenFlow
Openflow有多个版本,现在比较稳定的版本是1.3和1.0,这里对1.3版本进行剖析。
Controller通过下发Openflow协议通道下发策略给Openflow交换机,openflow交换机就成了策略的执行者,例如controller下发流表项给openflow交换机,当数据包从端口进入到交换机且匹配流表项失时,就将数据包放到packet-in中并上报给controller,controller再下发流表项和packet-out(对数据的具体处理)来告诉交换机如何处理这个报文。在1.0的基础上,新增了组表和meter表,支持table-miss动作。
Openflow流表组成
Openflow流表组成,流表中含有若干流表项,每个流表项包括:
匹配域、优先级、计数器、指令、计时器、Cookie
后续再来讲解每个成分的意义。
组表的组成
有了流表,为什么还要组表呢?组表又是什么呢?
所谓的组表,就是包含一组动作的表。它不同与流表的单项动作,我们来看一下它的组成:
组成号、类型、计数器、动作桶
它能够被多个流表项指向,也就是可以接收来自多个流表项的数据报,这也就赋予了它实现组播、负载均衡、聚合、容灾备份等功能。
Meter表的组成
这个表被赋予了一种专项任务,它主要用来计量和限速。
它由如下结构组成:
计量表号、计数带、计数器
从而实现QoS功能。
Openfow通道
即控制器和交换机交流信息的通道。它由三种类型的报文,如下。
Controller-to-Switch报文
控制器给交换机发送信息的报文。
Features:有Request和Reply两种,Request用来请求交换机的特征信息和端口的特征信息,即属性。
Configuration:包括请求、回复、设置交换机的配置信息。
Modify-State:用于修改交换机的流表、组表、Meter表、端口的状态。
Read-State:用于获取交换机的流表、组表、Meter表、端口的状态。
Packet-out:用于响应Packet-in报文,经常跟随在Flow-Mod报文后,用来指挥匹配失败的报文,这个报文可以由控制器接收然后回馈给交换机,也可以是交换机匹配失败放到缓存中。
Barrier:分为Request和Reply两种,用于确保操作的执行顺序。
Role-Request:多控制器下,控制器用来请求角色。
Asynchronous-Configuration:异步配置。
Asynchronous报文
我更喜欢称为Switch-To-Cotroller报文。
packet-in:当数据报匹配流表项失败的时候,上交给Controller处理,或者存到交换机的缓存中。通过Packet-in报文通知交换机处理。
Flow-Removed:当一个流表项失效的时候, 每个流表项都有一个计时器,用来计算当前流表运行的时间,当然也有失效时间。
Port-Status:当端口状态发生变化的时候,通过该报文告知控制器。
Role-Status:告知控制器角色发生了变化。
Controller-Status:告知控制器Openflow的连接的变化。
Flow-Monitor:告知控制器流表的改变。
Symmetric报文
控制器或者交换机任意一方发送的报文,无需得到对方的邀请和许可。
Hello:通道建立初期,用来协商版本。
Echo:用于测试时延和带宽。
Error:一般交换机告知控制器请求发生错误。
Experimenter:用于实验场景的报文。
交换机向控制器发起TCP连接建立请求之后,执行如下过程。
OF-config
OpenFlow的辅助协议,用来对交换机的资源、功能等进行配置,这不属于Openflow协议的管理范围,所以就出现了一种OF-config协议来管理。
采用XML来描述其数据结构,主要用于对交换机的控制器信息,端口,队列(QoS依赖于队列来实现)等资源进行修改。它使用NETCONF协议作为它的传输协议。
支持的配置如下:
配置datapath连接的控制器信息,datapath即openflow逻辑交换机。
配置交换机的端口和队列。
远程改变端口的状态。
完成Openflow交换机与Openflow控制器之间安全链接的证书配置。
发现Openflow的逻辑交换能力。
配置VXLAN隧道协议。
OVSDB
OVSDB用于OVS(Open vswitch)的配置和管理,这一点雨OF-Config类似。OVSDB采用JSON格式对数据进行编码。它通过一系列RPC方法对数据库进行各种操作,例如增删改查。这一点通过实践操作更能体会到它的作用。
P4
与POF类似的设计理念一样,用来实现一种协议无关的可完全编程数据面的技术。
P4强调可编程的解析模块,而不像Openflow那样固定的解析逻辑,并支持串行和并行的Match-Aciton操作,而Openflow只支持串行。
P4支持定义数据包的解析逻辑和转发逻辑。
P4的工作流程如下:
由上图我们可以看到P4进行数据处理的流程。
1、数据报根据报头的字段来进行批评,在这里面header结构。
2、定义了报头之后,还定义报头协议字段之间的关系,以及数据包的解析流程,这里parse start对ethernet进行逻辑判断,switch是编程语言中常用的一种语法。假如匹配到了0x800,那么就跳转到IPv4Header进行匹配。
3、比如我们要在报文中加一个mTag标签,这里由mTag_table可以看出,先对ethernet进行精确匹配,并对vlan的id进行精确匹配,如果匹配成功就执行action中的方法。
4、具体执行action方法,这里体现为add_mTag()方法,而方法中又调用你了set_field()方法,这个方法是专门用来修改报文格式的。
由Openflow中可知,Openflow中定义了4中行动,Forward行动、Drop行动、EnQueue行动、Set-Fied行动,分别用来转发数据报,丢弃数据报,执行队列操作(用来实现QoS),修改报文
控制平面
对于控制平面主要通过实践来学习,这里推荐一个网站,https://www.sdnlab.com/,专注于SDN领域。
这里主要介绍几种控制器。
NOX/POX:早期的控制器,NOX用C++,POX使用python。
RYU:使用Python进行开发,可以轻松和OpenStack(云计算的一个库)进行整合,它提供了RPC和REST接口,允许和外界进程进行通信,也就是我们可以通过其他程序来转发控制信息到你的RYU;它的架构图;
Floodlight:采用Java开发,自带Web接口,Floodlight架构非常简洁清晰,所以后来的odl沿袭了它的架构。
OpenDayLight:采用Java语言开发,是一个重量级的控制器平台,它高度可用,模块化,可扩展,支持多协议。
ONOS:OpenDayLight的竞争对手,它是核心是一个分布式的架构,支持多协同工作。
数据平面详解
SDN数据平面强调:
清晰的软件硬件编程接口。
简洁的硬件架构。
可编程包转发。
传统的网络数据平面架构中的包解析,L2/L3/L4等都不支持可编程控制,包转发调度过程也不支持通过编程控制。而SDN希望这些都是可编程的,它将转发平面抽象成Match-Aciton的过程。即控制器下发流表项,由数据平面匹配并转发。
通用硬件模型
1、数据报进入转发模型。
2、按协议解析模块完成对数据报头部的解析(这个解析可自定协议来实现)。
3、对解析结果选择流表匹配,这里选择流表和流表项一方面是根据匹配的结果来选择,另一方面根据优先级来选择。
4、流表项匹配成功之后,执行流表项中定义的Action。
5、无任何流表项与之匹配,那么就将这个数据报存到缓存中或者直接通过packet-in报文发送给controller来处理,controller下发指令对这个报文进行具体的处理。
6、流表项匹配之后,可以指向某个meter表或者组表,它们可以被多个流表项共用。
对通用硬件中数据处理流程有一系列的处理指令:
操作指令:对数据报的具体操作,例如转发数据报、修改数据报等等。
跳转指令:在多个流表中跳转的指令。
专用指令:处理某个特定流的指令。
流水线处理
我们知道Openflow只提供了单流表,但是在后来出现了多流表,并且出现了meter表和组表等。首先来看看多流表的好处在哪?这里引入一个例子:
这里看成一个三列的矩阵,我们分别从第一列,第二列,第三列中取一个数组合成一个字符串,一共有3x3x3=27种组合方法,但是这里一共却只用了9个存储空间,而如果使用单流表,就需要27个存储空间,采用多流表能够节省存储空间。
1、数据报输入之后,被分配一个操作指令集合Set。
2、到达流表0,对流表项进行查找匹配,匹配到某条流表项之后,将操作写到操作指令集中,或者传输给下一个流表,有的操作指令是直接执行的。
3、 多个流表之间通过metadata来交流信息。
流表项
我们知道,数据到达交换机后,是根据流表项进行匹配的,那么流表项由哪些字段构成的呢?
匹配域、指令集、计数器、优先级、失效时间、Cookie、Flogs
数据报在单个流表间的操作流程:
这里应该注意的是:
匹配域不止包括数据报中的部分字段,还应该包括来自上一个流表的metadata信息。由这两个字段构成的匹配域与当前流表项的匹配域进行对比。如果相同,这时候,计数器会增加,同时跳转指令让当前数据报跳往下一个流表,如果没有跳转指令,就证明这个数据报到头了,应该执行操作指令集中的指令了。
组表
它能够给一组端口定义指定操作,这是组表最大的特征。这就可以让多个流表项指向同一个组表,这就为组播,负载均衡,聚类操作等提供了实现方式。
组表跟流表一样,也具有多个项,称为组表项。同时,组表项中的Group动作可以将数据报指向某组动作,执行组表中的动作集合。
组表项的组成
组表项ID、组表项操作类型、计数器、操作列表
我们来剖析一下组表项操作类型:
全选择类型(ALL):这种类型表示执行操列表中是所有操作。
选择执行类型(SELECT):这种类型会执操作列表中的一个Action。
间接类型(Indirect):这种类型用于重定向到其他组表项。
快速恢复类型(Fast Failover):这种类型不必每次都向控制器请求,能够自我调整。
Meter表
这种表主要用来计量,观测速率和控制速率。
计量表项的组成:
表项ID、计量带、计数器。
计量表项ID由流表项或者组表来指向,主要作用还是在于计量带,由它来实现流量控制。
现在来剖析计量带。
计量带中又band type,rate,counters,还有一个可选参数作为保留字段。
band type指定了两种操作类型,一种是Drop,一种是Remark。
由rate字段定义的一个值,当数据流速超过了这个rate,就执行Drop,从而实现流量控制的效果。
状态信息表
状态信息表:计数器。对特定的数据报进行统计和记录。
同时还有一种特殊的计数器,用于维护各个表项的存活时间。
端口
可分为物理端口和逻辑端口以及保留端口。
它们作为传输数据包的接口,将各个通用硬件模型逻辑的连接在一起。
指令
可分为网络处理控制指令、操作指令、专用指令。
网络处理控制指令
它可以分为两种,第一种:
用来操作数据报的操作指令集合,比如申请一个操作,删除一个操作。比如,Apply-Actions。
第二种:
用来指挥数据报的跳转。比如Goto-Table指令。
Apply-Actions:立即执行的Acitons,所以就不用写入到操作指令集中,对操作指令集合不用做任何修改。
Clear-Actions:立即删除操作指令集中的所有Action
Writer-Acitons:将一个操作指令(下面会简述)写到Set集合或者List集合中。
Goto-Table:表间跳转指令。
操作指令
主要用来对数据包进行操作,比如复制,修改,丢弃,转发。每一个操作都会写到操作指令集中,指令集合有两种类型,一种是Set类型,一种是List类型,Set去重,List可重复。
操作指令由网络处理控制指令来申请,修改,删除。并添加到Set集合或者List集合中。
Output:转发数据报到指定端口。
Group:将数据报交给组表处理。
Drop:丢弃数据包。
Set-Queue:将数据包放到指定缓存队列中。
Meter:将数据包发到Meter表中。
Push-Tag:添加标签域。如果加Vlan。
Set-Field:用来修改包头域的值。
Copy-Field:复制包头域。
Change-TTL:修改IPv4的TTL,MPLS TTL等。
专用指令
通过专用的流表项来实现特定的处理。
比如Table-miss,也就是匹配不成功的情况。每一个流表中都可以有这种流表项,它可以将匹配方式设置成都可以匹配,但是必须要讲优先级设置成0,也就是说,当其他都不匹配的时候,Table-Miss匹配成功,就执行Table-Miss操作。
最后
以上就是玩命小伙为你收集整理的SDN--进阶的全部内容,希望文章能够帮你解决SDN--进阶所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复