實驗5:開源控制器實踐POX
一、基礎實驗
建立拓撲:
sudo mn --topo=single,3 --mac --controller=remote,ip=127.0.0.1,port=6633 --switch ovsk,protocols=OpenFlow10
運行Hub模板:
./pox.py log.level --DEBUG forwarding.hub
開啟主機終端:
mininet> xterm h2 h3
在h2 /h3 主機終端輸入:
tcpdump -nn -i h2/h3-eth0
1、h1 ping h2,h2和h3的tcpdump抓包結果截圖:


2、h1 ping h3,h2和h3的tcpdump抓包結果截圖:


3、L2_learning模塊代碼流程圖:

4、使用 tcpdump 驗證Switch模塊
運行L2_learning模塊:./pox.py log.level --DEBUG forwarding.l2_learning
h1 ping h2(h3沒有收到數據包):


h1 ping h3(h2沒有收到數據包):


二、進階要求
重新建立拓撲,用dpctl del-flows命令刪除流表,如下圖。

將拓撲連接至SendFlowInSingle3(默認端口6633),實現向s1發送流表規則使得所有主機兩兩互通。 ( ./pox.py log.level --DEBUG 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)


三、心得體會
本次實驗難度挺大的
一開始我不清楚怎么打開POX,在詢問了同學之后才逐漸明白操作的過程。而后也和室友一樣遇到了刪除流表不起作用的問題,重啟之后也能順利的解決。
在進階部分,沒注意老師的文檔在./pox.py log.level --DEBUG調用文件的時候加上了.py,自己摸索了挺久的,后面還是問了問同學才解決問題。
最后的時候,我的進階1的代碼一直出現問題,問了老師,老師看了很久,才發現我的這臺虛擬機和別人有些不同,POX的6633端口在關閉后仍然會繼續運行,要kill進程才能有效進行下去。
總而言之,這次試驗我基本是邊問邊做的,還是有很多的不足之處,有待進步。

浙公網安備 33010602011771號