OpenFlow
SDNで、コントローラーがスイッチの転送の仕方を指示するためのプロトコル。スイッチはコントローラーから受け取ったルール(フローエントリ)に従ってパケットを転送する。
イマシルちゃんの解説
ふつうのスイッチやルータは、1台1台が「このパケットはどこへ送るか」を自分で考えて決めているんだ。
OpenFlowでは、考えるのはコントローラーという司令塔だけ!
スイッチは「こういうパケットが来たら、こうしてね」という指示書どおりに動く係になるんだ。
わからないパケットが来たら、司令塔に「これどうしたらいい?」って聞きに行くんだよ。
より深い解説
定義
OpenFlowは、ONF(Open Networking Foundation)が仕様を定めた、SDNを実現するためのプロトコルである。ネットワークの経路を考える機能(制御)をOpenFlowコントローラーに、パケットを転送する機能(データ転送)をOpenFlowスイッチに分け、両者の間のやり取りをOpenFlowで行う。コントローラーとスイッチの間の通信には、TCPのポート6653番を使い、TLSで暗号化することもできる。
フローテーブル
OpenFlowスイッチは、フローテーブルに登録されたフローエントリに従ってパケットを処理する。
| 項目 | 内容 |
|---|---|
| マッチフィールド | 対象のパケットの条件(受信ポート、MACアドレス、IPアドレス、ポート番号など) |
| 優先度 | 複数のエントリに当てはまるときの優先順位 |
| カウンタ | 当てはまったパケットの数やバイト数 |
| インストラクション(アクション) | 当てはまったパケットをどうするか(指定ポートへ出力、ヘッダーの書き換え、破棄、コントローラーへ送る、など) |
| タイムアウト | 一定時間使われなかったら、エントリを削除する |
従来のスイッチがMACアドレスだけ、ルータがIPアドレスだけを見て転送するのに対し、OpenFlowではレイヤ2からレイヤ4までのさまざまな条件を組み合わせて、転送の仕方を細かく決められる。
主なメッセージ
| メッセージ | 向き | 内容 |
|---|---|---|
| Packet-In | スイッチ → コントローラー | 受信したパケット(またはその一部)をコントローラーに送る。当てはまるフローエントリがないときや、アクションで指定されたときに使う |
| Packet-Out | コントローラー → スイッチ | 指定したパケットを、指定したポートから送出させる |
| Flow-Mod | コントローラー → スイッチ | フローエントリの追加、変更、削除を指示する |
| Echo(Request / Reply) | 双方向 | 接続が生きているかを確かめる |
| Hello | 双方向 | 接続の開始時に、使うバージョンを取り決める |
| Port-Status | スイッチ → コントローラー | ポートの状態の変化を知らせる |
典型的な流れ(リアクティブ型)
- スイッチが、フローテーブルのどのエントリにも当てはまらないパケットを受け取る
- スイッチが、そのパケットをPacket-Inでコントローラーに送る
- コントローラーが転送先を決め、Flow-Modで同じ種類のパケットのためのエントリをスイッチに登録する
- 最初のパケットは、コントローラーがPacket-Outで送出させる
- 以降の同じ種類のパケットは、スイッチがエントリに従って自分で転送する
このように、パケットが来てからエントリを登録する方式をリアクティブ型、あらかじめエントリを登録しておく方式をプロアクティブ型という。