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通,查看连通性