目录

前言
PIM-DM
  Assert
PIM-SM
  Designated Router
Sparse-Dense-Mode
Auto-RP
  Candidate RP
  Mapping Agent
  Group List
  RP-announce-filter
  Auto-RP Listener
Bootstrap Router (BSR) Protocol
  Candidate RP
  BSR
  Accept-rp-candidate
  Hash Mask
Source Specific Multicast (SSM)
Bidirectional PIM
Multicast Boundary

前言

PIM (Protocol Independent Multicast) 是可以在网络进行 Multicast Routing 的其中一种 Protocol。所谓 Independent 的意思即是它能够在任何 Unicast Routing Protocol 之环境上执行。PIM 用了 RPF checking 的技术,在 Routing Table 查找 Source Address 来建立自己的 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 才能传送 Multicast Traffic。要知道各 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 是否正在执行中,就是看看 Mullicast 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

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

pim

幻想归幻想,PC 没存在怎样接收 Multicast 呢?大家可以在 e0/2 使用 ip igmp join-group <ip> 来强迫 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 (在 Multicast 我们通常叫作 Group) 是 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 <ip> 来看看 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

试试另一个情况,把 R2 e0/0 的 PIM 拿掉。

R2(config)#int ethernet 0/0
R2(config-if)#no ip pim dense-mode

这样就没法找到 Route 了,因为 Route Table 中的 Best Path 并没执行 PIM,RPF Check 不成功。

R2#show ip rpf 192.168.15.5
 failed, no route exists

解决方法有两个,一是把 OSPF cost 修改让执行 PIM 的 Interface 成为 Best Path,但这样就会影响 Unicast 的 Traffic 流向,另一个较理想的方法是加一条 Multicast Static Route 告诉 PIM 用 192.168.24.4 那边找 Source 192.168.15.5。

R2(config)#ip mroute 192.168.15.5 255.255.255.255 192.168.24.4
R2(config)#end
R2#show ip rpf 192.168.15.5
RPF information for ? (192.168.15.5)
  RPF interface: Ethernet1/1
  RPF neighbor: ? (192.168.24.4)
  RPF route/mask: 192.168.15.5/32
  RPF type: multicast (static)
  Doing distance-preferred lookups across tables
  RPF topology: ipv4 multicast base

究竟整个 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 <IP> 指令,就一定会出现这个 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 nbr

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

5⃣️ Outgoing Interface list

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

Assert

在一个 Multi Access 的媒介 (例如 Ethernet) 有机会收到重复的 Multicast Traffic,请看以下例子。R1 所发出的 Multicast 经过 R2 和 R3 到达 R4,R4 收到了重复的 Traffic。

pim

为了解决这个问题,PIM 会在同一网段中选出 Assert,如遇同一 Multicast Group 并且来自相同 Source 的 Traffic,网段中只有 Assert 可以传送 Traffic。Router 会查看 Source Address 位於 Route Table 的 Administrative Distance (AD) 和 Metric,AD 较小的成为 Assert,如 AD 相同则选 Metric 较小,如两者皆相同则选 Interface IP 较高者,show ip mroute 结果中有字母 A 代表 Assert。

R3#show ip mroute interface ethernet 1/1 
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, E - Extranet,
       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, 
       G - Received BGP C-Mroute, g - Sent BGP C-Mroute, 
       Q - Received BGP S-A Route, q - Sent BGP S-A Route, 
       V - RD & Vector, v - Vector
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:25:03/stopped, RP 0.0.0.0, flags: D
  Incoming interface: Null, RPF nbr 0.0.0.0
  Outgoing interface list:
    Ethernet1/1, Forward/Dense, 00:25:03/stopped
    Ethernet1/0, Forward/Dense, 00:25:03/stopped

(1.1.1.1, 224.1.1.1), 00:25:03/00:02:53, flags: PT
  Incoming interface: Ethernet1/0, RPF nbr 192.168.13.1
  Outgoing interface list:
    Ethernet1/1, Prune/Dense, 00:23:51/00:02:40, A

(*, 224.0.1.40), 00:26:32/00:02:36, RP 0.0.0.0, flags: DCL
  Incoming interface: Null, RPF nbr 0.0.0.0
  Outgoing interface list:
    Ethernet1/1, Forward/Dense, 00:26:32/stopped
    Ethernet1/0, Forward/Dense, 00:26:32/stopped

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,即各 Router 不会像 Dense Mode 一样预先建立出 (S,G) Route,所以想收 Multicast 的 Receiver 不会知道 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
<Output Omitted>

(*, 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

<Output Omitted>

再看看 R1,是 SPT 无误!

R1#show ip mroute
<Output Omitted>

(*, 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

<Output Omitted>

不过你会发现 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

<output omitted>

(*, 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

<output omitted>

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

其实 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

<Output Omitted>

(*, 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

<Output Omitted>

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

R1#show ip mroute

<Output Omitted>

(*, 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

<Output Omitted>

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

Designated Router

Sparse Mode 在 Multi Access 环境有一个跟 Dense Mode 相似的问题,如果网段中同时有两只以上 Router 收到 Receiver 的 Join 讯息,又或者网段中同时有两只 Router 收到 Source 向 RP 发 Register 讯息,就有可能出现讯息重复的问题。因此网段中的 PIM Neighbor 会推选一只 Designated Router (DR),由 DR 的 Interface 负责向 RP 发讯息。

pim

在 Interface 设定 PIM 时可以用指令 ip pim dr-priority 去设定 Priority (预设值为 1),Priority 最高者成为 DR,如 DR 相同则 IP 最大者成为 DR。

R2(config)#int ethernet 1/1
R2(config-if)#ip pim sparse-mode 
R2(config-if)#ip pim dr-priority 1000

Sparse-Dense-Mode

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

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

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

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 <interface> scope <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 和 Backup 之分,理论上他们会宣告同样的资讯。

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

Group List

RP 可以选择只为某些 Multicast Group 服务,例如刚才 R2 如果只愿为 224.1.1.0/24 和 224.2.2.0/24 作 RP,可用以下指令达成。此设定称为 Positive Group。

R2(config)#ip pim send-rp-announce Loopback0 scope 255 group-list 1 interval 10
R2(config)#access-list 1 permit 224.1.1.0 0.0.0.255
R2(config)#access-list 1 permit 224.2.2.0 0.0.0.255

有趣的是,我们也可以把逻辑倒转,叫 RP 不要为某些 Group 做 RP,其他全部接受。例如 R3 接受除了 224.2.2.0/24 以外的所有 Group,可用以下指令达成。此设定称为 Negative Group。

R3(config)#ip pim send-rp-announce Loopback0 scope 255 group-list 1 interval 10
R3(config)#access-list 1 deny 224.2.2.0 0.0.0.255
R3(config)#access-list 1 permit any

在 MA 查看 mapping 就会看到结果,留意 Group 前面有 (-) 即表示该组为 Netgative Group。Router 对 RP 的选择以 Longest Match 为逻辑,所以假设有 224.1.1.1 这个 Multicast Group 出现时,Router 会查看 RP Mapping Table 寻找 Longest Match,结果找到 224.1.1.0/24 这一条,於是使用 2.2.2.2 作为 RP。如果出现 224.3.3.3 的话,就会用 224.0.0.0/4 中的 3.3.3.3 作为 RP 了。最有趣的地方是,只要 Longest Match 踩中了 Netgative Group,无论是由那一只 RP 传来都好,Router 都不会为这 Group 选用 RP。举例:现在出现 224.2.2.2 这个 Group,由於 Mapping Table 里 Longest Match 中了 Netgative Group 224.2.2.0/24,因而放弃使用 RP,如果在行 Sparse-Dense-Mode 的话,就 Fall back 到 Dense Mode 好了。

R4#show ip pim rp mapping 
PIM Group-to-RP Mappings
This system is an RP-mapping agent (Loopback0)

Group(s) 224.0.0.0/4
  RP 3.3.3.3 (?), v2v1
    Info source: 3.3.3.3 (?), elected via Auto-RP
         Uptime: 00:01:56, expires: 00:00:14
Group(s) 224.1.1.0/24
  RP 2.2.2.2 (?), v2v1
    Info source: 2.2.2.2 (?), elected via Auto-RP
         Uptime: 00:01:56, expires: 00:00:14
Group(s) (-)224.2.2.0/24
  RP 3.3.3.3 (?), v2v1
    Info source: 3.3.3.3 (?), elected via Auto-RP
         Uptime: 00:01:56, expires: 00:00:13

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,就要先使用 Sparse-Dense-Mode,其实还有另一个方法,就是在所有 Router 都执行 ip pim autorp listener 这个指令让 Router 容许 224.0.1.39 及 224.0.1.40 执行 dense mode。

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 <interface> [group-list <acl>][priority <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 <interface> <hash mask> <priority> ,那 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

Accept-rp-candidate

与 Auto-RP 一样为了防止有 Router 伪冒成为 RP ,BSR 设有 RP Candidate Filter,跟 Auto-RP 设定相若。

R3(config)#ip pim bsr-candidate Loopback0 0 50 accept-rp-candidate 1
R3(config)#access-list 1 permit 2.2.2.2

Hash Mask

再来一点精彩的,常常说 BSR 的 RP 可以 Load Balance 负载平衡,要怎样做呢?请先试试 show ip pim rp-hash <multicast address>,刚才说因为 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 便可以了,设定更加简单。另外,由於 SSM 在 Join Group 已经知道 Source Address,可以直接建 Shortest Path Tree,所以不用硬性规定使用 Sparse Mode,用 Dense Mode 也可以。

Bidirectional PIM

有时候我们会遇到 Multicast Source 同时又是 Multicast Destination,经典例子为视像会议系统,会议各方对着镜头说话 (Source),也同时接收其他人的声音影像 (Destination)。这个情况适合使用 Bidirectional PIM,以 RP 为起点向各 Source/Destination 建立 Shared Tree。由於同时存在多个 Source,因此 Source Address 在 Bidirectional PIM 变得没有意义。现在我们使用以下网络作例子去设定 Bidirectional PIM。

pim

除了基本 Multicast 设定外,要使用 Bidirectional PIM,必先在每只 PIM Router 使用 ip pim bidir-enable 指令。

R1(config)#ip pim bidir-enable

Bidirectional PIM 必需使用 Sparse Mode,所以必需有 RP,无论使用 Static RP丶Auto RP 或 BSR,都必需加上 Keyword bidir

R2(config)#ip pim rp-address 2.2.2.2 bidir
R2(config)#ip pim send-rp-announce loopback 0 scope 255 bidir
R2(config)#ip pim rp-candidate loopback 0 bidir

假设使用 BSR,整套 Bidirectional PIM 设定如下。

hostname R1
!
ip multicast-routing 
!
interface Loopback0
 ip address 1.1.1.1 255.255.255.255
 ip pim sparse-mode
!
interface Ethernet1/0
 ip address 192.168.12.1 255.255.255.0
 ip pim sparse-mode
!
router ospf 1
 network 0.0.0.0 255.255.255.255 area 0
!
ip pim bidir-enable
hostname R2
!         
ip multicast-routing 
!
interface Loopback0
 ip address 2.2.2.2 255.255.255.255
 ip pim sparse-mode
!
interface Ethernet1/0
 ip address 192.168.12.2 255.255.255.0
 ip pim sparse-mode
!
interface Ethernet1/1
 ip address 192.168.23.2 255.255.255.0
 ip pim sparse-mode
!
router ospf 1
 network 0.0.0.0 255.255.255.255 area 0
!
ip pim bidir-enable
ip pim bsr-candidate Loopback0 0
ip pim rp-candidate Loopback0 bidir
hostname R3
!
ip multicast-routing 
!
interface Loopback0
 ip address 3.3.3.3 255.255.255.255
 ip pim sparse-mode
!
interface Ethernet1/0
 ip address 192.168.23.3 255.255.255.0
 ip pim sparse-mode
!
router ospf 1
 network 0.0.0.0 255.255.255.255 area 0
!
ip pim bidir-enable

完成设定後,在 RP Mapping Table 会见到 RP 正在跑 Bidirection。

R2#show ip pim rp mapping 
PIM Group-to-RP Mappings
This system is a candidate RP (v2)
This system is the Bootstrap Router (v2)

Group(s) 224.0.0.0/4
  RP 2.2.2.2 (?), v2, bidir
    Info source: 2.2.2.2 (?), via bootstrap, priority 0, holdtime 150
         Uptime: 00:09:10, expires: 00:02:18

而 mroute table 也会看到 flag B,即 Bidir Group,可见只有 (*,G) 而没有 (S,G),因 Bidir 根本不需知道 Source Address。

R3#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, E - Extranet,
       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, 
       G - Received BGP C-Mroute, g - Sent BGP C-Mroute, 
       Q - Received BGP S-A Route, q - Sent BGP S-A Route, 
       V - RD & Vector, v - Vector
Outgoing interface flags: H - Hardware switched, A - Assert winner
 Timers: Uptime/Expires
 Interface state: Interface, Next-Hop or VCD, State/Mode

(*,224.0.0.0/4), 00:01:20/-, RP 2.2.2.2, flags: B
  Bidir-Upstream: Ethernet1/0, RPF nbr: 192.168.23.2
  Incoming interface list:
    Loopback0, Accepting/Sparse
    Ethernet1/0, Accepting/Sparse

(*, 224.1.1.1), 00:01:20/00:02:14, RP 2.2.2.2, flags: BCL
  Bidir-Upstream: Ethernet1/0, RPF nbr 192.168.23.2
  Outgoing interface list:
    Loopback0, Forward/Sparse, 00:01:20/00:02:14
    Ethernet1/0, Bidir-Upstream/Sparse, 00:01:20/stopped

(*, 224.0.1.40), 00:25:02/00:02:08, RP 0.0.0.0, flags: DCL
  Incoming interface: Null, RPF nbr 0.0.0.0
  Outgoing interface list:
    Ethernet1/0, Forward/Sparse, 00:25:02/00:02:08

Multicast Boundary

最後要补充的是关於 Multicast Boundary。在一个大型网络里,我们可以透过 Multicast Boundary 限制 Multicast 的范围。又或者两个组织的网络相连,而不希望 Multicast Traffic 传到对方的网络里,也可过透过 Multicast Boundary 把网络分割成不同的 Multicast Domain。

pim

基本方法为使用 ip multicast boundary 指令,直接禁止 Multicast Traffic 流通。以上图为例,在 R1 e0/1 用以下指令,只放行 Group 224.1.1.1。

R3(config)#access-list 1 permit 224.1.1.1
R3(config)#int eth 0/1
R3(config-if)#ip multicast boundary 1

如要全挡则把 access-list 改成 deny any,跟平时用的 ACL 很相似,这部份应该没有悬念。

如网络使用 Static RP,那就好辨了。以上图为例,只需在不同的 Multicast Domain 设定不同的 RP,Multicast Domain 里的 Host 就无法得知其他 Multicast Domain 里的 Share Tree 了,即无法收到其 Multicast Traffic。

如使用 BSR 则可使用 ip pim bsr-border 指令去限制 RP 传播。以上图为例,我们可以在 R1 和 R3 的 e0/1 用此指令。

R1(config)#interface ethernet 0/1
R1(config-if)#ip pim bsr-border
R3(config)#interface ethernet 0/1
R3(config-if)#ip pim bsr-border

而 Auto RP 则可在 ip multicast boundary 後加上 filter-autorp Keyword 使 Auto RP 无法传播。

R1(config)#int eth 0/1
R1(config-if)#ip multicast boundary 1 filter-autorp