1.实验拓扑
要求达成如下拓扑
使用Python脚本完成拓扑搭建,并连接ryu控制器。
#!/usr/bin/python
from mininet.topo import Topo
class MyTopo(Topo):
def __init__(self):
Topo.__init__(self)
switchs = []
for i in range(2):
sw = self.addSwitch("s{}".format(i + 1))
switchs.append(sw)
count = 1
for sw in switchs:
for i in range(3):
h = self.addHost("h{}".format(count))
self.addLink(sw, h)
count += 1
self.addLink(switchs[0], switchs[1])
topos = {"mytopo": (lambda : MyTopo()) }
2.使用Ryu的REST API下发流表实现和第2次实验同样的VLAN
参考RYU官方的API文档和助教博客内容,结合第二次上机实验的流表信息可得出如下代码片段
#对要从s1分发出去的数据进行流表约束
#本例给出h1经由s1受到的约束
curl -X POST -d '{
"dpid": 1, #data path id -> switch
"priority":1,
"match":{
"in_port":1
},
"actions":[
{
"type": "PUSH_VLAN",
# Push a new VLAN tag if a input frame is non-VLAN-tagged
"ethertype": 33024
# Ethertype 0x8100(=33024): IEEE 802.1Q VLAN-tagged frame
},
{
"type" : "SET_FIELD",
"field": "vlan_vid", # Set VLAN ID
"value": 4096
# Describe sum of vlan_id(e.g. 6) | OFPVID_PRESENT(0x1000=4096)
},
{
"type": "OUTPUT",
"port": 4
}
]
}' http://127.0.0.1:8080/stats/flowentry/add
#对s1从外部交换机收到的数据进行标签识别与分发
#以s1对发至h1的信息筛选为例
curl -X POST -d '{
"dpid": 1,
"priority":1,
"match":{
"dl_vlan": "0",
"in_port": 4
},
"actions":[
{
"type": "POP_VLAN", # Discard vlan_tag
},
{
"type": "OUTPUT", #Divide into port 1
"port": 1
}
]
}' http://127.0.0.1:8080/stats/flowentry/add
依此类推,写出十二个将要分发的流表项
开启控制器及其可视化图形界面
交换机初始状态尚无任何流表项,执行写好的脚本文件进行流表的下发,交换机终端页面显示成功接收
此时在网页端也可看到所下发的流表
对网络拓扑进行pingall操作,得到预期结果
3.对比两种方法,写出你的实验体会
两者的实现皆带有一定的工作量,但RYU作为控制器在使用过程中让人感到更为顺畅,条理、逻辑、结果的判断都有迹可循。