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

第12回 【Trema編】動画放送局をIPマルチキャストで作ってみよう!

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

実行してみよう

さっそく動かしてみましょう! 構成としてストリーミングサーバ1台,受信ホスト2台に加え,コントローラを動作させるホストの合計4台を使います図5⁠。

図5 動作構成

図5 動作構成

まず,TremaとOpenFlowスイッチの準備をしましょう。リスト3のネットワーク設定ファイルを用意します。

リスト3 マルチキャスト用スイッチ1台をeth0,eth1,eth2に接続(network.conf)

vswitch ( "msw" ) {
  datapath_id "0xabc"
}

link "msw", "eth0"
link "msw", "eth1"
link "msw", "eth2"

今回作成したsimple-multicast.rb,mfc.rbとコンフィグレーションファイルを,tremaコマンドと同じディレクトリに置いてください。次のように今回作成したコントローラを実行します。

% ./trema run ./simple-multicast.rb -c ./network.conf

マルチキャストの送受信を行うアプリケーションとしては,VLC注3を使います。ストリーミングサーバと受信ホストの両方に,次のようにVLCをインストールしてください。

% sudo apt-get install vlc

それでは,ストリーミングサーバの設定をします。前もって,配信したい動画ファイルを携帯やデジカメで撮影しておいてください(movie.mpg⁠⁠。次のコマンドで,マルチキャストを使った動画のストリーミングを開始します注4⁠。

% cvlc ./movie.mpg --sout udp://239.192.0.1:60000 
--miface eth0 --loop --mtu 1472 -d

次に,2台の受信ホストで動画視聴の準備をしましょう。まず,次のコマンドでIGMP Version 2注5を使うように各ホストの設定を変更しておいてください。

% sudo sysctl -w net.ipv4.conf.all.force_igmp_version=2

次に,VLCを起動し,メニューから「ネットワークストリームを開く」を選択します。ダイアログボックスに,⁠udp://@239.192.0.1:60000」と入力してください図6⁠。

図6 マルチキャスト受信の設定

図6 マルチキャスト受信の設定

以上を行うと,2台の受信ホストで,図7のように動画が同じタイミングで再生されるはずです。うまく再生ができたでしょうか?

図7 マルチキャストで配信された動画の表示

図7 マルチキャストで配信された動画の表示 図7 マルチキャストで配信された動画の表示

注3)
The VideoLAN projectで開発されているオープンソースのストリーミングツールです。
注4)
IPv4マルチキャストで用いられるグループアドレスのうち,239.192.0.0/14が組織内利用のために確保されています。この中のアドレスを使いましょう。
注5)
Linuxを含む主要OSには現在,最新バージョンであるIGMP Version 3が実装されています。しかし,動作が少し複雑であるため,今回はよりシンプルな動作を行うIGMP Version2を使っています。

まとめ

今回は,マルチキャスト転送を実現するコントローラを作りました。学んだことは,次の2点です。

  • packet_inメッセージの中のパケットの各フィールドの値を参照する方法を学びました。Trema::PacketInクラスに用意されているigmp_typeなどのアクセサメソッドを使うことで,いろいろなレイヤの値を簡単に取り出すことができます。
  • マルチキャスト転送を実現するアクションの書き方を学びました。複数のアクションを指定することで,複数のポートに複製したパケットの出力ができます。

次回は,いよいよ最終回です。Tremaについてより深く知ってもらうために,Tremaの中身,アーキテクチャについて紹介します。

[友太郎の質問]もっと大きなネットワークでマルチキャストしたい!

Q.「ぼくの撮った動画をもっとたくさんの人に観てもらいたいな! 今回はスイッチ1つだけだったけど,もっとたくさんのスイッチを使ったマルチキャストはどうするの?」

A.今回紹介したSimpleMulticastでは,スイッチを1台しか扱えません。しかし,実際に大勢のユーザに動画を配信するネットワークは,多くのスイッチで構成されています。このようなネットワークでマルチキャスト転送をするためには,たとえば図Aのようにパケットが流れるよう,フローを設定しなければいけません。

このフロー設定のためには,ストリーミングサーバがつながっているスイッチAから,受信ホストがつながっているスイッチDまでの最短パスを計算します。その結果,A→B→Dが最短パスとわかるので,このパス上の各スイッチにフローを設定します。受信ホストはスイッチCにもつながっているので,こちらにも同様に最短パスの計算とフロー設定を行います。

最短パスを計算するためには,スイッチどうしがどのように接続しているかを知る必要があります。そのためのモジュールとして,Trema Apps中にTopologyモジュールが用意されています。また,最短パスの計算には,Trema Apps中にあるRouting Switchに同梱されているlibpathresolverというライブラリが参考になるでしょう。

図A 複数スイッチによるマルチキャスト

図A 複数スイッチによるマルチキャスト

著者プロフィール

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

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


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

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