labs.beatcraft.com openflow
Open Flow Tutorialのように Wireshark を用いて OpenFlow パケットの表示と
スイッチの種類による性能比較を行います。
http://www.openflow.org/wk/index.php/OpenFlow_Tutorial#Start_Controller_and_view_Startup_messages_in_Wireshark
OpenFlow 解析プラグインをインストールした Wireshark を使用することで、
OpenFlow/OpenFlow Tutorial 1で作成した仮想ネットワーク環境上の
パケットのやり取りを観察することができます。
$ sudo wireshark
Wireshark を起動して loopback インタフェースのパケットをキャプチャーします。
Filer に of という文字列を入力するとOpenFlow 関連のパケット(Protocol OFP)だけを確認することができます。
Wireshark でパケットを監視している状態で、
OpenFlow リファレンス実装のコントローラーをlearnig switchとして起動します。
$ controller ptcp:
この時 Wireshark のキャプチャーウィンドウを見ると、コントローラーとスイッチがどのようなやり取りをしているかが分かります。
メッセージの内容は以下のとおりです。
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 のキャプチャーウィンドウには以下のように新しいメッセージが表示されます。
メッセージの内容は以下のとおりです。
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
以上が reactive モードでの OpenFlow を rective モードで使用した場合の動作例です。
reactive モードではフローは個々のパケットへの反応として挿入されます。
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']
パケットがユーザー空間-カーネル空間の移動を何度か行わなければならず
スループットが出にくくなっていますが、変更は容易です。