labs.beatcraft.com openflow

OpenFlow/OpenFlow Tutorial 2

Open Flow Tutorialのように Wireshark を用いて OpenFlow パケットの表示と
スイッチの種類による性能比較を行います。

http://www.openflow.org/wk/index.php/OpenFlow_Tutorial#Start_Controller_and_view_Startup_messages_in_Wireshark

OpenFlow パケット表示

OpenFlow 解析プラグインをインストールした Wireshark を使用することで、
OpenFlow/OpenFlow Tutorial 1で作成した仮想ネットワーク環境上の
パケットのやり取りを観察することができます。

$ sudo wireshark

Wireshark を起動して loopback インタフェースのパケットをキャプチャーします。
Filer に of という文字列を入力するとOpenFlow 関連のパケット(Protocol OFP)だけを確認することができます。

Wireshark でパケットを監視している状態で、
OpenFlow リファレンス実装のコントローラーをlearnig switchとして起動します。

$ controller ptcp:

この時 Wireshark のキャプチャーウィンドウを見ると、コントローラーとスイッチがどのようなやり取りをしているかが分かります。

openflow01.png


メッセージの内容は以下のとおりです。

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 のキャプチャーウィンドウには以下のように新しいメッセージが表示されます。

openflow-ping02.png


メッセージの内容は以下のとおりです。

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']

パケットがユーザー空間-カーネル空間の移動を何度か行わなければならず
スループットが出にくくなっていますが、変更は容易です。


BC::labsへの質問は、bc9-dev @ googlegroups.com までお願い致します。
トップ   新規 一覧 単語検索 最終更新   最終更新のRSS