はじめに
こんにちは。ネットワークエンジニアの「だいまる」です。
今回はネットワークの基本中の基本となるSpanning Tree Protocol(STP)と高速収束が可能なRapid-STP(RSTP)について、復習と深掘りを兼ねてまとめていきたいと思います。
今回は、夏休みシーズンということもあり、家のセキュリティを少しでも高めるためのスマートホームに関する広告を貼り付けております。
STP(Spanning Tree Protocol)とは
STP(Spanning Tree Protocol)とは、ループで形成されたL2ネットワーク上でループを発生させないために利用するプロトコルです。
信頼性の高いネットワーク構築のためには、迂回路を考慮したネットワーク構成が必要となります。
STPを使わない場合、L2NW上のSwitchは受信したIF以外のIFにMACアドレスの解決のためにARPリクエストを送ります。この連鎖が続くとブロードキャストストームが発生するのです。
※ブロードキャストストーム:ブロードキャストパケットが複製され、通信帯域を圧迫し輻輳を発生させること
このブロードキャストストームの防止にSTPを利用するのです。
STPを利用すると論理的にはサイクル(ループ・閉路)がなくなり、ブロードキャストストームが発生しないようになります。
余談ですがスパニングツリーとはグラフ理論で出てくる用語の1つであり、全域木とも呼びます。
この全域木とはグラフに存在する頂点(ノード:ルータ・スイッチ)をすべて使った木(閉路:サイクルが存在しない)になります。
グラフ理論や組み合わせ最適化問題を勉強することでネットワークで利用されるアルゴリズムを深く理解することができると思います。
私が学生時代に使っていた教材を紹介させていただきますね。
STPの理解には欠かせないBPDUメッセージ
STPの概要が理解できたところでBPDUメッセージについてまとめていきます。
BPDUメッセージは、STPに関連する情報をやり取りするためのメッセージです。
このメッセージは、STPのRoot IDやPath Cost、ブリッジIDなどが含まれています。
フィールド名 | Bit数 | 用途 |
宛先 | 48bit | マルチキャストアドレス(0180.C200.000) |
Protocol ID | 16bit | STP:0 RSTP:2 |
Version | 8bit | STP:0 RSTP:2 |
Message Types | 8bit | ・通常BPDU:0x00 ・変更時BPDU:0x80 |
Flags | 8bit | トポロジ変更や確認応答を表す情報 |
Root ID | 64bit | ルートブリッジのブリッジID |
Path Cost | 32bit | ルートブリッジに到達するまでの累積コスト |
Bridge ID | 32bit | スイッチ自身のブリッジID |
Port ID | 16bit | ポートプライオリティとポート番号 |
Message Age | 16bit | BPDUをルートブリッジが作成してからのホップカウント |
Max Age | 16bit | BPDUの最大保持時間(デフォルト:20秒) |
Hello Time | 16bit | BPDUの送信間隔(デフォルト:2秒) |
Forward Delay | 16bit | Listening/Learning状態にとどまる時間(デフォルト:15秒) |
このメッセージのフィールドをCMLのパケットキャプチャの機能を使って観てみましょう。
上記のパケットの中身にもある通り、基本的な値は全て想定通りとなっています。
STPの構成を決めるのはブリッジIDとパスコスト
次にSTPの構成を決定するブリッジIDとパスコストについて説明したいと思います。
ブリッジID
ブリッジIDとは、STPで利用するL2SWのIDとなります。
このIDのフィールドは、下の図にもある通りPriorityが16bit・MACアドレスが48bitとなっております。
このブリッジIDの最小値を持つL2SWがSTPのルートブリッジとなります。
ブリッジIDが同じ場合の優先度はプライオリティが小さいL2SWが優先度高となり、プライオリティも同一の場合はMACアドレスを比較し、小さいMACアドレスを持つ方が優先度が高くなります。
そのブリッジIDを構成するフィールドの1つであるPriorityはデフォルトが32768となっており、4096の倍数を指定する決まりとなっています。
ちなみに、先ほどのキャプチャしたパケットの中身にもブリッジIDは記載があるのでご確認いただければと思います。
また、Cisco IOS上での基本的な設定は、Priorityを変更することでルートブリッジを好きなL2SWに設定していきます。
(設定コマンド)
(config)#spanning-tree vlan <VLAN ID> priority <Priority値> ※4096の倍数
ルートブリッジにしたいときは、このPriority値を「0」にします。
パスコスト
パスコストはSTPの構成を決定するために利用するコストになります。
このパスコストは、帯域幅により決定されています。
帯域幅 | コスト値 |
10Gbps | 2 |
1Gbps | 4 |
100Mbps | 19 |
10Mbps | 100 |
この値は、後ほどポート種別を決定するために利用する値になってきます。
Cisco IOSではIF設定の配下にcost値を入力する形になります。
(設定コマンド)
(config-if)#spanning-tree cost <cost値>
ポート種別
ここまで説明してきたブリッジIDとパスコストにより、以下のポート種別が決められます。
ポート種別 | 決定ルール |
ルートポート(Root Port:RP) | ルートブリッジへのパスコストが最小値となるポート ①非ルートブリッジのみ ②各ポートのパスコスト→送信元ブリッジID→送信元ポートID |
指定ポート(Desginated Port:DP) | ルートブリッジへのパスコストが最小値となるポート ①各リンクごとに1ポート選出 ②各スイッチのパスコスト→送信元ブリ時ID→送信元ポートID |
非指定ポート(Non Desginated Port:NDP) | ルートポートと指定ポート以外のポート(ブロッキングポート) ※データ送受信はしないポート |
下の例を使って説明していきます。
L2SW1がPriority 0として指定しているためルートブリッジとなります。
L2SW2(Gi0/1)とL2SW3(Gi0/0)はルートブリッジから最小コストとなるポートのため、ルートポート(RP)となります。
また、L2SW2(Gi0/0)とL2SW3(Gi0/1)は指定ポート(DP)となります。これは、L2SW4側がRPとなっているためです。
(L2SW2の状態確認)
L2SW2#show spanning-tree vlan 2
VLAN0002
Spanning tree enabled protocol rstp
Root ID Priority 2
Address 5254.0009.652d
Cost 4
Port 2 (GigabitEthernet0/1)
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 32770 (priority 32768 sys-id-ext 2)
Address 5254.0007.55ed
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 300 sec
Interface Role Sts Cost Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Gi0/0 Desg FWD 4 128.1 P2p
Gi0/1 Root FWD 4 128.2 P2p
(L2SW3の状態確認)
L2SW3#show spanning-tree vlan 2
VLAN0002
Spanning tree enabled protocol rstp
Root ID Priority 2
Address 5254.0009.652d
Cost 4
Port 1 (GigabitEthernet0/0)
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 32770 (priority 32768 sys-id-ext 2)
Address 5254.0009.be24
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 300 sec
Interface Role Sts Cost Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Gi0/0 Root FWD 4 128.1 P2p
Gi0/1 Desg FWD 4 128.2 P2p
L2SW4はGi0/0はルートポート(RP)となり、Gi0/1が非指定ポート(NDP)となります。
ただ、状態表示の時はAlternative Port(Altn)となっております。
(L2SW4の状態確認)
L2SW4#show spanning-tree vlan 2
VLAN0002
Spanning tree enabled protocol rstp
Root ID Priority 2
Address 5254.0009.652d
Cost 8
Port 1 (GigabitEthernet0/0)
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 32770 (priority 32768 sys-id-ext 2)
Address 5254.0001.250c
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 300 sec
Interface Role Sts Cost Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Gi0/0 Root FWD 4 128.1 P2p
Gi0/1 Altn BLK 4 128.2 P2p
ポート状態
ポート種別をまとめた後は、各ポートの状態を説明していきたいと思います。
ポート状態 | 説明 |
Disable | Shutdown状態 |
Blocking | BPDUの受信のみでデータ転送はなし ※MACアドレス学習なし |
Listening | BPDU送受信中(データ転送なし・ポート種別の選出・15秒) ※MACアドレス学習なし |
Learning | BPDU送受信中(MACアドレス学習済・データ転送なし・15秒) |
Forwarding | データ転送・MACアドレス学習済 |
ポート状態の確認は、先程の確認コマンドで確認ができます。
その上で、状態遷移はDebugログをみながら確認していきたいと思います。
今回使ったデバッグコマンドは以下のコマンドになります。
debug spanning-tree events
debug spanning-tree pvst+
上記デバッグログを入力後、以下の出力があります。
*Jul 24 10:23:31.939: set portid: VLAN0002 Gi0/0: new port id 8001
*Jul 24 10:23:31.939: STP: PVST vlan 2 port Gi0/0 created, ext id CF7CE60
*Jul 24 10:23:31.939: STP: VLAN0002 Gi0/0 -> listening
*Jul 24 10:23:31.939: setting bridge id (which=3) prio 32771 prio cfg 32768 sysid 3 (on) id 8003.5254.0001.250c1
*Jul 24 10:23:33.253: STP: VLAN0002 heard root 32770-5254.0007.55ed on Gi0/0
*Jul 24 10:23:36.158: set portid: VLAN0002 Gi0/1: new port id 8002
*Jul 24 10:23:36.158: STP: PVST vlan 2 port Gi0/1 created, ext id CFDE318
*Jul 24 10:23:36.158: STP: VLAN0002 Gi0/1 -> listening
*Jul 24 10:23:37.942: STP: VLAN0002 Topology Change rcvd on Gi0/0
*Jul 24 10:23:46.939: STP: VLAN0002 Gi0/0 -> learning
*Jul 24 10:23:51.158: STP: VLAN0002 Gi0/1 -> learning
*Jul 24 10:24:01.939: STP[2]: Generating TC trap for port GigabitEthernet0/0
*Jul 24 10:24:01.939: STP: VLAN0002 Gi0/0 -> forwarding
*Jul 24 10:24:06.158: STP[2]: Generating TC trap for port GigabitEthernet0/1
*Jul 24 10:24:06.158: STP: VLAN0002 Gi0/1 -> forwarding
ちなみに、状態変化の時は「Topology Change Notification」のメッセージが送信されます。
その中身は、BPDUメッセージタイプが「0x80」となっています。
RSTP(Rapid-STP)とは
Rapid-STPとは名前の通りSTPの高速版となります。
STPと変わった点
RSTPとSTPの変わった点はポート種別とポート状態になります。
ポート種別(変更点のみ)
RSTPのポート種別は、以下の通り4つとなります。
ポート種別 | 決定ルール |
ルートポート(Root Port:RP) | ルートブリッジへのパスコストが最小値となるポート ①非ルートブリッジのみ ②各ポートのパスコスト→送信元ブリッジID→送信元ポートID |
指定ポート(Desginated Port:DP) | ルートブリッジへのパスコストが最小値となるポート ①各リンクごとに1ポート選出 ②各スイッチのパスコスト→送信元ブリ時ID→送信元ポートID |
代替ポート(Alternate Port:AP) | ルートポートのバックアップ用ポート(ルートポートのリンクダウン時に高速切替) ※データ送受信はしないポート |
バックアップポート(Backup Port:BP) | 指定ポートのバックアップとなるポート(指定ポートダウン時に切替) ※DP/BPの違いは送信元ポートID(小さい方がDPとなる) |
大きく変わった点は非指定ポートがなくなり、代替ポート(Alternate Port)とバックアップポート(Backup Port)が追加されました。
この2つは高速切替のためのバックアップポートとなり、ルートポートと指定ポート用の2つになります。
このポートにより障害検知した際に、再計算前に切り替えることが可能となります。
RSTPの適用のためには、以下のコマンドを入力します。
(config)#spanning-tree mode rapid-pvst
このコマンドを入れネットワーク構成に変化が発生した際のログを見ていきたいと思います。
使った構成は先程と同じ四角形の構成ですが、ポートの役割が異なります。
以下の図のL2SW4のGi0/1が非指定ポートではなく、Alternate Port(AP)になりました。
その上で、L2SW2ーL2SW4間のリンクで障害を起こしてみました。
その結果、L2SW4のみデバッグログが吐き出され、Gi0/0→G0/1に遷移していることがわかります。
その遷移の時間は、リンクダウンが13:17:49.630だったのに対し、Gi0/0がDPになったのが13:17.53.499と約4秒弱で切り替わっていることがわかります。
(L4SWのデバッグログ)
*Jul 25 13:17:49.630: %LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/0, changed state to down
*Jul 25 13:17:50.630: %LINK-3-UPDOWN: Interface GigabitEthernet0/0, changed state to down
*Jul 25 13:17:53.499: RSTP(2): Gi0/0 rcvd info expired
*Jul 25 13:17:53.499: RSTP(2): updt roles, information on root port Gi0/0 expired
*Jul 25 13:17:53.499: RSTP(2): Gi0/1 is now root port
*Jul 25 13:17:53.499: RSTP(2): Gi0/0 blocked by re-root
*Jul 25 13:17:53.499: RSTP(2): Gi0/0 is now designated
*Jul 25 13:17:53.499: STP[2]: Generating TC trap for port GigabitEthernet0/1
*Jul 25 13:17:53.500: RSTP(2): transmitting a proposal on Gi0/0
*Jul 25 13:17:54.788: RSTP(2): transmitting a proposal on Gi0/0
*Jul 25 13:17:56.789: RSTP(2): transmitting a proposal on Gi0/0undebug
*Jul 25 13:17:58.790: RSTP(2): transmitting a proposal on Gi0/0 all
All possible debugging has been turned off
このようにSTPではListening/Learningの状態で15秒ずつキープしていたのが、かなり高速に切り替わっていることがわかります。
RSTPを使うことで障害による断時間を極力最小限にした上でネットワーク構築・運用ができるようになります。
最後に
今回は、STP/RSTPの基本について、ざっくり復習と深掘りをしてみました。
次回の投稿では、作業時にSTPの迂回をどうするか考えたことがあるので、その話をしていきたいと思います。
コメント