基于RYU控制器(controller)上的simple-switch 的APP做的测试-SDN/OpenFlow

本文介绍了RYU控制器的优点,包括其使用Python编写易于上手、架构清晰、与OpenStack兼容等,并通过simple-switch.py APP演示了如何实现流表自动下发。

最近一直在学习RYU控制器,在使用的过程中,发现有以下几方面的优点:RYU控制器完全使用Python语言编写,在理解起来和上手速度上是挺快的;RYU控制器的整体架构清晰明了,在日后有时间我会整理一个关于RYU控制器的架构性的文章供大家参考;RYU控制器本身是一个功能强大的网络实验平台,可以和openstack很好的兼容,对于openstack我不是很熟悉,就知道通过openstack可以实现的数据中心云计算方面的功能;RYU控制器本身自带很多编写好的APP,通过对这些APP的熟悉,可以很好的掌握通过RYU这个框架自己编写APP的能力,这在其他的SDN/OpenFlow控制器是无法比拟的;同时,因为RYU控制器本身已经编写的功能已经很全面了,网络开发者基本可以利用这个框架来编写自己的APP,减少二次开发的工作,这也是一个优点。


下面说一下在simple-switch.py的APP的测试过程,通过这个APP实现流表的自动下发。

在mininet上模拟一台交换机(s1)三台主机(h1,h2,h3),然后远端连接RYU控制器,使用127.0.0.1,和6633端口建立连接

打开两个终端terminal,一个用于mininet建立网络拓扑模拟环境,一个用于模拟远程RYU控制器。

第一,在RYU控制器开启simple-switch.py的APP,输入命令:ryu-manager simple-switch.py,开启后如图:


第二,在另外一个终端上建立mininet模拟拓扑,输入命令:mn --topo single,3 --mac --switch ovsk --controller remote

然后在RYU的那个终端就会显示连接的建立,同时,也会同步一些交换机和控制器建立连接的信息,如图:


此时,在交换机的转发流表是空的,因此此时主机之间是不可以通信的,在使用h1去ping h2的时候,就会自动建立流表


注意是先进行广播,然后建立反方向的流表,然后建立正方向的流表。流表如图:


<think>好的,我现在需要帮助用户了解如何通过Mininet和Ryu控制器结合,使用ovs-ofctl命令添加流表规则来实现主机间的通信。首先,我得回忆一下相关组件的基本知识,确保自己理解正确。 用户提到了Mininet、Ryu控制器和ovs-ofctl命令。Mininet是一个网络模拟工具,可以创建虚拟网络拓扑。Ryu是一个SDN控制器,支持OpenFlow协议,用于管理网络中的交换机的流表。ovs-ofctl是Open vSwitch的命令行工具,用于手动配置流表规则。 用户的需求是具体的教程示例,所以需要给出一步一步的操作步骤,包括设置环境、启动控制器、创建拓扑、添加流表规则,并测试通信。同时,用户可能希望了解每个步骤的作用,以及流表规则的具体含义。 首先,可能需要先安装必要的软件,比如Mininet、Ryu和Open vSwitch。但用户可能已经有基础环境,所以重点放在配置步骤上。接着,启动Ryu控制器,运行简单的应用,比如ryu.app.simple_switch_13,这个应用支持OpenFlow 1.3协议,可以处理基本的二层转发。 然后,使用Mininet创建自定义拓扑,比如两个主机连接到一个OVS交换机。这里需要确保交换机由Ryu控制器管理,因此启动Mininet时需要指定控制器指向Ryu的地址和端口。 接下来,当Mininet启动后,OVS交换机应该连接到Ryu控制器。但此时如果没有流表规则,主机之间可能无法通信,因为交换机不知道如何处理数据包。这时需要使用ovs-ofctl手动添加流表规则。 流表规则需要匹配数据包的入端口、源MAC、目的MAC,并指定动作,比如转发到特定端口或泛洪。例如,从h1到h2的数据包,需要匹配h1的MAC和h2的MAC,然后转发到h2所连的端口。同时,可能需要添加反向的规则,或者设置默认泛洪的规则,以便处理ARP请求等。 在测试时,用户需要执行ping或iperf测试,并验证流表是否生效。可能还需要使用ovs-ofctl dump-flows来查看已添加的流表条目,确认是否正确。 另外,需要注意控制器的类型,比如如果Ryu运行的是simple_switch,可能已经安装了一些默认流表,比如泛洪未知流量。因此,用户是否需要覆盖这些规则,或者直接添加自己的规则。但在示例中,用户可能希望手动添加所有必要规则,因此可能需要先清除现有流表,或者确保控制器不会自动添加规则。 但根据用户的问题,他们希望手动添加流表,所以可能需要启动Ryu时不启用任何应用,或者使用一个空的应用程序,这样控制器不会自动下发流表。不过,ryu.app.simple_switch_13会自动下发默认流表,比如将未匹配的数据包发送到控制器。因此,用户可能需要先清除这些规则,或者覆盖它们。 或者,可能需要在启动控制器时不使用simple_switch应用,而是自己编写一个不自动下发流表的应用。但这对用户来说可能复杂,所以更简单的方法可能是允许控制器下发基本规则,然后用户手动添加更具体的规则。或者,用户可能希望完全手动控制,这时候可能需要调整Ryu应用的配置,或者在启动时禁用某些功能。 不过,为了简化示例,可能假设用户使用simple_switch_13,并手动添加流表覆盖自动下发的规则。或者,直接添加更优先的流表项,因为流表项是按优先级匹配的。 可能还需要解释流表的结构,比如每个字段的含义,如in_port、dl_src、dl_dst、actions等。用户需要理解如何正确设置这些字段。 此外,ovs-ofctl命令的语法需要正确,比如指定交换机名称,通常是s1(如果Mininet中的交换机名称是s1)。流表规则的格式也需要正确,比如使用逗号分隔的字段,优先级priority=...,动作actions=output:port。 最后,测试时可能遇到的问题,比如MAC地址未正确学习,或者端口号不正确。需要确保用户知道如何通过mininet的links命令或ovs-vsctl show查看端口号,或者通过ovs-ofctl show s1来查看交换机的端口信息。 总结步骤: 1. 启动Ryu控制器,运行simple_switch_13应用。 2. 启动Mininet,创建两个主机连接到一个OVS交换机,指定控制器Ryu。 3. 使用ovs-ofctl命令手动添加流表规则,匹配源和目的MAC,指定输出端口。 4. 测试主机之间的通信,如ping。 5. 验证流表是否正确应用。 可能的注意事项包括:确保交换机的控制器指向正确的IP和端口,确认端口号对应主机的连接,处理ARP请求(可能需要添加相关流表或依赖控制器的处理),以及流表优先级的设置。 现在需要将这些步骤详细写出,并给出具体的命令示例,同时解释每个步骤的作用。确保命令正确,并说明流表规则的含义。此外,生成相关问题,帮助用户进一步学习。</think>### 通过 Mininet 和 Ryu 配置 OVS 流表实现主机通信的教程 #### 环境准备 1. 安装 Mininet、Open vSwitchRyu 控制器(若未安装,需提前配置)。 2. 确保 Ryu 控制器Python 依赖已配置完成。 --- #### 步骤 1:启动 Ryu 控制器 运行以下命令启动 Ryu 的简单二层交换机应用(支持 OpenFlow 1.3): ```bash ryu-manager ryu.app.simple_switch_13 ``` 此应用会监听默认端口 `6653`,并自动下发默认流表(如泛洪未知流量)[^1]。 --- #### 步骤 2:创建 Mininet 拓扑 启动 Mininet,创建两个主机(h1, h2)连接到一个 OVS 交换机(s1),并指定控制器Ryu: ```bash sudo mn --topo single,2 --mac --controller remote,ip=127.0.0.1,port=6653 --switch ovs,protocols=OpenFlow13 ``` 参数说明: - `--mac`:简化 MAC 地址为小数值(如 h1=00:00:00:00:00:01)。 - `--controller remote`:指定 Ryu 控制器的 IP 和端口。 - `--switch ovs`:使用 OVS 交换机并支持 OpenFlow 1.3。 --- #### 步骤 3:查看交换机端口信息 在 Mininet 命令行中执行: ```bash mininet> sh ovs-ofctl show s1 -O OpenFlow13 ``` 输出示例: ``` OFPT_FEATURES_REPLY (OF1.3) ... 1(s1-eth1): addr:xx:xx, config=0, state=0 2(s1-eth2): addr:xx:xx, config=0, state=0 LOCAL(s1): addr:xx:xx, config=0, state=0 ``` 记录 `h1` 和 `h2` 连接的端口号(如 h1 对应端口 1,h2 对应端口 2)。 --- #### 步骤 4:手动添加流表规则 **规则 1:允许 h1 到 h2 的流量** ```bash mininet> sh ovs-ofctl add-flow s1 -O OpenFlow13 "priority=100,in_port=1,dl_src=00:00:00:00:00:01,dl_dst=00:00:00:00:00:02,actions=output:2" ``` **规则 2:允许 h2 到 h1 的流量** ```bash mininet> sh ovs-ofctl add-flow s1 -O OpenFlow13 "priority=100,in_port=2,dl_src=00:00:00:00:00:02,dl_dst=00:00:00:00:00:01,actions=output:1" ``` 参数说明: - `priority=100`:设置流表项优先级(高于默认流表)。 - `in_port`:数据包进入的端口。 - `dl_src/dl_dst`:匹配源/目的 MAC 地址。 - `actions=output:N`:指定转发到端口 N。 --- #### 步骤 5:测试通信 在 Mininet 中执行 ping 测试: ```bash mininet> h1 ping h2 ``` 若返回正常延迟,则说明流表生效。 --- #### 验证流表条目 查看当前流表: ```bash mininet> sh ovs-ofctl dump-flows s1 -O OpenFlow13 ``` 应显示添加的两条高优先级流表项。 --- ### 关键原理 1. **流表匹配逻辑**:交换机根据流表的 `in_port`、`dl_src`、`dl_dst` 匹配数据包,执行指定动作。 2. **控制平面分离**:Ryu 控制器通过 OpenFlow 协议管理交换机,但手动流表会覆盖控制器下发的规则[^1]。 3. **端口与 MAC 绑定**:需确保流表规则中的端口和 MAC 地址与拓扑一致。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值