マルチキャストは素敵!?

現在ストリーミングは大はやりです. イベントなどでもリアルタイム中継がよく行われています. 少し前はこういう同報通信にはマルチキャストが用いられていましたが, 現在はありあまるサーバパワーと通信環境に頼った方法が手軽なためかマルチキャストを 利用することも少なくなっているのが残念です. 確かにVideo on Demandであれば個別にセッションを作るしかしかたがない部分もありますが, リアルタイム中継であればマルチキャストを使った方が, 網への負荷だけでなくサーバ周辺への負荷を減らす意味でも有効でしょう. 更に最近良く利用されているプッシュ型サービスもユーザが増えると破綻するので, マルチキャストが使われた方が望ましいでしょう.

使われなくなって来ている理由は, 情報処理2001年2月号の太田昌孝先生の本当のインターネットを目指してvol.23「マルチキャスト」 に詳しく説明されていますが, 重量制課金でもないのに誰も網への負担なんか気にしないからと言うことらしいです [1]

では,何故マルチキャストを今回やるんでしょうか? 一つ目の理由は連載を引き受けた当時から温めていたネタであるということ(^-^;)ですが, 二つ目の理由としてビデオ会議 [2] などの実現に非常に使えるということがあげられるでしょう. もちろんセグメントを跨がないのであればブロードキャストでも同じことが可能ですが, セグメントを跨ぐ可能性があるのであれば, 最初からマルチキャストで構築しておいた方が後々楽です.

マルチキャストってなあに?

ここでは簡単にマルチキャストの基礎について説明します. 詳しい参考文献としては

があります.

マルチキャストの基礎

マルチキャストは1対多もしくは多対多の通信を インターネット全体で実現するための方法です. 同じセグメントであればブロードキャストを利用すれば全てのホストにパケットを 送ることが可能です. ビデオの同時送信などの同報通信の場合, 個別にセッションを作って独立にデータを流すのは インターネット網への負担から望ましくありません. そこで,インターネット全体でグループを構成し, そのグループにだけブロードキャスト的にデータを流すことが考えられました. これがマルチキャストです.

マルチキャストアドレスはクラスD(224.0.0.1-239.255.255.255)を利用します. 予約されているアドレス一覧は IANAの割当されたマルチキャストアドレス一覧から入手可能です.

日本語でのマルチキャストに関する情報は, JP-MBone InformationIP Multicast Initiative に集まっています. ツール関係の情報は英語になりますが Mbone Conferencing Applications に情報が集まっています. 各ツールの詳細なマニュアルもここから手に入れることができます.

管理スコープアドレスとTTL

インターネットで放送ができるといっても, 必要の無い所に情報を流すのはもちろん好ましくありません. 例えば日本語の放送などは, 日本国内では意味があっても海外にまで流すのは無駄でしょう. このために配布範囲を制限する方法として, 以前はIPのTTL(Time To Live)による制限が行われていました. これは,IPパケットのTTLを利用して配布範囲を制限するもので, マルチキャストルータで次段に送ってもよい閾値(threshold)を設定することで, 適切な範囲への配布を実現するものです. 高品質のビデオなどを広い範囲に配布することは,網への負担から好ましくありません. そこで,JP Mboneでは利用するバンド幅に応じてのように, 閾値を設定するようにガイドラインで定められています.

表 1. ユーザによる初期TTLの指針

現在では,組織でのローカルな配布制限の目的には 管理スコープアドレス(RFC2365)が主に利用されます. 239.0.0.0/8はこの目的で利用され、 IPv4ローカルスコープとしては特に239.255.0.0/16が利用されます. 組織内ローカルスコープもあり、これには239.192.0.0/14が利用されます. 外に流す必要のないマルチキャストサービスは これらのアドレスを利用するようにしましょう. なお,TTLによる配布制限も併用可能ですので, 組織内ローカルより広い範囲に配布する場合, トンネルの閾値の設定をしっかり設定した上で活用しましょう.

マルチキャストのルーティング

マルチキャストのルーティングは普通のIPのルーティングと独立に設定します. ルーティングの方法としては, DVMRP(RFC1075:ただしバージョンが古い) や PIM-DM, PIM-SM(RFC2362) などが主に用いられています. このうち,DVMRPを利用するルーティングコマンドに関してはmroutedが ディストリビューションに含まれています. また,PIMに関してはIPv6関連でpim6*コマンド群が含まれています. 私は未だIPv6環境を構築できていませんので, ここではmroutedを用いたDVMRPの設定に関してのみ説明します.

DVMRPによるルーティングデーモンmroutedは 設定ファイルが存在しない場合, 複数のネットワークインターフェース間でマルチキャストパケットをフォワードするだけですが, トンネルを設定することで遠方のネットワークに対しても マルチキャストパケットを転送することが可能です. この時,パケットはカプセル化されて転送されますので, 転送路間でマルチキャストパケットが送れるようになっている必要はありません.

マルチキャストルーティングを行うためには,カーネル設定ファイル中に

  options         MROUTING

を設定し,カーネルを再構築する必要があります. クライアントとしての利用だけであればこのオプションは必要ありません.

トンネルを設定するためには /etc/mrouted.confに以下のような設定を記述します.

  tunnel 192.168.122.1 192.168.10.1
  # tunnel local-address|interface-name remote-address|remote-hostname
  # tunnel 192.168.122.1 192.168.10.1 threshold 64

ローカル側はIPアドレスもしくはインターフェース名で指定し, リモート側はインターフェースが一意に決定できる場合はホスト名が利用できますし, できない場合はIPアドレスで指定します. さらに,リモート側でもローカルとリモートが逆になった設定を行う必要があります. トンネル間の閾値の設定には,thresholdの後に転送される閾値を設定することが可能です.

mroutedの設定を変更した時に再読み込みさせるためには, HUPシグナルが利用可能です. また,内部ルーティングテーブル情報や内部キャッシュ情報をファイル出力するためには, それぞれUSR1とUSR2シグナルが利用可能です. 詳細はマニュアルを参照してください.

マルチキャストルータの設定確認にはmrinfoを利用します. 引数としてマルチキャストルータを指定します. 実行例は以下のようになります.

	  > mrinfo sun.take60.org
	  192.168.122.1 (sun.take60.org) [DVMRPv3 compliant]:
	    192.168.200.1 -> 0.0.0.0 (local) [1/1/querier/leaf]
	    192.168.122.1 -> 0.0.0.0 (local) [1/1/querier/leaf]
	    192.168.122.1 -> 192.168.0.1 (somewhere.net) [1/1/tunnel]
	
この場合,sun.take60.orgには2つのセグメントに 192.168.122.1と192.168.200.1で接続されており, トンネルは192.168.0.1との間に作られていることがわかります (). うしろの数字部分はメトリック/閾値/接続状況が 表示されています.

図 1. 例で利用したネットワークの構成

tracerouteのマルチキャスト版がmtraceです. 最低限必要な引数はソースアドレスだけです. 接続がアスキーキャラクタを利用した図で出力されます.

map-mboneはマルチキャストルータの接続状況を表示します. このコマンドはrootで実行する必要があります. mfinfoと同じネットワークに対して, コマンドを実行した結果を以下に示します.

	   map-mbone sun.take60.org
	  192.168.122.1 (sun.take60.org): v3.255
	    192.168.200.1:  192.168.200.1 (sun.inter.take60.org) [1/1/querier]
	    192.168.122.1:  192.168.0.1 (somewhere.net) [1/1/tunnel]
	                    192.168.122.1 (sun.take60.org) [1/1/querier]

	  192.168.122.1: alias for 192.168.200.1
	

portsのアプリケーション

セッション管理

具体的なマルチキャストアプリケーションは後で説明しますが, 各アプリケーションはビデオ転送だけ,音声転送だけとなっていますので, テレビ会議の実現のためにはこれらを協調させて利用する必要があります. また,どのような会議や番組がいつ行われるかなどの情報を知らせる必要があるため, これらを管理するソフトウエアが必要になります. このような目的で利用されるのがセッション管理ツールです. 古くはsdなどが利用されていましたが, 現在は セッションディレクトリツールsdr(mbone/sdr)がよく用いられます. portsに含まれているバージョンは2.9と少し古いものになっています.

sdrを実行すると, のようなウインドウが開きます. 現在アナウンスされているセッションが存在する場合, ここにそのセッションの一覧が表示されます. セッション名をクリックするとセッションの詳細が表示されますので, Joinボタンを押すことで適切なツールが 実行されます. 利用されるツールは, ビデオ転送ツールとしてはvic, 音声転送ツールとしてはvatもしくはrat, 黒板ツールとしてはwb, 共有エディタとしてはnteとなっています.

図 2. sdrのセッション一覧ウインドウ

新しいセッションを開く場合はNewを選び, 質問に適切に答えていきます. 配布範囲のLocal Scopeは管理スコープアドレスのローカルアドレスが利用されます. その他のスコープでは,TTLによる配送制限を行います.

ビデオ転送

ビデオ転送はテレビ会議に必須の機能でしょう. マルチキャストを利用したビデオ転送ツールとしては,古くは ivs (FreeBSD 2.0ではキャプチャできないが動いていた)や nv (FreeBSDバイナリはあるが現在は動かない)がありました. 最近では vic(mbone/vic)を 利用することがほとんどで,nvで可能なことは vicで可能なので,これで困ることはないでしょう. FreeBSD portsのvicはXの画面転送パッチなども取り込まれていますので, 画面の転送などでの利用も可能です. また,JPEG画像の静止画転送も可能です. ちなみに,vicはWindowsなどでも利用可能です.

vicで動画像を転送する場合, ビデオキャプチャカードは Brooktree Bt848,878(bktr), The Creative Labs Video Spigot(spigot) で認識できるものなら利用可能です [3]. 他にIBM SmartCapture Card(scc) [4] などもパッチが存在します.

vicの立ち上げはsdr経由で行うのが普通ですが, コマンドラインでマルチキャストアドレスとポートを指定することも可能です. 更に,1対1のセッションの場合, 普通のIPアドレスとポートによる指定で実行することも可能です. これらは多くのマルチキャストアプリケーションに共通の機能です. コマンドラインでの実行形式は次のようになります.

	  vic IPアドレス/ポート番号
	
明示的にTTLを指定する場合は,-t TTLを利用します. このコマンドライン指定は, 断らない限り以下のほとんどのマルチキャストアプリケーションでも同じです.

vicを起動すると, のようなウインドウが表示されます. 左に小さく表示されている画面をクリックすると, その画面が拡大され別ウインドウで表示されます. 全ての画面を拡大されたウインドウにすることも可能ですが, ,,Enterで 画面の切り替えも可能です.

図 3. vicのメインウインドウ

自分の画面を転送したい場合はメインウインドウの Menuボタンをクリックします. Encoder部分のDevice...で 転送するデバイスを決定し, Transmission部分の

注意

[1]

しかし,贅沢な時代になったものです.

[2]

安価な監視システム構築なども可能でしょうね;-p

[3]

後者は手元にないので確認していません.

[4]

現在のところ,NEW-BUS化されたドライバが存在しないのでPAO3での利用しかできません.