實驗5:開源控制器實踐——POX
forwarding.hub模塊
h1 ping h2
時,h3處同樣收到icmp報文
h1 ping h3
時,h2處同樣收到icmp報文
由於hub模塊采用洪泛轉發,所以在ping特定主機時,交換機會向所有端口洪泛轉發,故可以在另一台主機處也會收到icmp報文。
forwarding.l2_learning
h1 ping h2
時,h2處收到icmp報文,h3處則沒有
h1 ping h3
時,h3處收到icmp報文,h2處則沒有
可以看到,交換機對進來的包進行了學習,所以從相應的端口發出,故只有目的主機可以抓取到報文
L2_learning模塊程序流程圖
進階要求
創建拓撲,並刪除流表,使得所有主機無法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.py SendFlowInSingle3
查看流表,並測試pingall
看到流表下發成功,以及所有節點ping通,沒有出現丟包
總結
本次作業難度較以往提升,一個是需要學習POX控制器,另外是需要對流表有一定的熟悉。本次實驗遇到了兩個難題,如下:
- 在使用POX組件進行流表下發時,發現無法下發流表,詢問同學之后了解到在生成拓撲時,需要指定openflow協議為1.0,才可以成功下發流表,但是一開始使用miniedit進行拓撲搭建時,又遇到POX端口沖突的情況。
- 在編寫代碼進行流表下發時,按照老師pdf的通過匹配目的IP,進行流表下發,但是之后遇到問題,拓撲還是無法ping通。懷疑問題在於arp報文沒有洪泛轉發,但是不了解如何進行流表下發,使得arp報文可以進行洪泛轉發。最后直接編寫代碼,分別將交換機三個端口輸入的包向其他兩個端口發送出去,使得拓撲可以ping通。
經過本次實驗,發現自己對於流表的了解還不夠,之后還需再多閱讀相關材料,進行學習。