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

 

ある受信機が 239.1.1.1 のマルチキャストを受信したいとき、受信機は自分に一番近いルータ(ラストホップルータ:LHR)に「239.1.1.1 を配信してください」と依頼します。このときに使うプロトコルが IGMP(Internet Group Management Protocol)です。この記事では、よく使われる IGMPv2 の動作を、Cisco ルータの検証とパケットキャプチャで確認します。

マルチキャストルーティングの全体像は、先に次の記事を読んでおくと理解しやすくなります。

>> 参考:【初心者わかりやすく】マルチキャストルーティングの第1歩

この記事でわかること
  1. IGMPv2 のメッセージ(Query、Report、Leave Group)と宛先アドレス
  2. LHR が定期的に送る General Query と、受信機がランダムな時間待って返す Report
  3. 同じグループの受信機が複数いるときに、Report の数を減らす仕組み
  4. 受信機が離脱するときの Leave Group と Group-Specific Query の動き

IGMP とは

IGMP は、同じセグメントにいる受信機(ホスト)とルータの間で、「どのマルチキャストグループを受信したいか」をやりとりするプロトコルです。ルータは IGMP で、自分のインターフェースの先にどのグループの受信機がいるかを把握し、そのグループのマルチキャストだけをセグメントに流します。

IGMP には、バージョン1〜3があります。

バージョン特徴
IGMPv1Query と Report だけ。受信機が離脱を伝える手段はなく、Report が来なくなるまで待つ
IGMPv2離脱を伝える Leave Group と、グループを指定した Query(Group-Specific Query)が追加された。離脱がすぐにわかる
IGMPv3受信したい送信元を指定できる(ソースフィルタリング)。送信元を指定して受信する SSM(Source Specific Multicast)で必要になる

この記事では、よく使われる IGMPv2 を扱います。IGMPv2 のメッセージは次の3種類です。

メッセージType送信元宛先
Membership Query(General Query)0x11ルータ224.0.0.1(同じセグメントのすべての機器)
Membership Query(Group-Specific Query)0x11ルータ問い合わせるグループのアドレス
Membership Report(Version 2)0x16受信機受信したいグループのアドレス
Leave Group0x17受信機224.0.0.2(同じセグメントのすべてのルータ)

検証構成

LHR の FastEthernet0/0.123(192.168.123.1)と、2台の受信機 Receiver-1(192.168.123.2)、Receiver-2(192.168.123.3)が、同じセグメント 192.168.123.0/24 につながっています。受信機には Cisco ルータを使います。

192.168.123.0/24 LHR .1 Fa0/0.123 ラストホップルータ .2 .3 Receiver-1 受信機1 Receiver-2 受信機2
図1 検証構成
画面イメージについて

この記事のパケットキャプチャの画面は、実際の画面ではなく、検証時の画面から見るポイントを抜き出して描いたイメージです。バージョンによって、項目の並びや表記は変わります。

IGMPv2 の動作を確認する

LHR で IGMP を有効にする

LHR で IGMP を受け付けるには、マルチキャストルーティングを有効にし、受信機がつながるインターフェースで PIM を有効にします。Cisco ルータでは、インターフェースで PIM を有効にすると、そのインターフェースで IGMP(既定はバージョン2)も有効になります。

LHR

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

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

LHR

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 is enabled on interfaceこのインターフェースで IGMP が有効
Current IGMP router version is 2ルータとして動く IGMP のバージョンは 2
IGMP query interval is 60 secondsGeneral Query を送る間隔は 60 秒
IGMP max query response time is 10 secondsGeneral Query に入れる最大応答時間(Max Resp Time)は 10 秒
Last member query count is 2Leave Group を受け取ったあと、Group-Specific Query を送る回数は 2 回
Last member query response interval is 1000 msGroup-Specific Query に入れる最大応答時間と、その送信間隔は 1 秒
IGMP querying router is 192.168.123.1 (this system)このセグメントで Query を送るルータ(クエリア)は LHR 自身
Query の間隔の既定値

IGMPv2 の仕様(RFC 2236)では、General Query の間隔の既定値は 125 秒ですが、Cisco ルータの既定値は 60 秒です。同じセグメントに複数のルータがあるときは、IP アドレスがいちばん小さいルータがクエリアになり、Query を送ります。

ここで、LHR のパケットをキャプチャしてみます。LHR から IGMPv2 の Membership Query が、60 秒ごとに送られていることがわかります。

パケットキャプチャ(Wireshark):LHR の General Query画面イメージ
TimeSourceDestinationProtocolInfo
50.693151192.168.123.1224.0.0.1IGMPv2Membership Query, general
110.719991192.168.123.1224.0.0.1IGMPv2Membership Query, general
170.695989192.168.123.1224.0.0.1IGMPv2Membership Query, general
230.704782192.168.123.1224.0.0.1IGMPv2Membership Query, general
290.694977192.168.123.1224.0.0.1IGMPv2Membership Query, general
▸ Ethernet II, Src: 00:00:00_00:11:11 (00:00:00:00:11:11), Dst: IPv4mcast_01 (01:00:5e:00:00:01)▸ 802.1Q Virtual LAN, PRI: 0, DEI: 0, ID: 1231▸ Internet Protocol Version 4, Src: 192.168.123.1, Dst: 224.0.0.1▾ Internet Group Management Protocol    [IGMP Version: 2]2    Type: Membership Query (0x11)3    Max Resp Time: 10.0 sec (0x64)    Checksum: 0xee9b [correct]    [Checksum Status: Good]4    Multicast Address: 0.0.0.0
図2 LHR の General Query(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1Dst: 224.0.0.1宛先は、同じセグメントのすべての機器を表す 224.0.0.1。一覧の Time を見ると、約 60 秒ごとに送られている
2Type: Membership Query (0x11)Membership Query
3Max Resp Time: 10.0 sec受信機が Report を返すまでの最大の待ち時間は 10 秒
4Multicast Address: 0.0.0.0グループを指定していない General Query(一覧の Info では general)

General Query で、LHR は「マルチキャストを受信したい機器はいますか?」と定期的に問い合わせます。受信したい機器がいなければ、受信機からは何も返ってきません。

受信機から参加を要求する

IGMP は、Windows、macOS、Linux など一般的な OS でサポートされています。Cisco ルータもサポートしているので、ここでは受信機を Cisco ルータにして、239.1.1.1 の受信を要求します。

Receiver-1

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

ip igmp join-group を設定すると、ルータ自身がそのグループのメンバー(受信機)として動き、IGMP の Report を送ります。受信機側のパケットをキャプチャすると、設定した直後に、受信機から 239.1.1.1 宛てに IGMPv2 の Membership Report が送られています。

パケットキャプチャ(Wireshark):Receiver-1 の Membership Report画面イメージ
TimeSourceDestinationProtocolInfo
17.974090192.168.123.2239.1.1.1IGMPv2Membership Report group 239.1.1.1
▸ Ethernet II, Src: 00:00:00_00:22:22 (00:00:00:00:22:22), Dst: IPv4mcast_01:01:01 (01:00:5e:01:01:01)▸ 802.1Q Virtual LAN, PRI: 0, DEI: 0, ID: 1231▸ Internet Protocol Version 4, Src: 192.168.123.2, Dst: 239.1.1.1▾ Internet Group Management Protocol    [IGMP Version: 2]2    Type: Membership Report (0x16)    Max Resp Time: 0.0 sec (0x00)    Checksum: 0xf9fc [correct]    [Checksum Status: Good]3    Multicast Address: 239.1.1.1
図3 Receiver-1 の Membership Report(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1Dst: 239.1.1.1宛先は、受信したいグループのアドレスそのもの
2Type: Membership Report (0x16)IGMPv2 の Membership Report
3Multicast Address: 239.1.1.1受信したいグループ

Membership Report で、受信機は「239.1.1.1 を配信してください」と要求します。LHR が Report を受け取ったかを確認します。

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   
列意味
Group Address受信機がいるグループ
Interfaceそのグループの受信機がいるインターフェース
Uptimeグループを学習してからの時間
Expiresこの時間までに Report が来なければ、グループを削除する。Report を受け取るたびに延長される
Last Reporter最後に Report を送ってきた受信機

192.168.123.2(Receiver-1)から、グループ 239.1.1.1 の Report を受け取っていることがわかります。

このあとも、LHR は 60 秒ごとに General Query を送り、受信機はそのたびに Report を返します。

パケットキャプチャ(Wireshark):General Query と Report画面イメージ
TimeSourceDestinationProtocolInfo
18.068645192.168.123.1224.0.0.1IGMPv2Membership Query, general
24.756587192.168.123.2239.1.1.1IGMPv2Membership Report group 239.1.1.1
78.073707192.168.123.1224.0.0.1IGMPv2Membership Query, general
81.353463192.168.123.2239.1.1.1IGMPv2Membership Report group 239.1.1.1
▸ Internet Protocol Version 4, Src: 192.168.123.1, Dst: 224.0.0.1▾ Internet Group Management Protocol    [IGMP Version: 2]    Type: Membership Query (0x11)1    Max Resp Time: 10.0 sec (0x64)    Checksum: 0xee9b [correct]    [Checksum Status: Good]    Multicast Address: 0.0.0.0
図4 Query から Report までの時間は毎回ちがう(実際の画面ではなく、表示内容のポイントを示したイメージです)

一覧の Time を見ると、Query を受け取ってから Report を返すまでの時間が、1回目は約 6.7 秒、2回目は約 3.3 秒と、毎回ちがいます。受信機が不安定なわけではなく、これは仕様どおりの動きです。

General Query の中身を見ると、最大応答時間(Max Resp Time)が 10 秒になっています。受信機はこの値を受け取り、0〜10 秒の範囲でランダムに決めた時間だけ待ってから Report を返します。

LHR 192.168.123.1 Receiver-1 192.168.123.2 General Query(宛先 224.0.0.1) Max Resp Time 10 秒 待ち時間 0〜10 秒のランダム Report(宛先 239.1.1.1) グループ 239.1.1.1 を受信したい 60 秒 次の General Query
図5 General Query と Report のやりとり

2台目の受信機を追加する

2台目の受信機 Receiver-2 でも、239.1.1.1 の受信を要求します。

Receiver-2

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

LHR の General Query に対して、2台とも Report を返しているかを、パケットキャプチャで確認します。

パケットキャプチャ(Wireshark):受信機が2台のときの Report画面イメージ
TimeSourceDestinationProtocolInfo
211.575803192.168.123.1224.0.0.1IGMPv2Membership Query, general
212.018917192.168.123.2239.1.1.1IGMPv2Membership Report group 239.1.1.1
271.553330192.168.123.1224.0.0.1IGMPv2Membership Query, general
279.630815192.168.123.2239.1.1.1IGMPv2Membership Report group 239.1.1.1
331.565016192.168.123.1224.0.0.1IGMPv2Membership Query, general
332.824154192.168.123.2239.1.1.1IGMPv2Membership Report group 239.1.1.1
391.569987192.168.123.1224.0.0.1IGMPv2Membership Query, general
393.029931192.168.123.2239.1.1.1IGMPv2Membership Report group 239.1.1.1
451.569804192.168.123.1224.0.0.1IGMPv2Membership Query, general
454.050772192.168.123.3239.1.1.1IGMPv2Membership Report group 239.1.1.1
511.563515192.168.123.1224.0.0.1IGMPv2Membership Query, general
515.426852192.168.123.3239.1.1.1IGMPv2Membership Report group 239.1.1.1
図6 1回の Query に対して、Report は1台からだけ返る(実際の画面ではなく、表示内容のポイントを示したイメージです)

2台とも Report を返すのではなく、1回の Query に対して、Receiver-1(192.168.123.2)か Receiver-2(192.168.123.3)のどちらか1台だけが Report を返しています。どちらが返すかは、そのときどきで変わります。

受信機は、それぞれランダムな時間だけ待ってから Report を送ろうとします。Report は受信したいグループのアドレス宛てに送るので、同じグループのほかの受信機にも届きます。待っている間にほかの受信機の Report を受け取った受信機は、自分の Report の送信をやめます。こうして、いちばん早く待ち時間が切れた1台だけが Report を返します。

LHR 192.168.123.1 Receiver-1 192.168.123.2 Receiver-2 192.168.123.3 General Query(宛先 224.0.0.1) Max Resp Time 10 秒 待ち時間 短いほう 待ち時間 長いほう Report(宛先 239.1.1.1) ほかの受信機の Report を 受け取ったので送信をやめる LHR はグループ 239.1.1.1 の受信機が 1台以上いることだけ分かればよい
図7 ほかの受信機の Report を受け取ると、Report の送信をやめる

LHR は、そのセグメントにグループ 239.1.1.1 の受信機が1台以上いることさえわかれば、マルチキャストを流せます。この仕組みがなければ、例えば受信機が 10 台あると、Query のたびに Report も 10 パケット送られ、ネットワークの効率が悪くなります。

受信機の1台が離脱する

2台のうち Receiver-2 で、239.1.1.1 の受信が不要になったので離脱させます。Receiver-2 の設定から ip igmp join-group 239.1.1.1 を削除したときの、LHR のパケットキャプチャを確認します。

パケットキャプチャ(Wireshark):Receiver-2 の Leave Group画面イメージ
TimeSourceDestinationProtocolInfo
27.596554192.168.123.1224.0.0.1IGMPv2Membership Query, general
34.448778192.168.123.3239.1.1.1IGMPv2Membership Report group 239.1.1.1
54.071635192.168.123.3224.0.0.2IGMPv2Leave Group 239.1.1.1
54.078151192.168.123.1239.1.1.1IGMPv2Membership Query, specific for group 239.1.1.1
55.120085192.168.123.2239.1.1.1IGMPv2Membership Report group 239.1.1.1
▸ Ethernet II, Src: 00:00:00_00:33:33 (00:00:00:00:33:33), Dst: IPv4mcast_02 (01:00:5e:00:00:02)▸ 802.1Q Virtual LAN, PRI: 0, DEI: 0, ID: 1231▸ Internet Protocol Version 4, Src: 192.168.123.3, Dst: 224.0.0.2▾ Internet Group Management Protocol    [IGMP Version: 2]2    Type: Leave Group (0x17)    Max Resp Time: 0.0 sec (0x00)    Checksum: 0xf8fc [correct]    [Checksum Status: Good]3    Multicast Address: 239.1.1.1
図8 Receiver-2 の Leave Group(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1Dst: 224.0.0.2宛先は、同じセグメントのすべてのルータを表す 224.0.0.2
2Type: Leave Group (0x17)グループからの離脱を伝える Leave Group
3Multicast Address: 239.1.1.1離脱するグループ

Receiver-2 から、239.1.1.1 の Leave Group が送られています。これを受け取った LHR は、すぐに Membership Query を送ります。ただし、これまでの General Query はグループを指定していませんでしたが、今回は 239.1.1.1 を指定して「ほかに 239.1.1.1 の受信機はいませんか?」と問い合わせています。これを Group-Specific Query といいます。

パケットキャプチャ(Wireshark):LHR の Group-Specific Query画面イメージ
▸ Ethernet II, Src: 00:00:00_00:11:11 (00:00:00:00:11:11), Dst: IPv4mcast_01:01:01 (01:00:5e:01:01:01)▸ 802.1Q Virtual LAN, PRI: 0, DEI: 0, ID: 1231▸ Internet Protocol Version 4, Src: 192.168.123.1, Dst: 239.1.1.1▾ Internet Group Management Protocol    [IGMP Version: 2]    Type: Membership Query (0x11)2    Max Resp Time: 1.0 sec (0x0a)    Checksum: 0xfef2 [correct]    [Checksum Status: Good]3    Multicast Address: 239.1.1.1
図9 LHR の Group-Specific Query(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1Dst: 239.1.1.1宛先は、問い合わせるグループのアドレス
2Max Resp Time: 1.0 sec最大応答時間が、General Query の 10 秒から 1 秒に短くなっている
3Multicast Address: 239.1.1.1問い合わせるグループ

ここで面白いのは、最大応答時間(Max Resp Time)が、これまでの 10 秒から 1 秒に変わっていることです。この 1 秒は、STEP 1 で確認した Last member query response interval is 1000 ms の値です。受信機がいなくなったかどうかを早く判断するために、短い時間で返事を求めています。

まだ 239.1.1.1 を受信したい Receiver-1 は、この Query を受け取ると、最大 1 秒のランダムな時間だけ待って Report を返します(一覧では、Query から約 1 秒後)。

パケットキャプチャ(Wireshark):Receiver-1 の Report画面イメージ
▸ Ethernet II, Src: 00:00:00_00:22:22 (00:00:00:00:22:22), Dst: IPv4mcast_01:01:01 (01:00:5e:01:01:01)▸ 802.1Q Virtual LAN, PRI: 0, DEI: 0, ID: 1231▸ Internet Protocol Version 4, Src: 192.168.123.2, Dst: 239.1.1.1▾ Internet Group Management Protocol    [IGMP Version: 2]2    Type: Membership Report (0x16)    Max Resp Time: 0.0 sec (0x00)    Checksum: 0xf9fc [correct]    [Checksum Status: Good]    Multicast Address: 239.1.1.1
図10 Group-Specific Query に Receiver-1 が Report を返す(実際の画面ではなく、表示内容のポイントを示したイメージです)

まだ受信機がいることがわかったので、LHR は 239.1.1.1 のマルチキャストを流し続けます。

LHR 192.168.123.1 Receiver-1 192.168.123.2 Receiver-2 192.168.123.3 Leave Group(宛先 224.0.0.2) グループ 239.1.1.1 から離脱 Group-Specific Query 宛先 239.1.1.1 Max Resp Time 1 秒 最大 1 秒 Report(宛先 239.1.1.1) まだ受信機がいるので、239.1.1.1 の配信を続ける
図11 受信機の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:41:15  00:02:50  192.168.123.2 

グループ 239.1.1.1 を学習しています。Expires は、あと 2 分 50 秒です。

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

Receiver-1

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

すると、受信機から Leave Group が送られます。

パケットキャプチャ(Wireshark):最後の受信機の Leave Group画面イメージ
TimeSourceDestinationProtocolInfo
2.262265192.168.123.2239.1.1.1IGMPv2Membership Report group 239.1.1.1
14.460236192.168.123.2224.0.0.2IGMPv2Leave Group 239.1.1.1
14.464321192.168.123.1239.1.1.1IGMPv2Membership Query, specific for group 239.1.1.1
15.532269192.168.123.1239.1.1.1IGMPv2Membership Query, specific for group 239.1.1.1
▸ Ethernet II, Src: 00:00:00_00:22:22 (00:00:00:00:22:22), Dst: IPv4mcast_02 (01:00:5e:00:00:02)▸ 802.1Q Virtual LAN, PRI: 0, DEI: 0, ID: 1231▸ Internet Protocol Version 4, Src: 192.168.123.2, Dst: 224.0.0.2▾ Internet Group Management Protocol    [IGMP Version: 2]2    Type: Leave Group (0x17)    Max Resp Time: 0.0 sec (0x00)    Checksum: 0xf8fc [correct]    [Checksum Status: Good]    Multicast Address: 239.1.1.1
図12 最後の受信機の Leave Group と、そのあとの Group-Specific Query(実際の画面ではなく、表示内容のポイントを示したイメージです)

LHR は、すぐに 239.1.1.1 を指定した Group-Specific Query で、ほかに受信機がいないかを問い合わせます。一覧を見ると、Group-Specific Query は約 1 秒の間隔で 2 回送られています。これは、STEP 1 で確認した Last member query count is 2(2 回)と Last member query response interval is 1000 ms(1 秒)のとおりです。2 回の Query の中身は、STEP 4 の Group-Specific Query と同じで、Max Resp Time は 1 秒です。

もちろん、受信機はもういないので、どの機器も Report を返しません。LHR のグループの学習状態を続けて確認すると、239.1.1.1 の Expires がすぐに 0 になり、一覧から消えます。

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: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   
LHR 192.168.123.1 Receiver-1 192.168.123.2 Leave Group(宛先 224.0.0.2) グループ 239.1.1.1 から離脱 Group-Specific Query(1回目) 宛先 239.1.1.1 Max Resp Time 1 秒 Group-Specific Query(2回目) 1 秒 Report なし 受信機がいなくなったので、239.1.1.1 をグループの一覧から削除
図13 最後の受信機が離脱したときのやりとり

これが、IGMPv2 の離脱(Leave)の仕組みです。IGMPv1 には Leave Group がないので、ルータは Report が来なくなって Expires が切れるまで、受信機のいなくなったセグメントにマルチキャストを流し続けます。IGMPv2 では、Leave Group と Group-Specific Query で、受信機がいなくなったことを数秒で判断できます。

まとめ

場面IGMPv2 の動き
定期的な確認LHR が 224.0.0.1 宛てに General Query を送る(Cisco の既定は 60 秒ごと、Max Resp Time 10 秒)
参加の要求受信機がグループのアドレス宛てに Report を送る。Query への返事は、0〜Max Resp Time のランダムな時間待ってから送る
受信機が複数ほかの受信機の Report を受け取った受信機は、自分の Report を送らない。1回の Query に返る Report は1つで済む
離脱受信機が 224.0.0.2 宛てに Leave Group を送る。LHR はグループ宛てに Group-Specific Query(Max Resp Time 1 秒)を送る
最後の受信機の離脱Group-Specific Query を 1 秒間隔で 2 回送っても Report がなければ、LHR はグループを削除する

これで、IGMPv2 の動作をひととおり確認できました。

コメント