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 はこれを区別できない。受け取ったフレームは再びフラッディングされ、ループが永続する。
ループに乗ったブロードキャストは、現実の機器では十数ミリ秒のうちにリンク帯域を埋め尽くす。これが ブロードキャストストーム である。同時に、同じ MAC アドレスを持つフレームが複数のポートから次々に届くため、各スイッチの CAM テーブルは「ホスト A は Gi0/1 にいる」「いや Gi0/2 にいる」と書き換え合戦を起こし、正常なユニキャスト転送も巻き添えで破綻する。1 つのループで L2 ドメイン全体が停止する、というのが L2 ループの怖さである。
ところが冗長性の観点から、現場では「リンク 1 本切れてもサービスは止めない」設計を要求される。複数のスイッチを冗長に結ぶ以上、物理的なループは避けて通れない。物理ループを許しつつ、論理的にはループを断つ仕組みが要る。それが本節で扱う Spanning Tree Protocol である。
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 状態である。
ブロッキングされたポートは「使われていない」ように見えるが、Root Bridge や他のリンクに障害が起きると、即座に 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 になる。それ以外のスイッチでは、リンクの両端でコスト比較などを経て一方の switch のポートが 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)は隣接が 1 台のスイッチであることを RSTP が検出している証である。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 リンクの転送責任を SW2 側が持っている状態だ。SW2 はループのある 3 角形のうち SW1-SW2 と SW2-SW3 の 2 本でデータを通せる、まっとうな立ち位置にいる。
ここまでは予想どおりの結果である。問題は 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で動作しているのが分かる。現代の Cisco rapid-pvst では既定で有効。
9. 次節
ここまでで、L2 ループの危険性、STP / RSTP がループを論理的に断つ仕組み、そして Cisco Rapid PVST+ における Root Bridge 選出と Blocking ポート選択を、3 SW 三角構成の実機出力で追った。物理的にループしているリンクのうち 1 本だけを論理ブロックすることで、フレームの永久周回を防いでいる、というのが核心であった。
次節 2-7「EtherChannel」では、複数の物理リンクを 1 つの論理リンクに束ねる仕組みを扱う。EtherChannel で束ねた複数本のリンクは、STP からは「1 ポート」として扱われ、束ねた本数ぶんの帯域を素直に合算できる。STP に Blocking させるのではなく、最初からループにならない「太い 1 本」を作る、という発想の冗長化手法である。