通道 Channel

在前面的OpenFlow的内容中,我们提到了在交换层所采用的流表是控制层的Controller下发的,那么Controller是如何下发流表的呢?中间经过了哪些的流程和步骤?控制器和交换机的会话是如何建立的?

这就是我们今天要介绍的内容,Channel。

连接建立



Hello包会定期的交换,其中最核心的就是OpenFlow的版本号。

Hello1:Switch -> Controller 你支持版本1.3吗?

Hello2:Controller -> Switch 我支持啊

就像之前的OSPF的Hello报文要交换RID等等的信息一样,比较好理解。

Feature request:Controller -> Switch 你的OF支持哪一些特性?你的接口信息是什么?也就是询问交换机所能提供的功能。

Feature reply:Switch -> Controller 交换机回复一个非常大的包,把它的所有配置信息,所有接口信息都回复给Controller。

Set config:Controller -> Switch Controller下发命令,根据交换机提供的信息对交换机进行简单的设置。

至此,Controller和交换机建立起了一个联系。

packet in:Switch -> Controller 当交换机本地没有匹配到与流相符合的表项 或者说 没有FlowTable(默认)的时候,会将数据包丢给Controller。

packet out:Controller -> Switch Controller回复指示信息,给Switch处理该数据包提供了方法,或者说选择的路径。

port status:Switch -> Controller 当交换机的端口状态发生变化的时候,交换机通知Controller,告诉Controller这个变化,让Controller刷新路径信息。

消息列表

三类消息:

  • Controller-to-Switch 消息:有控制器发起,用来管理或者获取Switch状态。例子:上面的 Feature Request 和 packet out。
  • asynchronous 消息:由 Switch 发起,用来将网络事件或者交换机状态变化更新到控制器。例子:上面的 port status。
  • symmetric 消息:有 Switch 或者 Controller 发起。

第一类消息顾名思义,是由控制器下发到交换机的,比如下发流表。

而第二类消息可以理解为由 交换机向控制器 发送的消息类型,比如端口状态辨认等等。asynchronous直译是 “异步的”。

第三类消息,这类消息是控制器和交换机的 交互,也就是说,既有控制器发送给交换机的消息,也有交换机发送给控制器的消息。symmetric 也就是 “同步的”。典型的第三类消息是Hello报文,你Hello来我Hello过去。

  1、Controller‐to‐Switch
控制器至交换机消息此类消息由控制器主动发出
    Features 用来获取交换机特性
    Configuration 用来配置Openflow交换机
    Modify‐State 用来修改交换机状态(修改流表)
    Read‐Stats 用来读取交换机状态
    Send‐Packet 用来发送数据包
    Barrier 阻塞消息
 2、Asynchronous
   异步消息此类消息由交换机主动发出
    Packet‐in 用来告知控制器交换机接收到数据包
    Flow‐Removed 用来告知控制器交换机流表被删除
    Port‐Status 用来告知控制器交换机端口状态更新
    Error 用来告知控制器交换机发生错误
 3、Symmetric
   对称消息,可以由控制器或交换机主动发起
    Hello 用来建立Openflow连接
    Echo 用来确认交换机与控制器之间的连接状态
    Vendor 厂商自定义消息

更进一步的细节,可以参考:OpenFlow消息

协议交互

我们选用的模拟器,首选Mininet,仅使用一条命令 sudo mn 直接就创建了一台控制器,一台交换机,两台电脑的网络拓扑。

甚至,我们可以用Mininet的一条指令,创建一个数据中心!It‘s amazing!

视频教程介绍了传统网络协议和OpenFlow交互的一个案例。

使用 sudo mn 建立一个 含有一个Controller,一个Switch,两个PC的简单网络拓扑。

简单的介绍一下名称:两台PC,h1和h2;连接在h1上的接口eth0;连接在h2上的接口eth0;Switch,S1;在S1上和h1连接的接口eth1;在S1上和h2连接的接口eth2;Controller,简称C;在S1上和C连接的接口L0.

h1想向h2发送一个数据报文,但是不知道MAC地址;传统网络的解决方法是ARP泛洪获知MAC地址,那么在SDN是如何实现的呢?

(1)h1通过ARP协议,向所有接口泛洪ARP请求:报文通过eth1接口来到了S1。

(2)S1不知道这个报文要发到哪里去,并没有合适的表项让它匹配;于是乎,将请求报文转给了控制器:Packet-in消息。

(3)控制器也不知道这个报文要到哪里去(可能是因为刚刚建立连接,还没有建立一个合适的网络拓扑),于是向交换机S1下发指令,向所有接口(除了eth1)泛洪该数据报:Packet-out消息。

(4)S1向eth2接口发送该ARP请求报文,来到了h2.

(5)

SDN原理 OpenFlow协议 -4的更多相关文章

  1. SDN原理 OpenFlow协议 -1

    本文基于SDN原理视频而成:SDN原理 OpenFlow OpenFlow 协议 和 传统的路由选择协议 有很多相似的地方,同时在某些地方也具有一定的颠覆性. 路由表,由IP地址和子网掩码组成.MAC ...

  2. SDN原理 OpenFlow协议 -2

    本文由SDN原理视频而成:SDN原理 流表 FlowTable --- OpenFlow的核心 问题3 流表项 Flow Entry 单流表(OpenFlow 1.0版本) -> 多流表(Ope ...

  3. SDN原理 OpenFlow协议 -3

    问题4:流表匹配 OF1.1版本 这是OF1.1版本的操作,引入了多流表,1.0版本并没有多流表. 多流表的匹配称为 流水线处理:交换机从流表0开始查找,按照流表序号从小到大匹配. 每个包按照优先级去 ...

  4. SDN学习之OpenFlow协议分析

    学习SDN相关的学习也已经有快半年了,期间从一无所知到懵懵懂懂,再到现在的有所熟悉,经历了许多,也走了不少弯路,其中,最为忌讳的便是,我在学习过程中,尚未搞明白OpenFlow协议的情况下,便开始对S ...

  5. 传统二三层转发融合SDN Openflow协议的Hybrid交换机转发流程

    Hybrid 交换系统(以下简称Hybrid 交换机)是交换机融合了OVS(Openflow vswitch)原生代码,集传统和Openflow 技术于一体的转发系统.主要解决纯Openflow 基于 ...

  6. SDN学习之Mininet验证OpenFlow协议版本

    最近学习如何使用mininet,但是,刚刚开始时一直无法知道如何查看OpenFlow协议的版本,通过查阅网上的资料,从SDNLAB中,学习到了如何验证,mininet自身基于OpenFlow13版本的 ...

  7. [转]SDN与OpenFlow技术简介

    http://blog.163.com/s_zhchluo/blog/static/15014708201411144727961/ 本文是2012年文章,对Openflow的发展.规范.应用和SDN ...

  8. SDN原理 控制层 Controller控制器

    本文参照SDN原理视频而成:SDN原理 Controller 概念 从上面这个图片,我们能够知道,Controller 是一个非常重要的东西:承上启下,左右拓展. 从整个SDN的架构来看,控制器 处在 ...

  9. 实战录 | 基于openflow协议的抓包分析

    <实战录>导语 云端卫士<实战录>栏目定期会向粉丝朋友们分享一些在开发运维中的经验和技巧,希望对于关注我们的朋友有所裨益.本期分享人为云端卫士安全SDN工程师宋飞虎,将带来基于 ...

随机推荐

  1. 2012Noip提高组Day1 T3 开车旅行

    题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的 城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 ...

  2. my sql 两个 索引 时的 union 与 or 的比较

    背景:用一个表中的父子级关系进行查询 优化的过程中 发现可以使用 or 来代替 union all union all 需要查询两次 表 而 使用 or只需要 查询 一次 并且 两个字段都建立了索引 ...

  3. Egret的一些性能优化

    Egret的性能优化不知道在哪里啊,主要参考Laya的性能优化,都差不多 一.性能统计面板 index.html页面设置data-show-fps=true打开性能面板 性能统计面板说明 Egret没 ...

  4. 【BZOJ4372】烁烁的游戏 动态树分治+线段树

    [BZOJ4372]烁烁的游戏 Description 背景:烁烁很喜欢爬树,这吓坏了树上的皮皮鼠.题意:给定一颗n个节点的树,边权均为1,初始树上没有皮皮鼠.烁烁他每次会跳到一个节点u,把周围与他距 ...

  5. Swift - 把汉字转换为拼音,并且截取首字母做索引用

    var transformContents = CFStringCreateMutableCopy(nil, 0, "咋啊的看到回复阿斯顿发货发哦iasdifas") CFStri ...

  6. OC开发_Storyboard——视图控制生命周期以及NSNotifications

    一.生命周期 1.ViewDidLoad: 一般的初始化,除了几何图形的初始化(这个时候还没确定) 2.ViewWillAppear: 代表你的视图将要在屏幕上显示,可能会调用多次,对不可见时可能能改 ...

  7. 310实验室OTL问题(2)

    1.PyOptimization代码学习心得 (1).该部分由三个分块组成(按完成的相应的任务).第一部分,运行函数. 以optimization.py为入口程序,其思路是:首先获取路径,然后,初始化 ...

  8. __FILE__ 与 $_SERVER['SCRIPT_FILENAME']的区别

    二者都表明了本文件的绝对路径,区别在于,$_SERVER['SCRIPT_FILENAME']指向当前执行脚本的绝对路径:__FILE__指向当前文件的绝对路径:也就是写在哪个文件里就是哪里. 例子: ...

  9. javascript 之获取 百度地址参数方法

    原生态的JavaScript对DOM的操作 比jquery更方便,特别是当没有id  或class 可以获取的时候,只有用tag名获取 HTML DOM Element 对象操作  http://ww ...

  10. T-SQL数据库备份

    /*1.--得到数据库的文件目录 @dbname 指定要取得目录的数据库名 如果指定的数据不存在,返回安装SQL时设置的默认数据目录 如果指定NULL,则返回默认的SQL备份目录名 */ /*--调用 ...