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 )
记录流表未匹配成功的时间间隔
处理流程
-
数据包(抽取包头域) - > 匹配查找 -> 流表项(搜索优先级最高的匹配项)-> 执行 Instructions ->
Apply-action(修改数据包、更新匹配域、更新流水线域、转发或复制数据包) -> 输出 -
数据包(抽取包头域) - > 匹配查 -> 流表项(搜索优先级最高的匹配项)-> 执行 Instructions ->
clear-action/write-action -
数据包(抽取包头域) - > 匹配查 -> 流表项(搜索优先级最高的匹配项)-> 执行 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)
可变成包生成器
可变成解析器