OpenFlow学习笔记(一)——OpenFlow概要和OpenFlow1.0
0x01 OpenFlow概述
1.1 设计思想:
以网络设备中内置了TCAM存储器为前提设计的,无需设计新硬件,更新其软件即可。
1.2 具体:
控制面和数据面的分离
1.2.1 控制面的构建方法
1)不构建另外物理网络
2)分别构建控制面和数据面
1.2.2 数据面的构建方法
1)Hop-by-Hop方式
2)覆盖方式
3)混合方式
1.2.3 OpenFlow控制器和OpenFlow通道
OpenFlow控制器和OpenFlow交换机维持着经由OpenFlow通道的TCP连接。
两种模式:
1)Proactive模式
2)Reactive模式
1.2.4 流表
流表描述数据包要进行何种处理。
OpenFlow交换机可拥有多个流表。
1.3 控制器和交换机的基本动作
1.3.2 OpenFlow交换机的初始动作
连接是从OpenFlow交换机向OpenFlow控制器建立的。
1.3.3 Proactive模式
由控制器向交换机预先发送流表项的设置。
1.3.3 Reactive模式
交换机Packet-in消息询问控制器如何处理。控制器发送指示消息或设置流表项。
有时也存在根据Packet-in消息,控制器给多台交换机添加流表的情况。
0x02 OpenFlow1.0的机制
2.1 OpenFlow1.0的流表和流表项
流表中流表项由3个基本要素构成:头字段,计数器,行动。
交换机中有多个流表,OpenFlow1.0中匹配的流表只有一个,而OpenFlow1.1以上,数据包可以在各流表中与流表项匹配。
2.2 流表项
2.2.1 头字段
任何一个流表项都不匹配的情况称为Table-miss,发生Table-miss时交换机发送Packet-in消息或丢弃数据包。
若数据包与多个流表匹配,按优先级匹配,有配相同根据交换机具体实现来执行。
2.2.2 计数器
有4种计数器:
1)流表的PerTable计数器
2)端口的Per Port计数器
3)流表项的Per Flow计数器
4)队列的Per Queue计数器
2.2.3 行动
OpenFlow中定义了4种行动:
1)Forward
2)Drop
3)Enqueue(可选)
4)Modify-Field(可选)
2.2.3.1 Foeward
2.2.3.2 Drop
必备行动。只有Drop能丢弃与未指定Forward行动的流表项相匹配的数据包。
2.2.3.3 Enqueue(可选)
将现有数据包转发至现有的已设定的队列中(入队)。
用于实现Qos等功能的队列支持。
OpenFlow1.1开始Enqueue改名为Set-Queue。
2.2.3.4 Modify-Field(可选)
OpenFlow1.1开始Modify-Field改名为Set-Field。
2.3 控制器和交换机之间的消息
2.3.1 安全通道的建立
OpenFlow规范中,安全通道通过TLS(安全传输层协议,位于TCP之上)来实现。有时也会通过TCP明文来建立。
在OpenFlow1.0.2之后,建立安全通道的TCP端口号默认使用6653。
2.3.2 消息格式
OpenFlow头
OpenFlow版本,消息类型,该头包含8位字节数,分配给该数据包的事务id(请求和响应消息对应)
消息类型:22种。
2.3.3 安全通道的建立和初始设置
交换机和控制器都将发送Hello消息,Hello消息仅由OpenFlow头构成。
2.3.4 握手
2.3.4.1 Features消息
安全通道建立后,控制器通过握手掌握交换机的相关消息。
控制器发送查询的Features请求,交换价返回Features响应。
各OpenFlow交换机称为datapath,datapath_id是唯一标识。
2.3.4.2 SET_CONFIG和GET_CONFIG消息
用于查询和设置OpenFlow交换机的设置状态。
2.3.5 Flow-Mod消息
控制器用于对流表项添加、删除、变更设置等操作。
Flow-Mod消息字段:OpenFlow头,数据包匹配信息,Cookie,行动内容。
2.3.6 Packet-In消息
两种情况发送Packet-In消息:
1)Table-miss
2)行动为发送至控制器
两种情况:
1)不缓存数据包,buffer_id=-1。
2)缓存数据包。
不存在通知控制器缓存已经删除的机制。
2.3.7 Packet-Out消息
控制器向交换机发送含数据包发送命令的消息。
单一的Packet-Out消息中可包含多个行动。
2.3.8 Port-Status消息
在交换机中添加、删除或修改物理端口是,需要发送该消息通知控制器。
2.3.9 Flow-Remove消息
交换机流表项超时删除或是命令删除时,发送该消息通知控制器。
2.3.10 Error消息
通知错误。
控制器和交换机均可发送。
2.3.11 Barrier消息
用于掌握消息的处理进度。Barrier请求和响应。
2.3.12 Echo消息
用来确认控制器和交换机是否连接、检测通信延迟、测量通信带宽等。Echo请求和相应消息。
参考自《图解OpenFlow》