目录

前言
IGMP 的运作原理
  IGMP Version 1
  IGMP Version 2
  IGMP Version 3
  启动 IGMP
IGMP Querier
Multicast Group 的 MAC Address
IGMP Snooping
IGMP Filtering

前言

关於 Multicast,本网已讨论过用在 Layer 3 范畴的 PIM (Protocol Independent Multicast) 这款 Router 之间用作 Multicast Routing 的 Protocol。而在 Layer 2 的范畴,则有 IGMP (Internet Group Management Protocol) 负责 Host 与 PIM Router 之间的互动。笔者建议读者先对 PIM 有基本认识才研读 IGMP,因为 PIM 是 Multicast 的源头,而 IGMP 则是 Multicast 的最下游,从源头开始了解会比较容易消化和吸收。

IGMP 的运作原理

假设 Multicast Traffic 已经从源头经过 PIM Network 来到 Layer 3 的最後一只 PIM Router,问题是 Router 也不只有一个 Interface,到底那个 Interface 的 Host 需要 Multicast Traffic?还是全部都需要? IGMP 的作用就是 Host 和 Router 之间沟通的语言,透过使用 IGMP,Router 可以知道那些 Host 需要什麽 Multicast Group。

igmp

原理很简单,当 Router (IGMP Querier) 手上有收到一些 Multicast Group 时,它便会发 Query 讯息问有没有 Host 需要此 Group?如有 Host (Receiver) 需要,它会回应 IGMP Membership Report 讯息,Router 便知道有 Host 需要了,因此会把 Multicast Traffic 传过去相对的 Interface,相反如果 Host 没有回应,Router 知道没有 Host 需要该些 Group 了,就可以不传送 Multicast Traffic 到该 Interface 了。

而 IGMP 共有 3 个 Version,分别是 Version 1丶Version 2 及 Version 3。

IGMP Version 1

使用 IGMP Version 1 的 Router 预设每 60 秒 (query-interval) 发送 Membership Query 查询有没有 Host 需要它手上的 Group,Host 收到後,如果需要则回应 IGMP Membership Report。如 Router 能在 Max Response Time (预设 10 秒) 内收到回覆,则判断有 Host 需要 Multicast Group。当 Host 表示需要 Multicast Group 後,仍需於每次 Router 发送 IGMP Membership Query 时回覆以维持其对 Multicast Group 的需要。相反,如 Host 不再需要 Multicast Group,只需忽略来自 Router 的 Query,如 Router 发了 Query 後过了 180 秒都没有收到 IGMP Membership Report 的话则 Router 判断 Host 已不再需要此 Group。另外,Host 亦能随时主动发送 IGMP Membership Report 给 Router 要求接收某 Group。Router 修改 query-interval 方法如下。

R1(config-if)#ip igmp query-interval 120

IGMP Version 2

Version 2 比 Version 1 进步的地方是新增了 Leave Group Message,即 Host 决定不需接收 Multicast Group 时可以发 Leave Group Message 给 Router。当 Router 收到 Leave Group Message 後,会每隔 Last-member-query-interval (预设 1000ms) 送出一个 Last-member-query,去询问有没有 Host 仍需要此 Group。Query 总次数由 Last-member-query-count 控制,预设为 2 次。即是说当 Router 收到 Leave Group Message 後会送出第一个 Last-member-query,然後数到 1000ms 再送出第二个,如两个 Last-member-query 都收不到回应则判断该 Interface 已经没有 Host 需要该 Multicast Group。更改 Last-member-query-interval 及 Last-member-query-count 的指令如下。

R1(config-if)#ip igmp last-member-query-interval 2000
R1(config-if)#ip igmp last-member-query-count 4

如果我们确定该 Interface 只有一只 Host,亦可要求 Router 在收到某些 Group 的 Leave Group Message 时不送出 Last-member-query 直接判断该 Interface 所有 Host 已 Leave Group。

R1(config)#access-list 1 permit 224.1.1.1
R1(config)#int eth1/0 R1(config-if)#ip igmp immediate-leave group-list 1

此外,从 Version 2 开始亦可改变 Max Response Time,也优化了 Router 对 Multicast Group 的判断。修改 Max Response Time 指令如下。

R1(config-if)#ip igmp query-max-response-time 20

IGMP Version 3

而 Version 3 则可支援 Source Specific Multicast (SSM),让 Host 可以选择接收特定 Source Address 的 Multicast Traffic。有关 SSM 的详情,请观看 PIM 教学文件。

启动 IGMP

作为 IGMP Querier 的一方,Router 只需要执行了 PIM,则 IGMP 会自动启动。至於 Receiver 方面,如果我们想在做实验时利用 Router 来充当 Multicast Client,则可使用 ip igmp join-group 来启动 IGMP,并用 ip igmp version 来设定 Version,预设为 Version 2。

R2(config-if)#ip igmp join-group 224.1.1.1
R2(config-if)#ip igmp version ?
    version number
R2(config-if)#ip igmp version 2

最後我们可以用 show ip igmp interface 查询 IGMP 的 Version 及 Timer 等资讯。

R2#show ip igmp interface ethernet 1/0
Ethernet1/0 is up, line protocol is up
  Internet address is 192.168.12.2/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: 1 joins, 0 leaves
  Multicast routing is disabled on interface
  Multicast TTL threshold is 0
  Multicast groups joined by this system (number of users):
      224.1.1.1(1)

IGMP Querier

Router 经常会发 IGMP Query 到网络与 Host 沟通,试想想如同一网段中有两只或以上的 PIM Router 存在,它们可能拥有相同的 Group 而发放重覆的 Query Message,这是多馀的。因此同一网段中只有一只 Router 被选为 IGMP Querier,确保 Query Message 不重覆。IGMP Version 1 会选 PIM Designated Router 为 IGMP Querier,而 IGMP Version 2 及 Version 3 则会选 Interface IP Address 较小的成为 IGMP Querier。关於 PIM Designated Router 的设定,可到 PIM 教学文件查询。

当选定 IGMP Querier 後,一旦 Querier 失联,其他 Router 会等待 Querier-timeout 後重新进行 Querier 选举,Querier-timeout 预设为 IGMP Query-interval 的两倍,即 120 秒,设定 Querier-timeout 指令如下。

R2(config-if)#ip igmp querier-timeout 100

Multicast Group 的 MAC Address

众所周知,Router 会把 Unicast Traffic 的 Destination IP Address 1 对 1 地转换成 MAC Address,然後把讯息发到网络,网络上拥有此 MAC Address 的设备便可以接收并处理此讯息。然而,Multicast Traffic 没有 Destination IP Address,只有 Group 来代表多於一个 Destination,Router 该如何处理呢?

原来当 Multicast Packet 被建立时,已即时用 Group Address 去产生一个 MAC Address 写在 Packet 之中。举例,把 Group 224.1.2.3 转换成 MAC Address 的方法如下。

Step 1:
首先把 224.1.2.3 转换成二进制:11100000.00000001.00000010.00000011

Step 2:
只保留最後 23 Bits:0000001.00000010.00000011

Step 3:
在前面补上一串 25 Bits 的 Multicast MAC Prefix:00000001.00000000.01011110.0

00000001.00000000.01011110.00000001.00000010.00000011

Step 4:
用 16 进制表示:0100.5e01.0203

由於 Multicast Address (即 Class D,首 4 Bits 1110) 的 IP 范围是 224.0.0.0 至 239.255.255.255,这个转换机制会让某些 Group 出现相同的 MAC Address 结果,同一网络里应避免同时使用这些 Group。

224.1.2.3 ➡️ 0100.5e01.0203
224.129.2.3 ➡️ 0100.5e01.0203
225.1.2.3 ➡️ 0100.5e01.0203
225.129.2.3 ➡️ 0100.5e01.0203
.
.
.
239.129.2.3 ➡️ 0100.5e01.0203 (共 32 组相同结果)

Router 用以上方法作转换,而 Client Join Multicast Group 时亦使用同一套机制计算出自己需要聆听的 MAC Address,於是当 Multicast Traffic 到达时 Client 便懂得接收和处理。

IGMP Snooping

好!问题来了,如果在 Router 与 Client 之间加入一只 Switch,本来 Switch 是透过 Host 送出讯息时查看 Unicast 信息中的 Source MAC Address 来 Learn Host 位置,但 Host 绝不会用 Multicast Group MAC Address 来发讯息以致这些 MAC Address 无法被 Learn,因而 Switch 无法用处理 Unicast 的方法传送 Multicast。

igmp

要解决这个问题,Switch 大可把 Multicast Traffic 在所有 Port 送出 (如同 Broadcast),但这麽一来就浪费 Bandwidth 了。所以比较有效的方法为 IGMP Snooping。IGMP Snooping 的原理很简单,Switch 会持续偷听 Host 传给 Router 的 Join 和 Leave Message,如有 Join 出现则把 Port 加到 Snooping Table,而收到 Leave 的话则把其移除,於是 Switch 便可按 Snooping Table 判断那个 Port 需要什麽 Group。IGMP Snooping 在 Switch 预设是启动的,使用 show ip igmp snooping groups 可查看 Snooping Table。

Switch#show ip igmp snooping groups 
Vlan      Group                    Type        Version     Port List
-----------------------------------------------------------------------
1         224.0.1.40               igmp        v2          Gi1/0/1
1         224.1.1.1                igmp        v2          Gi1/0/2
1         239.255.255.250          igmp        v2          Gi1/0/11

IGMP Filtering

简单来说,IGMP Filtering 可分为在 Router 做还是在 Switch 做。

在 Router 做的 Filtering 叫 IGMP access-group,可以用 access-list 控制 Router 只接受或不接受某些 Multicast Group, 举例:如想 Router 不接受 Client Join Group 224.1.1.1,设定如下:

R1(config)#access-list 1 deny 224.1.1.1
R1(config)#access-list 1 permit any
R1(config)#int eth1/0
R1(config-if)#ip igmp access-group 1

这样子传给 Router 的 Join 224.1.1.1 将不会成功,开 debug ip igmp 的话应可看到 deny 讯息。

R1#debug ip igmp 
IGMP debugging is on
R1#
*Mar 19 12:22:10.773: IGMP(0): Received v2 Report on GigabitEthernet8 from 192.168.123.2 for 224.1.1.1
*Mar 19 12:22:10.773: IGMP(*): Group 224.1.1.1 access denied on GigabitEthernet8

而在 Switch 做的 Filtering 叫 IGMP Profile,可阻隔所有流经该 Switch 的 IGMP Join 讯息。例如要阻隔所有 Join Group 224.1.1.1 至 224.1.1.255 讯息,设定如下:

SW1(config)#ip igmp profile 1
SW1(config-igmp-profile)#deny
SW1(config-igmp-profile)#range 224.1.1.1 224.1.1.255
SW1(config-igmp-profile)#exit
SW1(config)#int f0/1
SW1(config-if)#ip igmp filter 1

打开 debug,收到不合法 igmp join 时会收到以下讯息。

SW1(config)#debug ip igmp 
IGMP debugging is on
SW1#
Mar 19 11:11:20.359: IGMPFILTER: igmp_filter_process_pkt() checking group from Gi1/0/1 : no profile attached