【随笔】OpenFlow概述

news2024/11/20 8:30:43

SDN之前的网络结构

硬件
操作系统
网络功能(交换机、路由器、防火墙、VPN、NAT、OSPF、BGP、Traffic Engineering)

北向是SDN应用
SDN控制器
底层是SDN数据面(通用硬件)

openflow

OPEN NETWORKING FOUNDATION

支持开放的SDN平台,一直使用的是openflow协议。
openflow是众多南向接口的一种开放接口。

ON.LAB

逻辑上分离。数据平面和控制平面有接口的时候,有一个逻辑分离集中控制。

SDN分层体系

SDN应用
SDN控制器
数据平面

也可以通过,SDN控制器独立连接各个数据中心网络和服务器。

SDN控制与数据平面、转发平面的交互为南向接口。
SDN向北与SDN应用的交互为北向接口。

firewall.c C编辑的防火墙。
南向接口 <Match, Action>

SDN数据平面会变成,通用的可编程数据平面
OpenFlow更侧重于网络功能的转发。

控制器之间要通信,东西向接口抽象层

SDN应用层(例如:OpenDayLight)

Web GUI 、Base Network Apps 、 Languages Library、 Neutron Plugin

中间层

REST Api 、Languages API (Python 、Java …)

东西向
East/Westbound(Mechanisms & Protocols)
SFC
Host Tracker

如果想长期研究SDN

推荐OpenDayLight
OpenDayLight 已发展为开源的控制器平台

2008年开始的OpenFlow

openFlow各版本情况
https://zhuanlan.zhihu.com/p/626759102
https://cloud.tencent.com/developer/article/2046688

2009年开始的OVS
OpenVSwitch 正在向 OVN的方向在演进

·

OpenStack也是一个Iaas的平台
网络产业的玩家越来越多,涵盖普林斯顿大学高级网络课程。

网络芯片层 ( 英特尔、博通、Barefoot )
芯片驱动和编译层 (ONIE, OF-DPA, P4 , Open DP)
设备OS层(ONL,PicOS, Cumulus)
南向接口层(OVS、Indigo、FBOSS)
SDN控制器层 (ODL、ONOS、Ryu、Floodilight、NOX)
SDN应用层 (交换机/防火墙,数据中心网络虚拟化,SD-WAN)

@交换机设计/控制器平台/可扩展性/性能评估/安全/SDN迁移/SDN于通信和云/SDE
@系统实现挑战(调试、测试于仿真)
@网络应用(流量工程/移动和无线/测量和监听/安全/数据中心网络)
@编程语言
@基于语言的虚拟化
@北向接口
@SDN控制器
@网络Hypervisors
@南向接口
@基础设施(数据平面 - 转发设备)

Learning SDN first Need learning

Network and Data Center Virtualzation
Linux for Network Engineer
OpenStack Certified Professional
Python Programming for Network Engineer
DevOps and Network Automation
SDN/NFV Use Case Cloud based Managed Services

OpenFlow概述

实践SDN的首选
主流南向接口
P4和PISA的前身
Ethane项目是斯坦福大学定义出了OpenFlow之后,主要是为了厂商的一些接口进行开放出来。

SDN ≠ OpenFlow

开放的南向接口
通用转发抽象模型
网络X86指令集

南向接口区别主要是 Particle size

OpenFlow类型的网络设备

包内容|包头
---->
端口 ->Flow Table <nums> --> 端口
流表(不是固定MAC学习表、一个IP查找表,是 set flow table)

网络设备API

网路x86指令集的尝试。


OpenFlow中的术语

Packet 以太帧、包括header 和 payload
Port packets 进出OpenFlow pipeline 的地方、由物理端口、Switch 定义的 logic 端口、 OpenFlow 协议定义的 reserved 端口
Pipeline OFS 中实现 matching、转发和 packet 修改的 flow table 流水线
Flow table pipline 的一个 stage ,包含 flow entries
Flow entry flow table 中的元素,用于 packets 查找和处理,包括用于包匹配的一组 match fields ,描述匹配顺序的 priority 、跟踪记录 packets 的一组 counters ,一组待用的 instructions
Match Field packet 匹配查找时使用的域,包括 packet header、输入端口和 metadata 值,一个 match field 可以是通配符(匹配任意值),也可以是 bitmasked 型
Metadata 一个Maskable register value 用于 table 之间的信息传递
Instruction 当一个 packet 匹配某个flow entry 时,对应的 instruction 描述特定的 OpenFlow 处理。一个 instruction 可以修改 pipeline processing 过程,比如直接把 packets 发给另一个 flow table , 也可以包含一组 actions 用来添加 action set ,或包含一个 action list 立即应用给packet。
Action 转发 packet 到某个端口或修改 packet 的一个操作,比如减小 TTL 值。Actions 也可作为 flow entry 对应的 instruction set 的一部分,或者在 group entry 对应的一个 action bucket 中。Actions 可以被添加到 packet 的 action set 中,也可以立即应用给匹配的 packet
Action set 与 packet 相关的一组 actions , 当每个 flow table 处理 packet 时会添加 action set,当 instruction set 表示 packet 会送出 processing pipline 时,action set 会被执行
Group 一个 action buckets 列表,从其中选择一个或多个 buckets 用在每个 packet 上
Action bucket 一组 action 以及相关参数,在 group 中定义
Tag 通过 push 和 pop action 插入 packet 或从 packet 删除的一个 header
Outermost tag 离 packet 起始位置最近的一个tag
Meter 一个switch基本单位,能测量和控制 packets 速率,如果 packet 速率或 byte 速率经过 meter 超出预定义的范围,meter 会激活一个 meter band,如果 meter band drop packet ,就是所谓的 Rate Limiter

Match 匹配域,例如MAC地址
流表里面包含的比较多,包含一组协议
从输入端口,到MAC目的地址、源地址、IP地址、TCP端口
OpenFlow1.5的话已经到40多个域,大概150多个字节宽度


SDN 控制器

| (use OpenFlow协议)
Flow Table - 流表

输入端口 -> Flow Entry 【匹配域(Match Fields) | 动作(Action) | 统计信息(Statistics) 】-> 输出端口

<Match/Rule>

匹配域(Mctch Fields|) | 优先级(Priority)| 计数器(Statistics)| 指令(Instructions)| 失效时间(Timeouts)| Cookie | Flasg

匹配域:一组网络数据包协议域的组合,用来识别该条表项对应的Flow , 也叫待匹配内容。
优先级 定义这个流表项的匹配优先级,当同时有多条表项匹配时

匹配域有协议的排列:

Ingress Port | Metadata | Ethernet(sec| dst | type) | VLAN (id | prio.) | MPLS(lab. | t.c.) | IP( src | dst | Proto/A.op | TOS ) | TCP/UDP/ICMP (src port /icmp type | dp port /icmp code)

匹配域和每条流表进行比较,找到匹配程度最高的。优先级最高的一条流表项,然后做响应的处理。
协议域的拼接就是字符串的组合。
但在部署过程中是不那么灵活的。从OpenFlow1.2开始,采用了TLV结构的OFSM的方式。可以用灵活的方式描述任意的协议域和匹配字段的方式。

协议域会匹配结构体:

struct ofp_match
uint16_t_type: (定义了 OFPMT_STANDARD = 0 和 OFPMT_OXM = 1 OpenFlow Extensible Match )

OXM TLV的基本结构
32bit 去匹配域,匹配协议要对齐
匹配类( oxm_class ) 16| 类字段(oxm_field)9| 掩码标志(HM)7| 载荷长度(oxm_length)0|

匹配类

enum_ofp_xml_class{
OFPXMC_NXM_0 = 0x0000,
OFPXMC_NXM_1 = 0x0001,
OFPXMC_OPENFLOW_BASIC = 0x8000,
OFPXMC_PACKET_REGS = 0x8001,
OFPXMC_EXPERIMENTER = 0xFFFF,
}

类字段

enum_oxm_ofb_match_fields{
OFPXMT_OFB_IN_PORT = 0,
OFPXMT_OFB_IN_PHY_PORT = 1,
OFPXMT_OFB_TCP_FLAGS = 42,
OFPXMT_OFB_ACTEST_OUTPUT = 43,
OFPXMT_OFB_PACKET_TYPE = 44
}

‘/* Header Match Flelds - 38 */’
OXM_OF_ETH_DST
OXM_OF_ETH_SRC

OXM_OF_PBB_UCA

/* Pipeline Match Fields - 6 */
OXM_IF_IN_PORT
OXM_OF_IN_PHY_PORT

OXM_OF_PACKET_TYPE

计数器

记录该表项匹配的数据包信息:包数目,包字节数目

指令(Instructions)
当数据包匹配该条流表项的匹配域时

1.修改或操作指令集(Action Set)
2.修改多级流表处理

指令和动作有区别

指令(Instructions):Apply-Action | Write-Action | Clear-Action | Goto table
动作(Action):Output <port_no> | Drop | Group <group_id> | Set-Queue <queue id> | Push-Tag/Pop-tag ethertype | Set-Field <field> <type> <value> | Change-TTL <ttl> | Meter <meter> <id> | Copy-Field <src> <dst> <field> <type>

在这里插入图片描述

失效时间 ( Timeouts )

记录流表未匹配成功的时间间隔

处理流程

  1. 数据包(抽取包头域) - > 匹配查找 -> 流表项(搜索优先级最高的匹配项)-> 执行 Instructions ->
    Apply-action(修改数据包、更新匹配域、更新流水线域、转发或复制数据包) -> 输出

  2. 数据包(抽取包头域) - > 匹配查 -> 流表项(搜索优先级最高的匹配项)-> 执行 Instructions ->
    clear-action/write-action

  3. 数据包(抽取包头域) - > 匹配查 -> 流表项(搜索优先级最高的匹配项)-> 执行 Instructions -> Goto-table{表 ID} -> 流表1/执行操作集

Group Entry – 组表项
Actions( 动作 )
组表项目ID (Group ID)| 组表项类型 (Group Type)| 计数器 (Counters) | 指令(Action Buckets)

组表项:根据此标识符使用这个组表项:32位无符号整数
组表项类型:指定该组表项动作包含的端口
计数器:记录组表项处理报文数目
指令:动作桶

组表象类型
在这里插入图片描述

计量表项ID(Meter ID)

Meter Bands 计量带
匹配域(Meter ID) | 计量带 (Meter Bands) | 计数器(Counters)

Band类型(Band Type) | 计量速率(Rate) | Burst | 计数器(Counters) | 类型参数 (Type specific arguments)

Band类型
在这里插入图片描述
Ports - 端口抽象子模型
在这里插入图片描述

实时的收集流的状态,依赖于计数器。
在这里插入图片描述

OpenFlow 通用转发抽象模型

在这里插入图片描述

OpenFlow消息

在这里插入图片描述

Controller-to-Switch 消息

• Controller-to-Switch子类型:

▫ Features消息:在SSL/TCP会话建立后,Controller给Switch发送Features请求Switch的相关信息。Switch必须应答自己支持的功能,括接口名、接口MAC地址、接口支持的速率等等基本信息。
▫ Configuration消息:Controller可以设置或查询Switch的状态。
▫ Modify-State消息:Controller发送该消息给Switch,来管理Switch的状态,即增加/删除、更改流表,并设置Switch的端口属性。
▫ Read-State消息:Controller用该消息收集Switch上的统计信息。
▫ Send-Packet消息:Controller发送该消息到Switch的特定端口。

• Asynchronous子类型:

▫ Packet-in消息:当Flow Table中没有匹配的表项或者匹配“send to Controller”,Switch将给Controller发送packet-in消息。
▫ Packet-out消息:从控制器回复的消息。
▫ Flow-Removed消息:当给Switch增加一条表项时,会设定超时周期。当时间超时后,该条目就会被删除。这时Switch就会给Controller送Flow-Removed消息;当流表中有条目要删除时,Switch也会给Controller发送该消息。
▫ Port-status消息:当数据路径接口被添加、删除、修改的时候,此消息用于通知控制器。

• Symmetric子类型:

▫ Hello消息:当一个OpenFlow连接建立时,Controller和Switch都会立刻向对端发送OFPT_HELLO消息,该消息中的version域填充发送支持的OpenFlow协议最高的版本号;接收方收到该消息后,接收方会计算协议版本号,即在发送方和接收方的版本号中选择一个较小的;如果接收方支持该版本,则继续处理连接,连接成功;否则,接收者回复一个OFPT_ERROR消息,类型域中填充ofp_error_type.OFPET_HELLO_FAILED
▫ Echo消息: Switch和Controller任何一方都可以发起Echo request消息,但收到的一方必须回应Echo reply消息。这个消息可以来测量latency、Controller-Switch之间的连接性,即心跳消息;
▫ Error消息:当交换机需要通知控制器发生问题或错误时,Switch给Controller 发送Error消息。
• OpenFlow协议仍在持续更新。更多更全的消息类型请参考ONF最新发布《OpenFlow Switch Specification》标准。

OpenFlow1.5有type35种

– 32 bits –
0x00 version | type | length
0x04 xid
0x08 Payload(type)

OF交换机 - - - OF控制器
– – OFPT_HELLO = 0 – – >
< – – ACK – –
< – – OFPT_HELLO – –
– – ACK – – >

0 - 7 - 15 - 16 - 31
OF版本(8) | OFPT_HELLO | length(16)
Xid(32)

OpenFlow是什么

开放的南向接口
通用转发抽象模型
网络x86指令集

OF-Config
OVS-DB
OpFlex, NETCONF等

PISA - 协议无关交换机架构(Tofino)

可变成包生成器
可变成解析器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1263638.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue 双向数据绑定

之前通过v-bind来完成的数据绑定&#xff0c;属性值和表达式进行绑定&#xff0c;表达式的值发生变化了属性值也跟着发生变化。 单向数据绑定&#xff1a; <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>首页</titl…

rss服务搭建记录

layout: post title: RSS subtitle: vps搭建RSS服务 date: 2023-11-27 author: Sprint#51264 header-img: img/post-bg-universe.jpg catalog: true tags: - 折腾 文章目录 引言RSShub-dockerRSS-radarFreshrssFluent reader获取fever api配置Fluent Reader同步 结语 引言 一个…

ArrayList源码全面解析

一、概述 ArrayList 是 java 集合框架中比较常用的数据结构,继承自 AbstractList&#xff0c;实现了 List 接口。底层采用数组来实现。ArrayList 实现了java.io.Serializable接口&#xff0c;这意味着ArrayList支持序列化&#xff0c;能通过序列化去传输。 1.1、底层数据结构…

从 Rust 程序员的早期使用印象看 Go

Go vs Rust 我在过去的几周开始使用 Go。这是我第一次在一个较大且严肃的项目中使用 Go。之前我对 Go 有过很多了解&#xff0c;并且在研究 Rust 的特性时&#xff0c;曾经使用例子和玩具程序。然而&#xff0c;真正的编程经验是完全不同的。 我认为写写我对它的印象会很有趣。…

Java(九)(多线程,线程安全,实现线程的方法,线程同步,线程池,并发和并行,线程的六种状态)

目录 多线程 线程 实现线程的方法 方法一:继承Thread父类 方法二:实现Runnable接口 方法三:Callable接口和FutureTask类来实现 Thread方法 线程安全 线程同步 同步代码块 同步方法 Lock锁 线程池 线程池对象的创建方式一: 线程池处理Runnable任务 线程池处理Cal…

办公软件定制开发在企业发展中的优势|app小程序搭建

办公软件定制开发在企业发展中的优势|app小程序搭建 如今&#xff0c;办公软件已经成为企业日常工作的必需品。很多企业为了提高工作效率和满足自身业务需要&#xff0c;选择定制开发办公软件。下面将介绍定制开发办公软件在企业发展中的优势。 1定制开发办公软件可以满足企业…

uni-app 微信小程序 pdf预览

<div click"getPDF">查看体检报告</div>getPDF() {uni.downloadFile({url: ${this.$baseURL}/file/download?id${this.pdfFileId},//编写在线的pdf地址success: function(res) {const filePath res.tempFilePath;uni.openDocument({filePath: filePath…

每日一练【移动零】

一、题目描述 283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 二、题目解析 可以…

Appium自动化如果出现报错怎么办?这么做确实解决问题

解决通过appium的inspector功能无法启动app的原因 在打开appium-desktop程序&#xff0c;点击inspector功能&#xff0c;填写app的配置信息&#xff0c;启动服务提示如下&#xff1a; 报错信息&#xff1a; An unknown server-side error occurred while processing the com…

数据结构(超详细讲解!!)第二十五节 树与森林

1.树的存储结构 和线性表一样&#xff0c;树可以用顺序和链式两种存储结构。 树的顺序存储结构适合树中结点比较“满”的情况。根据树的非线性结构特点&#xff0c;常用链式存储方式来表示树。树常用的存储方法有&#xff1a;双亲表示法、孩子表示法和孩子兄弟表…

Toast UI Editor上传图片到Flask

Toast UI Editor国内文档几乎搜不到&#xff0c;国外文档也写得不是特别项目&#xff0c;没有太多举例的demo。一开始选择使用这个就是因为UI好看。不过看看源码把思路滤清了。 他会给把图片转成Base64&#xff0c;到时候发表单直接丢过去就行了&#xff0c;blob这个参数能拿到…

05 Nacos实战:集成Nacos实现分布式配置中心实现配置动态刷新

上一节介绍了Nacos注册中心的功能,这节介绍下木谷博客中如何使用Nacos作为分布式配置中心。 在第二节搭建项目并运行中讲到创建mugu_nacos_config这个数据库,其中已经包含了木谷博客所需的全部配置,在nacos中也可以查看到,如下: 引入Nacos作为配置中心很简单,步骤如下:…

vue3中的customRef创建一个自定义的 ref对象

customRef 创建一个自定义的 ref&#xff0c;并对其依赖项跟踪和更新触发进行显式控制 小案例: 自定义 ref 实现 debounce <template><div style"font-size: 14px;"><input v-model"text" placeholder"搜索关键字"/><…

flask 上传文件

from flask import Flask, request, render_template,redirect, url_for from werkzeug.utils import secure_filename import os from flask import send_from_directory # send_from_directory可以从目录加载文件app Flask(__name__)#UPLOAD_FOLDER media # 注意&#xff…

【TiDB】TiDB离线方式部署

目录 1 下载TiDB离线组件包 2 安装TiUP 3 合并离线包 4 TIDB 软件和硬件环境建议配置 5 TiDB环境与系统配置检查 6 生成集群初始化配置文件模板 7 执行部署命令 1 检查就能存在的潜在风险 2 手动修复风险 3 部署 TiDB 集群 8 查看TIUP管理的集群情况 9 检查部署的…

[⑥ADRV902x]: 软件系统初始化流程学习

前言 本篇博客主要记录ADRV902x参考软件中对ADRV902x系统的初始化流程&#xff0c;使用API函数来实现transceiver的配置&#xff0c;校准和控制等。官方将整个系统初始化称之为multichip synchronization initialization (MCS) sequence&#xff0c;主要分成PreMcsInit&#x…

数字电源为什么一般用DSP控制,而不能用普通的单片机?

数字电源为什么一般用DSP控制&#xff0c;而不能用普通的单片机&#xff1f; 首先你要清楚&#xff0c;数字电源需要一个芯片具备什么功能&#xff1f; 1 能发PWM波 &#xff0c;并且具备保护关断功能&#xff1b; 电源对PWM发波 要求很高&#xff0c;精度要ns级甚至ps级的&…

易宝OA系统ExecuteSqlForSingle接口SQL注入漏洞复现 [附POC]

文章目录 易宝OA系统ExecuteSqlForSingle接口SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 易宝OA系统ExecuteSqlForSingle接口SQL注入漏洞复现 [附POC] 0x01 前言 免责声明&#xff1a;请勿利用文章…

2023极客大挑战-AGRT战队wp

目录 RE Shiftjmp 点击就送的逆向题 幸运数字 ​编辑 砍树 小黄鸭 flower-or-tea mySelf 是男人就来扎针 听说cpp很难&#xff1f; Easymath 寻找初音未来 Rainbow 浪漫至死不渝 ezandroid Pwn nc_pwntools password ret2text write1 ret2libc ezpwn wr…

MicroPython STM32F4 RTC功能使用介绍

MicroPython STM32F4 RTC功能使用介绍 &#x1f516;STM32和ESP32 RTC功能差不多&#xff0c;相关篇《MicroPython ESP32 RTC功能使用介绍》&#x1f4cc;固件刷可参考前面一篇《STM32刷Micropython固件参考指南》&#x1f33f; 相关篇《Micropython STM32F4入门点灯》&#x1…