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

BC::labsへの質問は、bc9-dev @ googlegroups.com までお願い致します。
トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS