技術編ではOpenFlowプロトコルの仕組みを見ていこう。

コントローラーがスイッチに指示

 まず覚えておきたいのは、“登場人物”だ。「OpenFlowコントローラー」と「OpenFlowスイッチ」の二つである。OpenFlowコントローラーは司令塔としてOpenFlowスイッチに指示を与え、これを受けてOpenFlowスイッチはフレーム転送などを実行する(図1の左上)。両者がやりとりに使うのがOpenFlowプロトコルだ。

図1●OpenFlowの“登場人物”とその役割を押さえよう
図1●OpenFlowの“登場人物”とその役割を押さえよう
経路制御など複雑な計算処理はOpenFlowコントローラーが一元的に担う。OpenFlowスイッチはフレーム転送など、比較的単純な処理を実行する。両者がやりとりする際の専用プロトコルを、OpenFlowプロトコルと呼ぶ。
[画像のクリックで拡大表示]

 OpenFlowコントローラーの最も大事な役割は「経路計算」である。これは、フレームを転送する際にどの経路を選択するべきかをいくつかのパラメーターを基に決める仕組みだ。

 使うパラメーターはOpenFlowコントローラーによって様々。例えばアルゴリズムを基に計算した最短経路や回線速度のほか、ユーザーが指定した「経路の重み付け」や「複数経路への負荷分散」などの条件を加味して経路を計算する。

 OpenFlowコントローラーが計算した経路はOpenFlowスイッチに送られ、「フローテーブル」として保存される。OpenFlowスイッチはフレームを受け取ったらフローテーブルを確認し、そのフレームに適した経路に向けて転送する(図1の右)。自分から勝手に動くことはない。

フレーム転送は三つの情報で決まる

 フローテーブルは、(1)条件(Header Fields)、(2)処理(Actions)、(3)統計情報(Counters)─の3種類の情報から成る(図2の上)。フレームの転送方法は、「こんなフレームは(条件)」と「こう操作する(処理)」で決まり、「今の状況はこう(統計情報)」も使うことができる。三つの情報をセットにした一つひとつを「フローエントリー」と呼び、複数のフローエントリーでフローテーブルを構成する。

図2●フレームの動きを決めるフローテーブルとは何か
図2●フレームの動きを決めるフローテーブルとは何か
フローテーブル、フローエントリーの構成要素の表記は、基本的に最初の規格であるOpenFlow 1.0の場合を示した。「※」部分のみOpenFlow 1.1で追加された内容。
[画像のクリックで拡大表示]

 (1)のHeader Fieldsとして指定できる条件は、レイヤー1の「スイッチの物理ポート」からレイヤー4の「TCP/UDPのポート番号」までの様々な情報だ(図2下)。この情報を「タプル」と呼ぶ。OpenFlow 1.0では12種類、1.1では15種類のタプルを使える。

 従来は転送時にイーサネットならレイヤー2のMACアドレス、IPルーティングならレイヤー3のIPアドレスといった具合に参照するヘッダー情報が決まっていた。OpenFlowではレイヤーを意識することなくユーザーがフレーム転送の条件を決められる。

 (2)のActionsとして指定できる処理方法には、「転送する」のほか、「廃棄する」「指定したフィールドの値を書き換える」などの操作がある(図2右上)。

 図2では説明のため簡単に記述したが、実際にActionsを指定する際には、書き換えるフィールドの値などを具体的に記す。例えば「宛先MACアドレスの値を書き換える」なら「MOD_DL_DST」などに続けてMACアドレスの値を記述する。なお「DL_DST」は「データリンク層の宛先」つまり宛先MACアドレスを指す。このほか「フレームを送り出すポートの種類」もセットで指定しておく

 (3)のCountersとして指定できる統計情報には、「同じフローエントリーに従って流れるフレームが、ネットワーク内にどのくらいあるか」が書き込まれている。例えばネットワーク上に流れる同種のフレームの数、その合計トラフィック量が何バイトあるかなどの情報だ。

 こうした統計情報は、OpenFlowコントローラーが経路計算を実施する際のパラメーターの一つとして利用することもできる。OpenFlowコントローラーの実装次第で、帯域が不足する経路をう回して、別の経路にフレームを振り分けるといった処理が可能だ。