功能
![1092957-20180501231239426-125945467.png](https://i-blog.csdnimg.cn/blog_migrate/41e599c8fbff07fc3d95008dd0f3265a.png)
- 1.0版本Openflow:控制器通过Openflow协议与交换机建立了安全通道(Sceure Channel),下发流表。
![1092957-20180501231520350-160341857.png](https://i-blog.csdnimg.cn/blog_migrate/87052ed13ed95979d3c04272a169d795.png)
- 1.3版本Openflow:多控制器,多流表。
- 用于实现Controller和Switch之间的通信过程,定义了一系列标准术语。
- 定义了Controller如何来控制Swithch以及Switch如何来反馈Ctroller。
- 定义了Controller和Switch通信过程的消息类型和格式。
版本
![1092957-20180501232310479-1468298412.png](https://i-blog.csdnimg.cn/blog_migrate/7a6f3cef2bc0578552580c2f730ef268.png)
流表
- 相当于传统网络的路由表和CAM表。
- 传统网络的表是死的,给我就按照上面的做,查找转发。
- SDN的流表,很多张,可编程。
流(Flow)
![1092957-20180501233752604-257337319.png](https://i-blog.csdnimg.cn/blog_migrate/1f97048342bef391845f4f61041c72ce.png)
- 同一时间内,经过同一网络并且具有相同属性的数据包集合。
- 不同情况流的定义可以不同。一般基于端口以及源目IP。
- SDN体系中,所有的数据都以“流”为单位进行处理。
流表(Flow Table)
![1092957-20180501234406580-1402160691.png](https://i-blog.csdnimg.cn/blog_migrate/0c1af8b23d0d20c202abbe89a8cbef9d.png)
- 流过来就查表(基于序号查找)。
- 每一张流表都有详细的流表项。
- 每一个流表项中都有相应参数,根据参数做出相应的动作(要么转,要么丢,不转也不丢,下一张表处理)。
- 虽然要递归似的查表,但是节约了计算的时间,总体上转发速度加快。
流表项-1.0版本(Flow Entry)
![1092957-20180501235244784-307676474.png](https://i-blog.csdnimg.cn/blog_migrate/0b215f3a32d60d71353ed845f1a3495d.png)
- 不同版本的Openflow的流表项有些区别,下面是Openflow1.0版本的流表项。
- 包含:包头域、计数器、动作三个部分。
![1092957-20180501235706542-760259271.png](https://i-blog.csdnimg.cn/blog_migrate/b4396e7f6ecfa296367f0bb411f2d107.png)
- 除了进接口,传统的2-4层的寻址信息都出现在包头域中(MAC、IP、PORT)。
- Openflow交换机相比传统网络交换机(路由器),是一个模糊的概念,不再区分二者,所以Openflow交换机可以广义的理解为Openflow转发设备(交换机、路由器、防火墙)。
计数器(Counters)
- 计数器主要对每张表、每个端口、每个流等进行计数,方便流量监管。
- 为流量可视化奠定了基础。
动作(Actions)
- 对匹配到的流进行处理,传统网络中要么转发要么丢弃,没有第三种选择。Openflow1.0中规定了必备动作(Required Actions)和可选动作(Optional Actions)。
- 必备动作-转发(Forward):
- ALL:转发到所有出口(不包括入口)。
- CONTROLLER:封装并转发给控制器。
- LOCAL:转发给本地网络栈。
- TABLE:对要发出的包执行流表中的行动。
- IN_PORT:从入口发出。
- 必要行动-丢弃(Drop)
- 没有明确指明处理行动的表项,所匹配的所有分组默认丢弃。
- 可选行动-转发
- NORMAL:按照传统交换机的2层或3层进行转发处理。
- FLOOD:通过最小生成树从出口泛洪发出,注意不包括入口。传统网络只有在CAM表空或者满了的时候才会泛洪,现在更加灵活。
- 可选行动-入队(Enqueue)
- 可选行动-修改域(Modify-field)
- 修改包头内容。
- 这个动作是跟传统网络的最大区别,Openflow可以对数据包头部进行修改!(可修改2层-4层的信息)。
流表项—1.3版本
![1092957-20180502121205364-515969262.png](https://i-blog.csdnimg.cn/blog_migrate/7bf17e80f9bc519ad1bc48e6e1b359e8.png)
- Openflow1.0之后都支持多流表,每张表都有独立的序号,从序号最小的开始匹配。
- Openflow1.3版本包括了匹配域、优先级、计数器、指令、超时时间、附属属性。
匹配域(Match Fields)
- 1.0包头域的拓展,除了2-4层的信息,多了MPLS、IPv6、PBB、Tunnel ID等支持。
- 1.0能匹配12个信息,1.3能匹配39个信息。
- Openflow正在覆盖传统网络协议。
优先级(Priority)
- 用于标志流表项的匹配优先次序,越高越先匹配,默认为0。
- 支持复杂的策略调度。
计数器(Counters)
- 在1.0的基础上,加入了对每组,每个动作的计数。
- 流量统计。
指令(Instructions)
- 相当于1.0版本的动作(Actions),但是因为引入了多流表,多了很多复杂操作:
- 行动集:查到行动后,不立即执行,放到一个集合(缓存)中去,最后一起执行。
- 这一段讲述了动作的叠加,集成,清除。
- Required Instruction:Write-Actions action(s):将指定的行动添加到正在运行的行动集中。
- Required Instruction:Goto-Table next-table-id:指定流水线处理进程中的下一张表的ID。
- Optional Instruction:Apply-Actions action(s):立即执行指定的行动,而不改变行动集。
- Optional Instruction:Meter meter id:直接将包计量后丢弃。
- Optional Instruction:Clear-Actions:在行动集中立即清除所有的行动。
- Optional Instruction:Write-Metadata metadata / mask:在元数据区域记录元数据。
- 这一段是动作
- Required Actions:Output:报文传输到指定端口。
- Required Actions:Drop:丢弃。
- Required Actions:Group:用组表处理报文。
- Optional Actions:Set-Queue:设置报文队列ID,为了Qos的需要。
- Optional Actions:Push-Tag / Pop-Tag
- Optional Actions:Set-Field:设置报文包头的类型和修改包头的值。
- Optional Actions:Change-TTL:修改TTL的值。
- copy TTL inwards:apply copy TTL inward actions to the packet.
- pop:apply all tag pop actions to the packet.
- push-MPLS:apply MPLS tag push action to the packet.
- push-PBB:apply PBB tag push action to the packet.
- push-VLAN:apply VLAN tag push action to the packet.
- copy TTL outwards:apply copy TTL outwards action to the packet.
- decrement TTL:apply decrement TTL action to the packet.
- set:apply all set-field actions to the packet.
- qos:apply all QoS actions,such as set queue to the packet.
- group:如果指定了组行动,那么按照这个序列中的顺序执行组行动存储段里的行动。
- output:如果没有指定组行动,报文就会按照output行动中指定的端口转发。
- 行动集与每个报文相关,默认情况下是空的。
- 一个流表项可以使用Write-Action指令或者Clear-Action指令修改行动集。
- 当一个表项的指令集没有包含Goto-Table指令时,流水线处理就停止了,然后报文的行动集就被执行。
- 交换机可以通过Apply-Actions指令修改行动的执行顺序。
- 行动集包含所有的行动,无论它们按照什么顺序加入到行动集中,行动的顺序均按照上一段顺序执行。
超时时间(Timeouts)
- 用于标志该流表项的老化时间,到了超时时间就删除,节约资源保持准确性。
附属信息(Cookie)
- 由控制器选择的不透明数据值。控制器用来过滤统计数据、流改变和流删除。但处理数据包时不能使用。
流表匹配—1.1版本(Flow Match)
![1092957-20180502213325291-126577980.png](https://i-blog.csdnimg.cn/blog_migrate/1de6dc1cf5543e13f6299a700955ad3a.png)
- 引入了多流表,多流表的流表匹配称为流水线处理(Pipeline Process)。交换机从流表0开始查找,序号从小到大匹配。
- 每个包按照优先级去匹配流表中的流表项,优先级高的先匹配(被匹配),一旦匹配成功,对应计数器将更新,动作立即执行;如果没能找到匹配的表项,则转发给控制器。
流表匹配—1.3版本
![1092957-20180502214853788-1830296268.png](https://i-blog.csdnimg.cn/blog_migrate/9ae9925582e8a1a6f75503ada2a6cbd8.png)
![1092957-20180502221233036-1951507921.png](https://i-blog.csdnimg.cn/blog_migrate/d6a64f47f6737cf3ea06121675643d69.png)
- 1.3版本引入了table-miss的处理和action-set的处理。
- 之前的版本当交换机没有匹配到流表项的时候,直接丢给Controller处理。而table-miss则用于解决这个问题。
- 通过table-miss参数,可以对数据包实现丢弃、给下一个表处理、转发给控制器。
- 还多了一个逻辑层—动作集。动作的累加。
- 多流表操作中,每个表都有独立的指令,这些指令(执行动作)可以在查表的时候执行,也可以通过指令汇总到action-set再叠加执行。
- 行动集与每个报文相关,默认情况为空。
- 一个流表项可以使用Write-Action指令或者Clear-Action指令修改行动集。
- 当一个表项的指令集没有包含Goto-Table指令时,流水线处理就停止了,然后报文的行动集就被执行。
- 交换机可以通过Apply-Actions指令修改行动的执行顺序。
- 行动集包含所有的行动,无论它们按照什么顺序加入到行动集中,行动按照指定顺序执行。
- 单表时,只有action动作;多表环境下,多个action操作累加则为action-set动作集。
- 决定action-set中的一堆动作如何工作,便是Instruction指令。指令可以将动作写入、修改到动作集action-set中,或者可以直接在读表时执行。
- 多流表最核心的内容:叠加执行。
流表的生成
![1092957-20180502222458188-694929360.png](https://i-blog.csdnimg.cn/blog_migrate/af58770c653c6194423a3d7ef4748cc5.png)
- 传统路由技术中,建立一张路由表,需要路由器和路由器之间运行路由协议,然后相互交互路由条目,之后达到路由共享。这种架构是一种P2P架构(双方对等)。
- SDN的想法是类似的,在控制器和交换机直接运行Openflow协议,不同的是,这里是一种C/S架构(客户端服务器架构)。由控制器统一计算后再下发给Openflow交换机流表项信息。
转载于:https://www.cnblogs.com/031602523liu/p/8978212.html