目录

前言
PIM-DM
PIM-SM
Sparse-Dense-Mode
Auto-RP
  Candidate RP
  Mapping Agent
Bootstrap Router (BSR) Protocol
  Candidate RP
  BSR
Source Specific Multicast (SSM)

前言

PIM (Protocol Independent Multicast) 是可以在网络进行 Multicast Routing 的其中一种 Protocol。所谓 Independent 的意思即是它能够独立地在任何 Unicast Routing Protocol 之环境上执行。PIM 用了 RPF checking 的技术,利用查找 Routing Table 来建立自己的 Multicast Routing Table 把 Multicast packets forward 出去。

PIM-DM

PIM 一个最基本的玩法就是 PIM-Dense Mode (PIM-DM),在 Dense Mode 假设网络中大部份 Host 都需要 Multicast Packet,用一个强暴式的方法把 Multicast 推送 (Push) 到所有 Router,但如果某些 Router 觉得自己真的不需要该 Multicast 讯息,则可对上游的 Router 发出 Purne 讯息拒绝再接收 Multicast。现在我们尝试为一个简单的网络设置 PIM-DM。下图中 R1 至 R4 会执行 Multicast Routing,而 R5 这只 Router 则用来模拟 Multicast Group 224.1.1.1 的 Source,它会发放封包到 224.1.1.1。

pim

因为 PIM-DM 需要用到 Routing Table 来在 Multicast Routing 的判断,所以我们要先对 Router 执行好 Routing Protocol,本例子用 OSPF 作为示範。R1, R2, R3, R4 都执行了 OSPF。

router ospf 1
 network 0.0.0.0 255.255.255.255 area 0

然後设定 PIM-DM 所用的指令其实非常简单。先用 ip multicast-routing 启动 Multicast Routing,然後在各个要执行 Multicast Routing 的 Router 所连接的 Interface 使用 ip pim dense-mode。要留意的是 R1 连接 Multicast Source 的 Interface 亦需要执行。

R1(config)#ip multicast-routing
R1(config)#int range ethernet 0/0 - 2
R1(config-if-range)#ip pim dense-mode
R2(config)#ip multicast-routing
R2(config)#int range ethernet 0/0 - 1
R2(config-if-range)#ip pim dense-mode
R3(config)#ip multicast-routing
R3(config)#int range ethernet 0/0 - 1
R3(config-if-range)#ip pim dense-mode
R4(config)#ip multicast-routing
R4(config)#int range ethernet 0/0 - 1
R4(config-if-range)#ip pim dense-mode

多简单的设定!要知道各 Router 是否成功成为 PIM Neighbor,可使用 show ip pim neighbor 来查看,例如在 R2 输入这道指令,会得到以下结果:

R2#show ip pim neighbor
PIM Neighbor Table
Mode: B - Bidir Capable, DR - Designated Router, N - Default DR Priority,
      S - State Refresh Capable
Neighbor          Interface                Uptime/Expires    Ver   DR
Address                                                            Prio/Mode
192.168.12.1      Ethernet0/0              00:12:17/00:01:44 v2    1 / S
192.168.24.4      Ethernet0/1              00:29:33/00:01:17 v2    1 / DR S

还有一个指令可以确认 Multicast Routing 是否正在执行中,就是看看 Mutlicast Routing Table,或者简单叫作 mroute Table。试试在各 Router 执行 show ip mroute,如果有资料则代表有 mroute 了。哗!一大推不知名的东西!不要紧张!本篇文章会逐一说明。

R1#show ip mroute
IP Multicast Routing Table
Flags: D - Dense, S - Sparse, B - Bidir Group, s - SSM Group, C - Connected,
       L - Local, P - Pruned, R - RP-bit set, F - Register flag,
       T - SPT-bit set, J - Join SPT, M - MSDP created entry,
       X - Proxy Join Timer Running, A - Candidate for MSDP Advertisement,
       U - URD, I - Received Source Specific Host Report,
       Z - Multicast Tunnel, z - MDT-data group sender,
       Y - Joined MDT-data group, y - Sending to MDT-data group
Outgoing interface flags: H - Hardware switched, A - Assert winner
 Timers: Uptime/Expires
 Interface state: Interface, Next-Hop or VCD, State/Mode

(*, 224.0.1.40), 00:26:51/00:02:06, RP 0.0.0.0, flags: DCL
  Incoming interface: Null, RPF nbr 0.0.0.0
  Outgoing interface list:
    Ethernet0/0, Forward/Dense, 00:26:53/00:00:00
    Ethernet0/1, Forward/Dense, 00:26:53/00:00:00

网络中如果有 PC 想接收 Multicast 的话,理论上它会向 Router 发出 IGMP Join 讯息,但现在我们在这个测试的网络中没有 PC,那怎样去测试接收 Multicast 呢?那就得靠幻想了!我们幻想 R2 和 R4 的 e0/2 都连著一台 PC,它们都希望接收 224.1.1.1。

pim

幻想归幻想,PC 没存在怎样接收 Multicast 呢?大家可以在 e0/2 使用 ip igmp join-group  来强迫 R2 和 R4 接收 Multicast。

R2(config)#interface ethernet 0/2
R2(config-if)#ip igmp join-group 224.1.1.1
R4(config)#interface ethernet 0/2
R4(config-if)#ip igmp join-group 224.1.1.1

真的成功吗?到 R5 去 Ping 一下 224.1.1.1,果然 Ping 到了!和普通 Ping 的结果不同,你会发现有两个 IP 回应 Ping,那就正好證明了有两个 host 都加入了 224.1.1.1 这个 Group,所以 Ping 224.1.1.1 的时候两个 host 都有回应。

R5#ping 224.1.1.1 repeat 3

Type escape sequence to abort.
Sending 3, 100-byte ICMP Echos to 224.1.1.1, timeout is 2 seconds:

Reply to request 0 from 192.168.12.2, 108 ms
Reply to request 0 from 192.168.34.4, 188 ms
Reply to request 1 from 192.168.12.2, 184 ms
Reply to request 1 from 192.168.34.4, 184 ms
Reply to request 2 from 192.168.12.2, 144 ms
Reply to request 2 from 192.168.34.4, 176 ms

大家有没有想过,只有 Group IP 却没有 Destination IP,Router 是怎样传到正确的 Destination 呢?试想想,当每一个 Router 收到一个 Multicast Packet ,都把 Packet 尽量远离 Source 地传开去,最终网络上所有 Router 都收到这个 Multicast Packet。但这又产生了另一个问题,就是可能会出现 Loop 的情况。所以 Router 收到 Multicast Packet 时会先检查 Packet 的 Source IP 是否从 Route Table 中的 Best Path 到达本 Router,如果正确 (即通过检查),才把 Multicast Packet 传出去,否则就会 Drop 掉,这就能保證同一个 Multicast Packet 只经过本 Router 一次。这就是 PIM 所用的 Reverse Path Forwarding (RPF) Checking,亦建立了所谓的 Shortest Path Tree (SPT)。

试用刚刚 R5 传到 R1 的 Multicast Packet 做例子,这 Packet Destination 是 224.1.1.1 而 Source IP 就是 192.168.15.5 (R5 的 e0/0),当这个 Packet 传到 R1 的 e0/2 时,R1 会做 RPF Checking,看看 192.168.15.5 从 e0/2 进来是否 Best Path,看看 Routing Table 就知道了,是正确的,不会 Drop。

R1#show ip route | begin Gateway
Gateway of last resort is not set

C    192.168.12.0/24 is directly connected, Ethernet0/0
C    192.168.13.0/24 is directly connected, Ethernet0/1
C    192.168.15.0/24 is directly connected, Ethernet0/2
O    192.168.24.0/24 [110/20] via 192.168.12.2, 00:39:14, Ethernet0/0
O    192.168.26.0/24 [110/20] via 192.168.12.2, 00:39:14, Ethernet0/0
     10.0.0.0/24 is subnetted, 4 subnets
O       10.1.25.0 [110/20] via 192.168.15.5, 00:39:14, Ethernet0/2
O       10.1.47.0 [110/30] via 192.168.13.3, 00:39:14, Ethernet0/1
                  [110/30] via 192.168.12.2, 00:39:14, Ethernet0/0
O       10.1.58.0 [110/20] via 192.168.15.5, 00:39:14, Ethernet0/2
O       10.1.56.0 [110/20] via 192.168.15.5, 00:39:14, Ethernet0/2
O    192.168.34.0/24 [110/20] via 192.168.13.3, 00:39:14, Ethernet0/1

不过,正确来说 R1 并不是查 Routing Table,而是查 RPF Table,我们可以输入指令 show ip rpf  来看看 RPF Table。RPF Table 会按著 Routing Table 每 5 秒更新一次,也算够效率吧!

R1#show ip rpf 192.168.15.5
RPF information for ? (192.168.15.5)
  RPF interface: Ethernet0/2
  RPF neighbor: ? (192.168.15.5) - directly connected
  RPF route/mask: 192.168.15.0/24
  RPF type: unicast (connected)
  RPF recursion count: 0
  Doing distance-preferred lookups across tables

又看看 R2 的 RPF Table,如果 Source IP 是 192.168.15.5 的 Multicast 从 e0/0 进来是 OK 的!但如果从其他 Interface 进来就会被 Drop 了。

R2#show ip rpf 192.168.15.5
RPF information for ? (192.168.15.5)
  RPF interface: Ethernet0/0
  RPF neighbor: ? (192.168.12.1)
  RPF route/mask: 192.168.15.0/24
  RPF type: unicast (ospf 1)
  RPF recursion count: 0
  Doing distance-preferred lookups across tables

另一个有趣的例子是 R4 。先看看 Route Table,发现 192.168.15.5 有两条 equal cost 的 path,但因为 RPF 只能取一条跟径,会怎样选择呢?

R4#show ip route | begin Gateway
Gateway of last resort is not set

O    192.168.12.0/24 [110/20] via 192.168.24.2, 00:48:31, Ethernet0/1
O    192.168.13.0/24 [110/20] via 192.168.34.3, 00:48:31, Ethernet0/0
O    192.168.15.0/24 [110/30] via 192.168.34.3, 00:48:31, Ethernet0/0
                     [110/30] via 192.168.24.2, 00:48:31, Ethernet0/1
C    192.168.24.0/24 is directly connected, Ethernet0/1
O    192.168.26.0/24 [110/20] via 192.168.24.2, 00:48:31, Ethernet0/1
     10.0.0.0/24 is subnetted, 4 subnets
O       10.1.25.0 [110/40] via 192.168.34.3, 00:48:31, Ethernet0/0
                  [110/40] via 192.168.24.2, 00:48:31, Ethernet0/1
C       10.1.47.0 is directly connected, Ethernet0/2
O       10.1.58.0 [110/40] via 192.168.34.3, 00:48:31, Ethernet0/0
                  [110/40] via 192.168.24.2, 00:48:31, Ethernet0/1
O       10.1.56.0 [110/40] via 192.168.34.3, 00:48:31, Ethernet0/0
                  [110/40] via 192.168.24.2, 00:48:31, Ethernet0/1
C    192.168.34.0/24 is directly connected, Ethernet0/0

原来遇到这个情况,RPF Table 会选择 Next Hop IP 比较大的一个 Interface。

R4#show ip rpf 192.168.15.5
RPF information for ? (192.168.15.5)
  RPF interface: Ethernet0/0
  RPF neighbor: ? (192.168.34.3)
  RPF route/mask: 192.168.15.0/24
  RPF type: unicast (ospf 1)
  RPF recursion count: 0
  Doing distance-preferred lookups across tables

要證实一下!尝试更改一下 R4 的 OSPF cost 吧!

R4(config-if)#ip ospf cost 10000

R4 的 192.168.15.0/24 只剩一条 Route 了。

R4#show ip route | begin Gateway
Gateway of last resort is not set

O    192.168.12.0/24 [110/20] via 192.168.24.2, 00:03:04, Ethernet0/1
O    192.168.13.0/24 [110/30] via 192.168.24.2, 00:03:04, Ethernet0/1
O    192.168.15.0/24 [110/30] via 192.168.24.2, 00:03:04, Ethernet0/1
C    192.168.24.0/24 is directly connected, Ethernet0/1
O    192.168.26.0/24 [110/20] via 192.168.24.2, 00:03:04, Ethernet0/1
     10.0.0.0/24 is subnetted, 4 subnets
O       10.1.25.0 [110/40] via 192.168.24.2, 00:03:04, Ethernet0/1
C       10.1.47.0 is directly connected, Ethernet0/2
O       10.1.58.0 [110/40] via 192.168.24.2, 00:03:04, Ethernet0/1
O       10.1.56.0 [110/40] via 192.168.24.2, 00:03:04, Ethernet0/1
C    192.168.34.0/24 is directly connected, Ethernet0/0

RPF Table 亦随之而改变。

R4#sh ip rpf 192.168.15.5
RPF information for ? (192.168.15.5)
  RPF interface: Ethernet0/1
  RPF neighbor: ? (192.168.24.2)
  RPF route/mask: 192.168.15.0/24
  RPF type: unicast (ospf 1)
  RPF recursion count: 0
  Doing distance-preferred lookups across tables

究竟整个 Multicast Routing 的过程又是怎样呢?我们又要从 mroute table 说起 ,再用 R5 Ping 224.1.1.1 ,然後先看看 R1 的 mroute table 和之前有什麽分别。你会发现多了两组资料,一共有叁组资料,每一组就是一条 Multicast 的 Route。

第一组 Route 是 (*, 224.1.1.1),224.1.1.1 是 Group IP,所以这组叫 (*,G) Route。

第二组 Route 是 (192.168.15.5, 224.1.1.1),192.168.15.5 是 Source IP,所以这组叫 (S,G) Route。

第叁组 Route 也是一条 (*,G) Route,但我们明明没有使用 224.0.1.40 喔,为什麽会有这条 Route?请注意了,在 dense mode 这条 Route 是全无意义的,请暂时当它不存在,我保證会在稍後再说明。

请按 ⬇️ 查看说明。

R1#show ip mroute
IP Multicast Routing Table
Flags: D - Dense, S - Sparse, B - Bidir Group, s - SSM Group, C - Connected,
       L - Local, P - Pruned, R - RP-bit set, F - Register flag,
       T - SPT-bit set, J - Join SPT, M - MSDP created entry,
       X - Proxy Join Timer Running, A - Candidate for MSDP Advertisement,
       U - URD, I - Received Source Specific Host Report,
       Z - Multicast Tunnel, z - MDT-data group sender,
       Y - Joined MDT-data group, y - Sending to MDT-data group
Outgoing interface flags: H - Hardware switched, A - Assert winner
 Timers: Uptime/Expires
 Interface state: Interface, Next-Hop or VCD, State/Mode

(*, 224.1.1.1), 00:00:04/stopped, RP 0.0.0.0, flags: D
  Incoming interface: Null, RPF nbr 0.0.0.0
  Outgoing interface list:
    Ethernet0/0, Forward/Dense, 00:00:04/00:00:00 1⃣️ ⬇️
    Ethernet0/1, Forward/Dense, 00:00:04/00:00:00

(192.168.15.5, 224.1.1.1), 00:00:04/00:02:55, flags: T 2⃣️ ⬇️
  Incoming interface: Ethernet0/2 3⃣️ ⬇️, RPF nbr 0.0.0.0 4⃣️ ⬇️
  Outgoing interface list:
    Ethernet0/0, Forward/Dense, 00:00:07/00:00:00
    Ethernet0/1, Forward/Dense, 00:00:07/00:00:00

(*, 224.0.1.40), 00:34:34/00:02:25, RP 0.0.0.0, flags: DCL
  Incoming interface: Null, RPF nbr 0.0.0.0
  Outgoing interface list: 5⃣️ ⬇️
    Ethernet0/0, Forward/Dense, 00:34:34/00:00:00
    Ethernet0/1, Forward/Dense, 00:34:34/00:00:00

现在开始说明 Mroute Table 里面是什麽东东。在 Dense Mode 来说,我们应集中看第二条 (S,G) Route,(*,G) 作用不大,只不过在 Cisco Router 来说 (*,G) 是 (S,G) 的妈妈,任何 (S,G) 产生之前,必需先有一条 (*,G),然後 (S,G) 就被 (*,G) 生出来。(*,G) 唯一给我们有用的资讯就是 flags 的位置有一个 D,说明这个 Group 正在执行 Dense Mode。

现在我们用 R4 作例子,来集中研究第二条 (S,G) Route 每个栏位的意思。

(192.168.15.5, 224.1.1.1), 00:00:57/00:02:04, flags: PLT
  Incoming interface: Ethernet0/0, RPF nbr 192.168.34.3
  Outgoing interface list:
    Ethernet0/1, Prune/Dense, 00:00:58/00:02:01

1⃣️ Uptime / Expire Timer 

00:00:57/00:02:04

Uptime 是指这条 mroute 已经执行多久了。Expire Timer 的意思是如果过了这个时间还收不到这个 Source 送来的 Mutlicast ,就砍掉这条 mroute,所以 mroute Table 和 Route Table 不同的是,如果一段时间没有 traffic 的话,mroute 是会消失的。

2⃣️ Flags

Flag 是一个重要的栏位,它能够显示此 Route 的状态,在 Dense Mode 所用到的 Flags 如下:

D- 正在执行 Dense Mode,只会在 (*,G) 出现。

C - 表示有想接收这个 Group 的 Host 正直接连著本 Router,在我们的实验中并不会出现,因为我们没有在实验中用到真正的 Host。

L - 表示本 Router 属於这一个 Group,即是想接收这一个 Group 的 Multicast,如果在 Router 下了 ip igmp join-group  指令,就一定会出现这个 flag 了。

P - 之前说过,如果某 Router 确定不需要这个 Group 的 Multicast,意思是这个 Router 没有一个 interface 说要 Join 这个 group,它就可以对上游说 Prune 来阻止 Multicast 送过来,P 就是 Prune 的意思了。

T - SPT flag,即本 Router 正在帮忙 forward multicast packet,是形成 SPT 的其中一员。

3⃣️ Incoming Interface

很明显就是 Multicast traffic 是从那个 Interface 进入啦。

4⃣️ RPF

刚才说过 RPF 的一些大道理,这就是 Router 用来做 RPF checking 的 Interface 的对家 IP。知道便好了,个人认为对 debug 的作用不大。因为如果要做 PRF 的 debug 的话我们通常用 show ip rpf

5⃣️ Outgoing Interface list

这显示了收回来的 Multicast 会从那个 Interface 送出去,在上面的例子来说,因为 Neighbor R2 跟 R4 说了 Prune 不愿再收到这个 Group,所以中间显示了 Prune,而 Dense 意思是现在正执行 Dense Mode。最後有两个时间,前面是 Uptime 显示维持这个状态多久了。後面是 Expire Timer,原来 Dense Mode 是十分顽固的,每叁分钟 (即是 Timer 倒数到 0) 会再次尝试传送 Mutlicast,届时对方必需再 Prune,週而复此。

所以,只要分析 R1 到 R4 的 Mroute Table 的 Incoming 和 Outgoing,就能知道现时 SPT 的结构。

R1#show ip mroute | begin 192.168.15.5
(192.168.15.5, 224.1.1.1), 00:00:32/00:02:29, flags: T
  Incoming interface: Ethernet0/2, RPF nbr 0.0.0.0
  Outgoing interface list:
    Ethernet0/0, Forward/Dense, 00:00:32/00:00:00
    Ethernet0/1, Prune/Dense, 00:00:27/00:02:32
R2#show ip mroute | begin 192.168.15.5
(192.168.15.5, 224.1.1.1), 00:00:03/00:02:56, flags: LT
  Incoming interface: Ethernet0/0, RPF nbr 192.168.12.1
  Outgoing interface list:
    Ethernet0/1, Forward/Dense, 00:00:03/00:00:00
R3#show ip mroute | begin 192.168.15.5
(192.168.15.5, 224.1.1.1), 00:00:27/00:02:42, flags: PT
  Incoming interface: Ethernet0/1, RPF nbr 192.168.13.1
  Outgoing interface list:
    Ethernet0/0, Prune/Dense, 00:00:22/00:02:37, A
R4#show ip mroute | begin 192.168.15.5
(192.168.15.5, 224.1.1.1), 00:00:46/00:02:15, flags: PLT
  Incoming interface: Ethernet0/1, RPF nbr 192.168.24.2
  Outgoing interface list:
    Ethernet0/0, Prune/Dense, 00:00:46/00:02:13

pim

如果 R4 不再想接收 multicast 会有什麽改变呢?

R4(config)#int ethernet 0/2
R4(config-if)#no ip igmp join-group 224.1.1.1

R4 会对 R2 Prune,所以 R2 的 Outgoing interface 变成 Prune 了。

R2#show ip mroute | begin 192.168.15.5
(192.168.15.5, 224.1.1.1), 00:00:46/00:02:59, flags: PLT
  Incoming interface: Ethernet0/0, RPF nbr 192.168.12.1
  Outgoing interface list:
    Ethernet0/1, Prune/Dense, 00:00:41/00:02:18, A

如果 R2 都不接收 multicast:

R2(config)#int ethernet 0/2
R2(config-if)#no ip igmp join-group 224.1.1.1

R1 的 Outgoin Ethernet0/0 亦变成 Prune。

R1#show ip mroute | begin 192.168.15.5
(192.168.15.5, 224.1.1.1), 00:05:43/00:01:54, flags: PT
  Incoming interface: Ethernet0/2, RPF nbr 0.0.0.0
  Outgoing interface list:
    Ethernet0/0, Prune/Dense, 00:00:56/00:02:03
    Ethernet0/1, Prune/Dense, 00:02:41/00:00:18

PIM-SM

相信 PIM-DM 的设定大家应该都相当明白了,但 PIM-DM 有一个缺点,就是它必需对整个网络强暴地发放 Multicast Packet (Flooding),虽然可以用 Prune 来解决,但每隔 3 分钟仍会被 Flood 一次,除非网络里大部份 host 都需要此 Multicast,否则,这会造成 bandwidth 耗用的问题。相反,如果只有少部份 host 需要 Multicast packet ,我们可以使用 PIM Sparse Mode (PIM-SM),Sparse Mode 是比较「害羞」的模式,并不会向网络主动发放 Multicast,除非收到 Join 讯息才会开始发放。

问题来了,如果 Source 不主动发放 Multicast,想收 Multicast 的 Receiver 又没有 Multicast Source 的 IP,怎样向它 send Join 讯息呢?答案就是我们需要一个中间人来处理,这个中间人叫做 Rendezvous Point (RP)。

要设定 Sparse Mode,方法与 Dense Mode 类似,不过多了一个 RP 的设定,我们再用之前的网络例子作说明:

pim

把 R3 设定为 RP,习惯上我们会用 Lookback IP 来做 RP 的 IP Address。假设 OSPF 已经设定好,R1 至 R4 Sparse Mode 的设定如下:

R1(config)#ip multicast-routing
R1(config)#ip pim rp-address 3.3.3.3
R1(config)#int range ethernet 0/0 - 2
R1(config-if-range)#ip pim sparse-mode

R2 下了一个 ip spt-threshold infinity 的指令,在此先卖个关子,稍後再解释。

R2(config)#ip multicast-routing
R2(config)#ip pim spt-threshold infinity
R2(config)#ip pim rp-address 3.3.3.3
R2(config)#int range ethernet 0/0 - 2
R2(config-if-range)#ip pim sparse-mode

注意:R3 的 Lookback (即是用来做 RP 的那个 Interface) 也要执行 ip pim sparse-mode 指令。

R3(config)#ip multicast-routing
R3(config)#ip pim rp-address 3.3.3.3
R3(config)#int range ethernet 0/0 - 2
R3(config-if-range)#ip pim sparse-mode
R3(config)#int lookback 0
R3(config-if-range)#ip pim sparse-mode
R4(config)#ip multicast-routing
R4(config)#ip pim rp-address 3.3.3.3
R4(config)#int range ethernet 0/0 - 2
R4(config-if-range)#ip pim sparse-mode

一切準备就绪,我们可以开始测试了。首先要确定的是,究竟 Source 是怎样与 RP 连繫起来呢?这个过程相当之快,为了记录这电光火石间,我们可以在 RP (即 R3) 先执行 debug ip pim 指令,打开 debug 来看看。

先确认一下,现时没有 224.1.1.1 的 mroute ,然後开 debug。

R3#show ip mroute 224.1.1.1
Group 224.1.1.1 not found

R3#debug ip pim

现在尝试用 Source 去 Ping 224.1.1.1,没有回应是正常的,因为还未有 Receiver join 这个 Group。

R5#ping 224.1.1.1 repeat 5

Type escape sequence to abort.
Sending 1000, 100-byte ICMP Echos to 224.1.1.1, timeout is 2 seconds:
.....

但在 RP 已经发生了精彩的事情,原来当 R5 发出 Multicast,身为 First Hop 的 R1 会向 RP 发出 PIM Register,目的是告知 RP Multicast Source 的位置,所以在 R3 的 debug 会看到 Register 讯息。但为什麽又会有 Register-Stop 呢?因为 RP 得知 Source 的位置後,会立刻与 Source 建立 SPT,当 SPT 建立好後,RP 就会告讯 R1 「不需要再用这个方法和我沟通了! 我已建立好 SPT。」所以发一个 Register-Stop 给 R1。

*Mar  1 00:46:03.523: PIM(0): Received v2 Register on Ethernet0/1 from 192.168.13.1
*Mar  1 00:46:03.523: PIM(0): Send v2 Register-Stop to 192.168.13.1 for 0.0.0.0, group 0.0.0.0

想知道 SPT 是否真的建立了?看看 R3 的 Mroute Table,(S,G) route 从 E0/1 进来。

R3#show ip mroute


(*, 224.1.1.1), 00:00:09/stopped, RP 3.3.3.3, flags: SP
  Incoming interface: Null, RPF nbr 0.0.0.0
  Outgoing interface list: Null

(192.168.15.5, 224.1.1.1), 00:00:09/00:02:50, flags: P
  Incoming interface: Ethernet0/1, RPF nbr 192.168.13.1
  Outgoing interface list: Null

再看看 R1,是 SPT 无误!

R1#show ip mroute


(*, 224.1.1.1), 00:03:51/stopped, RP 3.3.3.3, flags: SPF
  Incoming interface: Ethernet0/1, RPF nbr 192.168.13.3
  Outgoing interface list: Null

(192.168.15.5, 224.1.1.1), 00:00:03/00:02:56, flags: PFT
  Incoming interface: Ethernet0/2, RPF nbr 0.0.0.0
  Outgoing interface list: Null

不过你会发现 Outgoing Interface 都是 NULL 的,当然了,因为还未有 Host Join Group。留意 RP 栏位出现了 RP 的 IP Address。Mroute Table 的栏位在 Dense Mode 时都介绍过了,不过看到了一些新的 Flags,现在我们来介绍一下在 Sparse Mode 会出现的 Flags:

S - 表示正在使用 Sparse Mode,只会在 (*,G) Route 出现。

F - 曾经为这个 Source 向 RP Register。

J - 转成了使用 SPT ,稍後会有详细说明。

我们试试在 R2 用 e0/2 去 Join 224.1.1.1。再看看 mroute Table,(*,G) Route 表示在使用 Share Tree,即任何 Source 的 224.1.1.1 都会用这条路径做 Routing,看到 RP 是 3.3.3.3,Flag S 代表正在执行 Sparse Mode。

R2(config)#int ethernet 0/2
R2(config-if)#ip igmp join-group 224.1.1.1
R2(config-if)#end
R2#
R2#show ip mroute



(*, 224.1.1.1), 00:00:29/00:02:59, RP 3.3.3.3, flags: SCL
  Incoming interface: Ethernet0/1, RPF nbr 192.168.24.4
  Outgoing interface list:
    Ethernet0/2, Forward/Sparse, 00:00:29/00:02:30

所以,现时 Source 经过 RP 把 Multicast 送到 R2。唔......即是说现时的路径为 R5 -> R1 -> R3 -> R4 -> R2,很明显这不是最好的路径,明明 R5 可以直接经由 R1 到达 R2,可不可以这样走呢?是可以的!起初我们要依靠 RP 是因为要帮助害羞的 Sprase Mode 去连接 Receiver R2,但现在 R2 都知道 Source 的 IP 了,RP 已经再没有利用价值了!何不对 RP 来一个过河拆桥,直接用 SPT 连接 Source R5呢?

其实 Cisco Router default 的设定就是会过河拆桥的,只不过我们在 R2 下了一个  ip pim spt-threshold infinity 指令,ip spt threshold 意思是 Traffic 量到了某个 kb per second,就进行 SPT switchover,改由 SPT 连接,如果用了 keyword infinity 就等於关掉这功能。如果不下这道指令,Cisco default 就把 threshold 设成 0,即是必然会使用 SPT。现在我们就把它 no 掉,看看会产生什麽变化。出现了 (S,G) route ! Incoming interface 是 Ethernet 0/0,是从 R1 进来的,而且出现 J Flag,说明转成 SPT。

R2(config)#no ip pim spt-threshold infinity
R2(config)#end
R2#
R2#show ip mroute



(*, 224.1.1.1), 00:26:54/00:02:55, RP 3.3.3.3, flags: SJCL
  Incoming interface: Ethernet0/1, RPF nbr 192.168.24.4
  Outgoing interface list:
    Ethernet0/2, Forward/Sparse, 00:26:54/00:02:02

(192.168.15.5, 224.1.1.1), 00:00:04/00:02:59, flags: LJT
  Incoming interface: Ethernet0/0, RPF nbr 192.168.12.1
  Outgoing interface list:
    Ethernet0/2, Forward/Sparse, 00:00:04/00:02:55

再看看 R1 确认一下,Incoming e0/2 由 R5 进来,Outgoing 到 e0/0 即是 R2,确认这是一条 SPT。

R1#show ip mroute



(*, 224.1.1.1), 00:05:05/stopped, RP 3.3.3.3, flags: SPF
  Incoming interface: Ethernet0/1, RPF nbr 192.168.13.3
  Outgoing interface list: Null

(192.168.15.5, 224.1.1.1), 00:05:05/00:03:20, flags: FT
  Incoming interface: Ethernet0/2, RPF nbr 0.0.0.0
  Outgoing interface list:
    Ethernet0/0, Forward/Sparse, 00:04:21/00:03:06

Switchover 可以让 Multicast Traffic 能够走较好的路径,减少各 Router 浪费 Bandwidth,同时也减轻了 RP 的负担。

Sparse-Dense-Mode

Sparse-Dense-Mode 意思是一个混合的模式,可以同时用 Sparse 和 Dense 去处理 Multicast Traffic。处理的纙缉是:

在 Sparse-Dense-Mode 中,如果有 RP 设定的话就用 Sparse Mode,如果没有则用 Dense Mode。

且看以下实验,Source 是 224.1.1.1 和 224.2.2.2,PC 想收到这两个 Multicast。因此 R4 的 e0/2 Join 了这两个 Source Address。

pim

R3 是 RP,为了测试 Sparse-Dense-Mode,我们要控制 RP 只为一个 Multicast Source 做 RP,要怎样才可以做到呢?我们可以在 ip pim rp-address 3.3.3.3 这句指令後面加入一个 Access List,这样就只有 Access List Permit 的 Multicast Address 能够使用 RP。记著!每一只 PIM Router 都要加入这条 Access List。

R1(config)#ip pim rp-address 3.3.3.3 RPGroupList
R1(config)#!
R1(config)#ip access-list standard RPGroupList
R1(config-std-nacl)# permit 224.1.1.1

用 R5 分别 Ping 224.1.1.1 和 224.2.2.2。

R5#ping 224.1.1.1

Type escape sequence to abort.
Sending 1, 100-byte ICMP Echos to 224.1.1.1, timeout is 2 seconds:

Reply to request 0 from 192.168.34.4, 348 ms
R5#ping 224.2.2.2

Type escape sequence to abort.
Sending 1, 100-byte ICMP Echos to 224.2.2.2, timeout is 2 seconds:

Reply to request 0 from 192.168.34.4, 336 ms

这时候看看 R4 的 MRoute Table,可以见到 224.2.2.2 因为没有 RP ,所以正在使用 Dense Mode,而 224.1.1.1 则使用 Sparse Mode,RP 是 3.3.3.3,證实 Dense Mode 与 Sparse Mode 正在同时执行中呢!这就是 Sprase-Dense-Mode 的功能。

R4#sh ip mroute | begin 224.2.2.2
(*, 224.2.2.2), 00:14:59/stopped, RP 0.0.0.0, flags: DCL
  Incoming interface: Null, RPF nbr 0.0.0.0
  Outgoing interface list:
    Ethernet0/2, Forward/Sparse, 00:14:59/00:02:21
    Ethernet0/1, Forward/Sparse-Dense, 00:14:59/00:00:00
    Ethernet0/0, Forward/Sparse-Dense, 00:14:59/00:00:00

(192.168.15.5, 224.2.2.2), 00:01:14/00:01:49, flags: LT
  Incoming interface: Ethernet0/0, RPF nbr 192.168.34.3
  Outgoing interface list:
    Ethernet0/1, Prune/Sparse-Dense, 00:01:14/00:01:45
    Ethernet0/2, Forward/Sparse, 00:01:14/00:02:21

(*, 224.1.1.1), 00:24:34/stopped, RP 3.3.3.3, flags: SJCL
  Incoming interface: Ethernet0/0, RPF nbr 192.168.34.3
  Outgoing interface list:
    Ethernet0/2, Forward/Sparse, 00:24:34/00:02:17

(192.168.15.5, 224.1.1.1), 00:01:19/00:01:41, flags: LJT
  Incoming interface: Ethernet0/0, RPF nbr 192.168.34.3
  Outgoing interface list:
    Ethernet0/2, Forward/Sparse, 00:01:19/00:02:17

(*, 224.0.1.40), 00:15:02/00:02:09, RP 0.0.0.0, flags: DCL
  Incoming interface: Null, RPF nbr 0.0.0.0
  Outgoing interface list:
    Ethernet0/1, Forward/Sparse-Dense, 00:15:02/00:00:00
    Ethernet0/0, Forward/Sparse-Dense, 00:15:02/00:00:00

Auto-RP

Sparse Mode 可以减少 Bandwidth 的使用,听起来比较好,但因为要为每一只 PIM Router 设定 RP,比较麻烦,而且如果有一天 RP 的 IP 有更改的话,要为所有 PIM Router 更改 RP 设定,这简直是一个悲剧。还有,假若 RP 掛掉了,Multicast 就会 Forward 不到。这麽多问题,有没有解决办法呢?其中一个方法是用 Auto-RP,让 RP 自动设定好,而且还可以设定不只一只 RP,达到冗馀功能。

Auto-RP 是 Cisco Router 独有的功能。要设定 Auto-RP,就只需要设定 Candidate RP 和 Mapping Agent 两样东西,然後整个 PIM 网络都会知道谁是 RP 了,这就不用逐台逐台 Router 设定。现在我们先搞清楚什麽是 Candidate RP 和 Mapping Agent。

Candidate RP

即是 RP!只要在 Router 输入 ip pim send-rp-announce scope 指令,这个 Router 便会向 Mapping Agent 宣告自己是 RP。Candidate RP 可以不只一只,我们可以选择多只 Router 成为 Candidate RP,Mapping Agent 会选择 IP 最大的一只成为 Active RP,其他成为备用 RP。

Mapping Agent

Mapping Agent 会把 RP 资讯传送到整个 PIM 网络之中,这样大家就会知道谁是 RP 了。Mapping Agent 同样可以不只一只,但多只 Mapping Agent 角色是样同的,并没有 Active 和备用之分,理论上他们会宣告同样的资讯。

Candidate RP 会用 Multicast address 224.0.1.39 把资讯传到 Mapping Agent,然後 Mapping Agent 会用 Multicast address 224.0.1.40 把 RP List 传到 PIM 所有 Router。问题来了,Auto-RP 出生的目的是要帮大家找 RP,但现在没有 RP 的情况下,它们又怎样用 Multicast 传送资料呢?不能传送资料又怎样找到 RP 呢?没有 RP 又怎样传送 Multicast 呢?不能传送 Multicast 又怎样找到 RP 呢?没有 RP 又怎样传送 Multicast 呢?......聪明的你应该会想到我们刚刚学过的 Sprase-Dense-Mode。没错,224.0.1.39 和 40 用 Dense 便解决了,所以要用 Auto-RP,其中一个条件就是要设定 Sprase-Dense-Mode。另外,我们刚刚开始学 PIM 时就发现 Router 会自动加入了一条 224.0.1.40,现在迷题终於解开了,原来这是一个为了 Auto-RP 而加入的设定。

现在我们尝试一个 1 x Mapping Agent (R1),2 x Candidate RP (R2 及 R3) 的设定。

pim

请紧记用来做 RP 的 Interface 也需要执行 ip pim sprase-dense-mode,假设已经设定好 Routing Protocol 及 Interface 已设好 ip pim sparse-dense-mode,然後我们用 ip pim send-rp-announce scope 来把这 Router 宣告成一只 Candidate RP,scope 是什麽呢?稍後的部份会再说明。

hostname R2
!
ip multicast-routing
!
interface Loopback0
 ip address 2.2.2.2 255.255.255.255
 ip pim sparse-dense-mode
!
ip pim send-rp-announce Loopback0 scope 255

同样地,R3 亦都设定成 Candidate RP。

hostname R3
!
ip multicast-routing
!
interface Loopback0
 ip address 3.3.3.3 255.255.255.255
 ip pim sparse-dense-mode
!
ip pim send-rp-announce Loopback0 scope 255

最後,在 R1 使用 ip pim send-rp-discovery scope 来宣告这是一只 Mapping Agent。

hostname R1
!
ip multicast-routing
!
interface Loopback0
 ip address 1.1.1.1 255.255.255.255
 ip pim sparse-dense-mode
!
ip pim send-rp-discovery Loopback0 scope 255

Auto-RP 就简单地设定完成啦,我们可以验證一下。最重要是 Ping 一下吧,成功。

R5#ping 224.1.1.1

Type escape sequence to abort.
Sending 1, 100-byte ICMP Echos to 224.1.1.1, timeout is 2 seconds:

Reply to request 0 from 192.168.34.4, 552 ms
R5#ping 224.2.2.2

Type escape sequence to abort.
Sending 1, 100-byte ICMP Echos to 224.2.2.2, timeout is 2 seconds:

Reply to request 0 from 192.168.34.4, 252 ms

然後可以到 R4 看看 show ip pim rp mapping,现在的 RP 是 3.3.3.3,是由 1.1.1.1 这个 Mapping Agent 告诉 R4 的。

R4#show ip pim rp mapping
PIM Group-to-RP Mappings

Group(s) 224.0.0.0/4
  RP 3.3.3.3 (?), v2v1
    Info source: 1.1.1.1 (?), elected via Auto-RP
         Uptime: 00:09:04, expires: 00:02:50

如果 3.3.3.3 掛掉会怎样呢?

R3(config)#interface loopback 0
R3(config-if)#shutdown
R3(config-if)#
*Mar  1 02:15:58.283: %LINK-5-CHANGED: Interface Loopback0, changed state to administratively down
*Mar  1 02:15:59.283: %LINEPROTO-5-UPDOWN: Line protocol on Interface Loopback0, changed state to down

等待 60 秒 (default 的 hold time) 之後,RP 更新了。

R4#show ip pim rp mapping
PIM Group-to-RP Mappings

Group(s) 224.0.0.0/4
  RP 2.2.2.2 (?), v2v1
    Info source: 1.1.1.1 (?), elected via Auto-RP
         Uptime: 00:00:07, expires: 00:02:48

60 秒才 Failover 实在太慢了,如果想 Failover 的切换快一点,可以在设定 Candidate RP 加入一个 Interval 参数,例如设定成 10 秒,这样就能控制跳转的时间。

R3(config)#ip pim send-rp-announce Loopback0 scope 255 interval 10

RP-announce-filter

由於 Auto-RP 并没提供认證,为了防止有 Router 伪冒成为 RP,我们可以在 Mapping Agent 加入 rp-announce-filter 来限制只有某些 IP 来能成为 RP。以下是一个例子。这个 Mapping Agent 只容许 2.2.2.2 传来想成为 224.1.1.1 的 RP 的要求。

ip pim rp-announce-filter rp-list 1 group-list 2
!
access-list 1 permit 2.2.2.2
access-list 2 permit 224.1.1.1

Auto-RP Listener

刚才说过要实拖 Auto-RP,就要先使用 Sprase-Dense-Mode,其实还有另一个方法,就是在所有 Router 都执行 ip pim autorp listener 这个指令。

Bootstrap Router (BSR) Protocol

BSR 跟 Auto-RP 一样是可以让 PIM Router 自动设定 RP,而且是 Open Standard,只要使用 PIM Version 2 便支缓 BSR。在设定上也跟 Auto-RP 很相似。先学两个名词:

Candidate RP

跟 Auto-RP 的 Candidate RP 一样是宣告成为 RP 的 Router,只不过是用的指令有点不同,在 BSR 中要成为 Candidate RP 可以输入 ip pim rp-candidate [group-list ][priority ] 指令,那麽这只 Router 就会向 Bootstrap Router 宣告自己成为 Candidate RP。Priority 较小者为 Active RP,其他备用。留意!如果 Priority 相同,可以 Load Balance!

BSR

BSR 功能与 Auto-RP 的 Mapping Agent 类似,但如果超过一只 Router 想做 BSR 的话,只会有一只成为 Active,其他成为备用,它们会先比较 Priority ,大的优胜,如果相同再比 IP,同样是大的优胜。要成为 BSR 可以输入以下指令 ip pim bsr-candidate  ,那 hash mask 是什麽呢?原来 BSR 比较进步的是:可以让多只 RP Load Balance,即是说 hash mask 可以控制两只或以上的 RP 同时执行,在稍後的例子会加以说明。

另一个 BSR 比较进步的地方不得不提,就是 BSR 与 Candidate RP 之间是透过 PIM Message 来沟通的,不需要倚靠 Multicast,所以设定 BSR 时并不需要特地使用 Sparse-Dense-Mode,直接用 Sparse Mode 便可以了。

好!让大家久等了,来个例子说明一下。

pim

假设所有 Router 已经设定好 Routing Protocol 及 Interface 已设好 ip pim sparse-mode。首先,我们在 R2 及 R3 设定 Candidate RP。

hostname R2
!
ip multicast-routing
!
interface Loopback0
 ip address 2.2.2.2 255.255.255.255
 ip pim sparse-mode
!
ip pim rp-candidate Loopback0 priority 50
hostname R3
!
ip multicast-routing
!
interface Loopback0
 ip address 3.3.3.3 255.255.255.255
 ip pim sparse-mode
!
ip pim rp-candidate Loopback0 priority 100

然後在 R1 及 R4 设定 BSR。hash 暂时设为 0。

hostname R1
!
ip multicast-routing
!
interface Loopback0
 ip address 1.1.1.1 255.255.255.255
 ip pim sparse-mode
!
ip pim bsr-candidate Loopback0 0 50
hostname R4
!
ip multicast-routing
!
interface Loopback0
 ip address 4.4.4.4 255.255.255.255
 ip pim sparse-mode
!
ip pim bsr-candidate Loopback0 0 25

首先验證一下 BSR,在 R1 输入 show ip pim bsr-router。因为 R1 的 BSR priority 较大,所以成为 BSR。

R1#show ip pim bsr-router
PIMv2 Bootstrap information
This system is the Bootstrap Router (BSR)
  BSR address: 1.1.1.1 (?)
  Uptime:      00:00:29, BSR Priority: 50, Hash mask length: 0
  Next bootstrap message in 00:00:31

让 R4 join 224.1.1.1 和 224.2.2.2,然後用 R5 Ping 224.1.1.1 和 224.2.2.2 让 RP 建立。回到 R1 看看 show ip pim rp ,结果是 2.2.2.2 当选了 RP,因为它 Priority 较小。用 show ip pim rp mapping 的话,资料会更详尽。

R1#show ip pim rp
Group: 224.2.2.2, RP: 2.2.2.2, v2, uptime 00:05:08, expires 00:02:21
Group: 224.1.1.1, RP: 2.2.2.2, v2, uptime 00:05:08, expires 00:02:21
R1#show ip pim rp mapping
PIM Group-to-RP Mappings
This system is the Bootstrap Router (v2)

Group(s) 224.0.0.0/4
  RP 2.2.2.2 (?), v2
    Info source: 192.168.12.2 (?), via bootstrap, priority 50, holdtime 150
         Uptime: 00:07:08, expires: 00:02:19
  RP 3.3.3.3 (?), v2
    Info source: 192.168.13.3 (?), via bootstrap, priority 100, holdtime 150
         Uptime: 00:07:03, expires: 00:02:23

再来一点精彩的,常常说 BSR 的 RP 可以 Load Balance 负载平衡,要怎样做呢?请先试试 show ip pim rp-hash ,刚才说因为 Priority 小而成为 RP,如果 Priority 相同,就要看的是 hash value,hash value 大的会成为 RP。

R1#show ip pim rp-hash 224.1.1.1
  RP 2.2.2.2 (?), v2
    Info source: 192.168.12.2 (?), via bootstrap, priority 50, holdtime 150
         Uptime: 00:14:24, expires: 00:02:03
  PIMv2 Hash Value (mask 0.0.0.0)
    RP 2.2.2.2, via bootstrap, priority 50, hash value 1524600152
    RP 3.3.3.3, via bootstrap, priority 100, hash value 450145259
R1#
R1#show ip pim rp-hash 224.2.2.2
  RP 2.2.2.2 (?), v2
    Info source: 192.168.12.2 (?), via bootstrap, priority 50, holdtime 150
         Uptime: 00:14:32, expires: 00:01:55
  PIMv2 Hash Value (mask 0.0.0.0)
    RP 2.2.2.2, via bootstrap, priority 50, hash value 1524600152
    RP 3.3.3.3, via bootstrap, priority 100, hash value 450145259

hash value 是怎样计算的呢?根据文献记载,Hash Value=(1103515245 * ((1103515245 * (Group Address & Hash Mask)+12345) XOR RP(i)) + 12345) mod 2^31 ,老实说,笔者花了一点时间去理解,仍未理解箇中奥秘,所以笔者靠死记的:

Load Balance RP 数目 = 2^(32- Hash Mask)

所以,如果想 2 只 RP Load Balance,可把 Hash Mask 设成 31,如果想 4 只 RP Load Balance,可把 Hash Mask 设成 30,如此类推。如果读者可以解释给我知 Hash Value 的详细解释,请留个言吧!

现在我们把 R2 和 R3 两个 RP 的 priority 都设成 0。

R2(config)#ip pim rp-candidate loopback 0 priority 0
R3(config)#ip pim rp-candidate loopback 0 priority 0

然後,到 BSR 把 Hash Mask 改成 31。

R1(config)#ip pim bsr-candidate loopback 0 31 50

於是,224.1.1.1 使用 3.3.3.3 作为 RP,224.2.2.2 使用 2.2.2.2 作为 RP。因为 hash value 改变了。

R1#show ip pim rp-hash 224.1.1.1
  RP 3.3.3.3 (?), v2
    Info source: 192.168.13.3 (?), via bootstrap, priority 0, holdtime 150
         Uptime: 01:04:52, expires: 00:02:04
  PIMv2 Hash Value (mask 255.255.255.254)
    RP 2.2.2.2, via bootstrap, priority 0, hash value 1043265112
    RP 3.3.3.3, via bootstrap, priority 0, hash value 1420638955
R1#show ip pim rp-hash 224.2.2.2
  RP 2.2.2.2 (?), v2
    Info source: 192.168.12.2 (?), via bootstrap, priority 0, holdtime 150
         Uptime: 01:05:04, expires: 00:01:42
  PIMv2 Hash Value (mask 255.255.255.254)
    RP 2.2.2.2, via bootstrap, priority 0, hash value 1613014646
    RP 3.3.3.3, via bootstrap, priority 0, hash value 480439049

请留意,到现时为止,我们学习了 PIM 的 Dense Mode 和 Sparse Mode,要搞清楚 Auto-RP 与 Bootstrap Router Protocol (BSR) 亦属 Sparse Mode 的一个变奏,帮助我们设定 RP。接下来我们会了解一下 PIM 的另外两个模式 Source Specific Multicast (SSM) 和 Bidirectional PIM。

Source Specific Multicast (SSM)

不论 Dense Mode 或 Sparse Mode,我们都可能会遇到一个问题:假如网络里有两个应用程式,使用同一个 Group Address 来发佈信息,那麽网络里接收 Multicast 的 Client 就会同时收到来自两个 Source 的讯息,造成混乱,试看以下例子。

pim

Source A 使用 224.1.1.1,可惜 Source B 也刚刚使用 224.1.1.1,导致 Join 了 224.1.1.1 这个 Group 的 PC1 和 PC2 时收到两个 Source 的讯息,造成混乱。在 R5 Ping 224.1.1.1 可见两个 Client 同时接收。

R5#ping 224.1.1.1 repeat 3

Type escape sequence to abort.
Sending 3, 100-byte ICMP Echos to 224.1.1.1, timeout is 2 seconds:

Reply to request 0 from 192.168.34.4, 540 ms
Reply to request 0 from 192.168.24.2, 544 ms
Reply to request 1 from 192.168.12.2, 372 ms
Reply to request 1 from 192.168.34.4, 488 ms
Reply to request 2 from 192.168.12.2, 444 ms
Reply to request 2 from 192.168.34.4, 536 ms

在 R6 的情况也一样。

R6#ping 224.1.1.1 repeat 3

Type escape sequence to abort.
Sending 3, 100-byte ICMP Echos to 224.1.1.1, timeout is 2 seconds:

Reply to request 0 from 192.168.34.4, 220 ms
Reply to request 0 from 192.168.24.2, 432 ms
Reply to request 1 from 192.168.34.4, 172 ms
Reply to request 1 from 192.168.24.2, 244 ms
Reply to request 2 from 192.168.34.4, 388 ms
Reply to request 2 from 192.168.24.2, 884 ms

解决办法是使用 SSM,PC1 和 PC2 Join Group 时必需指明 Source Address,这样就可以判别到不同 Source 的 Multicast。回顾刚才的网络,我们会尝试设定 PC1 只想接收由 Source A 传来的 Multicast,而 PC2 只想接收由 Source B 传来的 Multicast。要设定 SSM 有两个步骤,首先是 IGMP 的设定。要使用 SSM 得先把 IGMP 设成 Version 3,然後在 join-group 时除了输入 Group Address 外,还要输入 Source Address。以 R2 为例子:

R2(config)#int eth 0/2
R2(config-if)#ip igmp version 3
R2(config-if)#ip igmp join-group 224.1.1.1 source 192.168.15.5

然後是 PIM 的设定,告诉 R2 那些 Group Address 会使用 SSM。

R2(config)#ip pim ssm range 1
R2(config)#access-list 1 permit 224.1.1.1

在 R4 做同样的设定,只有 Source Address 不同。

R4(config)#int eth 0/2
R4(config-if)#ip igmp version 3
R4(config-if)#ip igmp join-group 224.1.1.1 source 192.168.36.6
R4(config)#ip pim ssm range 1
R4(config)#access-list 1 permit 224.1.1.1

再尝试在 R5 和 R6 Ping 224.1.1.1,现在,只有相对应的 PC 收到 Multicast。

R5#ping 224.1.1.1 repeat 3

Type escape sequence to abort.
Sending 3, 100-byte ICMP Echos to 224.1.1.1, timeout is 2 seconds:

Reply to request 0 from 192.168.12.2, 252 ms
Reply to request 1 from 192.168.12.2, 184 ms
Reply to request 2 from 192.168.12.2, 224 ms
R6#ping 224.1.1.1 repeat 3

Type escape sequence to abort.
Sending 3, 100-byte ICMP Echos to 224.1.1.1, timeout is 2 seconds:

Reply to request 0 from 192.168.34.4, 160 ms
Reply to request 1 from 192.168.34.4, 192 ms
Reply to request 2 from 192.168.34.4, 204 ms

最後要提醒大家,其实 SSM 是有自己预设的 Group Address 的,就是 232.0.0.0 / 8,所以如果 Group Address 是在这个範围里面的话,再设定 PIM 时只要使用 ip pim ssm default 便可以了,设定更加简单。

Coming Soon...

bi-dir
SSM
MSDP
domain border