一、基礎要求:
建立拓撲: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主機終端輸入:tcpdump -nn -i h2-eth0
在h3主機終端輸入:tcpdump -nn -i 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命令刪除流表,如下圖。
![]()
1、將拓撲連接至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)
![]()
2、基于進階1的代碼,完成ODL實驗的硬超時功能。(./pox.py log.level --DEBUG SendPoxHardTimeOut)
代碼:
from pox.core import core
import pox.openflow.libopenflow_01 as of
#只禁h1與h3的通信,h2與其他兩個主機都可通信
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
msg.actions.append(of.ofp_action_output(port=2))
# msg.actions.append(of.ofp_action_output(port=3)) #把從端口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)) 把從端口1轉發出去的路徑刪掉
msg.actions.append(of.ofp_action_output(port=2))
event.connection.send(msg)
def launch():
core.registerNew(SendFlowInSingle3)
![]()
三、心得體會:
這次的實驗對我來說難度還是挺大的。
最開始我也遇到了使用命令dpctl del-flows刪除流表也不起作用的問題,后來是看到群里有人的解答重啟了虛擬機解決的。
在進階部分,沒注意老師的文檔在./pox.py log.level --DEBUG調用文件的時候加上了.py,報錯了很久,后來認真的看完文檔解決了。
最后特別是在進階的ODL硬超時功能的實現,當硬超時太久的時候,會出現“找不到主機”,這時候再利用SendFlowInSingle3向s1發送流表規則也沒有用了。后來發現得在出現“找不到主機”字眼出現之前就要向s1發送流表規則才能解決這個問題。