写下来,总结一下了解的东西。
谈到OpenFlow,首先不得不提一下软件定义网络(SDN),在SDN中有两个重要的元素一个是交换机,一个是控制器。在网络设备上还有一个“上帝”,也就是控制器,它知道所有网络信息,负责指挥设备如何工作,而交换机什么都不知道,只会按照控制器的命令进行工作,在SND中,网络设备之间不运行任何的网络协议,设备的转发表是由控制器产生的,那么问题来了,控制器和网络设备之间怎样进行通信呢,就是通过OpenFlow协议,属于南向协议,但是南向协议不只有OpenFlow协议,现在我们就知道了OpenFlow协议是干什么的了,就是用来让控制器与网络设备之间进行互相通信用的;用一个图表示:
OpenFlow交换机中的交换机成为流表(Flow table),其中包括数据包匹配特征和数据包的处理方法:
我们来看看OpenFlow1.0流表数据包匹配特征的结构:
第一层:交换机入端口,即消息在哪个端口进入交换机(Ingress Port);
第二层:源MAC地址(Ether source),目的MAC地址(Ether dst),以太网类型(Ether Type),VLAN标签(VLAN id),VLAN优先级(VLAN priority);
第三层:源IP(IP src),目的IP(IP dst),IP协议字段(IP Proto),IP服务类型(IP Tosbits);
第四层:TCP/UDP源端口号(TCP/UCP src port),TCP/UDP目的端口号(TCP/UDP dst port)。
数据包处理方法包括转发,修改包头,每一个处理叫做一个Action。
Openflow消息的类型可以总体分为三大类:
1. Controller-to-Switch(控制器到交换机的消息,由控制器主动发出)
- Features用来获取交换机特性
- Configuration用来配置OpenFlow交换机
- Modify-State用来修改交换机状态(修改流表)
- Read-Stats用来读取交换机状态
- Send-Packet用来发送数据包
- Barrier阻塞消息
- Packet-in用来告知控制器,交换机接收到数据包
- Flow-Removed用来告知控制器交换机流表被删除
- Port-Status用来告知控制器交换机端口状态更新
- Error用来告知控制器交换机发生错误
- Hello用来建立OpenFlow连接
- Echo用来确认交换机与控制器之间的连接状态
- Vendor厂商自定义消息
- 目的:协议协商。
- 内容:本方支持的最高版本的协议
- 成果:使用双方都支持的最低版本协议。
- 成功:建立连接
- 失败:OFPT_ERROR (TYPE:OFPT_HELLO_FAILED,CODE =0),终止连接。
端口及端口属性等等。控制器向交换机发送Features Request消息查询交换机特性,Features Request消息只包含Openflow Header。交换机在收到Features Request消息后返回Features Reply消息,Features Reply消息包括Openflow Header 和Features Reply Message;
- 发送时间:连接建立完成之后
- 发送数据:OFPT_FEATURES_REQUEST
- 对称数据:OFPT_FEATURES_REPLY
- 目的:获取交换机的信息
- datapath_id为交换机独一无二的ID号
- n_buffers为交换机可以同时缓存的最大数据包个数
- n_tables为交换机的流表数量
- Capabilities表示交换机支持的特殊功能
- Actions表示交换机支持的动作(见ofp_action_type)
- ofp_phy_ports为交换机的物理端口描述列表,具体结构如下图
- port_no为物理端口的编号
- hw_addr为端口的MAC地址
- name为端口的名称
- config为端口的配置
- State为端口状态
- curr, advertised supported,peer为端口物理属性
- OFPR_NO_MATCH:当交换机收到一个数据包后,会查找流表,找出与数据包包头相匹配的条目。如果流表中有匹配条目,则交换机按照流表所指示的action列表处理数据包。如果流表中没有匹配条目,则交换机会将数据包封装在Packet‐in消息中发送给控制器处理。此时数据包会被缓存在交换机中等待处理。
- OFPR_ACTION:交换机流表所指示的action列表中包含转发给控制器的动作(Output=CONTROLLER)。此时数据包不会被缓存在交换机中。
- buffer_id为packet‐in事件所携带的数据包在交换机中的缓存区ID
- total_len为data段的长度
- in_port数据包进入交换机的入接口号
- Reason为packet‐in事件产生的原因
缓存。控制器收到Packet-in消息后,可以发送flow-mod消向交换机写一个流表项。并且将flow-mod消息中的buffer_id字段设置为packet-in消息中的buffer_id值。从而
控制器向交换机写入了一条与数据包相关的流表项,并且指定该数据包按照此流表项的aciton列表处理。
- type:类型
- ength:整个数据包的长度
- xid:数据包的编号
在of1.0中这里的0,1意义跟我们平时接触的如子网掩码等意义相反,如OFPFW_NW_DST_MASK=0则表示全匹配目标IP。如果为63,则表示不匹配IP。为什么拿这个举例?原因就在于,他的长度是6bit,最大是63,需要将数值转变成对应2进制数值才是我们想要的匹配规则,且注意,1是忽略,0是匹配。如果wildcards全0,则表示由match精确指定,即所有12元组都匹配。
当然高兴的是,在1.3的时候,这个逻辑改成了正常的与逻辑。即1为使能匹配,0为默认不匹配。
- idle_timeout:如值为10,则某条流在10秒之内没有被匹配,则删除,可以称之为活跃时间吧。
- hard_timeout:如值为30,则30秒到达的时候,一定删除这条流,即使他还活跃,即被匹配。
- priority是流的优先级的字段,字数越大则优先级越高,存放在号数越小的table中。
- buffer_id是由交换机指定的buffei_id,准确的说是由dpid指定的。如果是手动下发的流,buffer_id应填-1,即0xffff,告诉交换机这个数据包并没有缓存在队列中。
- out_port为删除流表的flow_mod消息提供额外的匹配参数
- command用来指定操作的类型,共有五种类型:ADD、DELETE、DELETE‐STRICT、MODIFY、MODIFY‐STRICT