Protocol Independent Multicast (PIM) 獨立組播協定

前言

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

Uptime / Expire Timer 

00:00:57/00:02:04

Uptime 是指這條 mroute 已經執行多久了。Expire Timer 的意思是如果過了這個時間還收不到這個 Source 送來的 Mutlicast ,就砍掉這條 mroute,所以 mroute Table 和 Route Table 不同的是,如果一段時間沒有 traffic 的話,mroute 是會消失的。

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 的其中一員。

Incoming Interface

很明顯就是 Multicast traffic 是從那個 Interface 進入啦。

RPF nbr

剛才說過 RPF 的一些大道理,這就是 Router 用來做 RPF checking 的 Neighbor IP。知道便好了,個人認為對 debug 的作用不大。因為如果要做 PRF 的 debug 的話我們通常用 show ip rpf <ip>

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 的要求。例如以下例子禁止 2.2.2.2 成為 RP。

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

如在後面加入 group-list 這個參數,邏輯有點複雜,代表忽略 2.2.2.2 成為 RP,除非它宣告的 Group 是 224.1.1.1 則接受。

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 設定相若。

R1(config)#ip pim bsr-candidate Loopback0 0 50 accept-rp-candidate 1
R1(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

相關主題

發佈留言

2014-07-24

Posted In: Layer 3 網絡技術, menu-tall-2-zh-hant

Leave a Comment