SDN實驗5:開源控制器實踐POX
實驗目的
- 能夠理解 POX 控制器的工作原理
- 通過驗證POX的forwarding.hub和forwarding.l2_learning模塊,初步掌握POX控制器的使用方法
- 能夠運用 POX控制器編寫自定義網絡應用程序,進一步熟悉POX控制器流表下發的方法
實驗要求
基本要求
- 搭建下圖所示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
開啟POX的命令:(在pox目錄下執行)
./pox.py log.level --DEBUG forwarding.hub
使用xterm命令開啟主機終端:
mininet> xterm h2 h3
使用tcpdump抓取數據包
h2主機終端:tcpdump -nn -i h2-eth0
h3主機終端:tcpdump -nn -i h3-eth0
h1 ping h2
時,h3主機同樣收到icmp報文:
h1 ping h3
時,h2主機同樣收到icmp報文
由上述實驗結果可以看出,h1 ping h2或h3,h2和h3都能同時接收到數據包,結果符合Hub模塊的作用:在每個交換機上安裝泛洪通配符規則,將數據包廣播轉發,此時交換機等效於集線器
- 閱讀L2_learning模塊代碼,畫出程序流程圖,使用 tcpdump 驗證Switch模塊
L2_learning模塊程序流程圖:
停止hub模塊,運行forwarding文件夾下的 l2_learning 模塊
./pox.py log.level --DEBUG forwarding.l2_learning
h1 ping h2
時,只有h2能收到icmp報文:
h1 ping h3
時,只有h3能收到icmp報文:
實驗結果表明,當h1 ping 其他主機時,只有相應主機可以接收到數據包,驗證了switch模塊的功能:讓Openflow交換機實現L2自學習,可見交換機對數據包進行了學習,實現從相應的端口發出,只有目的主機可以抓取到報文
進階要求
- 重新搭建(一)的拓撲,此時交換機內無流表規則,拓撲內主機互不相通;編寫Python程序自定義一個POX模塊SendFlowInSingle3,並且將拓撲連接至SendFlowInSingle3(默認端口6633),實現向s1發送流表規則使得所有主機兩兩互通
重新搭建拓撲后,刪除流表:
dpctl del-flows
執行該命令后,所有主機都無法ping通
創建文件SendFlowInSingle3.py
from pox.core import core
import pox.openflow.libopenflow_01 as of
from pox.openflow.of_json import *
def _handle_ConnectionUp(event):
msg = of.ofp_flow_mod()
msg.priority = 1
msg.match.in_port = 1
msg.actions.append(of.ofp_action_output(port=2))
msg.actions.append(of.ofp_action_output(port=3))
event.connection.send(msg)
msg = of.ofp_flow_mod()
msg.priority = 1
msg.match.in_port = 2
msg.actions.append(of.ofp_action_output(port=1))
msg.actions.append(of.ofp_action_output(port=3))
event.connection.send(msg)
msg = of.ofp_flow_mod()
msg.priority = 1
msg.match.in_port = 3
msg.actions.append(of.ofp_action_output(port=1))
msg.actions.append(of.ofp_action_output(port=2))
event.connection.send(msg)
def launch():
core.openflow.addListenerByName("ConnectionUp", _handle_ConnectionUp)
在pox目錄下執行./pox.py SendFlowInSingle3
后,流表下發成功,所有節點均可ping通
個人總結
遇到的問題:
- 一開始沒想明白為什么
h1 ping h3
時,雖然后來h2不會收到icmp報文了,但確實還有一個h1到h3的報文可以被h2抓到
合理的解釋應該是,這個是交換機自學習完成前抓到的icmp報文,交換機的學習過程是表中若沒有目的端口則進行一次洪泛轉發,之后把對應端口加入表中
- 將文件復制到pox文件夾的過程,雖然知道使用cp命令,但由於路徑原因嘗試了多次
解決方法:如果無法確定准確的路徑,可以直接用cd ..
命令,一層一層地往上找,確認是不是路徑的問題
本次實驗通過實際操作,驗證POX的forwarding.hub和forwarding.l2_learning模塊,初步掌握了POX控制器的一些使用方法,並進一步熟悉流表下發的操作。POX使用指南全是英文也留下了深刻的印象hhh,對POX的基本原理 的理解和更深度的使用還需要進一步學習。