SDN

什么是SDN

SDN是一种框架和思想,核心诉求是通过软件控制网络,实现业务的自动化部署,为方便软件来控制网络,希望控制面和转发面是分离的。

例如,传统的交换机内部,由交换机负责具体的网络流量往哪里转发,在SDN中,有一个控制器进行流量转发的计算,然后将结果发送给交换机,交换机只进行简单的转发,从分布式的控制转发过程称为集中式的控制,使得控制和转发平面相分离。

SDN的特点

网络开放可编程、数控分离(数据平面和控制平面相分离,为开放可编程提供架构基础)、逻辑上集中控制、网络业务的自动化应用程序控制。

SDN的架构

数据平面

可以抽象为数据平面或者转发平面,可以是交换机、虚拟交换机、路由器等。数据平面通用抽象模型将不同协议的匹配表整合起来,形成多字段匹配表,解决了网络协议堆砌的问题

传统网络中,现有的分层协议可以看作一种数据平面的抽象模型,但是控制平面依然只是网络功能和网络协议的堆砌,缺少合适的抽象模型

南向接口

控制面跟数据转发面之间的接口,传统网络的南向接口存在于各个设备商的私有代码中,对外不可见,如存在于交换机内部

控制器(控制平面)

可以有多个,可以是主从关系,也可以是对等关系,一个控制器控制多台设备,一个设备也可以被多台控制器控制,向上提供应用程序的编程接口,向下控制硬件设备。

北向接口

传统网络里,指交换机控制面跟网管软件之间的接口,在SDN中,指控制器跟应用程序之间的接口

SDN应用服务

为用户提供服务,包括负载均衡、安全、网络运行情况监测等,并以应用软件的形式表现出来,代替传统的网管软件来对网络进行控制和管理,可以跟控制器位于同一台服务器,也可以运行在别的服务器上通过通信协议来跟控制器通信。

SDN南向协议

狭义的SDN南向协议具有对数据平面编程的能力,可以指导数据平面设备的转发操作等网络行为,关键在于是否具有确切的数据平面可编程能力(如openflow)。

广义的SDN南向协议主要分为三种类型。第一种是仅具有对数据平面配置的南向协议(如OF-Config、OVSDB、NET-CONF);第二种是应用于广义SDN,具有部分可编程能力的协议(如OpFlex);第三种是本来就存在,其应用范围很广,不限于应用在SDN控制平面和数据平面之间传输控制信令的协议(如PCEP、XMPP)。

狭义SDN南向协议 — Openflow

Openflow原理

Openflow交换机

Openflow交换机可以分成流表和安全通道两部分。

  • 流表用于存放流表项,控制器可以给交换机下发流表项来指导交换机处理匹配流表项的数据包
  • 安全通道用于和控制器通信的安全连接

在Openflow协议中,交换机是策略的执行者,而网络相关的策略需要控制器下发

Openflow表

流表

  • 匹配域用于区分不同的数据流
  • 计数器记录了匹配数据流的数据包的数目和字节数等相关数据
组表

组表用于定义一组动作,且这组动作可以被多个流表项共同使用,从而实现组播、负载均衡、容灾备份和聚合等功能。

Meter表

Meter表用于计量和限速,可以针对流制定对应的限速规则,从而实现丰富的Qos功能,注意不是针对端口的。

OpenFlow通道

控制器和交换机的通信通道,支持以下三类报文:

  • Controller-to-Switch:主要由控制器初始化并发送给交换机
  • Asynchronous:交换机异步上传给控制器的报文,告知控制器新数据包的到达和交换机状态的改变
  • Symmetric:无需等待对方请求,双发都可以任意发送的报文

OpenFlow的缺点

  • 无法适应复杂的场景,当出现一种新的协议,需要扩充流表的匹配域,同时重写交换机和控制器两端的协议栈,交换机只能按照固定的协议逻辑去处理数据,不断增多的匹配域,使得OpenFlow的交换机的设计与实现越来越复杂
  • 只能在现有支持的转发逻辑上添加对应的流表项来指导数据包的转发,而无法对交换机的转发进行编程和修改,使得数据平面仍然需要掌握协议的语义等控制信息才能完成数据的匹配
  • 无状态协议,交换机只能受控制器的指导去执行操作,而无法在满足条件时主动采取动作,过度依赖控制平面

POF协议和P4协议对此进行了改进

广义SDN南向协议

OF-Config协议

OF-Config协议是一种交换机配置协议,主要功能包括进行交换机连接的控制信息,端口和队列资源的配置及端口等资源的状态修改等。

OF-Config协议可以看作是Openflow协议的一种补充

OVSDB协议

OVSDB与OF-Config协议类似,都是交换机配置协议,两者区别在于:OVSDB仅用于OVS(Open vSwitch)的配置,而OF-Config可以用于所有支持OpenFlow的软件或者硬件的交换机

NETCONF协议

是一种产生于SDN之前的网络配置协议,NETCONF是许多网络协议的配置协议,能统一管理和配置SDN设备和传统网络设备,既保证了现有网络设备的可用性,又支持SDN设备的设备

OpFlex协议

  • OpFlex是一种声明式控制的协议,只通知对象要达到一种状态的要求,但并没有规定通过指定的方式去达到这个状态
  • OpenFlow会精确的告诉交换机具体的动作,来完成数据的处理
  • OpFlex具有的可编程能力不强

XMMP协议

不是专门为SDN设计,可以统一管理传统设备和SDN设备,可以用于做OpenFlow的补充协议,或者用于SDN和传统网络混合组网的管理

PCEP

PCEP用于为流量工程提供路径计算服务,把路径计算的控制逻辑从转发设备中抽离到远端,实现了部分数据平面和控制平面的分离,将OpenFlow和PCEP协议结合使用实现OpenFlow网络和传统网络的统一管理和调度

完全可编程南向协议

POF协议

  • 通过${offset,length}$来确定匹配数据,强调协议无关

  • 协议的操作无非是增加、修改和删除对应的字段/标签,这些操作可以通过通用的指令集来实现,POF协议为交换机设计了通用的指令集
  • 针对OpenFlow的无状态缺点,POF设计了相关指令来在交换机内部维护一个简单的状态机,在条件满足时,可以采取主动的动作,然后异步通知控制器发生的改变,从而实现数据的同步

POF协议的设计思想借助了计算机的设计思想,控制器相当于操作系统,而转发元件(交换机)相当于CPU执行相关的指令

POF协议的缺点

控制流程复杂,丢失了部分性能,需要定义一套通用指令集,实现复杂的指令调度

P4

协议无关数据包处理编程语言,关注的是数据平面的可编程

  • P4编程语言具有对交换机的协议解析流程和数据处理流程进行编程的能力
  • 转发设备协议无关转发
  • 设备无关性

思想:是一门数据平面编程语言,当出现一种新的协议,通过P4语言编写程序,利用P4编译器将程序编译并写入交换机中,使得交换机能够拥有处理该协议的功能。

SDN控制器

SDN数据平面

通用可编程转发模型

通用硬件模型

上图为OpenFlow Switch通用硬件模型架构,其中网络数据处理流程为:数据包从端口进入$\rightarrow$通用模型中的数据包解析模块对数据包头进行分析$\rightarrow$选择对应的流表进行处理$\rightarrow$在流表内部,与每个流表项进行比较,若匹配成功,则按照对应的动作处理

流水线处理

采用多级流表,数据包在进入流水线之前,被分配一个空的操作指令集,进入第0个流表开始处理,通用硬件模型将数据包协议内容与每个流表项进行匹配,将匹配成功的流表项中的操作指令写入操作指令集中,或者传输给下一个流表

  • 现有交换机内部通常有多个查找表,多级流表使得资源的利用率变得更高
  • 单流表会造成资源浪费,多级流表可以组合支持实现不同处理之间的逻辑关系,有效的减少流表的数量,具有更好的适配能力

流表

  • 每个流表由多个流表项组成,流表项的匹配域用来与每个数据包的指定包头标识集合进行比较;
  • 流表项的优先级用来表示该流表项匹配的优先级,当数据包与多条流表项匹配成功的时候,需要按照优先级来选择一条流表项,并执行该表项的动作;
  • 失效时间包括硬超时和软超时,如果流表项的生存时间超过硬生存时间或者在软生存时间内没有匹配到数据包,则流表项中的内容将被清空

单个流表的处理过程

  • 先从网络数据包中提取待匹配的网络数据包协议字段组合,再加上上一个流表的Metadata信息共同组成一个待匹配域(可能该数据包从上级流表流入)
  • 与每个流表项进行匹配,如果只有一个流表项匹配到,则更新对应流表项的计数器等状态,然后执行流表项中的指令,这些指令会指明数据包跳转到哪一个流表【跳转指令,不是操作指令】,从而实现流表的跳转【只能向前跳转】;当数据包与多条流表项匹配成功的时候,需要按照优先级来选择一条流表项;
  • 当流表项中没有指定跳转指令时,流水线停止跳转,然后对数据包执行具体的操作【最后一个流表不会包含跳转指令】

组表

  • 组表用于定义一组动作,且这组动作可以被多个流表项共同使用,从而实现组播、负载均衡、容灾备份和聚合等功能
  • 每个组表由多条组表项组成,在流表项中,通过使用Group操作可以将数据包指向某个组操作
  • 组表项的桶操作(Action Buckets)可以用来存储多个Action Bucket,每个Action Bucket包含一个数据包操作指令集

组表项操作类型(Group Type)

  • 全操作类型(ALL),执行Action Buckets中的所有Action Bucket中的操作指令集,可以实现网络中的组播和广播功能
  • 选择类型(Select),只执行一个Action Bucket中的操作指令集,可用于流量的网络负载均衡
  • 间接类型(Indirect),只支持一个Action Bucket
  • 快速恢复类型(Fast Failover),只执行激活的第一个Action Bucket,多用于容灾备份场景

Meter表

  • Meter表用于计量和限速,可以针对流制定对应的限速规则,从而实现丰富的Qos功能,注意不是针对端口的
  • 通常当网络数据流的当前流量超过rate阈值时,才会执行band type中的指定操作

通用处理指令

网络处理控制指令

  • 数据包的操作指令集进行写入、应用或者删除等修改指令,如数据包在流表中,控制指令完成对数据包操作指令集中指令的添加、更新和删除等操作
  • 数据包在多个表中的处理顺序的跳转指令

操作指令

完成对数据包的丢弃、复制、转发和修改等操作

专用指令

如Table-miss表项中的Table-miss指令定义了在流表中匹配不成功时处理网络数据包的行为,匹配所有的匹配域,优先级为零,使得Table-miss表项能被所有的数据包匹配

Open Swtich的缺点

  • 数据包解析和包调度模块还不具备编程能力
  • 新协议扩展方面抽象能力不够
  • 不支持有状态的网络数据处理
  • 只支持有限数量的网络数据处理操作,不支持新的处理操作扩展
  • 网络流量监控和分析方面不足

白盒交换机

也称为开放交换机,网络交换机硬件和操作系统解耦合的结果

本质上,解决网络可编程的因素在于数据平面的可编程

参考资料
杨泽卫, 李呈. 重构网络: SDN 架构与实现[J]. 2017.

作者:yearsj
转载请注明出处: https://www.cnblogs.com/yearsj/p/9519680.html
segmentfault对应博文: https://segmentfault.com/a/1190000016112134

SDN学习笔记的更多相关文章

  1. OpenFlow Switch学习笔记(一)——基础概念

    OpenFlow Switch v1.4.0规范是在2013年10月14号发布,规范涵盖了OpenFlow Switch各个组件的功能定义.Controller与Switch之间的通信协议Open F ...

  2. 学习笔记:CentOS7学习之十五: RAID磁盘阵列的原理与搭建

    目录 学习笔记:CentOS7学习之十五: RAID磁盘阵列的原理与搭建 14.1 RAID概念 14.1.1 RAID几种常见的类型 14.1.2 RAID-0工作原理 14.1.3 RAID-1工 ...

  3. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  4. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  5. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  6. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  7. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  8. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  9. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

随机推荐

  1. iOS 开发学习资料整理(持续更新)

      “如果说我看得比别人远些,那是因为我站在巨人们的肩膀上.” ---牛顿   iOS及Mac开源项目和学习资料[超级全面] http://www.kancloud.cn/digest/ios-mac ...

  2. GitHub如何在自己的Stars中进行搜索

    默认的搜索结果,仅仅搜索原创的repository 想要搜索的时候,能够搜索到fork出来的repository的话 在关键字后面加上空格 fork:true

  3. 无法读取配置节“protocolMapping”,因为它缺少节声明

    无法读取配置节“protocolMapping”,因为它缺少节声明 1.正常情况   :  Web.config文件中有protocolMapping节点, 发现在IIS部署时使用了.NET 2.0的 ...

  4. 【Android 界面效果43】Android LayoutInflater的inflate方法中attachToRoot的作用

    我们在ListView的Adapter的getView方法里面经常会调用两个参数的inflate方法, mInflater.inflate(R.layout.adv_viewpager, null); ...

  5. 《Python基础教程(第二版)》学习笔记 -&gt; 第六章 抽象

    抽象和结构 本章将会介绍如何让将语句组织成函数,还会详细介绍参数(parameter)和作用域(scope)的概念,以及递归的概念及其在程序中的用途. 创建函数 函数可以调用,它执行某种行为,并返回某 ...

  6. JS禁止横竖屏切换,强制横竖屏显示

    js判断屏幕横竖屏: function orient() { //alert('gete'); if (window.orientation == 0 || window.orientation == ...

  7. ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 后篇 --事件冒泡

    原文:ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 后篇 --事件冒泡 CompositeControl  后篇 --事件冒泡 系列文章链接: ASP.NET ...

  8. jedis使用api

    Jedis 是 Redis 官方首选的 Java 客户端开发包. 工作过程总结的一个示例,贴出来,如下: package com.wujintao.redis; import java.util.Da ...

  9. 深入解析Linux中的fork函数

    1.定义 #include <unistd.h> #include<sys/types.h> pid_t fork( void ); pid_t 是一个宏定义,其实质是int, ...

  10. 09 Zabbix4.0系统clone、mass update使用

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 09 Zabbix4.0系统clone.mass update使用 1. clone使用: clo ...