Skip to content

Commit

Permalink
switching_hub: improve wording
Browse files Browse the repository at this point in the history
  • Loading branch information
Rui KUBO committed Jan 29, 2014
1 parent e677f10 commit f26a24e
Showing 1 changed file with 47 additions and 51 deletions.
98 changes: 47 additions & 51 deletions ja/source/switching_hub.rst
Original file line number Diff line number Diff line change
Expand Up @@ -3,74 +3,49 @@
スイッチングハブ
================

本章では、簡単なスイッチングハブの実装を題材として、RyuによるOpenFlow
コントローラの実装方法を解説していきます
本章では、簡単なスイッチングハブの実装を題材として、Ryuによるアプリケーションの
実装方法を解説していきます


スイッチングハブ
----------------

世の中には様々な機能を持つスイッチングハブがありますが、ここでは一番単純な、
必要最低限の機能を持ったスイッチングハブの実装をみてみます。

スイッチングハブの機能は次のようなものとします。
世の中には様々な機能を持つスイッチングハブがありますが、ここでは
次のような単純な機能を持ったスイッチングハブの実装を見てみます。

* ポートに接続されているホストのMACアドレスを学習し、MACアドレステーブル
に保持する
* 受信パケットの宛先ホストが接続されているポートへ、パケットを転送する
* 未知の宛先ホストへのパケットは、フラッディングする
* 学習済みのホスト宛のパケットを受信したら、ホストの接続されているポートに転送する
* 未知のホスト宛のパケットを受信したら、フラッディングする

これらの機能をOpenFlowで実現します
このようなスイッチをRyuを使って実現してみましょう


OpenFlowによるスイッチングハブ
------------------------------

コントローラは、OpenFlowスイッチがパケット受信時に発行するPacket-In
メッセージから、ポートに接続されているホストのMACアドレスを学習します。

OpenFlow 1.3では、OpenFlowスイッチにPacket-Inを発行させるために、Table-
missフローエントリという特別なエントリをフローテーブルに追加する必要
があります。

Table-missフローエントリは、優先度が最低(0)で、すべてのパケットにマッチ
するエントリです。このエントリのインストラクションにコントローラポート
への出力アクションを指定することで、受信パケットが、すべての通常のフロー
エントリにマッチしなかった場合、Packet-Inを発行するようになります。

.. NOTE::

現時点のOpen vSwitchでは、まだOpenFlow 1.3への対応が不完全であり、
OpenFlow 1.3以前と同様にデフォルトでPacket-Inが発行されます。また、
Table-missフローエントリにも現時点では未対応で、通常のフローエントリ
として扱われます。

コントローラは、受信したPacket-Inメッセージから、パケットの受信ポートと
送信元MACアドレスを得て、MACアドレステーブルを更新します。

また、宛先MACアドレスをMACアドレステーブルから検索し、見つかった場合は
対応するポートへ転送するようPacket-OutメッセージをOpenFlowスイッチに
発行します。
OpenFlowスイッチは、Ryuの様なOpenFlowコントローラからの指示を受けて、
次のようなことを行えます。

さらに、対応するModify Flow Entry(Flow Mod)メッセージを発行し、OpenFlow
スイッチにフローエントリを設定することで、同一条件のパケットについては、
Packet-Inメッセージを発行せずにパケット転送するようにします。
* 受信したパケットのアドレスを書き換えたり、指定のポートから転送
* 受信したパケットをコントローラへ転送(Packet-In)
* コントローラから転送されたパケットを指定のポートから転送(Packet-Out)

宛先MACアドレスがMACアドレステーブルに存在しないアドレスだった場合は、
フラッディングを指定したPacket-Outメッセージを発行します。
これらの機能を組み合わせ、スイッチングハブを実現することが出来ます。

.. HINT::
まずは、Packet-Inの機能を利用したMACアドレスの学習です。
コントローラは、Packet-Inの機能を利用し、スイッチからパケットを受け取る事が出来ます。
受け取ったパケットを解析し、ホストのMACアドレスや接続されている
ポートの情報を学習することが出来ます。

OpenFlowでは、NORMALポートという論理的な出力ポートがオプションで規定
されており、出力ポートにNORMALを指定すると、スイッチのL2/L3機能を使っ
てパケットを処理するようになります。つまり、すべてのパケットをNORMAL
ポートに出力するように指示するだけで、スイッチングハブとして動作する
ようにできます(スイッチがNORMALポートをサポートしている場合)が、ここ
では各々の処理をOpenFlowを使って実現するものとします。
学習の後は受信したパケットの転送です。
パケットの宛先MACアドレスが学習済みのホストのものか検索します。
検索結果によって次の処理を実行します。

* 学習済みのホストの場合…Packet-Outの機能で、接続先のポートからパケットを転送
* 未知のホストの場合…Packet-Outの機能でパケットをフラッディング

これらの動作を順を追って図とともに説明します。
なお、ここではTable-missフローエントリについては省略しています。


1. 初期状態
Expand Down Expand Up @@ -347,7 +322,17 @@ send_msg(msg)
ofproto.OFPCML_NO_BUFFER)]
self.add_flow(datapath, 0, match, actions)

Table-missフローエントリを作成します。
Table-missフローエントリは、優先度が最低(0)で、すべてのパケットにマッチ
するエントリです。このエントリのインストラクションにコントローラポート
への出力アクションを指定することで、受信パケットが、すべての通常のフロー
エントリにマッチしなかった場合、Packet-Inを発行するようになります。

.. NOTE::

2014年1月現在のOpen vSwitchは、OpenFlow 1.3への対応が不完全であり、
OpenFlow 1.3以前と同様にデフォルトでPacket-Inが発行されます。また、
Table-missフローエントリにも現時点では未対応で、通常のフローエントリ
として扱われます。

すべてのパケットにマッチさせるため、空のマッチを生成します。マッチは
``OFPMatch`` クラスで表されます。
Expand All @@ -361,10 +346,12 @@ Table-missフローエントリを作成します。
メッセージを送信します。add_flow()メソッドの内容については後述します。




Packet-inメッセージ
"""""""""""""""""""

未知の受信パケットを受け付けるため、Packet-Inメッセージを受け取ります
未知の宛先の受信パケットを受け付けるため、Packet-Inイベントのハンドラを作成します

.. rst-class:: sourcecode

Expand Down Expand Up @@ -465,7 +452,7 @@ OUTPUTアクションクラスのインスタンスを生成します。
# ...


宛先MACアドレスがみつかった場合は、OpenFlowスイッチのフローテーブルに
宛先MACアドレスが見つかった場合は、OpenFlowスイッチのフローテーブルに
エントリを追加します。

Table-missフローエントリの追加と同様に、マッチとアクションを指定して
Expand All @@ -476,7 +463,7 @@ Table-missフローエントリとは違って、今回はマッチに条件を
(eth_dst)を指定しています。例えば、「ポート1で受信したホストB宛」のパケット
が対象となります。

今回のフローエントリでは、優先度に1を指定しています。優先度は値が大きい
今回のフローエントリでは、優先度に1を指定しています。値が大きい
ほど優先度が高くなるので、ここで追加するフローエントリは、Table-missフロー
エントリより先に評価されるようになります。

Expand All @@ -486,6 +473,14 @@ Table-missフローエントリとは違って、今回はマッチに条件を
ポート1で受信した、ホストB宛(宛先MACアドレスがB)のパケットを、
ポート4に転送する

.. HINT::

OpenFlowでは、NORMALポートという論理的な出力ポートがオプションで規定
されており、出力ポートにNORMALを指定すると、スイッチのL2/L3機能を使っ
てパケットを処理するようになります。つまり、すべてのパケットをNORMAL
ポートに出力するように指示するだけで、スイッチングハブとして動作する
ようにできますが、ここでは各々の処理をOpenFlowを使って実現するものとします。


フローエントリの追加処理
""""""""""""""""""""""""
Expand Down Expand Up @@ -1151,3 +1146,4 @@ host: h3:
本章では、簡単なスイッチングハブの実装を題材に、Ryuアプリケーションの実装
の基本的な手順と、OpenFlowによるOpenFlowスイッチの簡単な制御方法について
説明しました。

0 comments on commit f26a24e

Please sign in to comment.