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


一、實驗目的

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目錄下執行。
    • 剛看到進階要求時沒有什么頭緒,不知道從何處下手,重新看了一次老師的pdf后,能理解但是不知道怎么寫,打開老師給的POX使用指南后發現竟然是全英文的,但只能硬着頭皮看下去,又用網頁翻譯,有點難懂,又去網上查詢資料,看慕課,詢問同學,才勉強寫出來
    • 運行SendFlowInSingle3模塊后,發現主機始終無法ping通,重新實驗、重啟虛擬機、查找了資料、詢問了同學后,還是無法解決,多次仔細瀏覽了一次自己的代碼后發現,原來是launch函數多寫了一個縮進導致的。
  • 個人感想

本次實驗使我對POX控制器的工作原理和功能有了更深刻的影響印象,通過實踐驗證了POX的Hub和L2_learning模塊的功能,通過實驗也讓我發現對POX的學習和使用還要進一步加強,挺多地方卡殼,花了很多時間,特別是當發現是因為縮進導致無法ping通的時候太氣人了,真是細節決定成敗啊。


免責聲明!

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



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