OpenDaylight下发流表

news/2025/2/28 20:13:11/文章来源:https://www.cnblogs.com/chuangblog/p/18607139

image-20241125161140946

实验一:单流表(v1.0)

下发流表实现h1和h2之间不能互通。

1、启动OpenDaylight

./karaf

image-20241127081148840

查看6633端口是否处于监听状态

netstat -an | grep 6633

image-20241213201252014

在物理机浏览器中访问虚拟机ip:8181/index.html登录OpenDaylight网页端。

账号密码都是admin。

image-20241127081226827

后面做实验的时候,出现过无法登录的情况,点击登录后,提示无法登录,重启也没用。后来发现,多等一会儿就能登录上了。

image-20241213202253369

需要注意的是,ODL资源开销比较大,我2G内存的虚拟机,ODL就占用了60%多的内存。

image-20241213202453142

image-20241213202457873

后来把虚拟机内存调到4G,启动ODL的速度明显变快了。

2、创建拓扑

重新打开一个终端,使用Mininet创建拓扑,并指定控制器为OpenDaylight1.0的控制器

mn --topo=single,3 --controller=remote,ip=127.0.0.1,port=6633 --switch ovsk,protocol=OpenFlow10

注意:OpenFlow10需区分大小写,不能写成openflow10

image-20241127081800092

在浏览器中刷新OpenDaylight的界面,查看是否出现了交换机。

image-20241127081909337

在Mininet交互界面中输入pingall,再次刷新OpenDaylight界面,出现了三台主机。

image-20241127083649657

image-20241127082248323

3、定义流表

在浏览器中访问OpenDaylight的Nodes页面,查看Node ID。记住这个Node ID。openflow:1

image-20241127084725545

打开Yang UI界面,展开opendaylight-inventory rev.2013-08-19

image-20241213210742598

补全node id。node id就是刚才Nodes页面要记住的那个ID。

openflow:1

image-20241213213415622

添加流表

image-20241213213445884

输入table id。由于是单流表,只有一个表项,所以就填0。

image-20241213213524882

定义流策略

以太帧中type字段值为0x0800表示上层协议使用的是IP协议。(下图中写成了0x800,不过也不影响)

h1到h2的流,源IP为h1的IP:10.0.0.1,目的IP为h2的IP:10.0.0.2

image-20241213211644646

往下滑~

定义流行为

image-20241213212040157

继续往下滑~

设置优先级,超时时间等参数

将cookie设置为10进制的10,待会再mininet中查看流表时,cookie=0xa的那条流表就是现在编辑的这条流表。

image-20241213212305735

下发流表

回到上方url板块,将动作类型更改为PUT,点击Send使用put方式下发流表。

image-20241213213556914

下方出现这样的提示表示下发成功

image-20241213212703094

在Mininet交互界面查看流表是否已下发

dpctl dump-flows
# 或
sh ovs-ofctl dump-flows s1

image-20241213213647130

寻找cookie=0xa或优先级priority=10的流表,可以看到刚刚下方的流表已经下发成功了。

验证流表是否生效

使用h1 ping h2不通,其他主机之间能够互通,流表生效。

image-20241127094448259

image-20241127094632337

4、删除流表

一定要记得把流表删除,不然以后做实验时,流表可能还在,影响做实验。

# 删除流表
sh ovs-ofctl del-flows s1 dl_type=0x0800,nw_src=10.0.0.1,nw_dst=10.0.0.2
# 查看流表
sh ovs-ofctl dump-flows s1

image-20241213214353173

再次测试连通性,h1和h2之间连通。

image-20241213214608346

实验环境不要关,可以接着做下一个实验。

实验二:多级流表(v1.3)

下发多级流表实现h1和h2之间不能互通。

1、创建topo

基于Open Flow v1.3下发多级流表。

如果第一个实验还没关,可以继续使用。(记得注意检查一下三台主机是否能ping通,我做实验时,将流表删除了,后面这条流表又自己出现了)

在mininet交互界面直接更改Open Flow的版本。

sh ovs-vsctl set bridge s1 protocols=OpenFlow13

image-20241213215113964

如果是重新开始,就先启动ODL,登录到web端,再使用以下命令创建一个topo。

mn --topo=single,3 --controller=remote,ip=127.0.0.1,port=6633 --switch ovsk,protocol=OpenFlow13

2、下发第一条流表

打开Yang UI界面,展开opendaylight-inventory rev.2013-08-19。

与单流表不同,到table时,需要再展开一层,到达flow。

image-20241213215909406

补全node id和table id。node id仍然与实验一中查询到的node id相同。table id设置为2。

# node-id
openflow:1
# table-id
2

image-20241213220257599

添加流表

设置flow id为1。

image-20241213220351965

image-20241213220535547

源IP为h1的IP,目的IP为h3的IP。

image-20241213220745915

往下滑

image-20241213221003435

继续往下滑,滑到底

cookie设置为11,待会查看流表时,该条流表的cookie=0xb。

image-20241213221204186

下发流表

image-20241213221419925

查看下发的流表

由于OpenFlow协议版本改为了1.3所以命令也需要做一些调整

sh ovs-ofctl -O OpenFlow13  dump-flows s1

image-20241213221811499

测试连通性,都能ping通,原因再书上P119页步骤12中有解释。还需要再下发一条流表。将table 0匹配到的流表交给table2处理。

image-20241213223755746

3、下发第二条流表

第二条流表与第一条流表类似。

table id设置为0,flow id设置为1.

image-20241213224244773

image-20241213224420670

image-20241213224537093

注意,这里与第一个流表不同。

image-20241213224915779

滑到最下面

image-20241213225151895

下发流表

image-20241213225226258

查看流表

sh ovs-ofctl -O OpenFlow13  dump-flows s1

image-20241213225311080

测试连通性,1,3不通,其他都同,说明流表生效。

image-20241213225413435

实验完成,删除流表,以免影响后续实验。

sh ovs-ofctl -O OpenFlow13 del-flows s1

image-20241213225735373

推出mininet交互界面,清楚缓存

mn -c

image-20241213225848458

问题

问题一:Mininet拓扑创建不成功

创建Mininet拓扑不成功,提示有一个控制器已经在端口6653上运行

image-20241125150720241

解决方法:

# 查看占用6653端口的进程
netstat -tulnp | grep :6653
# 停止该进程
kill -9 进程号
# 清理Mininet残留
mn -c

image-20241125151132457

问题二:无法连接控制器

重新打开一个终端,查看网桥是否已经连接上了控制器。

ovs-vsctl show

由于当时没连接成功的时候忘记做记录了,这次做实验没有遇到。哪次遇到了再补充。

删除控制器,再重新设置。

root@UbuntuDesktop:~# ovs-vsctl del-controller s1
root@UbuntuDesktop:~# ovs-vsctl show

再次在浏览器中查看拓扑图中是否显示了交换机s1。出现下图中的is_connected:true字样则表示连接成功。

image-20241125160318596

在Mininet交互界面执行pingall命令后,各主机之间互通,浏览器中显示出拓扑图。

image-20241125160655615

image-20241125152613960

问题三:新创建的topo无法ping通

新创建的topo,控制器也链接成功了,但是ping不通。

image-20241213204217258

又ping了一次,发现是只有h1和h2ping不通。估计是上次做的单流表实验的缓存还在。

通过sh ovs-ofctl dump-flows s1查看流表。发现确实是上次做的流表内容还在。

下面这条cookie=0xa,就是做单流表实验时最后设置的那个cokie值,设置为10进制的10,这里以16进制显示为0xa。(源为10.0.0.1,目的为10.0.0.2,动作为阻止drop)

cookie=0xa, duration=1432.332s, table=0, n_packets=4, n_bytes=392, idle_age=472, priority=27,ip,nw_src=10.0.0.1,nw_dst=10.0.0.2 actions=drop

image-20241213204725622

删除这条流表就行了。

# 删除指定流表
sh ovs-ofctl del-flows s1 "cookie=0xa/0xffffffff, priority=27, ip, nw_src=10.0.0.1, nw_dst=10.0.0.2"
  • cookie=0xa/0xffffffff 用来确保只删除具有特定cookie值的流表项。0xffffffff是掩码,它确保了我们只匹配这个确切的cookie值。
  • priority=27, ip, nw_src=10.0.0.1, nw_dst=10.0.0.2 指定了其他匹配条件,以确保仅删除这条流表项。

千万不要为了方便,直接这样删除。

sh ovs-ofctl del-flows s1 "nw_src=10.0.0.1,nw_dst=10.0.0.2"

其他的流表也被匹配到了,一并删除了。

image-20241213210353983

不过好在,重新ping了一遍,流表由自动生成了。

image-20241213210504121

问题四:做完实验一后,做实验二时,莫名奇妙多出一条流表

做完实验一接着做实验二,实验二下发第一条流表的时候,发现第一个实验的流表又冒出来了,导致h1和h2不通。

image-20241213223407235

再把它删掉,不过因为协议该为了1.3所以,命令也有些改变。删除后就能ping通了

sh ovs-ofctl -O OpenFlow13 del-flows s1 dl_type=0x0800,nw_src=10.0.0.1,nw_dst=10.0.0.2

image-20241213223607787

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习入门笔记——神经网络的构建和使用

神经网络的整体构建 神经网络的基本骨架 首先可以在Pytorch官网的Python API中查看torch.nn的使用,如下所示。可以看到神经网络包括Container(基本骨架)、卷积层、池化层、Padding层、非线性激活等等。 构建一个神经网络首先要先构建起基本骨架,也就是Containersnn.Moudle的…

计算机做的所有事情都叫计算

计算机怎么解决问题?答:需要告诉计算机解决问题的步骤(不要写成说明书了) 怎么告诉计算机这个步骤?答:编程语言写程序 1. 写程序不是表达关系,是表达动作2. 是解决问题的步骤,编程的时候不是你说一句它做一句3. 编程语言不是用来和计算机交流的4. 计算机的交流是你的操…

第四章 文件管理

文件 4.1.1 文件的基本概念文件是指由创建者所定义的、具有文件名的一组相关元素的集合,是以硬盘为载体的存储在计算机上的信息集合 是文件系统中最大的数据单位 在用户进行的输入,输出中,则以文件为基本单位4.1.5 文件的逻辑结构 按文件是否有结构分类 无结构文件 文件内部…

程序执行两种方式

1.你写的程序交文件给它,它一步步按照你的要求执行 2.写的程序文件交给它,它翻译成计算机懂的文件,用计算机懂的文件执行 解释语言vs编译语言1. 语言本身没有解释和编译的区分,任何语言都可以编译执行和解释执行。2. 只是语言常用执行方式的传统和习惯的问题3. 解释语言 特…

P1070 [NOIP2009 普及组] 道路游戏

ProblemSolve 此题是求最优解,考虑贪心时会发现这个不满足局部最优->整体最优,故考虑DP 通过输入格式能受到启发,时间可以作为维度之一,所以定义为: \(f_{i,j}\)第i秒末,机器人在j号工厂能获得的最大金币 因为机器存在时间有上限,所以推的时候枚举本次机器人到底走了多…

2024-12-14:K 周期字符串需要的最少操作次数。用go语言,给定一个长度为n的字符串 word 和一个整数k,k是n的因数。每次操作可以选择两个下标i和j,使得i和j都可以被k整除,然后用从j

2024-12-14:K 周期字符串需要的最少操作次数。用go语言,给定一个长度为n的字符串 word 和一个整数k,k是n的因数。每次操作可以选择两个下标i和j,使得i和j都可以被k整除,然后用从j开始的长度为k的子串替换从i开始的长度为k的子串。要使得word成为一个K周期字符串,需要进行…

实现综合实例:简单文字处软件 (一)

学业繁重,更新缓慢。 本内容主要用于个人学习/复习QT简单入门控件 DAY ONE 创建项目界面设计与开发 实现简单的菜单栏设计本人并没有使用代码实现,而是用于使用UI设计师界面。action条例分类 设计控件(帮助) 设计帮助控件: 我们转到槽,填写如下代码: 这是一个基于QT6实现…

微信防撤回插件

插件 https://pan.quark.cn/s/bb5165185a6a部署 先查看电脑微信版本,比如我这里是3.9.12.15版本下载对应版本之后,将插件名字改为WeChatWin.dll,删掉前面的版本号在微信所在的文件夹下,找到这个同名插件,用下载的插件替换它即可 end 替换之后需要重启微信才可以,效果如下…

事务管理与锁机制

title: 事务管理与锁机制 date: 2024/12/14 updated: 2024/12/14 author: cmdragon excerpt: 在数据库系统中,事务管理至关重要,它确保多个数据库操作能够作为一个单一的逻辑单元来执行,从而维护数据的一致性和完整性。一个良好的事务管理系统能够解决并发操作带来的问题,…

2024-2025-1 20241319 《计算机基础与程序设计》第十二周学习总结

作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK12这个作业的目标 结构体和数据结构基础 文件操作作业正文 https://www.cnblogs.com/wchxx/p/18607077教材学习内容总结 结构体(Struct…

数据采集综合设计

这个项目属于哪个课程2024数据采集与融合技术实践 组名 从你的全世界爬过团队logo:项目简介 项目名称:博物识植项目logo:项目介绍:在探索自然奥秘的旅途中,我们常与动植物相伴而行,却无法准确识别它们,更难以深入了解他们的特征。为了更好地理解和欣赏自然界的多样性,…

Java中创建线程的几种方式

盘点一下Java中创建线程的几种方式 一、继承Thread类,重写run()方法public class MyThread extends Thread {@Overridepublic void run() {System.out.println("my thread start " + Thread.currentThread().getName());}public static void main(String[] args) {S…