興味ない方はスルー推奨。
ネットワーク間でのマルチキャストルーティングに関しての情報はよく見るけど、同一サブネット内での動きに関する情報はあまりない。(そもそも必要ないのかな?)
企業や学校とかでサブネットの範囲が広い場合に、必要ないパケットをネットワーク内に流さないことは結構重要だと思うんだけどなぁ。
それではまず、IGMPスヌーピングが無効の状態でマルチキャスト通信を実行。
テストに利用したのはマルチキャストを利用するボイスチャットソフト。複数のマルチキャストアドレスを利用したグルーピングも可能なやつ。スイッチは製品名忘れたけど、パナソニック電工ネットワークスさんの高機能なやつです。

上図のように2つのマルチキャストグループを作り、双方向でボイスチャットしてみた。すると、それぞれの端末から送信されたマルチキャストは同じマルチキャストグループの端末だけでなく、スイッチに接続されている端末すべてに流れていることを確認。もちろん基幹側にも流れてる。閉じた環境ではブロードキャストと同様の動きといっていいかな。
次にIGMPSnoopingを有効にして同様の通信を実施。

おぉ、自分が所属するマルチキャストグループのパケット以外流れなくなった!
ってあれ?IGMPクエリアがないのにIGMPスヌーピングは正常に動作するの?
※IGMPクエリアとは。
クエリはクエリア(マルチキャストルータ等)がマルチキャストレシーバの存在を確認するために定期的に送信するメッセージのこと。IGMPクエリは224.0.0.1というサブネット上の全マルチキャストホストを示すリンクローカルマルチキャストアドレスで送信。このクエリに反応して、レシーバーは自身が所属するマルチキャストアドレスにメンバーシップレポートを送信する(Joinメッセージ)。L2スイッチはこのメンバーシップレポート覗き見してIGMPスヌーピングを行うわけだ。
アナライザーを見てみると、確かにクエリは流れてないけど、機能開始時にマルチキャストアドレスに対してJoinメッセージが流れ、機能終了時にはLeaveメッセージが流れていた。スイッチはこの最初のJoinメッセージだけを使って、IGMPスヌーピングを行っているようだ。アプリケーションがマルチキャストソケットを開いたタイミングでJoinメッセージを投げるらしい。(Windows側の機能)
じゃあLeave時は?
IGMPスヌーピングには即時脱退処理ってのがあるのね。
先にスイッチからクエリを送信しなくても、Leaveメッセージを送信するインターフェイスを転送テーブルから即時削除できるらしい。(IGMPv1はLeaveメッセージは送信しないからだめだね。)
ということはクエリアって必要ないんじゃね?
JoinメッセージとLeaveメッセージだけIGMPスヌーピングできそうな気がしてきた。
でもそこでふと思ったんだけど、IGMPSnoopingにタイムアウトあったらだめなんじゃ・・・いろんなスイッチの説明書見たけど、デフォルトで260秒とかのタイムアウトがあるみたい。しかもタイムアウトを無効に出来ないやつもあった。つまり機能実行直後は初回のjoinメッセージが流れてIGMPスヌーピングも動作するけど、そのあとクエリ流れないからJoinメッセージも帰ってこなくてタイムアウトするね。。。たぶんみんな同時にバスッと通信切れる感じかな。
あとはカスケードしているときが問題だった。
IGMPスヌーピング有効のスイッチ同士をカスケードするとお互いをカスケードしてるポート同士ではマルチキャストは流れない。

なぜかって? それはIGMPスヌーピングが有効だから。
スイッチをまたいでマルチキャストを送信しようとしても、Joinメッセージが流れてメンバーがいると判断されたポートにしかマルチキャストは流せない。ということは隣のスイッチからそもそも最初のJoinメッセージ(マルチキャスト)自体を流せないから、いわゆるデッドロック状態。あたりまえと言えばあたりまえだけどなかなか気付けなかった;
ciscoさんの以下のページを参考にすると、いくつか回避方法があるみたい。
Catalyst スイッチで同一 VLAN 内でのマルチキャストが機能しない
①レイヤ 3(L3)ルータ/VLAN インターフェイスで PIM を有効にする。
ようするに上位にマルチキャストルータを置けということかな。
そうすることで、マルチキャストルータに繋がるポートはマルチキャストルータポートとして判別され そこに対してjoinメッセージを流せるようになる。カスケードしてる場合も上手くリレーしてくれるのかな。まぁマルチキャストルータを自動判別できないスイッチはダメか。

②L2 スイッチで IGMP クエリアを有効にする
自分自身をクエリを送信するクエリアとして動作させることのできる高価なL2スイッチがある。そうすることでスイッチはクエリアとして判別され、そこへIGMPレポートを流せるようになるらしい。だいたい①と同じことだね。
カスケードしてる場合は上位のL2スイッチをクエリアとすればいいのかな。
③スイッチに静的 mrouter ポートを設定する
IGMPクエリアに接続されたポートを静的に指定することで、そこにIGMPレポートを流せるようになるらしい。これも結局①と同じことか。確かにCatalyst以外のスイッチでもこの設定はあったような気がする。試したことないけど、これなら実際にクエリアなくてもいけるかな。
④すべてのスイッチに静的マルチキャスト MAC エントリを設定する
静的にマルチキャストMACアドレスのルールを作成すればいいらしい・・・そのルールで指定されたポートにマルチキャストを流せるようになるらしいけど、めんどくさそう。そもそもマルチキャストグループに参加するレシーバがいつも異なる環境ではほとんど意味ない気がする。 Catalyst以外で出来るかどうかもあやしい・・・
⑤すべてのスイッチで IGMP スヌーピングを無効にする
www
とりあえず、他にもいろんなパターン試したけど長くなってきたので次回。
人気ブログランキングへ