OpenFlow 交换机与控制器交互步骤
Note: OpenFlow规范中并没有规定握手之后必须发送Set config消息,这取决于控制器。因此Set config消息一定是在握手后进行,但不一定是在控制器收到Features Reply之后。
1. Hello
控制器与交互及互相发送 Hello 消息。Hello消息中只包含有OpenFlow Header,其中的 type 字段为 OFPT_HELLO,version 字段为发送方所支持的最高版本 OpenFlow 。这时候会出现两种情况:
- 双方都支持 OpenFlow ,则选取 Hello 消息中最低版本的协议作为通信协议
- 如果其中有一方不支持 OpenFlow 协议版本,则发送 Error 消息后断开连接
如果双方 OpenFlow 版本可以兼容,则 OpenFlow 连接建立成功。
Q1:Hello 消息是使用什么协议传输?TCP?UDP?
Q2:所有的网络协议在升级的时候都必须向前兼容更低版本的协议?why?
2. Features Request
OpenFlow 连接建立之后,就像你刚到手一部新手机,你最想知道的就是手机的配置如何一样,控制器最需要获得交换机的特性信息,交换机的特性信息包括交换机的 ID(DPID),交换机缓冲区数量,交换机端口及端口属性等等。
控制器向交换机发送 Features Request 消息查询交换机特性,Features Request 消息只包含 OpenFlow Header,其中 type 字段为 OFPT_FEATURES_REQUEST。
3. Features Reply
交换机在收到控制器发出的 Features Request 消息后返回 Features Request 消息,Features 消息包括 OpenFlow Header 和 Features Reply Message。后者结构如下:
struct ofp_switch_features{
struct ofp_header header;
uint64_t datapath_id; /*唯一标识 id 号*/
uint32_t n_buffers; /*交缓冲区可以缓存的最大数据包个数*/
uint8_t n_tables; /*流表数量*/
uint8_t pad[3]; /*align to 64 bits*/
uint32_t capabilities; /*支持的特殊功能,具体见 ofp_capabilities*/
uint32_t actions; /*支持的动作,具体见 ofp_actions_type*/
struct ofp_phy_port ports[0]; /*物理端口描述列表,具体见 ofp_phy_port*/
};
Q3:uint8_t pad[3] 这一字段的作用是什么?为了保证整个结构体长度是 64bits 的整数倍?
ofp_capabilities 结构如下:
ofp_actions_type 结构如下:
ofp_phy_port 结构如下:
struct ofp_phy_port{
uint16_t port_no; /*物理端口的编号*/
uint8_t hw_addr[OFP_EHT_ALEN]; /*MAC地址*/
char name[OFP_MAX_PORT_NAME_LEN]; /*端口的名称*/
uint32_t config; /*端口配置,见 ofp_port_config*/
uint32_t state; /*端口状态,见ofp_port_state*/
uint32_t curr; /*物理属性*/
uint32_t advertised; /*物理属性*/
uint32_t supported; /*物理属性*/
uint32_t peer; /*物理属性*/
};
ofp_port_config 和 ofp_port_state 结构如下:
4. Set config
知道了交换机的特性之后就要配置交换机了。OpenFlow 交换机只有两个属性需要控制器配置:
- 第一个属性为 flags,用来指示交换机如何才处理 IP 分片数据包。
- 第二个属性为 miss_send_len,用来指示当一个交换机无法处理的数据包到达时,将数据包发给控制器的最大字节数。
5. Packet-in
有两种情况会触发交换机向控制器发送 Packet-in 消息:
- 当交换机收到一个数据包后,查找流表。如果流表中有匹配条目,则交换机按照流表所指示的 action 列表处理数据包。如果没有,则交换机将数据包封装在 Packet-in 消息中发送给控制器处理,注意这时候数据包仍然会被放进缓冲区等待处理而不是被丢弃。
- 数据包在流表中有匹配的条目,但是其中所指示的 action 列表中包含转发给控制器的动作(Output = CONTROLLER),注意这时候数据包不会被放进缓冲区。
Packet-in消息格式如下:
struct ofp_packet_in {
struct ofp_header header;
uint32_t buffer_id; /*Packet-in消息所携带的数据包在交换机缓存区中的ID*/
uint16_t total_len; /*data字段的长度*/
uint16_t in_port; /*数据包进入交换机时的端口号*/
uint8_t reason; /*发送Packet-in消息的原因,具体见 ofp_packet_in_reason*/
uint8_t pad;
uint8_t data[0]; /*携带的数据包*/
};
ofp_packet_in_reason 结构如下:
enum ofp_packet_in_reason {
OFPR_NO_MACTH /*没有匹配的条目*/
OFPR_ACTION /*action列表中包含转发给控制器的动作*/
};
6. Flow-Mod / Packet-out
当控制器收到 Packet-in 消息时有两种响应的方式:
Flow-Mod
控制器收到 Packet‐in 消息后,可以发送 Flow‐Mod 消息向交换机写一个流表项。并
且将 Flow‐Mod 消息中的 buffer_id 字段设置为 Packet‐in 消息中的 buffer_id 值。从而
控制器向交换机写入了一条与数据包相关的流表项,并且指定该数据包按照此流表项的 action 列表处理。
Flow-Mod 消息共有五种类型:
- ADD,用来添加一条新的流表项
- DELETE,用来删除所有符合一定条件的流表项
- DELETE-STRICT,用来删除某一条指定的流表项
- MODIFY,用来修改所有符合一定条件的流表项
- MODIFY-STRICT,用来修改某一条指定的流表项
以上五种类型对应的数值分别为0-4
Flow-Mod 消息格式:
struct ofp_flow_mod {
struct ofp_header header;
struct ofp_match match; /*流表的匹配域*/
uint64_t cookie; /*流表项标识符*/
uint16_t command; /*可以是ADD,DELETE,DELETE-STRICT,MODIFY,MODIFY-STRICT*/
uint16_t idle_timeout; /*空闲超时时间*/
uint16_t hard_timeout; /*最大生存时间*/
uint16_t priority; /*优先级,优先级高的流表项优先匹配*/
uint32_t buffer_id; /*缓存区ID ,用于指定缓存区中的一个数据包按这个消息的action列表处理*/
uint16_t out_port; /*如果这条消息是用于删除流表则需要提供额外的匹配参数*/
uint16_t flags; /*标志位,可以用来指示流表删除后是否发送flow‐removed消息,添加流表时是否检查流表重复项,添加的流表项是否为应急流表项。*/
struct ofp_action_header actions[0]; /*action列表*/
};
Packet-Out
并不是所有的数据包都需要向交换机中添加一条流表项来匹配处理,网络中有些数据包出现的数量很少(如ARP、 IGMP等),没必要通过流表项来指定这一类数据包的处理方法。此时可以使用 Packet-Out 消息,高速交换机某一个数据包如何处理。
Q3:为什么没必要通过流表项来指定出现的数量很少的数据包的处理方法?
struct ofp_packet_out {
struct ofp_header header;
uint32_t buffer_id; /*交换机缓存区id,如果为-1则指定的为packet-out消息携带的data字段*/
uint16_t in_port; /*如果buffer_id为‐1,并且action列表中指定了Output=TABLE的动作,in_port将作为data段
数据包的额外匹配信息进行流表查询*/
uint16_t actions_len; /*action列表的长度,可以用来区分actions和data段*/
struct ofp_action_header actions[0]; /*动作列表*/
uint8_t data[0]; /*数据缓存区,可以存储一个以太网帧,可选*/
}
Flow-Mod 是指定一类数据包的处理方法,而 Packet-Out 则是指定某一个数据包的处理方法。不仅如此,Packet-Out 消息还可以让交换机产生一个数据包并按照 action 列表处理。
总结
基于 OpenFlow 的 SDN 工作流程,如下图:
OpenFlow 交换机与控制器交互步骤的更多相关文章
- ubuntu 14.04设备OVS虚拟OpenFlow交换机配置汇总
一.设备OVS sudo apt-get install openvswitch-controller openvswitch-switch openvswitch-datapath-source ( ...
- ubuntu 14.04安装OVS虚拟OpenFlow交换机配置总结
一.安装OVS sudo apt-get install openvswitch-controller openvswitch-switch openvswitch-datapath-source ( ...
- OpenFlow交换机的实现总结
先粗略介绍,后续会逐渐完善. OpenFlow交换机通过使用OpenFlow协议的安全通道与控制器进行通信.其具体实现如下示意图所示: 对于一个新到达的数据流,交换机通常的做法是,把该数据包发送给控制 ...
- 从三个开源项目认识OpenFlow交换机 - OVS
在SDN/NFV的网络革新技术浪潮的引领下,催生了诸多数据面开源方案的诞生.业界知名度较高的有OVS(Open vSwitch).FD.io (Fast Data I/O).ODP(Open Data ...
- OpenFlow 1.3 控制器与交换机的交互,以及拓扑发现
前言 最近纠结于控制器如何发现拓扑,于是就翻起了OpenFlow 1.3进行查看,以及一些相关协议 OF 1.3 安全通道,即交互消息 OpenFlow Switch Specification 1. ...
- AngularJs-指令和控制器交互
前言: 前段时间我们学习了angular的指令,他通过ECMA的方式创建元素,可以让我们共用这些元素,我们也知道可以通过 link的方法给这个指令添加一些动作事件,本节,我们将写入和让angular的 ...
- SteamVR Unity工具包(VRTK)之控制器交互
可交互对象(VRTK_InteractableObject) 可交互对象脚本被添加到需要用(如控制器)来交互的任何游戏对象上. 可用脚本参数如下 Touch Interactions 触摸交互 ...
- 华为交换机配置ACL详细步骤
ACL 介绍 #2000-2999普通ACL,根据源IP过滤 #3000-3999高级ACL,根据源目的端口和源目的地址等过滤 #4000-4999二层ACL,根据源目的MAC等过滤 配置举例: 拒绝 ...
- 解决vs2013不能添加控制器的步骤
点击:vs2013 更新,更新完以后,再重启下电脑就可以正常使用了
随机推荐
- Android 简单登陆 涉及 Button CheckBox TextView EditText简单应用
GitHub地址:https://github.com/1165863642/LoginDemo 直接贴代码<?xml version="1.0" encoding=&quo ...
- MySQL 基础知识梳理学习(一)----系统数据库
information_schema 此数据库是MySQL数据库自带的,主要存储数据库的元数据,保存了关于MySQL服务器维护的所有其他数据库的信息,如数据库名.数据库表.表列的数据类型及访问权限等. ...
- SQLServer之创建LOGON触发器
LOGON触发器工作原理 登录触发器将为响应 LOGON 事件而激发存储过程. 与 SQL Server实例建立用户会话时将引发此事件. 登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前 ...
- LeetCode算法题-Array Partition I(Java实现)
这是悦乐书的第262次更新,第275篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第129题(顺位题号是561).给定一个2n个整数的数组,你的任务是将这些整数分组为n对 ...
- (转载)Python之道1-环境搭建与pycharm的配置django安装及MySQL数据库配置
近期做那个python的开发,今天就来简单的写一下开发路线的安装及配置, 开发路线 Python3.6.1+Pycharm5.0.6+Django1.11+MySQL5.7.18 1-安装Python ...
- WIN提权总结【本地存档-转载】
[ web提权 ] 1.能不能执行cmd就看这个命令:net user,net不行就用net1,再不行就上传一个net到可写可读目录,执行/c c:\windows\temp\cookies\net1 ...
- jdbc链接数据库
JDBC简介 JDBC全称为:Java Data Base Connectivity (java数据库连接),可以为多种数据库提供填统一的访问.JDBC是sun开发的一套数据库访问编程接口,是一种SQ ...
- Win7 64位 + LoadRunner 11录制时弹不出IE的解决办法 Win7 64位 + LoadRunner 11录制时弹不出IE的解决办法
Win7 64位 + LoadRunner 11录制时弹不出IE的解决办法 Win7 64位 + LoadRunner 11录制时弹不出IE的解决办法 1. 卸载IE9( 装了Win7 64位后,默认 ...
- python中的struct模块的学习
由于TCP协议中的黏包现象的发生,对于最low的办法,每次发送之前让他睡一秒,然后在发送,可是这样真的太low了,而且太占用资源了. 黏包现象只发生在tcp协议中: 1.从表面上看,黏包问题主要是因为 ...
- pytorch Debug —交互式调试工具Pdb (ipdb是增强版的pdb)-1-在pytorch中使用
参考深度学习框架pytorch:入门和实践一书第六章 以深度学习框架PyTorch一书的学习-第六章-实战指南为前提 在pytorch中Debug pytorch作为一个动态图框架,与ipdb结合能为 ...