一、實驗目的
1.能夠理解 POX 控制器的工作原理;
2.通過驗證POX的forwarding.hub和forwarding.l2_learning模塊,初步掌握POX控制器的使用方法;
3.能夠運用POX控制器編寫自定義網絡應用程序,進一步熟悉POX控制器流表下發的方法。
二、實驗環境
1.下載虛擬機軟件Oracle VisualBox 或 VMware;
2.在虛擬機中安裝Ubuntu 20.04 Desktop amd64;
三、實驗要求
(一)基本要求
1.搭建下圖所示SDN拓撲,協議使用Open Flow 1.0,控制器使用部署於本地的POX(默認監聽6633端口)
- 使用命令
sudo mn --topo=single,3 --mac --controller=remote,ip=127.0.0.1,port=6633 --switch ovsk,protocols=OpenFlow10
搭建上述拓撲
2.閱讀Hub模塊代碼,使用 tcpdump 驗證Hub模塊;
-
開啟pox,運行hub模塊:
./pox.py log.level --DEBUG forwarding.hub
-
使用命令
mininet> xterm h2 h3
開啟主機終端 -
在h2主機終端中輸入
tcpdump -nn -i h2-eth0
-
在h3主機終端中輸入
tcpdump -nn -i h3-eth0
-
h1 ping h2
-
h1 ping h3
由上圖可以看出無論是
h1 ping h2
還是h1 ping h3
,h2和h3都能同時接收到數據包。結果驗證Hub模塊的作用:Hub模塊采用洪泛轉發,每個交換機上都安裝泛洪通配符規則,將數據包廣播轉發,此時交換機等效於集線器。所以在ping某個主機時,會在另一台主機上接收到。
3.閱讀L2_learning模塊代碼,畫出程序流程圖,使用 tcpdump 驗證Switch模塊。
(1)畫出流程圖
(2)使用 tcpdump 驗證Switch模塊
-
開啟pox,運行L2_learning模塊:
./pox.py log.level --DEBUG forwarding.l2_learning
-
h1 ping h2
-
h1 ping h3
由上圖可以看出,當
h1 ping 某個主機
時,只有相應主機可以接收到數據包,其他主機接收不到。驗證了Switch模塊的功能:讓OpenFlow交換機實現L2自學習。所以只有目的主機可以接收到數據包。
(二)進階要求
1.重新搭建(一)的拓撲,此時交換機內無流表規則,拓撲內主機互不相通;編寫Python程序自定義一個POX模塊SendFlowInSingle3,並且將拓撲連接至SendFlowInSingle3(默認端口6633),實現向s1發送流表規則使得所有主機兩兩互通。
(1)重新搭建(一)的拓撲,並使用命令dpctl del-flows
刪除流表,執行該命令后,所有主機都無法ping通
(2)Python程序自定義一個POX模塊SendFlowInSingle3
from pox.core import core
import pox.openflow.libopenflow_01 as of
class SendFlowInSingle3(object):
def __init__(self):
core.openflow.addListeners(self)
def _handle_ConnectionUp(self, event):
msg = of.ofp_flow_mod() # 使用ofp_flow_mod()方法向交換機下發流表
msg.priority = 1
msg.match.in_port = 1 # 使數據包進入端口1
msg.actions.append(of.ofp_action_output(port=2)) # 從端口2轉發出去
msg.actions.append(of.ofp_action_output(port=3)) # 從端口3轉發出去
event.connection.send(msg)
msg = of.ofp_flow_mod() # 使用ofp_flow_mod()方法向交換機下發流表
msg.priority = 1
msg.match.in_port = 2 # 使數據包進入端口2
msg.actions.append(of.ofp_action_output(port=1)) # 從端口1轉發出去
msg.actions.append(of.ofp_action_output(port=3)) # 從端口3轉發出去
event.connection.send(msg)
msg = of.ofp_flow_mod() # 使用ofp_flow_mod()方法向交換機下發流表
msg.priority = 1
msg.match.in_port = 3 # 使數據包進入端口3
msg.actions.append(of.ofp_action_output(port=1)) # 從端口1轉發出去
msg.actions.append(of.ofp_action_output(port=2)) # 從端口2轉發出去
event.connection.send(msg)
def launch():
core.registerNew(SendFlowInSingle3)
- 可以發現,運行SendFlowInSingle3模塊后,所有主機兩兩互通
四、個人總結
- 實驗難度:基本要求部分難度適中,進階部分有點難
- 實驗過程遇到的困難及解決辦法:
- 個人感想
本次實驗使我對POX控制器的工作原理和功能有了更深刻的影響印象,通過實踐驗證了POX的Hub和L2_learning模塊的功能,通過實驗也讓我發現對POX的學習和使用還要進一步加強,挺多地方卡殼,花了很多時間,特別是當發現是因為縮進導致無法ping通的時候太氣人了,真是細節決定成敗啊。