1.实验拓扑
拓扑图如下:
搭建代码如下:
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)
self.addLink(s[0],s[1])
count=1
for two in s:
for i in range(3):
host = self.addHost('h{}'.format(count))
self.addLink(two,host)
count += 1
topos = {'mytopo': (lambda:Mytopo())}
搭建成功
输入以下命令连接ryu控制器
ryu-manager ofctl_rest.py
输入net,查看各主机与交换机之间的端口情况,方便确定之后脚本中匹配项的值
2.使用Ryu的REST API下发流表实现和第2次实验同样的VLAN
参考了RYU手册中使用curl命令的部分 https://ryu.readthedocs.io/en/latest/app/ofctl_rest.html#description-of-match-on-request-messages ,编写以下sh格式脚本下发流表,拿其中两个举例:
首先是从主机1转发到交换机1的端口1:
curl -X POST -d '{
"dpid": 1,
"priority":1,
"match":{
"in_port":2
},
"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": 1
}
]
}' http://127.0.0.1:8080/stats/flowentry/add
然后是交换机1转发到端口2的:
curl -X POST -d '{
"dpid": 1,
"priority":1,
"match":{
"dl_vlan": "0"
},
"actions":[
{
"type": "POP_VLAN", # 给进入交换机的包去除 vlan_tag
},
{
"type": "OUTPUT",
"port": 2
}
]
}' http://localhost:8080/stats/flowentry/add
其它脚本以前两者为基础,根据实验二的流表更改匹配项与动作
之后可以用两种方法执行脚本
1.挨个执行
2.全部curl命令放到一个sh文件中,然后执行这个文件
接着查看流表,可以看到已下发
可以看到控制器端显示下发的流表已被接收
ping通,查看连通性
3.对比两种方法,写出你的实验体会
相比第二次实验中在终端手动挨个下发流表,基于restapi编写shell脚本进行一次性下发的方法确实要方便很多,而且纵式排版也能更好的观察各个匹配与动作参数,方便自己整理与理解