从连接到交互:SDN 架构下 OpenFlow 协议的流程与报文剖析

在SDN架构中,交换机与控制器之间的通信基于 OpenFlow协议,其设计目的是实现控制平面与数据平面的解耦。以下是 交换机连接控制器 和 数据包进入交换机触发交互 的详细流程及协议报文分析:
一、交换机连接控制器的流程(初始化阶段)
1. TCP/TLS 连接建立
- 协议:OpenFlow默认使用 TCP端口6653(或6633),支持TLS加密(可选)。
- 步骤:
- 交换机主动向控制器IP地址发起TCP连接。
- 若启用TLS,双方进行证书交换和加密协商。
2. OpenFlow 握手(版本协商)
- 关键报文:
OFPT_HELLO(消息类型0):- 作用:交换支持的OpenFlow版本。
- 流程:
- 交换机发送
OFPT_HELLO,携带支持的版本(如1.0, 1.3)。 - 控制器回复
OFPT_HELLO,选择双方共有的最高版本(如1.3)。 - 若版本不匹配,控制器发送
OFPT_ERROR并断开连接。
- 交换机发送
3. 交换机能力交换
- 关键报文:
OFPT_FEATURES_REQUEST(类型5):- 作用:控制器主动请求交换机的硬件能力。
OFPT_FEATURES_REPLY(类型6):- 内容:
datapath_id(交换机唯一标识)- 支持的流表数量、端口列表(端口号、MAC地址等)。
- 支持的OpenFlow动作(如
OUTPUT,SET_FIELD)。
- 内容:
4. 控制器配置交换机
- 关键报文:
OFPT_SET_CONFIG(类型9):- 作用:控制器下发基础配置参数。
- 配置项:
flags:是否发送非缓存Packet-In(OFPCML_NO_BUFFER)。miss_send_len:Packet-In消息中截取的数据包长度。
初始化完成标志
- 控制器通过下发 默认流表(如
table-miss流表项)完成初始化,将未知流量导向控制器。
二、数据包进入交换机的流程(运行时阶段)
当交换机收到数据包且无匹配流表项时,触发以下交互:
1. 交换机发送 OFPT_PACKET_IN(类型10)
- 报文结构:
| Header (OFPT_PACKET_IN) | buffer_id | total_len | reason | table_id | cookie | match字段 | 数据包内容(截断部分) |- 关键字段:
buffer_id:交换机缓存的数据包ID(避免重复传输完整数据)。reason:触发原因(如OFPR_NO_MATCH表示无流表匹配)。match:入端口(in_port)、数据包元数据(如MAC地址)。
- 关键字段:
2. 控制器处理 Packet-In 事件
- 逻辑步骤:
- 解析数据包:提取源/目的MAC、IP等信息。
- 决策转发路径:基于网络策略(如MAC学习、ACL规则)。
- 下发流表项:通过
OFPT_FLOW_MOD(类型14)动态添加流表。 - 转发数据包:通过
OFPT_PACKET_OUT(类型13)立即转发缓存的数据包。
3. 控制器下发流表(OFPT_FLOW_MOD)
- 报文结构:
| Header | cookie | command(ADD/MODIFY) | idle_timeout | priority | match字段 | instructions |- 关键指令:
OFPIT_APPLY_ACTIONS:立即执行动作(如OUTPUT:port)。OFPIT_WRITE_ACTIONS:写入动作到动作集(用于多级流表)。
- 关键指令:
4. 交换机执行转发(OFPT_PACKET_OUT)
- 报文结构:
| Header | buffer_id | in_port | actions | data(完整数据包,若buffer_id为-1) |- 作用:指示交换机将缓存的数据包(通过
buffer_id)从指定端口转发。
- 作用:指示交换机将缓存的数据包(通过
三、协议交互流程图
交换机 控制器| || ---- TCP Connect ------------>| 建立TCP连接| <---- OFPT_HELLO ------------ | 版本协商| ---- OFPT_HELLO ------------> || || <--- OFPT_FEATURES_REQUEST -- | 请求交换机能力| ---- OFPT_FEATURES_REPLY ---> || || <--- OFPT_SET_CONFIG -------- | 配置交换机参数| || ==== 初始化完成,进入运行状态 ====|| || ---- OFPT_PACKET_IN --------> | 数据包无匹配流表| <--- OFPT_FLOW_MOD ---------- | 下发新流表| <--- OFPT_PACKET_OUT -------- | 转发缓存数据包| |
四、设计逻辑与关键机制
-
状态分离:
- 控制平面:控制器维护全局网络视图(如拓扑、流表)。
- 数据平面:交换机仅负责高速转发,依赖流表匹配。
-
异步事件驱动:
- 控制器通过事件(如
Packet-In、Port-Status)感知网络变化。 - 交换机通过
Flow-Mod被动接收流表更新。
- 控制器通过事件(如
-
性能优化:
- Buffer ID:减少重复数据传输,提升效率。
- 流表优先级:高优先级流表优先匹配,支持复杂策略叠加。
-
容错与安全:
- Echo Request/Reply(类型2/3):用于心跳检测连接存活。
- TLS加密:防止中间人攻击(需预配置证书)。
五、OpenFlow 1.3 报文示例
1. OFPT_HELLO 消息(简略格式)
| version (0x04) | type (0) | length | xid | elements (版本列表) |
version=0x04:表示OpenFlow 1.3。
2. OFPT_PACKET_IN 消息(简略格式)
| version | type (10) | length | xid | buffer_id | total_len | reason | table_id | match | data |
六、总结
OpenFlow协议通过严格的 请求-响应模型 和 事件驱动机制,实现了SDN控制器与交换机的高效协作。其设计核心是:
- 控制集中化:控制器掌握全局网络状态。
- 数据平面可编程:通过动态流表实现灵活转发。
理解这些协议细节,有助于优化SDN应用性能(如减少Packet-In频率)和调试网络问题(如流表冲突)。
相关文章:
从连接到交互:SDN 架构下 OpenFlow 协议的流程与报文剖析
在SDN架构中,交换机与控制器之间的通信基于 OpenFlow协议,其设计目的是实现控制平面与数据平面的解耦。以下是 交换机连接控制器 和 数据包进入交换机触发交互 的详细流程及协议报文分析: 一、交换机连接控制器的流程(初始化阶段&…...
第七课:Python反爬攻防战:Headers/IP代理与验证码
在爬虫开发过程中,反爬虫机制成为了我们必须面对的挑战。本文将深入探讨Python爬虫中常见的反爬机制,并详细解析如何通过随机User-Agent生成、代理IP池搭建以及验证码识别来应对这些反爬策略。文章将包含完整的示例代码,帮助读者更好地理解和…...
Golang学习笔记_47——访问者模式
Golang学习笔记_44——命令模式 Golang学习笔记_45——备忘录模式 Golang学习笔记_46——状态模式 文章目录 一、核心概念1. 定义2. 解决的问题3. 核心角色4. 类图 二、特点分析三、适用场景1. 编译器实现2. 财务系统3. UI组件系统 四、Go语言实现示例完整实现代码执行结果 五、…...
软件高级架构师 - 软件工程
补充中 测试 测试类型 静态测试 动态测试 测试阶段 单元测试中,包含性能测试,如下: 集成测试中,包含以下: 维护 遗留系统处置 高水平低价值:采取集成 对于这类系统,采取 集成 的方式&…...
IDEA 基础配置: maven配置 | 服务窗口配置
文章目录 IDEA版本与MAVEN版本对应关系maven配置镜像源插件idea打开服务工具窗口IDEA中的一些常见问题及其解决方案IDEA版本与MAVEN版本对应关系 查找发布时间在IDEA版本之前的dea2021可以使用maven3.8以及以前的版本 比如我是idea2021.2.2 ,需要将 maven 退到 apache-maven-3.…...
Qt之QGraphicsView图像操作
QGraphicsView图像操作:旋转、放大、缩小、移动、图层切换 1 摘要 GraphicsView框架结构主要包含三个主要的类QGraphicsScene(场景)、QGraphicsView(视图)、QGraphicsItem(图元)。QGraphicsScene本身不可见,是一个存储图元的容器,必须通过与之相连的QGraphicsView视图来显…...
人工智能之数学基础:对线性代数中逆矩阵的思考?
本文重点 逆矩阵是线性代数中的一个重要概念,它在线性方程组、矩阵方程、动态系统、密码学、经济学和金融学以及计算机图形学等领域都有广泛的应用。通过了解逆矩阵的定义、性质、计算方法和应用,我们可以更好地理解和应用线性代数知识,解决各种实际问题。 关于逆矩阵的思…...
嵌入式开发之串行数据处理
前题 前面几篇文章写了关于嵌入式软件开发时,关于串行数据处理的一些相关内容,有兴趣的可以看看《嵌入式开发:软件架构、驱动开发与串行数据处理》、《嵌入式软件开发之生产关系模型》和《嵌入式开发之Modbus-RTU协议解析》相关的内容。从业十…...
机器学习(六)
一,决策树: 简介: 决策树是一种通过构建类似树状的结构(颠倒的树),从根节点开始逐步对数据进行划分,最终在叶子节点做出预测结果的模型。 结构组成: 根节点:初始的数据集…...
结合unittest和pytest进行虚拟数据库测试
使用 pytest 和 MagicMock 模拟数据库操作,并测试假设的 create_user 函数,将用户添加到数据库中。 代码实现 from datetime import date from typing import List, Optional from unittest.mock import MagicMock from pydantic import BaseModel, Fi…...
Spring Boot 监听器(Listeners)详细教程
Spring Boot 监听器(Listeners)详细教程 目录 Spring Boot 监听器概述监听器核心概念最佳使用场景实现步骤高级配置详细使用场景总结 1. Spring Boot 监听器概述 Spring Boot 监听器(Listeners)基于 Spring Framework 的事件机制…...
工具介绍《githack》以及Git 命令行
一、Githack 工具介绍 Githack 是一个用于检测和利用网站 .git 目录泄露漏洞的安全工具。当网站错误配置导致 .git 目录可公开访问时,攻击者可通过该工具下载 .git 中的版本控制文件,并重建完整的项目源代码。 核心用途 检测 .git 目录泄露漏洞。从泄…...
【hello git】git rebase、git merge、git stash、git cherry-pick
目录 一、git merge:保留了原有分支的提交结构 二、git rebase:提交分支更加整洁 三、git stash 四、git cherry-pick 共同点:将 一个分支的提交 合并到 到另一个上分支上去 一、git merge:保留了原有分支的提交结构 现有一个模型…...
MR的环形缓冲区(底层)
MapReduce的大致流程: 1、HDFS读取数据; 2、按照规则进行分片,形成若干个spilt; 3、进行Map 4、打上分区标签(patition) 5、数据入环形缓冲区(KVbuffer) 6、原地排序ÿ…...
下载Hugging Face模型的几种方式
1.网页下载 直接访问Hugging Face模型页面,点击“File and versions”选项卡,选择所需的文件进行下载。 2.使用huggingface-cli 首先,安装huggingface_hub: pip install huggingface_hub 然后,使用以下命令下载模型࿱…...
Java 第十一章 GUI编程(2)
目录 GUI 事件处理 基本思路 添加事件监听器 对话框 实例 GUI 事件处理 对于采用了图形用户界面的程序来说,事件控制是非常重要的;到目前为止, 我们编写的图形用户界面程序都仅仅只是完成了界面,而没有任何实际的功能&…...
Redis数据结构深度解析:从String到Stream的奇幻之旅(一)
Redis系列文章 《半小时掌握Redis核心操作:从零开始的实战指南》-CSDN博客 Redis数据结构深度解析:从String到Stream的奇幻之旅(一)-CSDN博客 Redis数据结构深度解析:从String到Stream的奇幻之旅(二&…...
7V 至 30V 的超宽 VIN 输入范围,转换效率高达 96%的WD5030
WD5030 具备 7V 至 30V 的超宽 VIN 输入范围,这一特性使其能够适应多种不同电压等级的供电环境,无论是在工业设备中常见的较高电压输入,还是在一些便携式设备经过初步升压后的电压,WD5030 都能轻松应对,极大地拓展了应…...
【Git原理与使用一】Git概念与基本操作
文章目录 1. Git 的概念2. Git 的安装3. Git 的认识3.1 创建本地仓库3.2 配置Git3.3 认识工作区、暂存区、版本库 4. Git 的基本操作4.1、认识几个指令1)git add 添加命令2)git commit 提交命令3)git log 查看日志命令4)git cat-f…...
kettle工具使用从入门到精通(一)
安装 可以从链接: 官网(下载链接在Pentaho.pdf文件里)或者网络上查找对应的版本安装 Kettle (PDI) 版本与 JDK 版本对应关系 Kettle (PDI) 版本支持的 JDK 版本备注PDI 9.x 及以上JDK 11 或更高版本推荐使用 OpenJDK 或 Oracle JDK 11。PDI 8.xJDK 8 …...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
