1.实验拓扑
(1)实验拓扑图
(2)构建拓建拓扑
from mininet.topo import Topo class Mytopo(Topo): def __init__(self): Topo.__init__(self) s=[] for i in range(2): sw = self.addSwitch('s{}'.format(i+1)) s.append(sw) count=1 for two in s: for i in range(3): host = self.addHost('h{}'.format(count)) self.addLink(two,host) count += 1 self.addLink(s[0],s[1]) topos = {'mytopo': (lambda:Mytopo())}
(3)用以下命令构建拓扑
sudo mn --custom sdn6.py --topo mytopo --controller=remote,ip=127.0.0.1,port=6633 --switch ovsk,protocols=OpenFlow13
(4)使用net命令查看端口情况
(5)使用pingall测试主机连通性
(6)进入文件夹的ryu文件夹下的app,通过以下的命令连接ryu控制器
ryu-manager ofctl_rest.py
2.使用Ryu的REST API下发流表实现和第2次实验同样的VLAN
根据实验二下发流表的命令编写脚本,以两个脚本举例:
(1)将主机h1进入s1的包打上vlan tag,转发到s1的端口4。
curl -X POST -d '{ "dpid": 1, "priority":1, "match":{ "in_port":1 }, "actions":[ { "type": "PUSH_VLAN", # 给进入交换机的包打上vlan_tag "ethertype": 33024 # 帧类型0x8100(=33024): 表示IEEE 802.1Q的VLAN数据帧 }, { "type": "SET_FIELD", "field": "vlan_vid", # 设置VLAN ID "value": 4096 # 设置vlan_id的值 }, { "type": "OUTPUT", "port": 4 } ] }' http://127.0.0.1:8080/stats/flowentry/add
(2)将从s1的端口4的包去除vlan tag, 并根据tag进行转发.
curl -X POST -d '{ "dpid": 1, "priority":1, "match":{ "dl_vlan": "0" }, "actions":[ { "type": "POP_VLAN", # 给进入交换机的包去除 vlan_tag }, { "type": "OUTPUT", "port": 1 } ] }' http://localhost:8080/stats/flowentry/add
其它脚本以前两者为基础,根据实验二的流表更改匹配项与动作
(1)可以用以下两种方式运行脚本
1、逐个执行脚本
2、全部curl命令放到一个sh文件中,然后执行这个文件
(2)用以下命令查看s1下发的流表
sudo ovs-ofctl -O OpenFlow13 dump-flows s1
(3)用以下命令查看s2下发的流表
sudo ovs-ofctl -O OpenFlow13 dump-flows s2
(4)可以看到控制器端显示下发的流表已被接收
(5)用pingall命令测试主机的连通性
(6)查看图形界面
3.对比两种方法,写出你的实验体会
相比于第二次试验逐个的去设置流表的参数,然后在终端逐个地去下发流表,通过编写shell脚本进行一次性地下发流表减少了很多的工作量,脚本采用的是json格式,在对不同流表进行参数的修改的时候,比较直观、方便,同时更加方便地去理解流表的参数代表什么含义。总体实验起来还是比较顺利的!