[[labs.beatcraft.com]] [[openflow]] [[labs.beatcraft.com]] ~ [[OpenFlow]] #contents * OpenFlow/OpenFlow Tutorial 2[#w6414832] Open Flow Tutorialのように Wireshark を用いて OpenFlow パケットの表示と ~ スイッチの種類による性能比較を行います。~ ~ http://www.openflow.org/wk/index.php/OpenFlow_Tutorial#Start_Controller_and_view_Startup_messages_in_Wireshark ~ ** OpenFlow パケット表示 [#j90fc51e] OpenFlow 解析プラグインをインストールした Wireshark を使用することで、 ~ [[OpenFlow/OpenFlow Tutorial 1]]で作成した仮想ネットワーク環境上の ~ パケットのやり取りを観察することができます。~ $ sudo wireshark Wireshark を起動して loopback インタフェースのパケットをキャプチャーします。~ Filter に of という文字列を入力するとOpenFlow 関連のパケット(Protocol OFP)だけを確認することができます。~ ~ Wireshark でパケットを監視している状態で、~ OpenFlow リファレンス実装のコントローラーをlearnig switchとして起動します。~ $ controller ptcp: この時 Wireshark のキャプチャーウィンドウを見ると、コントローラーとスイッチがどのようなやり取りをしているかが分かります。~ #ref(openflow01.png,,60%) ~ メッセージの内容は以下のとおりです。~ |Hello |スイッチ -> コントローラー|OpenFlow version を通知 | |Hello |コントローラー -> スイッチ|OpenFlow version を通知 | |Features Request|コントローラー -> スイッチ|Feature を要求 | |Set Config |コントローラー -> スイッチ|コントローラーはスイッチにIPフラグメントの扱いと新しいフローの最大バイト数を通知 | |Features Reply |スイッチ -> コントローラー|スイッチはコントローラーに Feature のリストを回答 | mininet 環境の場合はすべてのパケットは localhost 経由でやり取りされるため、IP アドレスでは送信元を特定できません。~ コントローラーは OpenFlow 標準のポート 6630 を使用し、スイッチは他のユーザー使用可能ポート(ここでは 54129)を使用。~ ~ ~ 今度はこの learnig switch が動いている状態で ping を打ち、OpenFlow 上ではどのようなことが起こっているかを確認します。~ 再度 Wireshark で loopback インタフェースをキャプチャーしますが、~ コントローラーとスイッチ間で接続維持のため行われる Echo Request/Reply もフィルターできるよう~ Fitler の入力欄には以下の文字列を入力し apply してキャプチャーを開始します。 of && (of.type != 3) && (of.type != 2) この段階ではフローテーブルには何も入っていません。~ mininet と別の shell で確認します。 $ dpctl dump-flows tcp:127.0.0.1:6634 stats_reply (xid=0x7a3fc29b): flags=none type=1(flow) mininet のプロンプトで ping を打ちます。 mininet> h1 ping -c1 h2 PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data. 64 bytes from 10.0.0.2: icmp_req=1 ttl=64 time=4.43 ms --- 10.0.0.2 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 4.431/4.431/4.431/0.000 ms Wireshark のキャプチャーウィンドウには以下のように新しいメッセージが表示されます。~ #ref(openflow-ping02.png,,60%) ~ メッセージの内容は以下のとおりです。~ |Packet In |スイッチ -> コントローラー |パケット受信(スイッチのフローテーブルに合致するものがないためにコントローラーにパケットを送信)| |Packet Out |コントローラー -> スイッチ |パケット送信| |Flow Mod |コントローラー -> スイッチ |フローテーブルにフローを追加| ここでフローテーブルを確認すると、以下のようにコントローラーによってエントリーが足されているのがわかります。 $ dpctl dump-flows tcp:127.0.0.1:6634 stats_reply (xid=0x342f8af7): flags=none type=1(flow) cookie=0, duration_sec=18s, duration_nsec=654000000s, table_id=0, priority=65535, n_packets=1, n_bytes=98, idle_timeout=60,hard_timeout=0,icmp,in_port=2,dl_vlan=0xffff,dl_vlan_pcp=0x00,dl_src=00:00:00:00:00:02,dl_dst=00:00:00:00:00:01,nw_src=10.0.0.2,nw_dst=10.0.0.1,nw_tos=0x00,icmp_type=0,icmp_code=0,actions=output:1 cookie=0, duration_sec=18s, duration_nsec=655000000s, table_id=0, priority=65535, n_packets=1, n_bytes=98, idle_timeout=60,hard_timeout=0,icmp,in_port=1,dl_vlan=0xffff,dl_vlan_pcp=0x00,dl_src=00:00:00:00:00:01,dl_dst=00:00:00:00:00:02,nw_src=10.0.0.1,nw_dst=10.0.0.2,nw_tos=0x00,icmp_type=8,icmp_code=0,actions=output:2 cookie=0, duration_sec=13s, duration_nsec=650000000s, table_id=0, priority=65535, n_packets=1, n_bytes=42, idle_timeout=60,hard_timeout=0,arp,in_port=1,dl_vlan=0xffff,dl_vlan_pcp=0x00,dl_src=00:00:00:00:00:01,dl_dst=00:00:00:00:00:02,nw_src=10.0.0.1,nw_dst=10.0.0.2,nw_proto=2,actions=output:2 cookie=0, duration_sec=18s, duration_nsec=656000000s, table_id=0, priority=65535, n_packets=1, n_bytes=42, idle_timeout=60,hard_timeout=0,arp,in_port=2,dl_vlan=0xffff,dl_vlan_pcp=0x00,dl_src=00:00:00:00:00:02,dl_dst=00:00:00:00:00:01,nw_src=10.0.0.2,nw_dst=10.0.0.1,nw_proto=2,actions=output:1 cookie=0, duration_sec=13s, duration_nsec=653000000s, table_id=0, priority=65535, n_packets=1, n_bytes=42, idle_timeout=60,hard_timeout=0,arp,in_port=2,dl_vlan=0xffff,dl_vlan_pcp=0x00,dl_src=00:00:00:00:00:02,dl_dst=00:00:00:00:00:01,nw_src=10.0.0.2,nw_dst=10.0.0.1,nw_proto=1,actions=output:1 以上が Passive モードでの OpenFlow を Passive モードで使用した場合の動作例です。~ Passive モードではフローは個々のパケットへの反応として挿入されます。~ ~ ** スイッチの種類による性能差 [#a54ca5c1] mn コマンドで mininet 環境を起動する際、--switch オプションで指定するスイッチによって~ ネットワークスループットに違いが出ます。~ ~ これまでの例で使っていた mininet 環境 の switch は Open vSwitch です。~ $ sudo mn --topo single,3 --mac --switch ovsk --controller remote mininet> iperf *** Iperf: testing TCP bandwidth between h1 and h3 *** Results: ['514 Mbits/sec', '517 Mbits/sec'] 平均して 300〜500 Mbps のスループットが出ます。~ ~ 今度は OpenFlow リファレンス実装のユーザーランドで動作するスイッチで mininet を起動して~ スループットを測定します。 $ sudo mn --topo single,3 --mac --switch user --controller remote mininet> iperf *** Iperf: testing TCP bandwidth between h1 and h3 *** Results: ['88.9 Mbits/sec', '89.2 Mbits/sec'] パケットがユーザー空間-カーネル空間の移動を何度か行わなければならず~ スループットが出にくくなっていますが、変更は容易です。