はじめに
こんにちは、ネットワークエンジニアの「だいまる」です。
前回の記事ではマルチキャストの基本となる「IGMP」について、説明しました。
今回は、マルチキャストの根幹となる「PIM-SM」と呼ばれるプロトコルについて説明したいと思います。
PIM-SMとはなんだ?
マルチキャストを学ぶ上で避けては通れない「PIM-DM」と「PIM-SM」。
今回は、その1つである「PIM-SM」について、理解していきましょう。

PIM-SMとは?
PIM-SMとは、「Sparseモードのマルチキャストルーティングプロトコル」になります。

共有ツリーが出てきたのがPIM-DMとの違いの1つだよ!
このPIM-SMでは、送信元ツリーを共有ツリーに根(Root)となるRP(ランデブーポイント)までの経路で利用し、その後の通信は共有ツリーを利用します。
このRP(ランデブーポイント)は、デフォルトでは静的(Static)で決定します。
この方法により、PIM-DMとは違い、1本ツリーのみで経路制御できるため、ルータの負荷軽減や帯域に余裕を持たせるメリットが生まれます。

最短経路ではないため、遅延が増大するデメリットもあります!

PIM-DMとの違いは?
先程、共有ツリーがPIM-DMとの違いの1つと触れましたが、もう1つ大きな違いあります。
PIM-DMでは「FloodとPrune」による参加や維持を確認する動作がありましたが、PIM-SMでは明示的に意思表示をしないと参加できない特徴があります。
Explicit Join(明示的な参加)と呼ばれ、ユースケースとなるWANに配慮した機能になります。

マルチキャストの経路制御で重要なRPFとは?
RPF(Reverse Path Forwarding)とは、「マルチキャストの経路を制御し、ネットワークループを発生させないための重要な機能」になります。
RPFの動作は、送信元IPアドレスをルーティングテーブルで確認し、マルチキャストパケットを受信したインターフェースが正しいのかどうかをチェックします。(具体的には以下のフローで説明します)
マルチキャストパケットの送信元IPアドレスをユニキャストルーティングテーブルからチェックします。
Step1でチェックした結果から、送信元IPアドレスにパケットを送る場合、どのインターフェースから送信するのが正しいのかチェックします。
Step1/Step2でチェックしたインターフェースとマルチキャストを受信したインターフェースが一致すれば、最短経路で受け取っていると判断され、OIL(Outgoing Interface List)を参照し、他のルータに送信されます。


実機で確認してみよう!
PIM-SMの概要を理解した後は、実機で設定方法と動作確認を行なっていきます。
今回の確認項目と検証構成は以下の通りとなっています。
確認項目
今回の動作確認では、以下の3項目について確認してみます。
No | 項目 | 目的 |
---|---|---|
1 | PIM-SMの基本設定 | PIM-SM設定方法の確認 |
2 | ネイバー状態の確認 | 設定時のPIMネイバーの確立動作を確認 |
3 | 送信元ツリー/共有ツリーの確認 | 各種ツリーの状態やRPFやOILを確認 |
今回の検証構成
今回の動作確認では、以下の構成で検証を行います。
Router1からRouter6のアンダーレイはOSPFを設定しており、各ルータのLoopbackは「10.0.X.1/32 *X:ルータ番号」としています。
また、OSPFコストは全区間「1」と指定しています。

項目①:PIM-SMの基本設定
ここでは、PIM-SMの基本設定を確認していきます。
基本的な設定内容
PIM-SMの場合、マルチキャストを有効にする「ip multicast-routing」とPIM-SMを有効にしいインターフェースに「ip pim sparse-mode」を設定する必要があります。
(config)# ip multicast-routing
(config-if)# ip pim sparse-mode
そして、PIM-DMとは異なり、RPを指定するConfigが必要となります。
(config)# ip pim rp-address <RPとするルータのアドレス>
実機への投入・状態確認
実際にConfigを投入し、前後の状態を確認してみましょう。
Router6#show ip multicast
Multicast Routing: enabled
Multicast Multipath: disabled
Multicast Route limit: No limit
Multicast Fallback group mode: Dense
Number of multicast boundaries configured with filter-autorp option: 0
MoFRR: Disabled
Router6#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,
N - Received BGP Shared-Tree Prune, n - BGP C-Mroute suppressed,
Q - Received BGP S-A Route, q - Sent BGP S-A Route,
V - RD & Vector, v - Vector, p - PIM Joins on route,
x - VxLAN group
Outgoing interface flags: H - Hardware switched, A - Assert winner, p - PIM Join
Timers: Uptime/Expires
Interface state: Interface, Next-Hop or VCD, State/Mode
上記の状態では、マルチキャストは有効化されているが、ルーティングテーブルは何もないことがわかります。
Router6#conf t
Enter configuration commands, one per line. End with CNTL/Z.
Router6(config)#interface gigabitEthernet 0/3
Router6(config-if)#ip pim sparse-mode
Router6(config)#interface gigabitEthernet 0/1
Router6(config-if)#ip pim sparse-mode
Router6(config)#ip pim rp-address 10.0.1.1
Router6(config)#end
投入後の状態を確認してみると?
Router6#show ip multicast
Multicast Routing: enabled
Multicast Multipath: disabled
Multicast Route limit: No limit
Multicast Fallback group mode: Sparse
Number of multicast boundaries configured with filter-autorp option: 0
MoFRR: Disabled
Router6#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,
N - Received BGP Shared-Tree Prune, n - BGP C-Mroute suppressed,
Q - Received BGP S-A Route, q - Sent BGP S-A Route,
V - RD & Vector, v - Vector, p - PIM Joins on route,
x - VxLAN group
Outgoing interface flags: H - Hardware switched, A - Assert winner, p - PIM Join
Timers: Uptime/Expires
Interface state: Interface, Next-Hop or VCD, State/Mode
(*, 224.0.1.40), 00:00:59/00:02:35, RP 10.0.1.1, flags: SJPCL
Incoming interface: GigabitEthernet0/3, RPF nbr 10.6.0.1
Outgoing interface list: Null
しっかり追加されたことがわかりますね!
項目②:PIMネイバーの確認
この項目では、「項目①:基本設定」で確率されるネイバーの状態を確認していきます。
Router6#show ip pim neighbor
PIM Neighbor Table
Mode: B - Bidir Capable, DR - Designated Router, N - Default DR Priority,
P - Proxy Capable, S - State Refresh Capable, G - GenID Capable,
L - DR Load-balancing Capable
Neighbor Interface Uptime/Expires Ver DR
Address Prio/Mode
ここにPIM-SMの設定を入れた後の設定がどうなっているか確認してみます。
しっかりPIMネイバーが確立され、モードもSparseになっていることがわかります。
Router6#show ip pim neighbor
PIM Neighbor Table
Mode: B - Bidir Capable, DR - Designated Router, N - Default DR Priority,
P - Proxy Capable, S - State Refresh Capable, G - GenID Capable,
L - DR Load-balancing Capable
Neighbor Interface Uptime/Expires Ver DR
Address Prio/Mode
10.6.0.1 GigabitEthernet0/3 00:04:02/00:01:37 v2 1 / S P G
Router6#
Config投入直後のデバッグログ
次にデバッグログを見てみましょう。

しっかり構築されていることがわかりますね。
Router6#
*Sep 10 00:53:06.832: %PIM-5-NBRCHG: neighbor 10.6.0.1 UP on interface GigabitEthernet0/3
*Sep 10 00:53:08.014: PIM(0): Check DR after interface: GigabitEthernet0/3 came up!
*Sep 10 00:53:08.014: PIM(0): Changing DR for GigabitEthernet0/3, from 0.0.0.0 to 10.6.0.2 (this system)
*Sep 10 00:53:08.014: %PIM-5-DRCHG: DR change from neighbor 0.0.0.0 to 10.6.0.2 on interface GigabitEthernet0/3
*Sep 10 00:53:13.964: PIM(0): Check DR after interface: GigabitEthernet0/1 came up!
*Sep 10 00:53:13.964: PIM(0): Changing DR for GigabitEthernet0/1, from 0.0.0.0 to 10.9.0.1 (this system)
*Sep 10 00:53:13.964: %PIM-5-DRCHG: DR change from neighbor 0.0.0.0 to 10.9.0.1 on interface GigabitEthernet0/1
*Sep 10 00:53:18.483: PIM(0): Initiating register encapsulation tunnel creation for RP 10.0.1.1
*Sep 10 00:53:18.484: PIM(0): Initial register tunnel creation succeeded for RP 10.0.1.1
*Sep 10 00:53:18.484: PIM(0): Check RP 10.0.1.1 into the (*, 224.0.1.40) entry
*Sep 10 00:53:18.495: PIM(0): pim_reg_tun_comingup Tunnel0 RP 10.0.1.1 previous event 0
*Sep 10 00:53:18.495: PIM(0): pim_ipv4_reg_tun_event_set Tunnel0 RP 10.0.1.1 previous event 0 new event 2
*Sep 10 00:53:18.498: PIM(0): Building Triggered (*,G) Join / (S,G,RP-bit) Prune message for 224.0.1.40
*Sep 10 00:53:18.498: PIM(0): Upstream mode for (*, 224.0.1.40) changed from 0 to 1
*Sep 10 00:53:18.498: PIM(0): Insert (*,224.0.1.40) join in nbr 10.6.0.1's queue
*Sep 10 00:53:18.499: PIM(0): Building Join/Prune packet for nbr 10.6.0.1
*Sep 10 00:53:18.499: PIM(0): Adding v2 (10.0.1.1/32, 224.0.1.40), WC-bit, RPT-bit, S-bit Join
*Sep 10 00:53:18.499: PIM(0): Send v2 join/prune to 10.6.0.1 (GigabitEthernet0/3)
項目③:送信元・共有ツリーの状態確認
今回の検証環境は、以下の図の通りのため、「ルータ1」、「ルータ2」、「ルータ5」で状態確認を行います。
確認するにあたり、「送信者」から「239.1.1.1」宛にPingを送り続ける状態で確認します。
ルータ1の状態
ルータ1の状態を確認すると、(*,239.1.1.1)が共有ツリー、(192.168.10.2,239.1.1.1)が送信元ツリーになっていることがわかります。
また、このルータは、RP(ランデブーポイント)に指定しているため、共有ツリーのIncoming Interfaceに何もないことがわかります。
Router1#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,
N - Received BGP Shared-Tree Prune, n - BGP C-Mroute suppressed,
Q - Received BGP S-A Route, q - Sent BGP S-A Route,
V - RD & Vector, v - Vector, p - PIM Joins on route,
x - VxLAN group
Outgoing interface flags: H - Hardware switched, A - Assert winner, p - PIM Join
Timers: Uptime/Expires
Interface state: Interface, Next-Hop or VCD, State/Mode
(*, 239.1.1.1), 23:38:31/00:03:19, RP 10.0.1.1, flags: S
Incoming interface: Null, RPF nbr 0.0.0.0
Outgoing interface list:
GigabitEthernet0/2, Forward/Sparse, 23:36:22/00:02:34
GigabitEthernet0/1, Forward/Sparse, 23:38:31/00:03:19
(192.168.10.2, 239.1.1.1), 00:06:17/00:01:20, flags: PT
Incoming interface: GigabitEthernet0/1, RPF nbr 10.1.0.2
Outgoing interface list: Null
(*, 224.0.1.40), 2w0d/00:03:26, RP 10.0.1.1, flags: SJCL
Incoming interface: Null, RPF nbr 0.0.0.0
Outgoing interface list:
GigabitEthernet0/2, Forward/Sparse, 2w0d/00:03:19
GigabitEthernet0/1, Forward/Sparse, 2w0d/00:03:26
ルータ2の状態
一方、ルータ1の配下にある「ルータ2」はどうでしょう?
共有ツリー(*,239.1.1.1)は、RP(ランデブーポイント)がルータ1になっているため、Incoming Interfaceがルータ1向けになっていることがわかります。
送信元ツリー(192.168.10.2,239.1.1.1)は、送信元であるGi0/4がIncoming、それ以外にInterfaceがOutgoingに属しているのがわかります。
Router2#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,
N - Received BGP Shared-Tree Prune, n - BGP C-Mroute suppressed,
Q - Received BGP S-A Route, q - Sent BGP S-A Route,
V - RD & Vector, v - Vector, p - PIM Joins on route,
x - VxLAN group
Outgoing interface flags: H - Hardware switched, A - Assert winner, p - PIM Join
Timers: Uptime/Expires
Interface state: Interface, Next-Hop or VCD, State/Mode
(*, 239.1.1.1), 2w0d/00:02:37, RP 10.0.1.1, flags: SJCF
Incoming interface: GigabitEthernet0/1, RPF nbr 10.1.0.1
Outgoing interface list:
GigabitEthernet0/3, Forward/Sparse, 2w0d/00:02:37
GigabitEthernet0/2, Forward/Sparse, 2w0d/stopped
GigabitEthernet0/4, Forward/Sparse, 2w0d/stopped
(192.168.10.2, 239.1.1.1), 00:11:38/00:02:29, flags: FT
Incoming interface: GigabitEthernet0/4, RPF nbr 0.0.0.0
Outgoing interface list:
GigabitEthernet0/2, Forward/Sparse, 00:11:38/00:02:38
GigabitEthernet0/3, Forward/Sparse, 00:11:38/00:02:41
(*, 224.0.1.40), 2w0d/00:02:36, RP 10.0.1.1, flags: SJCL
Incoming interface: GigabitEthernet0/1, RPF nbr 10.1.0.1
Outgoing interface list:
GigabitEthernet0/3, Forward/Sparse, 2w0d/00:02:36
GigabitEthernet0/2, Forward/Sparse, 2w0d/stopped
ルータ5の状態
最後にルータ5の状態を見ていきましょう。
以下の状態から分かる通り、(*,239.1.1.1)が共有ツリー、(192.168.10.2,239.1.1.1)が送信元ツリーになります。
ルータ5では、上位のルータが「ルータ2」と「ルータ3」の2台につながっているため、共有ツリーのIncoming interfaceはルータ3向けの「Gi0/1」、送信元ツリーのIncoming interfaceはルータ2向けの「Gi0/2」になっています。
Router5#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,
N - Received BGP Shared-Tree Prune, n - BGP C-Mroute suppressed,
Q - Received BGP S-A Route, q - Sent BGP S-A Route,
V - RD & Vector, v - Vector, p - PIM Joins on route,
x - VxLAN group
Outgoing interface flags: H - Hardware switched, A - Assert winner, p - PIM Join
Timers: Uptime/Expires
Interface state: Interface, Next-Hop or VCD, State/Mode
(*, 239.1.1.1), 23:30:12/stopped, RP 10.0.1.1, flags: SJC
Incoming interface: GigabitEthernet0/1, RPF nbr 10.5.0.1
Outgoing interface list:
GigabitEthernet0/3, Forward/Sparse, 23:30:12/00:02:46
(192.168.10.2, 239.1.1.1), 00:00:11/00:02:48, flags: J
Incoming interface: GigabitEthernet0/2, RPF nbr 10.4.0.1
Outgoing interface list:
GigabitEthernet0/3, Forward/Sparse, 00:00:11/00:02:48
(*, 224.0.1.40), 2w0d/00:02:09, RP 10.0.1.1, flags: SJCL
Incoming interface: GigabitEthernet0/1, RPF nbr 10.5.0.1
Outgoing interface list:
GigabitEthernet0/2, Forward/Sparse, 2w0d/stopped

最後に
今回は、マルチキャストのプロトコルの1つである「PIM-SM」についてまとめました。
次回は、「PIM-SM」のスイッチオーバ機能やAuto-RP、MLDについてまとめていきたいと思います。