2-6 STP と RSTP
Spanning Tree Protocol が L2 ループを自動防止する仕組み。3 スイッチ三角構成でブロッキングポートが選ばれる様子を Rapid PVST+ で実機確認する。
1. なぜ STP が必要か
L2 スイッチは、宛先 MAC アドレスが CAM テーブルにない時、そのフレームを受信ポート以外の全ポートにフラッディングします。これは未知ユニキャスト・ブロードキャスト・マルチキャストのいずれでも同じ挙動です。スイッチが 1 台だけ、あるいは 2 台を 1 本のリンクで結んだだけの構成では、この「全ポートにばら撒く」動きは何の問題も起こしません。
問題は、スイッチを 3 台以上で環状に結んだ瞬間に発生します。下図のように SW1・SW2・SW3 を 3 本のトランクで三角形に接続したケースが典型です。

ここで SW1 配下のホストがブロードキャストフレームを 1 枚送出すると、以下の連鎖が起こります。SW1 はそれを Gi0/1 と Gi0/2 の両方にフラッディングします。SW2 と SW3 はそれぞれ受け取ったブロードキャストを「受信したポート以外の全ポート」に再フラッディングします。すると SW2 → SW3 と SW3 → SW2 の経路でもう一度同じフレームが流れ、そのフレームは SW1 へ戻ってきます。SW1 から見れば「自分が出したフレームと同じ内容のものが戻ってきた」状態ですが、L2 フレームには TTL に相当するホップカウントが存在しないため、SW1 はこれを区別できません。受け取ったフレームは再びフラッディングされ、ループが永続します。
ループに乗ったブロードキャストは、現実の機器では十数ミリ秒のうちにリンク帯域を埋め尽くします。これが ブロードキャストストーム (Broadcast Storm) です。同時に、同じ MAC アドレスを持つフレームが複数のポートから次々に届くため、各スイッチの CAM テーブルは「ホスト A は Gi0/1 にいる」「いや Gi0/2 にいる」という書き換え合戦を起こし、正常なユニキャスト転送も巻き添えで破綻します。1 つのループで L2 ドメイン全体が停止するという、L2 ループの怖さです。
一方で冗長性の観点から、現場では「リンク 1 本切れてもサービスは止めない」設計を要求されます。複数のスイッチを冗長に結ぶ以上、物理的なループは避けて通れません。物理ループを許しつつ論理的にループを断つ仕組みが必要となります。それが本節で扱う Spanning Tree Protocol (STP) です。
2. STP の役割
STP (Spanning Tree Protocol、IEEE 802.1D) は、物理的にループを持つトポロジから論理的にループのない木構造 (Spanning Tree) を 1 つ選び出すプロトコルです。木構造とは、グラフ理論で「ループのない連結グラフ」を指します。SW1 / SW2 / SW3 の三角形であれば、3 本のリンクのうち 2 本だけを使って木を作れば、ループは解消され、かつ全ノードが到達可能な状態は保たれます。
STP の発想はシンプルで、「全スイッチが BPDU (Bridge Protocol Data Unit) という制御フレームを交換し、誰が木の根元 (Root Bridge) か、各リンクで誰が転送責任を持つかを分散的に合意する」点に尽きます。合意が取れたら、木に含まれないポートは 論理的にフレーム転送を止めます。物理リンクは up したまま、BPDU だけは受け取り続けますが、データフレームは送信も受信もしません。この状態を Blocking と呼びます。
Blocking 状態のポートは「使われていない」ように見えますが、Root Bridge や他のリンクに障害が起きると Forwarding に切り替わって木を再構築します。ただし旧来の STP (802.1D) では Blocking から Forwarding へ移る際に Listening → Learning という遷移状態を通り、標準では合計 30 秒 (Forward Delay 15 秒 × 2) ほどかかります。後述の RSTP では、こうした待機ポート (Alternate Port) を点対点リンクなどの条件下で高速に Forwarding へ昇格できます。普段は遊んでいるように見えて、いざという時の予備路として待機する運用です。
3. STP の用語
STP の挙動を読むには、最低限 4 つの用語を押さえる必要があります。
- Root Bridge: 全 STP インスタンスの起点となるスイッチ。木構造の根元にあたる存在。Bridge Priority (既定 32768) が最小のスイッチが選ばれ、priority が同値なら MAC アドレスが小さい方が勝ち。設計上はコアスイッチを意図的に低 priority に設定して固定するのが定石。
- Root Port (RP): Root Bridge ではない各スイッチが、Root へ向けて最短経路で出るポート。コストが最小のポートが選ばれる。1 スイッチあたり 1 つだけ存在。
- Designated Port (DP): 各物理リンクで「このリンクの転送責任を持つ」と合意されたポート。Root Bridge では全ポートが Designated になる。それ以外のスイッチでは、リンクの両端でコスト比較などを経て一方のスイッチのポートが Designated に選ばれる。
- Alternate Port / Blocking Port: Root でも Designated でもない、余ったポート。データフレームは送らず BPDU だけを聞く。RSTP では Alternate Port、旧 STP では単に Blocking と呼ぶ。
「Root Bridge を選ぶ → 各スイッチが Root Port を 1 つ選ぶ → 各リンクで Designated Port を選ぶ → 残りを Blocking する」という順序で木が決まります。本節の検証では、3 つ目までで木が完成し、4 つ目の Blocking が現れる構成になっています。
ポートのコストは、リンク速度から決まる整数値です。IEEE が定めた short cost では 10 Mbps = 100、100 Mbps = 19、1 Gbps = 4、10 Gbps = 2 となります。本節で使う 1 Gbps リンクのコストは 4 で、後の show 出力で繰り返し登場します。
4. RSTP — 収束を高速化
旧 STP (802.1D) には、致命的とは言わないまでも実運用で痛い欠点があります。それは 収束が遅い 点です。リンクが新しく up した時、ポートはまず Listening 状態に入り、ここで 15 秒 (Forward Delay) BPDU を聞いて木の状態を判断します。次に Learning 状態に 15 秒留まり、データフレームの転送はせずに MAC 学習だけを行います。そこからようやく Forwarding に遷移します。リンク 1 本が up してから実際にトラフィックを流せるまで 30 秒、Root Bridge 障害などで木の再計算が走るケースでは合計 50 秒近くかかります。サーバや SIP 電話などの再接続にはあまりに長い時間です。
RSTP (Rapid Spanning Tree Protocol、802.1w) は、この収束を 数秒 に短縮するために設計されました。BPDU の意味を拡張し、ポート役割 (Root / Designated / Alternate / Backup) と状態 (Discarding / Learning / Forwarding) を分離します。隣接スイッチ同士で「自分の側で見ている木の状態」を直接ハンドシェイクし、合意が取れた瞬間に Forwarding へ遷移する仕組み (Proposal / Agreement) が追加されました。結果、点対点リンクであれば 1〜2 秒で新しい木が安定します。
Cisco では、VLAN ごとに別の STP インスタンスを動かす PVST+ (Per-VLAN Spanning Tree Plus) が標準ですが、これを RSTP ベースで動かすモードを Rapid PVST+ と呼びます。グローバルコンフィグで spanning-tree mode rapid-pvst と入れるだけで切り替わります。現代の Cisco スイッチではこのモードが事実上の標準で、旧 STP を意図して使う場面はほぼありません。本ラボもこのモードで検証します。
5. CML での検証
検証は CML (Cisco Modeling Labs) 上の iosvl2 で行います。前節までと同じ理由で、Cat9000v ではなく軽量な iosvl2 を採用しました。STP / RSTP の挙動は IOS と IOS-XE で完全に共通です。
トポロジは図に示したとおり 3 台のスイッチを三角形に結んだ構成で、SW1 が Root Bridge になるよう priority を 4096 に固定しました。SW2 / SW3 は既定値の 32768 のままです。
Gi0/1
┌──────────┐
SW1 ──┤ ├── SW2
Gi0/1 │ │ Gi0/1
│ │
Gi0/2 │ │ Gi0/2
SW1 ──┤ ├── SW3
Gi0/2 (SW3 側 Gi0/1 が SW2 と)正確には、SW1-SW2 が SW1 Gi0/1 ↔ SW2 Gi0/1、SW2-SW3 が SW2 Gi0/2 ↔ SW3 Gi0/1、SW3-SW1 が SW3 Gi0/2 ↔ SW1 Gi0/2 という結線で、3 本ともトランクとして上げてあります。各スイッチの day0 config から STP とトランクに関わる部分を抜くと、SW1 は以下のとおりです。
spanning-tree mode rapid-pvst
spanning-tree vlan 1 priority 4096
!
interface GigabitEthernet0/1
description Trunk
switchport trunk encapsulation dot1q
switchport mode trunk
!
interface GigabitEthernet0/2
description Trunk
switchport trunk encapsulation dot1q
switchport mode trunkSW2 / SW3 は priority のラインがなく spanning-tree mode rapid-pvst だけ、それと Gi0/1 / Gi0/2 がトランクとして設定されている点だけが SW1 と異なります。VLAN は default の 1 のみで検証します。Cisco の PVST+ は VLAN ごとに独立した STP インスタンスを持つため、VLAN を増やすと VLAN 10 と VLAN 20 で別々に Root を選ぶ設計も可能となりますが、ここでは木構造の基本動作を見るために VLAN 1 だけに絞ります。
6. SW1 (Root) — 全ポート Designated Forwarding
まず SW1 から確認します。show spanning-tree summary で全体像を把握します。
SW1#show spanning-tree summary
Switch is in rapid-pvst mode
Root bridge for: VLAN0001
Extended system ID is enabled
Portfast Default is disabled
Portfast Edge BPDU Guard Default is disabled
Portfast Edge BPDU Filter Default is disabled
Loopguard Default is disabled
PVST Simulation Default is enabled but inactive in rapid-pvst mode
Bridge Assurance is enabled
EtherChannel misconfig guard is enabled
Configured Pathcost method used is short
UplinkFast is disabled
BackboneFast is disabled
Name Blocking Listening Learning Forwarding STP Active
---------------------- -------- --------- -------- ---------- ----------
VLAN0001 0 0 0 3 3
---------------------- -------- --------- -------- ---------- ----------
1 vlan 0 0 0 3 3冒頭 Switch is in rapid-pvst mode で動作モード、Root bridge for: VLAN0001 で SW1 が VLAN1 の Root であることが明示されています。下段の集計を見ると、Blocking が 0、Forwarding が 3 で、SW1 の 3 ポート (Gi0/0 / Gi0/1 / Gi0/2) はすべて Forwarding 状態です。Root Bridge は全ポートが Designated になるという STP の基本そのままの状態です。Bridge Assurance や Pathcost method (short) などの既定値も Cisco rapid-pvst の標準どおりに有効化されています。
続いて VLAN 単位の詳細を見ます。
SW1#show spanning-tree vlan 1
VLAN0001
Spanning tree enabled protocol rstp
Root ID Priority 4097
Address 5254.000e.7d61
This bridge is the root
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 4097 (priority 4096 sys-id-ext 1)
Address 5254.000e.7d61
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 Desg FWD 4 128.2 P2p
Gi0/2 Desg FWD 4 128.3 P2p重要な情報は次の 3 点です。Spanning tree enabled protocol rstp で動作プロトコルが RSTP (Rapid PVST+ は内部で RSTP を動かしている) であることが分かります。This bridge is the root の 1 行で SW1 自身が Root であることが明示されています。そして Root ID Priority 4097 と Bridge ID Priority 4097 が完全に一致しています。これは「Root のブリッジ ID = 自分のブリッジ ID」、すなわち自分が Root であるという論理の表れです。
Priority 4097 という半端な数字には理由があります。Cisco の PVST+ は VLAN ごとに別 STP を動かすため、Bridge Priority に VLAN ID (sys-id-ext と呼ぶ) を足し込む 仕様になっています。(priority 4096 sys-id-ext 1) の括弧書きが内訳で、設定値 4096 に VLAN 1 の 1 を足して 4097 となります。VLAN 10 なら 4106、VLAN 100 なら 4196 です。これを Extended System ID と呼び、有効化されている状態が show spanning-tree summary の Extended system ID is enabled に対応します。
下段のポート一覧では Gi0/0 / Gi0/1 / Gi0/2 のすべてが Desg FWD (Designated Forwarding)、Cost 4、Type P2p です。Cost 4 は 1 Gbps リンクの IEEE short cost そのもので、Type P2p (Point-to-Point) はそのリンクが点対点リンクであることを示します。RSTP は既定で全二重リンクを point-to-point、半二重リンクを shared とみなします (spanning-tree link-type で明示指定も可能)。P2p と判定されたリンクは RSTP の高速収束 (Proposal / Agreement) の対象になります。
7. SW3 — Blocking ポートが選ばれる(本節の山場)
SW2 と SW3 は priority 既定値の 32768 のままなので、SW1 に Root を奪われています。まず SW2 から確認します。
SW2#show spanning-tree vlan 1
VLAN0001
Spanning tree enabled protocol rstp
Root ID Priority 4097
Address 5254.000e.7d61
Cost 4
Port 2 (GigabitEthernet0/1)
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 32769 (priority 32768 sys-id-ext 1)
Address 5254.00bd.131d
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
Gi0/2 Desg FWD 4 128.3 P2pRoot ID Priority 4097 と Bridge ID Priority 32769 が異なる値になっており、SW2 が Root ではないことが分かります。Bridge ID 32769 は priority 32768 (既定) に VLAN 1 の sys-id-ext を足した値です。Root ID Cost 4 は SW2 から Root までのパスコストで、Gi0/1 リンク 1 本ぶんの 4 がそのまま乗っています。
下段ポート一覧では、SW1 へ直接向いている Gi0/1 が Root FWD (Root Port) に選ばれています。これが SW2 から見た Root への最短経路です。SW3 へ向かう Gi0/2 は Desg FWD (Designated) で、SW2 側はこのリンクの転送責任を持っています。ただし対向の SW3 Gi0/1 が後述のとおり Altn BLK でブロックされているため、SW2-SW3 リンクは end-to-end ではデータ転送に使われません。実際にフレームが通る転送木は SW1-SW2 と SW1-SW3 の 2 本で、SW2 はその一翼を担う立ち位置にあります。
ここまでは予想どおりの結果です。問題は SW3 です。SW3 は 3 角形の最後の頂点で、SW1 と SW2 の両方に直接繋がっています。両方を Forwarding で使うとループが完成します。STP がここで何を選ぶかが本節の核心です。
SW3#show spanning-tree vlan 1
VLAN0001
Spanning tree enabled protocol rstp
Root ID Priority 4097
Address 5254.000e.7d61
Cost 4
Port 3 (GigabitEthernet0/2)
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 32769 (priority 32768 sys-id-ext 1)
Address 5254.00c9.df4b
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 Altn BLK 4 128.2 P2p
Gi0/2 Root FWD 4 128.3 P2p注目すべきは下段の 2 行です。SW1 へ直接向いている Gi0/2 は Root FWD で、コスト 4 で Root に到達する経路として選ばれています。問題は SW2 へ向かう Gi0/1 で、ここが Altn BLK (Alternate / Blocking) になっています。これが本節の核心です。
物理的には Gi0/1 は up しており、対向の SW2 Gi0/2 と正しく繋がっています。トラフィックを通そうと思えば通せる状態にあります。にもかかわらず、STP はこのポートを論理的にブロックし、データフレームの送受信を止めています。BPDU だけは受信し続けて、SW1 や SW2 で何か変化 (リンクダウン等) があれば即座に Forwarding へ切り替えられるよう待機している、というのが Alternate Port の役割です。
これを単独ポート表示で見ても同じ結論が確認できます。
SW3#show spanning-tree interface Gi0/1
Vlan Role Sts Cost Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
VLAN0001 Altn BLK 4 128.2 P2p
SW3#show spanning-tree interface Gi0/2
Vlan Role Sts Cost Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
VLAN0001 Root FWD 4 128.3 P2p物理レイヤの状態と論理レイヤの状態を切り分けて見るには、show interfaces status を併せて読みます。
SW3#show interfaces status
Port Name Status Vlan Duplex Speed Type
Gi0/0 notconnect 1 a-full auto RJ45
Gi0/1 Trunk connected trunk a-full auto RJ45
Gi0/2 Trunk connected trunk a-full auto RJ45Gi0/1 / Gi0/2 はどちらも connected で、物理リンクは両方 up しています。にもかかわらず STP の上では Gi0/1 だけが Blocking、Gi0/2 だけが Forwarding という非対称な状態が選ばれています。「物理的にループしているが、STP が 1 ポートを論理的にブロックすることで、実害のあるループが発生しない」 という、STP の存在意義がそのまま現れた状態です。
仮に SW3 Gi0/2 のリンクが故障して SW1-SW3 直接路が失われた場合、Gi0/1 で受信していた BPDU の役割が突然「最良ルート」に格上げされ、Alternate だった Gi0/1 が即座に Root Port に昇格して Forwarding に切り替わります。SW3 は SW2 経由で Root に到達する木に再収束します。RSTP であれば、この再収束は数秒で完了します。「普段使わないリンク」が「いざという時の予備路」として機能する、というのが STP / RSTP の本質です。
3 つのスイッチがどの木に収束したかを整理すると以下のとおりです。
| スイッチ | Gi0/1 | Gi0/2 |
|---|---|---|
| SW1 (Root) | Desg FWD(→SW2) | Desg FWD(→SW3) |
| SW2 | Root FWD(→SW1) | Desg FWD(→SW3) |
| SW3 | Altn BLK(→SW2) | Root FWD(→SW1) |
論理的に使われているリンクは SW1-SW2 と SW1-SW3 の 2 本だけで、SW2-SW3 の片側 (SW3 Gi0/1) が Blocking になっています。3 角形の 1 辺を「切った」結果、ループのない木構造 (SW1 を根とする V 字) が出来上がっています。
8. 落とし穴・補足
- PVST+ は VLAN ごとに別 STP インスタンス: Cisco の Rapid PVST+ は VLAN ごとに独立した STP インスタンスを動かします。VLAN 10 と VLAN 20 で別のスイッチを Root にする、いわゆる Root 分散の設計が可能になる反面、VLAN 数 × スイッチ数のリソースを STP が消費します。VLAN が数十以上ある環境では MST (Multiple Spanning Tree、802.1s) でインスタンスを束ねるのが定石になります。
- BPDU Guard: 後述の PortFast を有効にしたアクセスポートに、想定外の BPDU が届いた瞬間にそのポートを
err-disableで強制シャットダウンする機能。ユーザーが机の下で勝手にスイッチを増設し、それが STP に参加してきて Root を奪うような事故を防ぐ、現場で最も多用される STP 系セキュリティ拡張です。 - Root Guard: 特定のポート方向から「自分より優先度の高い BPDU」が届いた場合に、そのポートを
root-inconsistent状態にして転送を止める機能。意図しないスイッチに Root を奪われることを防ぎます。コアから見たアクセス側のポートで有効化するのが典型です。 - PortFast: アクセスポートに対し、Listening / Learning を飛ばして即 Forwarding に遷移させるオプション。エンドポイント (PC、サーバ、IP 電話) が繋がる前提のポートで使います。スイッチ間トランクで PortFast を有効にしてはいけません (ループが収束前に発生する可能性があるため)。
- Bridge Assurance: 双方向の BPDU 送信を相互確認し、片方向リンク障害などで BPDU が止まったポートを
inconsistentで停止する機能。show spanning-tree summaryのBridge Assurance is enabledは、この機能がスイッチでグローバルに有効であることを示します。ただし Bridge Assurance が実際に効くのは link-type がnetworkのポートに限られるため、当該機能を活かすにはトランクポートを network port に設定する必要があります(本ラボの各リンクは Type がP2pのみで、Bridge Assurance が個々のポートで動作している状態までは示していません)。
9. 次節
ここまでで、L2 ループの危険性、STP / RSTP がループを論理的に断つ仕組み、そして Cisco Rapid PVST+ における Root Bridge 選出と Blocking ポート選択を、3 SW 三角構成の実機出力で追いました。物理的にループしているリンクのうち 1 本だけを論理ブロックすることで、フレームの永久周回を防いでいる、というのが核心でした。
2-7 EtherChannel では、複数の物理リンクを 1 つの論理リンクに束ねる仕組みを扱います。EtherChannel で束ねた複数本のリンクは、STP からは「1 ポート」として扱われ、束ねた本数ぶんの帯域を素直に合算できます。STP に Blocking させるのではなく、最初からループにならない「太い 1 本」を作る、という発想の冗長化手法を見ていきましょう。

spanning-tree mode rapid-pvst と入れるだけ。今回のラボもこれで検証する。じゃあ実機を見よう。CML で iosvl2 を 3 台、三角形に結んで、SW1 が Root になるよう priority を 4096 に固定した。SW2 / SW3 は既定の 32768 のままだ。まず Root の SW1 から。SW1#show spanning-tree vlan 1
Root ID Priority 4097
This bridge is the root
Interface Role Sts Cost Prio.Nbr Type
------------------- ---- --- --------- -------- -----
Gi0/0 Desg FWD 4 128.1 P2p
Gi0/1 Desg FWD 4 128.2 P2p
Gi0/2 Desg FWD 4 128.3 P2pThis bridge is the root で SW1 自身が Root だと明示されている。全ポートが Desg FWD(Designated Forwarding)だろう。Root Bridge は全ポートが Designated になる、という基本そのままだ。Cost 4 は 1 Gbps リンクの値、Type P2p は点対点リンクで RSTP の高速収束の対象、という意味だよ。4097 って半端な数字りん。設定したのは 4096 のはずりん?SW3#show spanning-tree vlan 1
Root ID Priority 4097
Cost 4
Port 3 (GigabitEthernet0/2)
Interface Role Sts Cost Prio.Nbr Type
------------------- ---- --- --------- -------- -----
Gi0/0 Desg FWD 4 128.1 P2p
Gi0/1 Altn BLK 4 128.2 P2p
Gi0/2 Root FWD 4 128.3 P2pRoot FWD ── Root への最短経路として選ばれた。そして SW2 へ向かう Gi0/1 が Altn BLK(Alternate / Blocking)になっている。これが核心だ。物理的には Gi0/1 は up していて、対向の SW2 とちゃんとつながっている。通そうと思えば通せる。にもかかわらず、STP はこのポートを論理的にブロックして、データフレームの送受信を止めているんだ。| スイッチ | Gi0/1 | Gi0/2 |
|---|---|---|
| SW1 (Root) | Desg FWD(→SW2) | Desg FWD(→SW3) |
| SW2 | Root FWD(→SW1) | Desg FWD(→SW3) |
| SW3 | Altn BLK(→SW2) | Root FWD(→SW1) |