實驗5:開源控制器實踐——POX


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的基本原理 的理解和更深度的使用還需要進一步學習。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM