【マルチキャスト】IGMPv2の動作をわかりやすく解説

 ある受信機が、239.1.1.1のマルチキャストを受信したい場合、受信機に一番近いルータ(ラストホップルータ:LHR)に「239.1.1.1を配信してください!」って依頼をします。ここで使われるプロトコルがインターネットグループ管理プロトコル(IGMP)です。

スポンサーリンク

IGMP設定と動作

 IGMPには、バージョン1〜3とあります。この記事ではよく使われるバージョン2について書きます。バージョン3はSSM(Source Specific Multicast)で使用されるもので、この記事では割愛します。

LHRでIGMPv2を受信するには

 LHR(ラストホップルータ)で、IGMPを受信するには、マルチキャストルーティングを有効にし、かつ、受信インタフェースで、PIMを有効にします。

LHR(config)# ip multicast-routing
LHR(config)# interface FastEthernet0/0.123
LHR(config-subif)# ip pim sparse-mode

 IGMPが有効になっているか確認します。

LHR# show ip igmp interface  
FastEthernet0/0.123 is up, line protocol is up
  Internet address is 192.168.123.1/24
  IGMP is enabled on interface
  Current IGMP host version is 2
  Current IGMP router version is 2
  IGMP query interval is 60 seconds
  IGMP configured query interval is 60 seconds
  IGMP querier timeout is 120 seconds
  IGMP configured querier timeout is 120 seconds
  IGMP max query response time is 10 seconds
  Last member query count is 2
  Last member query response interval is 1000 ms
  Inbound IGMP access group is not set
  IGMP activity: 3 joins, 2 leaves
  Multicast routing is enabled on interface
  Multicast TTL threshold is 0
  Multicast designated router (DR) is 192.168.123.1 (this system)
  IGMP querying router is 192.168.123.1 (this system)
  Multicast groups joined by this system (number of users):
      224.0.1.40(1)

 IGMPが有効で、バージョン2であることが確認できます。 ここでLHRのパケットをキャプチャしてみます。すると、LHRからIGMPv2 メンバーシップクエリー(Membership Query)が60秒毎に出力されていることが確認できます。

 メンバーシップクエリーで、224.0.0.1(全てのマルチキャストホスト)宛に「マルチキャストを受信したい人はいますか?」と定期的に確認します。

 マルチキャストを受信したい人がいなければ、受信機側からは何も応答がありません。

受信機側でマルチキャストを要求するには

 IGMPは一般のOS(Windows、MAC、Linuxなど)でサポートされています。Ciscoルータでもサポートされていますので、ここでは、受信機をCiscoルータとして、マルチキャストの受信を要求します。

 受信機側で、239.1.1.1のマルチキャストを受信したいと思います。この場合、受信機のCiscoルータでは以下の設定をします。

Receiver-1(config)# interface fastEthernet 0/0.123
Receiver-1(config-subif)# ip igmp join-group 239.1.1.1

 では、受信機側のパケットをキャプチャしてみます。すると、設定直後に受信機から宛先239.1.1.1にIGMPv2 メンバーシップレポート(Membership Report)が送信されています。

 メンバーシップレポートで、受信したいマルチキャストアドレス宛(今回は239.1.1.1)に「239.1.1.1を配信してください!」と要求します。

LHRで メンバーシップレポートを受信しているのか

 LHRで受信機からのメンバーシップレポートを受信しているか確認します。

LHR# show ip igmp groups
IGMP Connected Group Membership
Group Address    Interface                Uptime    Expires   Last Reporter   
239.1.1.1        FastEthernet0/0.123      00:16:09  00:02:25  192.168.123.2   

 受信機として、192.168.123.2から グループアドレス239.1.1.1のIGMPメンバーシップレポートを受信していることがわかります。

 LHRから60秒毎にメンバーシップクエリーが送信され、受信機はその度にメンバーシップレポートで応答します。

 受信機のメンバーシップクエリーからのレポート返答が、クエリー受信して6秒後や3秒後など値がマチマチに見えます。受信機が不安定なのでしょうか。。。ではなくて、これは仕様通りの動きです。 メンバーシップクエリのパケットの中身をみてみます。

 メンバーシップクエリの最大応答時間(Max Resp Time) が10秒で設定されています。受信者は、この値を受け取り、10秒以内のランダムな値を経過後に、メンバーシップレスポンスを応答します。

2台目の受信機(Receiver-2)を追加

 2台目の受信機を追加します。

Receiver-2(config)# interface FastEthernet0/0.123
Receiver-2(config-subif)# ip igmp join-group 239.1.1.1

 では、LHRのメンバーシップクエリーに対して、受信機2台ともが、メンバーシップレポートを返答しているかパケットキャプチャで確認します。

 2台ともレポートを返答するのではなくて、受信機1もしくは受信機2のどちらかが返答しているのがわかります。 また、どちらが返答するかというと、ランダムです。 これは、それぞれの受信機がランダムな秒数を経過後、一番早く返答した受信機のレポートは他の受信機にも届くので、他受信機がレポートを停止します。これで、レポート数を削減します。

 この仕組みがなければ、例えば、受信機が10台あった場合、レポートも10パケット送信されることになり、ネットワークの効率が悪くなります。

受信機(Receiver-2)の離脱

 では、2台のうち1台の受信機(Receiver-2)で239.1.1.1のマルチキャスト受信が不要となったため、離脱します。 Receiver-2の設定で、ip igmp join-group 239.1.1.1を削除した時の、LHRのパケットキャプチャを確認します。

 239.1.1.1の離脱(Leave)メッセージが送信されています。このメッセージを受信したLHRは、すぐにメンバーシップクエリを送信します。ただし、今までのメンバーシップクエリはマルチキャストグループを指定していません(General)でしたが、今回は、239.1.1.1を指定して、他に受信機がないかクエリしています。

 ここで、面白いのが、メンバーシップクエリの最大応答時間(Max Resp Time) が今まで10秒だったのが、1秒に変更されています。 他に239.1.1.1を受信したい受信機(Receiver-1)は、このメッセージを受け取って、1秒以内にメンバーシップレポートを送信します。

最後の受信機(Receiver-1)の離脱

 最後の239.1.1.1の受信機が離脱した場合を確認します。まず、離脱前のLHRのIGMPのグループ学習状態を確認しておきます。

LHR# show ip igmp groups
IGMP Connected Group Membership
Group Address    Interface                Uptime    Expires   Last Reporter   
239.1.1.1        FastEthernet0/0.123      00:41:15  00:02:50  192.168.123.2 

 グループアドレス:239.1.1.1を学習しています。Expireするには2分50秒残っています。

 では、最後の受信機で239.1.1.1から離脱します。

Receiver-1(config)# interface fastEthernet 0/0.123
Receiver-1(config-subif)# no ip igmp join-group 239.1.1.1

 すると、受信機から離脱(Leave)メッセージが送信されます。

 すぐに、LHRから239.1.1.1を指定して、他に受信機がないかメンバーシップクエリします。もちろん、受信機はもういないので、誰もメンバーシップレポートを応答しません。

 LHRのIGMP学習状態を連続して確認すると、グループアドレス:239.1.1.1のExpiresがすぐにゼロになり、リストから消去されます。

LHR# show ip igmp groups 
IGMP Connected Group Membership
Group Address    Interface                Uptime    Expires   Last Reporter   
239.1.1.1        FastEthernet0/0.123      00:00:13  00:02:46  192.168.123.2   

LHR# show ip igmp groups 
IGMP Connected Group Membership
Group Address    Interface                Uptime    Expires   Last Reporter   
239.1.1.1        FastEthernet0/0.123      00:00:25  00:00:00  192.168.123.2   

LHR# show ip igmp groups 
IGMP Connected Group Membership
Group Address    Interface                Uptime    Expires   Last Reporter   

 これが離脱(Leave)の仕組みです。

 これでざっくりとIGMPの動作が確認できました。

 最後までお読み頂きありがとうございました。

コメント