大家好,又见面了,我是你们的朋友全栈君。
OpenFlow交换机把传统网络中,完全由交换机/路由器控制的报文转换为由交换机和控制器来共同完成数据的转发操作,从而实现数据的转发与路由控制的分离。控制器则通过事先规定好的接口操作OpenFlow交换机中的流表,从而达到数据转发的目的。
SDN链路发现和拓扑管理主要是控制其利用南向接口的上行通道对底层交换设备上报信息进行统一监控和统计;而策略制定和表项下发则是控制器利用南向接口的下行通道对网络设备进行统一控制。
SDN控制器通过LLDP(Link Layer Discovery Protocol,链路发现协议)协议进行链路发现,然后根据发现协议搜集的信息来识别和管理网络拓扑结构。
LLDP协议格式:
OpenFlow协议的思路,即使网络设备维护一个FlowTable,并且只通过FlowTable对报文进行处理,FlowTable本身的生成、维护和下发完全由外置的控制器Controller来实现,从而实现Controller的全局控制。
OPENFLOW协议
在OpenFlow交换机中,包含安全通道,多级流表和组表。通过安全通道,OpenFlow交换机可以和控制器建立基于OpenFlow协议的连接;而流表则用来匹配OpenFlow交换机收到的报文;组表用来定义流表需要执行的动作。
SDN控制器与Openflow交换机通信
1、流表:
流表包括包头域(header fileds,匹配包头多个域)、活动计数器(counters)、0 个或多个执行行动(actions)。对每一个包进行查找,如果匹配则执行相关策略,否则通过安全通道将包转发到控制器,控制器来决策相关行为。流表项可以将包转发一个或者多个接口。
OpenFlow协议所支持的三种消息类型
openflow协议格式
(1)匹配域:
- 一层:交换机入端口(Ingress Port)
- 二层:源MAC地址(Ether src)、目的MAC地址(Ether dst)、以太网类型(EtherType)、VLAN标签(VLAN id)、VLAN优先级(VLAN priority)
- 三层:源IP(IP src)、目的IP(IP dst)、IP协议字段(IP proto)、IP服务类型(IP ToS bits)
- 四层:TCP/UDP源端口号(TCP/UDP src port)、TCP/UDP目的端口号(TCP/UDPdst port)OpenFlow协议所支持的三种消息类型
-
(2)计数器(counter)
-
计数器可以针对每张表、每个流、每个端口、每个队列来维护。用来统计流量的一些信息,例如活动表项、查找次数、发送包数等。
-
(3)行动(actions)
Openflow1.0提供两种数据包的处理方法:
• 转发(Forward)
• 修改包头(Modify field)其中修改包头包括:
SET_VLAN_VID //修改VLAN标签
SET_VLAN_PCP //修改VLAN优先级
STRIP_VLAN //弹出VLAN标签
SET_DL_SRC //修改源MAC地址
SET_DL_DST // 修改目的MAC地址
SET_NW_SRC // 修改源IP地址
SET_NW_DST // 修改目的IP地址
SET_NW_TOS //修改IP服务类型字段
SET_TP_SRC //修改源端口号
SET_TP_DST // 修改目的端口号 -
以上每一种操作称为一个动作(Action),流表中的数据包处理方法是一个动作列表(Action List),动作列表由以上各种动作组合合成。
在Actions头,包括Type和len字段:(数据结构如下)
由output类型的数据结构可以看出Port选项:
ALL:将数据包从除入端口以 外其他所有端口发出
CONTROLLER:将数据包发送给控制器
LOCAL:将数据包发送给交换机本地端口
TABLE:将数据包按照流表匹配条目处理
IN_PORT:将数据包从入端口发出
NORMAL:按照普通二层交换机流程处理数据包
FLOOD:将数据包从最小生成树使能端口转发(不包括入端口)
OpenFlow的建立:
-
OpenFlow连接建立后,控制器最需要获得交换机的特性信息,交换机的特性信息包括交换机的ID(DPID),交换机缓冲区数量,交换机端口及端口属性等等。控制器向交换机发送Features Request消息查询交换机特性,Features Request消息只包OpenFlow Header。交换机在收到Features Request消息后返回Features Reply消息, Features Reply消息包括Openflow Header 和Features Reply Message。
-
以下为Request和Reply报文:
-
Packet‐in事件(交换机接收数据包)
Packet‐in消息触发情况1:
当交换机收到一个数据包后,会查找流表,找出与数据包包头相匹配的条目。如果流表中有匹配条目,则交换机按照流表所指示的action列表处理数据包。如果流表中没有匹配条目,则交换机会将数据包封装在Packet‐in消息中发送给控制器处理。此时数据包会被缓存在交换机中等待处理。 -
Packet‐in消息触发情况2:
交换机流表所指示的action列表中包含转发给控制器的动作(Output=CONTROLLER)。此时数据包不会被缓存在交换机中。 -
Reason为packet‐in事件产生的原因
-
以下为Packet-in报文:
-
-
以下为packet-out报文:
-
并不是所有的数据包都需要向交换机中添加一条流表项来匹配处理,网络中还存在多种数据包,它出现的数量很少(如ARP、IGMP等),以至于没有必要通过流表项来指定这一类数据包的处理方法。此时,控制器可以使用PacketOut消息,告诉交换机某一个数据包如何处理。
-
控制器配置流表(Flow‐Mod消息)
-
当交换机收到一个数据包并且交换机中没有与该数据包匹配的流表项时,交换机将此数据包封装到Packet‐in消息中发送给控制器,并且交换机会将该数据包缓存。
控制器收到Packet‐in消息后,可以发送flow‐mod消向交换机写一个流表项。并且将flow‐mod消息中的buffer_id字段设置为packet‐in消息中的buffer_id值。从而控制器向交换机写入了一条与数据包相关的流表项,并且指定该数据包按照此流表项的aciton列表处理。 -
-
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/144007.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...