1 实验目的
- 掌握Open vSwitch下发流表操作;
- 掌握添加、删除流表命令以及设备通信的原理。
2 实验原理
在SDN环境下,当交换机收到一个数据包并且交换机中没有与该数据包匹配的流表项时,交换机将此数据包发送给控制器,由控制器决策数据包如何处理。控制器下发决策后,交换机根据控制器下发的信息来进行数据包的处理,即转发或者丢弃该数据包。我们可以通过对流表操作来控制交换机的转发行为。
3 实验任务
本实验基于一台OpenDaylight Lithium版本虚拟机和一台Mininet模拟实验。我们已安装相关环境的虚拟机中启动ODL和Mininet,Mininet创建一个默认树形拓扑并选择Mininet的控制器指定为ODL,进行基本的添加、删除流表操作,使网络实现网络通信和不通信。如下拓扑所示:
4 实验步骤
4.1 环境搭建
创建2个虚拟机,一个是选择OpenDaylight镜像的虚拟机作为控制器(注:内存大于2G),另一个是选择Mininet镜像作为所需Mininet,启动实验并启动虚拟机。
4.2 启动验证
登录OpenDaylight虚拟机,验证OpenDaylight启用是否启用:
1 |
ps –ef|grep java
|
说明OpenDaylight已启动(注:虚拟机启动后,OpenDaylight进程跟随虚拟机自起)。
OpenDaylight所在虚拟机的IP及路由:
Mininet所在虚拟机的IP及路由:
OpenDaylight所在虚拟机和Mininet所在虚拟机能够互相通信。
4.3 创建拓扑并连接控制器
4.4 流表的简单操作
先查看交换机上的流表,显示的是数据流指向控制器,让控制器来下发流表:
1 |
sh ovs-ofctl dump-flows s1
|
在Mininet中pingall一下,交换机下面的两台主机h1、h2应能互相通信,如果不能通信,请检查交换机是否与ODL正确连接。
此时再查看交换机s1中流表应多出两条控制器下发的流表:
我们看到每条流规则由一系列字段组成,它们由基本字段、条件字段和动作字段三部分组成。有了流表后交换机就根据流表来进行数据包的操作,当然我们也可以人工的进行流表的新增、修改、删除操作,在我们这个环境下可直接在终端下输入命令。
4.5 添加删除流表
例如让交换机丢弃从2号端口发来的所有数据包:
1 |
# sh ovs-ofctl add-flow s1 priority=12,in_port=2,actions=drop |
(注:优先级比其他流表优先级高)
增加这条流表以后,Mininet中h1和h2主机之间无法通信了。
再删除一条流规则:如将删除条件字段中包含in_port=2的所有流表,如下图所示,将含有in_port=2的所有流表被删除了。
1 |
# sh ovs-ofctl del-flows s1 in_port=2 |
因为之前添加的丢弃2号端口包的流表已被删除,这时Mininet中h1和h2主机又可以正常通信了。
查看流表后,之前删除的流表不存在,主机间能够互通。
5 实验结论
主要是对OpenFlow流表有更进一步的了解,简略介绍一些基本的流表操作。在此基础上可以进行比如改写源和目地主机的ip和mac地址、对数据包泛洪、回环等操作,用户可以根据需求通过修改流表来自主地控制转发行为,这本身也是SDN的初衷之一,也使得我们控制网络更加的便捷、灵活、多样。
priority 域指明了流表的优先级,数字越大,则优先级越高。因此,高优先级的带通配符流表项必须要被放到低编号的流表中。交换机负责正确的顺序,避免高优先级规则覆盖掉低优先级的。
n_packets:报文个数
n-bytes:报文的字节数
action:openflow里面最重要的结构。每一条流都必须指定必要的action,不然匹配上之后,没有指定action,交换机会默认执行drop操作。
idle_age: 闲置时间,指超过这个时间流如果没有被应用就将它丢掉
in_port=port传递数据包的OpenFlow端口号
dl_type匹配以太网协议类型
output:port: 输出数据包到指定的端口。port 是指端口的 OpenFlow 端口编号
必备行动-转发(Forward)
ALL 转发到所有出口(不包括入口)
CONTROLLER 封装并转发给控制器
LOCAL 转发给本地网络栈
TABLE 对要发出的包执行流表中的行动
IN_PORT 从入口发出