現在ストリーミングは大はやりです. イベントなどでもリアルタイム中継がよく行われています. 少し前はこういう同報通信にはマルチキャストが用いられていましたが, 現在はありあまるサーバパワーと通信環境に頼った方法が手軽なためかマルチキャストを 利用することも少なくなっているのが残念です. 確かにVideo on Demandであれば個別にセッションを作るしかしかたがない部分もありますが, リアルタイム中継であればマルチキャストを使った方が, 網への負荷だけでなくサーバ周辺への負荷を減らす意味でも有効でしょう. 更に最近良く利用されているプッシュ型サービスもユーザが増えると破綻するので, マルチキャストが使われた方が望ましいでしょう.
使われなくなって来ている理由は, 情報処理2001年2月号の太田昌孝先生の本当のインターネットを目指してvol.23「マルチキャスト」 に詳しく説明されていますが, 重量制課金でもないのに誰も網への負担なんか気にしないからと言うことらしいです [1] .
では,何故マルチキャストを今回やるんでしょうか? 一つ目の理由は連載を引き受けた当時から温めていたネタであるということ(^-^;)ですが, 二つ目の理由としてビデオ会議 [2] などの実現に非常に使えるということがあげられるでしょう. もちろんセグメントを跨がないのであればブロードキャストでも同じことが可能ですが, セグメントを跨ぐ可能性があるのであれば, 最初からマルチキャストで構築しておいた方が後々楽です.
ここでは簡単にマルチキャストの基礎について説明します. 詳しい参考文献としては
インターネットマルチキャストMbone,Vinay Kumar著,楠本博之監訳,インプレス,ISBN4-8443-4913-9: 管理からアプリケーションまで幅広く紹介. 若干古いので入手困難.
bit別冊 IPマルチキャスト入門,Thomas A. Maufer著,楠本博之監訳,共立出版: ルーティングなどからはじまり技術的な内容が中心.
bit別冊 インターネット参加の手引1996年度版,村井純・吉村伸監修,共立出版: これも古いですが参考になります. アプリケーションについての解説も多いです.
マルチキャストは1対多もしくは多対多の通信を インターネット全体で実現するための方法です. 同じセグメントであればブロードキャストを利用すれば全てのホストにパケットを 送ることが可能です. ビデオの同時送信などの同報通信の場合, 個別にセッションを作って独立にデータを流すのは インターネット網への負担から望ましくありません. そこで,インターネット全体でグループを構成し, そのグループにだけブロードキャスト的にデータを流すことが考えられました. これがマルチキャストです.
マルチキャストアドレスはクラスD(224.0.0.1-239.255.255.255)を利用します. 予約されているアドレス一覧は IANAの割当されたマルチキャストアドレス一覧から入手可能です.
日本語でのマルチキャストに関する情報は, JP-MBone Informationと IP Multicast Initiative に集まっています. ツール関係の情報は英語になりますが Mbone Conferencing Applications に情報が集まっています. 各ツールの詳細なマニュアルもここから手に入れることができます.
インターネットで放送ができるといっても, 必要の無い所に情報を流すのはもちろん好ましくありません. 例えば日本語の放送などは, 日本国内では意味があっても海外にまで流すのは無駄でしょう. このために配布範囲を制限する方法として, 以前はIPのTTL(Time To Live)による制限が行われていました. これは,IPパケットのTTLを利用して配布範囲を制限するもので, マルチキャストルータで次段に送ってもよい閾値(threshold)を設定することで, 適切な範囲への配布を実現するものです. 高品質のビデオなどを広い範囲に配布することは,網への負担から好ましくありません. そこで,JP Mboneでは利用するバンド幅に応じてのように, 閾値を設定するようにガイドラインで定められています.
現在では,組織でのローカルな配布制限の目的には 管理スコープアドレス(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
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との間に作られていることがわかります (). うしろの数字部分はメトリック/閾値/接続状況が 表示されています.
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
具体的なマルチキャストアプリケーションは後で説明しますが, 各アプリケーションはビデオ転送だけ,音声転送だけとなっていますので, テレビ会議の実現のためにはこれらを協調させて利用する必要があります. また,どのような会議や番組がいつ行われるかなどの情報を知らせる必要があるため, これらを管理するソフトウエアが必要になります. このような目的で利用されるのがセッション管理ツールです. 古くはsdなどが利用されていましたが, 現在は セッションディレクトリツールsdr(mbone/sdr)がよく用いられます. portsに含まれているバージョンは2.9と少し古いものになっています.
sdrを実行すると, のようなウインドウが開きます. 現在アナウンスされているセッションが存在する場合, ここにそのセッションの一覧が表示されます. セッション名をクリックするとセッションの詳細が表示されますので, Joinボタンを押すことで適切なツールが 実行されます. 利用されるツールは, ビデオ転送ツールとしてはvic, 音声転送ツールとしてはvatもしくはrat, 黒板ツールとしてはwb, 共有エディタとしてはnteとなっています.
新しいセッションを開く場合は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で 画面の切り替えも可能です.
自分の画面を転送したい場合はメインウインドウの Menuボタンをクリックします. Encoder部分のDevice...で 転送するデバイスを決定し, Transmission部分の
[1] | しかし,贅沢な時代になったものです. |
[2] | 安価な監視システム構築なども可能でしょうね;-p |
[3] | 後者は手元にないので確認していません. |
[4] | 現在のところ,NEW-BUS化されたドライバが存在しないのでPAO3での利用しかできません. |