ODL Yang UI界面下发流表
- VM实验环境
- 实验目的
- 实验原理
- 实验一步骤
- Step1 开ODL 控制器
- Step2 VM ifconfig查看地址,电脑登陆页面
- Step3 Mininet连接ODL(指定协议openflow1.0),查看topo结构
- Step4 Yang UI下找到opendaylight-inventory rev.2013-08-19模块目录
- Step5 从上到下依次点小**+**号,“config ——> nodes ——> node{id} ——> table{id} ——> flow{id}”
- Step6 补全node id、table id和flow id的值
- Step7 单击flow list后面的“+”,展开流表相关的参数,flow id会自动同步,然后match ——> ethernet-match ——> ethernet -type”,填写“type”为“0x0800(IPv4)
- Step8 在“layer-3-match”后面的下拉框中选择“ipv4-match”,使用IP匹配, 展开“layer-3-match”,填写源IP地址和目的IP地址,如下图所示。
- Step9 配置instructions,这里的动作时丢包drop
- Step10 设置“priority”为27,“idle-timeout”为0,“hard-timeout”为0,“cookie”为100000000,“table_id”为0
- Step11 发送流表
- Step12 测试流表下发效果
- 实验二步骤
VM实验环境
设备 | 软件环境 | 硬件环境 |
---|---|---|
Controller | Ubuntu 14.04 OpenDaylight Lithium | CPU:2核 内存:4G 磁盘:20G |
Mininet | Ubuntu 14.04 Mininet 2.3.0 | CPU:2核 内存:4G 磁盘:20G |
Tips1
大家首先注意本实验只开了一个VM,不需要开多个VM,然后ODL DLUX页面是在你电脑的网页页面(不是VM,不是VM,已经有人问过,这里就提一嘴)
Tips2
先熟练掌握实验一,再去实验二,让如果有什么问题不清楚的,私信和留言都行。
实验目的
1、使用YANG UI下发流表的方法
2、通过YANG UI下发流表控制主机之间的连通性
3、分别基于OpenFlow1.0协议和OpenFlow1.3协议下发流表,经过下流表的过程了解单级流表和多级流表的概念
实验原理
YANG UI是OpenDaylight中一款基于DLUX的应用,旨在简化、激励应用的开发与测试。YANG UI通过动态封装、调用YANG模型和相关REST APIs,生成并展示一个简单的UI界面。开发人员可以通过API请求获取交换机信息,并且以JSON格式展示。YANG UI主要面向上层应用开发,为应用开发人员提供了很多相关工具,有效的节约了开发人员的时间。
OpenFlow1.0仅仅单流表的概念,到了OpenFlow1.3有了组表和流水线式
处理数据分组,且1.3版本有了指令集这一说,比当初的1.0版本动作集的
只有一些动作指令功能更加强大
OpenFlow1.0协议处理数据包的流程相对简单,因为1.0版本只支持单流表。交换机接收到数据包后解析数据包,数据包解析后就开始匹配,从table 0 开始匹配,如果匹配成功则对该数据包执行相应的动作,更新相应的计数器。如果没有找到匹配项则将数据包交给控制器。
OpenFlow1.3协议支持多流表匹配,即一个交换机只会有多个流表,因此数据包处理过程相对复杂。首先解析进入设备的报文,然后从table 0开始匹配,按照优先级高低依次匹配该流表中的流表项,一个报文在一个流表中只会匹配上一条流表项。通常根据报文的类型,报文头的字段例如源MAC地址、目的MAC地址、源IP地址、目的IP地址等进行匹配,大部分匹配还支持掩码进行更精确、灵活的匹配。也可以通过报文的入端口或元数据信息来进行报文的匹配,一个流表项中可以同时存在多个匹配项,一个报文需要同时匹配流表项中所有匹配项才能匹配该流表项。报文匹配按照现有的报文字段进行,比如前一个流表通过apply actions改变了该报文的某个字段,则下一个表项按修改后的字段进行匹配。如果匹配成功,则按照指令集里的动作更新动作集,或更新报文/匹配集字段,或更新元数据和计数器。根据指令是否继续前往下一个流表,不继续则终止匹配流程执行动作集,如果指令要求继续前往下一个流表则继续匹配,下一个流表的ID需要比当前流表ID大。当报文匹配失败了,如果存在无匹配流表项(table miss)就按照该表项执行指令,一般是将报文转发给控制器、丢弃或转发给其他流表。如果没有table miss表项则默认丢弃该报文。
为了方便大家理解,流表呢,简单来说提取了传统网络各个层的网络特征,
比如说MAC地址,IP地址。1.3版本的流水线式处理流表,从优先级最高的
table 0开始,依次匹配,这里其实用了Goto指令,每次跳转更大的流表号
的流表
字段名称 table=number | 说明 |
---|---|
in_port=port | 传递数据包的端口的OpenFlow端口编号 |
dl_vlan=vlan | 数据包的VLAN Tag值,范围是0-4095,0xffff代表不包含VLAN Tag的数据包 |
dl_src= dl_dst= | 匹配源或者目标的MAC地址 01:00:00:00:00:00/01:00:00:00:00:00 代表广播地址 00:00:00:00:00:00/01:00:00:00:00:00 代表单播地址 |
dl_type=ethertype | 匹配以太网协议类型,其中: dl_type=0x0800 代表IPv4协议; dl_type=0x086dd 代表IPv6协议; dl_type=0x0806 代表ARP协议; |
nw_src=ip[/netmask] nw_dst=ip[/netmask] | 当 dl_typ=0x0800 时,匹配源或者目标的IPv4地址,可以使IP地址或者域名 |
table=number | 指定要使用的流表的编号,范围是0-254。在不指定的情况下,默认值为0。通过使用流表编号,可以创建或者修改多个Table中的Flow。 |
实验一步骤
Step1 开ODL 控制器
#cd distribution-karaf-0.3.0-Lithium/
#./bin/karaf
如下:
Tips:
切记这里多等一会不要着急登录页面
Step2 VM ifconfig查看地址,电脑登陆页面
看到这里有两个地址,请记住它,
我这里第一个是192.168.137.143,第二个都是127.0.0.1
然后用你的电脑登录网址http:// [IP address]:8080/index.html,username 和 password 都是admin。(不是VM 里的firefox的浏览器)
登录结果如下:
Step3 Mininet连接ODL(指定协议openflow1.0),查看topo结构
#mn --custom example1.py --topo mytopo --controller=remote,ip=127.0.0.1,port=6633 --switch ovsk,protocols=OpenFlow10
这里拓扑是事先准备好的,拓扑结构是一个交换机下挂三个host
这里注意看自己有么有连上ODL controller,还有就是地址注意是127.0.0.1,
没有连接上控制器的同学还有不知道为什么两个地址是这样分配的评论区问。
在上面界面下pingall下
mininet>pingall
返回本机电脑网页reload下可以看到topo
补充:
node下可以看节点信息,端口地址,就不细说,自己点进去自行体会。
Step4 Yang UI下找到opendaylight-inventory rev.2013-08-19模块目录
Step5 从上到下依次点小**+**号,“config ——> nodes ——> node{id} ——> table{id} ——> flow{id}”
Step6 补全node id、table id和flow id的值
这里node id 自己在查看node节点时或者看topo都能看到,table流表号,flow 流表的流
Step7 单击flow list后面的“+”,展开流表相关的参数,flow id会自动同步,然后match ——> ethernet-match ——> ethernet -type”,填写“type”为“0x0800(IPv4)
Step8 在“layer-3-match”后面的下拉框中选择“ipv4-match”,使用IP匹配, 展开“layer-3-match”,填写源IP地址和目的IP地址,如下图所示。
这里IP地址怎么知道的呢?
你可以返回电脑的网页看topo图,然后把鼠标移到host主机上就能显示。
我这里host1到host3依次IP地址是10.0.0.1,10.0.0.2,10.0.0.3
Step9 配置instructions,这里的动作时丢包drop
展开“instructions”,并单击“instruction list”后面的“+”,在“instruction”后面下拉框中选择“apply-actions-case”,
展开“apply-actions”,单击“action list”后面的“+”,在action后面的下拉框中选择“drop-action-case”,action order和instruction order都设置为0,如下图所示。
Step10 设置“priority”为27,“idle-timeout”为0,“hard-timeout”为0,“cookie”为100000000,“table_id”为0
这些字段什么意思,自己去查,不细说了,评论区问我也可以
Step11 发送流表
向右滚动Actions栏,在路径后面有动作类型GET、PUT、POST、DELETE,下发流表则选择PUT动作,然后单击“Send”,如下图所示。最后会显示request sent successfully 发送成功。
Step12 测试流表下发效果
回到VM的Mininet端口,输入命令查看下发流表
mininet>sh ovs-vsctl dump-flows s1
测试h1 发给 h2 的数据包是不是drop丢弃了
mininet>h1 ping h2
实验二步骤
STEP 1 清除实验一的布置的topo,指定OpenFlow1.3版本连接ODL
mininet>mn -c
#mn --custom example1.py --topo mytopo --controller=remote,ip=127.0.0.1,port=6633 --switch ovsk,protocols=OpenFlow13
STEP2 删除实验一ODL配置流表的信息
指定node id,table id ,分别通过GET SEND,DELETE SEND,查看配置流表信息和删除流表信息
STEP3 pingall查看下流表
mininet>pinall
mininet>sh ovs-vsctl dump-flows -O OpenFlow13 s1
STEP4 下发流表
整个下发流表的过程和实验一差不错,这里就直接上图。
PUT SEND 再回mininet下查看流表
以上是发送的第一条流表,h1 发送给 h3 的流表,actions=drop丢弃
查看流表,测试hi ping h3连通性
发现 h1 发送 h2 的包并没有丢弃,是因为有优先级更高的table先执行,导致h1 ping 通 h2
利用goto命令将table0 转到table2
PUT SEND 再回mininet下查看流表,然后h1 ping h3测试连通性。
查看流表,测试hi ping h3连通性
这里就能看到h1 ping h2丢包100%,试验成功,且能看到priority=23的流表项。
本实验在【实验参考】进行了改进优化并更加完整,且比原实验更加节约资源
有什么问题都可以私信我或评论区见,长期在线。
私信的同学们不要着急哟,稍后就会回私信。