スパニングツリープロトコル(STP/RSTP)の収束
冗長配線したのにループで網が落ちる、その悪夢をSTPがどう防ぐかが腑に落ちる。ルートブリッジ選出からRSTPの高速収束まで、ポート状態遷移で一気に押さえられる。
- 1.STPはBPDU交換で最小ブリッジIDのルートブリッジを選び、各ブリッジでルートへの最小コスト経路を残して冗長リンクをブロックし、物理ループを論理的な木に変える。
- 2.ポート役割はルートポート・指定ポート・非指定(ブロッキング)の順に決まり、コスト→送信ブリッジID→ポートIDのタイブレークで一意に定まる。
- 3.従来STPはタイマ駆動で収束に約50秒かかるが、RSTPは提案/合意ハンドシェイクとエッジ/ポイントツーポイントの区別で、トポロジ変化を秒未満で収束させる。
STP が解く問題:TTL のない世界のループ
L2スイッチは冗長性のために複数経路で結ばれますが、イーサネットフレームには /network/ethernet-switching-internals/ で述べたとおりL3の TTLに相当する寿命がありません。物理ループがあると、ブロードキャストや未知ユニキャストのフラッディングが永遠に回り、複製のたびに増殖して帯域を食い尽くす ブロードキャストストーム が起きます。さらにMACアドレステーブルが複数ポートで同一MACを学習し直す MACフラッピング も併発し、網が数秒で麻痺します。
STP(IEEE 802.1D)の発想は単純です。物理的にループした網から、冗長リンクを論理的にブロックして1本の木(スパニングツリー)を作る。木にはループがないので、フレームは安全に流れます。リンク障害時にはブロックしていた経路を復活させ、冗長性も確保します。問題は「どのリンクを止めるか」を、各ブリッジが中央制御なしに分散合意で決めることです。
ステップ1:ルートブリッジの選出
木を作るにはまず根を決めます。STPは網全体で ただ1台のルートブリッジ を選びます。基準は ブリッジID(BID)が最小 のブリッジです。BIDは次の構造を持ちます。
| フィールド | サイズ | 役割 |
|---|---|---|
| ブリッジプライオリティ | 2バイト | 管理者が設定する優先度。既定32768。小さいほど優先 |
| 拡張システムID | プライオリティ下位12ビット | VLAN番号を埋め込む(PVST+系) |
| MACアドレス | 6バイト | プライオリティが同値のときのタイブレーク。小さいほど優先 |
各ブリッジは起動時「自分がルートだ」と主張する BPDU(Bridge Protocol Data Unit) を送り合います。BPDUにはルートBID・送信元BID・ルートまでのパスコストが入っています。あるブリッジが自分より小さいルートBIDを載せたBPDUを受け取ったら、主張を取り下げてそのルートBIDを採用し、以後はそれを中継します。この比較が網全体で収束すると、最小BIDのブリッジだけが「自分がルート」と言い続け、全員がそれをルートと認めます。優先度を意図的に下げて特定機を確実にルートにするのが実務の定石です。
ステップ2:ポート役割の決定
ルートが決まると、各ブリッジは自分のポートに役割を割り当てます。鍵は ルートパスコスト(ルートブリッジまでの累積コスト)です。コストはリンク帯域に反比例し、速いリンクほど小さくなります。
| 役割 | 選定基準 | 状態 |
|---|---|---|
| ルートポート(RP) | そのブリッジでルートへ最小コストのポート。各非ルートブリッジに1つ | フォワーディング |
| 指定ポート(DP) | 各セグメントでルートへ最小コストを提供する側のポート | フォワーディング |
| 非指定ポート | RPでもDPでもない冗長ポート | ブロッキング |
決定は次の順で進みます。
1. ルートブリッジ自身: 全ポートが指定ポート(RPCは0)
2. 各非ルートブリッジ:
ルートパスコストが最小のポート → ルートポート(RP)
3. 各セグメント(リンク)ごと:
より小さいルートパスコストを送る側のポート → 指定ポート(DP)
4. RPでもDPでもないポート → 非指定(ブロッキング)でループを断つ
ブロッキングポートはデータフレームを送受信しませんが、BPDUの受信は続けます。これにより、現用リンクが切れたときブロッキングポートが昇格して経路を引き継げます。
コストが同点のとき、STPは次の優先順位で勝者を決めます。1) 最小ルートBID、2) 最小ルートパスコスト、3) 送信側ブリッジの最小BID、4) 送信側の最小ポートID(プライオリティ+ポート番号)。この多段比較により、対称な網でも必ず一意なツリーに収束します。「自分のポート優先度」ではなく「対向(送信側)のBID/ポートID」で割れる点が誤解しやすい要所です。
ステップ3:従来STPのポート状態遷移
STPはポートをいきなり転送状態にはしません。ループを避けるため、タイマで段階的に遷移します。
| 状態 | データ転送 | MAC学習 | BPDU | 標準滞在時間 |
|---|---|---|---|---|
| Blocking | しない | しない | 受信のみ | —(最大20秒で次へ) |
| Listening | しない | しない | 送受信 | 15秒(Forward Delay) |
| Learning | しない | する | 送受信 | 15秒(Forward Delay) |
| Forwarding | する | する | 送受信 | 安定状態 |
| Disabled | しない | しない | しない | 管理停止 |
ListeningとLearningにそれぞれ15秒(Forward Delay)、Blockingから抜ける判定に最大20秒(Max Age)を要するため、ブロックされていたポートが新たに転送を始めるまで最悪で約50秒 かかります。Listeningでツリー再計算とBPDU合意を待ち、Learningで先回りしてMACテーブルを作り、転送開始時の不要なフラッディングを減らす、という段取りです。
網の直径分だけBPDUが伝播し、全ブリッジの役割が確定するには時間がかかります。確定前に転送を始めると、過渡的なループが発生しかねません。Forward Delayはこの「全員の合意が行き渡る最大時間」を保守的に見積もった固定値です。安全ですが遅い。この50秒という代償を、後述のRSTPがハンドシェイクで置き換えます。
RSTP:ハンドシェイクで秒未満に収束させる
RSTP(IEEE 802.1w、現在は802.1Dに統合)は役割・選出のロジックはSTPを踏襲しつつ、収束を抜本的に速くします。要点は3つです。
第一に ポート役割の整理。ブロッキングを2種に分け、ルートポートのバックアップを 代替ポート(Alternate)、指定ポートのバックアップを バックアップポート(Backup) と明示します。代替ポートはルートポート障害時に即座に昇格できる「控え」です。
第二に 状態の簡素化。BlockingとListeningを廃止し、状態は Discarding / Learning / Forwarding の3つになります。
第三に、最大の高速化要因である 提案/合意(Proposal/Agreement)ハンドシェイク。隣接スイッチ間で「このポートを指定ポートにして転送開始してよいか」を直接やり取りし、同意が取れた区間から順に転送を開放します。タイマ待ちを、リンクごとの明示的な握手に置き換えるのが本質です。
# ポイントツーポイントリンクでの提案/合意(概略)
上流DP候補 → 下流: Proposal(私を指定ポートにしたい)
下流: 自分の他ポートを一旦Discardに落とす(同期: sync)
下流 → 上流: Agreement(同意する)
上流: そのポートを即Forwardingへ
→ 握手は隣接区間ごとに連鎖し、ルートから末端へ波及
RSTPは末端(PC直結など他スイッチがいない)ポートを エッジポート とみなし、ループの心配がないので即Forwardingにします。設定はCiscoのPortFast相当です。また握手が成立するのは ポイントツーポイント(全二重)リンク のみ。半二重の共有セグメントは相手が1台と確定できないため、従来同様タイマ収束にフォールバックします。全二重スイッチング環境が高速収束の前提です。
トポロジ変更通知(TCN)の違い
リンク障害でツリーが変わると、古いMACアドレステーブルのエントリは誤った経路を指したままになり得ます。STPは TCN BPDU をルートへ送り、ルートが網全体に変更を告知して、各ブリッジはエージング時間を既定300秒から Forward Delay(15秒)まで短縮 してテーブルを早く入れ替えます。間接的で遅い方式です。
RSTPはこれを根本から変えます。変化を検知したスイッチ自身が即座にTC(Topology Change)を網へ氾濫させ、関係するMACエントリを 即時フラッシュ します。ルートへの往復を待たないため、テーブルの再学習も速い。下表に収束特性をまとめます。
| 観点 | STP(802.1D 従来) | RSTP(802.1w) |
|---|---|---|
| ポート状態数 | 5(Disabled含む) | 3(Discarding/Learning/Forwarding) |
| 収束方式 | Forward Delay/Max Ageのタイマ駆動 | 提案/合意ハンドシェイク |
| 代表的な収束時間 | 約30〜50秒 | 1秒未満(多くは数百ミリ秒) |
| 冗長ポートの扱い | Blockingで一括 | Alternate / Backupに明示分離 |
| 変更通知 | TCNをルート経由で告知、エージング短縮 | 検知スイッチが即TC氾濫+即フラッシュ |
STP/RSTPだけに頼るのは危険です。BPDUが何らかの理由で途絶えると、ブロッキングポートがタイマ満了で転送を開始しループを生みます。実務ではエッジポートに BPDU Guard(想定外BPDU受信でポートを遮断)、上流に Root Guard(外部からのルート奪取を拒否)、片方向リンク障害に UDLD/Loop Guard を併用します。STPは「正しく動くときの設計」であり、異常系の防御は別途必要です。
全体像を一段で
STPは「最小BIDのルートを1台選び、各ブリッジでルートへ最小コストの経路だけを残して残りをブロックし、物理ループを木に変える」プロトコルです。役割決定はコスト→ルートBID→送信側BID→送信側ポートIDのタイブレークで一意に収束し、従来STPはその合意が行き渡るのを保守的なタイマで待つため約50秒を要しました。RSTPは提案/合意ハンドシェイクとエッジ/ポイントツーポイントの区別、即時TC氾濫により、同じ役割ロジックのまま収束を秒未満へ短縮します。L2のフラッディングとMAC学習、その引き金になるブロードキャスト/マルチキャストの挙動と合わせて捉えると、STPは「冗長性を保ちながらループだけを断つ自動制御」として一貫して読み解けます。
「ルートブリッジの選出基準は」→ 最小ブリッジID(プライオリティ+MAC)。「ルートポートの基準は」→ そのブリッジからルートへ最小ルートパスコストのポート。「タイブレークの順序は」→ ルートBID→ルートパスコスト→送信側BID→送信側ポートID。「STPの収束が遅い理由は」→ Listening/Learning各15秒とMax Age 20秒のタイマ駆動で約50秒。「RSTPが速い理由は」→ 提案/合意ハンドシェイクとエッジ/P2Pの区別、即時TCフラッシュ。この5点を状態遷移と結びつけられれば上級です。
ネットワーク Article
スパニングツリープロトコル(STP/RSTP)の収束を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
STP
比較で見る軸
難易度: advanced / カテゴリ: ネットワーク / タグ数: 5
導入後に効く点
ポート役割はルートポート・指定ポート・非指定(ブロッキング)の順に決まり、コスト→送信ブリッジID→ポートIDのタイブレークで一意に定まる。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- ネットワーク
- タグ数
- 5
判断チェックリスト
- 自社の用途が「STP / RSTP」に近いか確認する。
- 強みである「STPはBPDU交換で最小ブリッジIDのルートブリッジを選び、各ブリッジでルートへの最小コスト経路を残して冗長リンクをブロックし、物理ループを論理的な木に変える。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。