こんな夜中にOpenFlowでネットワークをプログラミング!

第10回 【Trema編】Tremaプロジェクトの深層に迫る!

この記事を読むのに必要な時間:およそ 4 分

はじめに

「合言葉を」異口同音にささやく。⁠デンマーク」

アルトゥル・シュニッツラー
「夢奇譚」

平穏と思える日常生活にも,思わぬところに「闇」が潜んでいるものです。アメリカの最古の秘密結社の1つ,トライステロをご存じでしょうか。トライステロは裏社会の地下郵便組織で,その流通ネットワークはなんと全米に広がっています。恐ろしいことに,トライステロは重要な社会インフラの1つである郵便事業を通じて,あらゆる歴史的事件に社会の裏側から関与し続けていると言われています。

ところで,アメリカの街中で図1のような小さなラッパの落書きに気づいたことはありませんか? これはトライステロのマークで,メンバーどうしが秘密裡に連絡を取り合うのに使うと言われています。このマークがある場所にはアジトがある可能性が高く危険なため,賢明な読者のみなさまはどうか近づかないでください注1)⁠

図1 秘密結社トライステロのマーク

図1 秘密結社トライステロのマーク

この連載で紹介しているTremaも,その実体はトレマと呼ばれる秘密結社によって作られたフリーソフトウェアです。トレマは闇プログラマや闇エンジニアを抱える地下組織であり,OpenFlowフレームワークTremaを通じてネットワーク界の大変革をもくろんでいます。

トライステロと同じく,トレマも図2のような秘密のマークを使って連絡を取り合っています。ぱっと見,どこにでもある道路標識のようにカムフラージュされているところに注目してください。まさに,思わぬ日常に闇は潜んでいるのです。

図2 道路標識としてカムフラージュされた,秘密結社トレマのマーク

図2 道路標識としてカムフラージュされた,秘密結社トレマのマーク

今回は,我々「トレマ探検隊」が知られざる秘密結社トレマの秘密に迫ります。謎のソフトウェアTremaの全貌は? 闇組織トレマに入るには?実に丸1年の歳月を費やし,命がけで調査した結果をここに公開します。もちろん,世界初公開です!

注1)
トライステロは,トマス・ピンチョンの小説『競売ナンバー49の叫び』に登場する架空の秘密結社です。

調査報告:Tremaの全貌

いきなりTremaのソースコードに飛び込むのもよいですが,すぐに迷ってしまうのが関の山です。我々トレマ探検隊が道案内をしましょう。まずは,大まかなファイル構成をつかんでおくとソースコード探検に便利です。

ファイル構成

Tremaをダウンロードすると,いくつかのファイルとディレクトリがあることがわかります。次に主要なものを挙げましょう。

  • build.rb:ビルドスクリプト
  • cruise.rb:すべてのテストコードを実行するテストスイート。開発者向け
  • features/:受け入れテスト一式。開発者向け
  • ruby/:Rubyライブラリのソースコード
  • spec/:Rubyのユニットテスト一式。開発者向け
  • src/examples/:サンプルアプリ(後述)
  • src/lib/:Cライブラリのソースコード
  • trema:tremaコマンド本体
  • unittests/:Cのユニットテスト一式。開発者向け

この中でもTremaで何か作りたい人が真っ先に読むべきは,サンプルアプリ(src/examples/)です。

サンプルアプリ

サンプルアプリは簡単なアプリケーションをたくさん含んでおり,実際のAPIの使い方を調べるのに便利です。基本的にはCとRubyの両方で書かれているため,両者のAPI対応を調べるのにも使えます。

表1におもなサンプルアプリをまとめておきます。この表では,簡単な順に上から並べていますので,順に読んでいくことをお勧めします。

TremaにはたくさんのAPIがあり,表1に掲載したサンプルではまだまだすべてを紹介しきれていません。新しいサンプルアプリを作成した人は,ぜひGitHubでPullリクエストを送ってください。あなたの名前が作者リスト(README.md)に載るかもしれません!

表1 Tremaのおもなサンプルアプリ

アプリ説明
hello_tremaすべての基本、Helloと表示するだけのサンプル連載第7回に掲載)⁠これをtrema runに渡せば、手っ取り早くTremaを試すことができる。Tremaを始めたばかりの初心者向け
packet_inOpenFlowメッセージの中でも重要なpacket_inメッセージをハンドルするサンプル。ハンドラの定義方法やpacket_inメッセージの基本が学べる
switch_monitorスイッチの起動、切断を捕捉するサンプル連載第7回に掲載)⁠ハンドラを複数使ったコントローラの実装が学べる
dumper受け取ったすべてのOpenFlowメッセージを文字列としてダンプするサンプル。OpenFlowメッセージのハンドル方法が学べる
switch_infofeatures_requestメッセージをスイッチに送信し、スイッチから受信したスイッチ情報を出力するサンプル。コントローラからスイッチへOpenFlowメッセージを送る方法が学べる
repeater_hub受け取ったパケットを、入ってきたポート以外に出力する、いわゆるリピータハブをOpenFlowで実装したサンプル連載第9回に掲載)⁠重要なメッセージであるflow_modとpacket_outの基本が学べる
learning_switchいわゆるL2スイッチをエミュレートするサンプル。普通のスイッチの基本構成(FDBなど)を学ぶことができる。これは1台のOpenFlowスイッチのみで動作するが、複数スイッチ向けにはmulti_learning_switchを参照すること
traffic_monitorlearning_switchを拡張し、ユーザごとのトラフィックを測れるようにしたサンプル連載第8回に掲載)⁠スイッチのフローが消えたときに送信されるflow_removed メッセージの応用例としておもしろい
multi_learning_switchlearning_switchの複数スイッチ対応版。learning_switchとの違い、とくにスイッチごとにFDBを管理している部分に注目

著者プロフィール

高宮安仁(たかみややすひと)

Trema開発チーム自称リーダー。東京の大学で計算科学を学び,並列プログラミング用ライブラリや,大規模クラスタ管理ツールの開発,とくに東工大のスパコンTSUBAME,分散クラスタInTriggerの管理基盤などなど主に分散・大規模システムのミドルウェア開発者・研究者として活動。現在は企業の研究者として,OpenFlow用プログラミングフレームワークTremaのメイン開発者。モットーは何がなんでも定時に帰ること。コンピューターはもちろん映画や音楽も好きで,スクラッチDJとしても活動しています。DJの仕事ください。


鈴木一哉(すずきかずや)

Trema開発チームのメンバー。Ascend,古河電工,ヤマハ等のネットワーク機器を扱うエンジニアを経て,現在は経路制御の研究に従事。ホエールズ時代からのベイスターズファンで,98年の優勝時にはもちろん横浜スタジアムへ駆けつけました。野球のない時期には,もっぱらSFを読んでいます。会社ではランニングサークルに入っており,先日も多摩川の駅伝に参加しましたが,練習不足で全然走れませんでした。ちゃんと練習して,来年こそはしっかり走るぞ!

コメント

コメントの記入