實驗6:開源控制器實踐——Ryu
實驗步驟
一、安裝 Ryu
二、 tcpdump 驗證 Ryu 控制器的 L2Switch
- 根據官方文檔第一節的 L2Switch 的 python 代碼創建文件並運行 Ryu
from ryu.base import app_manager
from ryu.controller import ofp_event
from ryu.controller.handler import MAIN_DISPATCHER
from ryu.controller.handler import set_ev_cls
from ryu.ofproto import ofproto_v1_0
class L2Switch(app_manager.RyuApp):
OFP_VERSIONS = [ofproto_v1_0.OFP_VERSION]
def __init__(self, *args, **kwargs):
super(L2Switch, self).__init__(*args, **kwargs)
@set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
def packet_in_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
ofp_parser = dp.ofproto_parser
actions = [ofp_parser.OFPActionOutput(ofp.OFPP_FLOOD)]
data = None
if msg.buffer_id == ofp.OFP_NO_BUFFER:
data = msg.data
out = ofp_parser.OFPPacketOut(
datapath=dp, buffer_id=msg.buffer_id, in_port=msg.in_port,
actions=actions, data = data)
dp.send_msg(out)
-
h1 ping h2,h2 和 h3 都接收到 h1 發送的 ICMP 報文
-
h1 ping h3,h2 和 h3 都接收到 h1 發送的 ICMP 報文
個人總結
- 本次實驗與實驗 5 類似,不過使用的是不同的控制器。實驗中遇到的一個困惑是 POX 控制器實踐時,h1 ping h2 會先發送 ARP 報文。然而 Ryu 實踐時居然沒看見 ARP 報文,直接發送了 ICMP 報文,剛開始時還以為是 Ryu 和 POX的不同之處,后來搜索了資料,並沒有相關內容,遂使用 arp -a 命令查看,發現 h1 上已經有了 h2 和 h3的 ip/mac 緩存,可能就是這個原因。清除緩存以后重試,發現 ARP 報文。思考了一下,問題在於我在完成 POX 實踐以后並沒有馬上退出 mininet 命令行,導致拓撲被復用,原來設置的 ip/mac 緩存映射表也被保留了下來,這才有了上述不發送 ARP 報文而直接發送ICMP報文的情況。