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腳本進行一次性下發的方法確實要方便很多,而且縱式排版也能更好的觀察各個匹配與動作參數,方便自己整理與理解