技術編ではOpenFlowプロトコルの仕組みを見ていこう。
コントローラーがスイッチに指示
まず覚えておきたいのは、“登場人物”だ。「OpenFlowコントローラー」と「OpenFlowスイッチ」の二つである。OpenFlowコントローラーは司令塔としてOpenFlowスイッチに指示を与え、これを受けてOpenFlowスイッチはフレーム転送などを実行する(図1の左上)。両者がやりとりに使うのがOpenFlowプロトコルだ。
OpenFlowコントローラーの最も大事な役割は「経路計算」である。これは、フレームを転送する際にどの経路を選択するべきかをいくつかのパラメーターを基に決める仕組みだ。
使うパラメーターはOpenFlowコントローラーによって様々。例えばアルゴリズムを基に計算した最短経路や回線速度のほか、ユーザーが指定した「経路の重み付け」や「複数経路への負荷分散」などの条件を加味して経路を計算する。
OpenFlowコントローラーが計算した経路はOpenFlowスイッチに送られ、「フローテーブル」として保存される。OpenFlowスイッチはフレームを受け取ったらフローテーブルを確認し、そのフレームに適した経路に向けて転送する(図1の右)。自分から勝手に動くことはない。
フレーム転送は三つの情報で決まる
フローテーブルは、(1)条件(Header Fields)、(2)処理(Actions)、(3)統計情報(Counters)─の3種類の情報から成る(図2の上)。フレームの転送方法は、「こんなフレームは(条件)」と「こう操作する(処理)」で決まり、「今の状況はこう(統計情報)」も使うことができる。三つの情報をセットにした一つひとつを「フローエントリー」と呼び、複数のフローエントリーでフローテーブルを構成する。
(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コントローラーの実装次第で、帯域が不足する経路をう回して、別の経路にフレームを振り分けるといった処理が可能だ。