【実務・中級編】 STPポート状態の遷移(BlockingからForwardingまで) – インフラ・物理&L2/L3ネットワーク基礎実践ガイド

スパニングツリーの鼓動:BlockingからForwardingへ至る「30秒の沈黙」とL2ループの防衛戦

ネットワークエンジニアの皆さん、こんにちは。現場で数々のL2ループによる「ブロードキャストストーム」の轟音を聴いたことはあるでしょうか? スイッチのファンがフル回転し、CPU使用率が張り付き、管理画面すら応答しなくなるあの絶望感……。それを未然に防ぐための守護神こそが STP(Spanning Tree Protocol / IEEE 802.1D) です。

しかし、このSTP、いざ障害が発生した際やポートをアップした際に「なぜか通信が始まるまでにやたら時間がかかる」と感じたことはないでしょうか?「リンクアップしたのに、なんで30秒も繋がらないんだ!」とイライラした経験、誰しも一度はあるはずです。

今回は、STPのポート状態(Port States)が Blocking から Forwarding へ遷移するまでのドラマと、その裏で正確無比に刻まれるタイマーたちの秘密を、実務の現場目線で徹底的に紐解いていきます。

—

なぜSTPの遷移には時間がかかるのか?(設計思想の背景)

Web APIの設計やモダンなクラウドインフラの構築に慣れたエンジニアからすると、「ステータスの変更になぜ30秒もかかるのか、非効率ではないか?」と思われるかもしれません。HTTPリクエストであればタイムアウトレベルの時間です。

しかし、イーサネットの世界にはL3のような「TTL(Time to Live)」が存在しません。MACアドレステーブルのフラッディング(Unknown Unicast)やブロードキャストフレームは、物理ループが存在する限り、永遠にネットワーク内を回り続けます。

STPは、この「無限ループの恐怖」を確実に断ち切るために、ネットワーク全体でトポロジの収束(Convergence)が完了したことを保証してからデータ転送を許可するという安全第一の設計を採用しています。その慎重さの表れが、各ポート状態の遷移プロセスなのです。

—

ポート状態の5つのステップとタイマーの役割

STPが有効なポートは、物理的にリンクアップした後、以下の5つの状態を順番に(あるいは状況に応じて)駆け抜けます。

1. Blocking (ブロッキング)
2. Listening (リスニング)
3. Learning (ラーニング)
4. Forwarding (フォワーディング)
*(※初期状態や無効時は Disabled が存在)*

それぞれの状態と、そこで働くタイマーの正体を詳しく見ていきましょう。

1. Blocking(ブロッキング状態)

  • 役割: ループを防ぐための待機状態。
  • 挙動: ユーザーデータの送受信は行いません。ただし、隣接スイッチから送られてくる BPDU(Bridge Protocol Data Unit) の受信だけは行い、自分がブロックされるべきポジション(AlternateやBackupなど)にあるかを常に監視しています。
  • 関わるタイマー: Max Age(最大寿命)

> 実務Tips:Max Ageの正体
> スイッチが「親(Root Bridge)からの便り(BPDU)が途絶えた」と判断するまでの期限です。デフォルトは 20秒。もし直接繋がっているアップリンクがダウンし、別のバックアップパスへ切り替える際、この「20秒の沈黙」が切替遅延の原因になります。

2. Listening(リスニング状態)

  • 役割: トポロジの変更に備えて、自身がアクティブに参加すべきかを決定する準備期間。
  • 挙動: BPDUの送受信を行い、自身がルートポートや指定ポート(Designated Port)になるべきかを計算します。まだMACアドレスの学習は行わず、ユーザーデータも流しません。
  • 関わるタイマー: Forward Delay(フォワード遅延)の前半

3. Learning(ラーニング状態)

  • 役割: データ転送開始に向けた「助走期間」。
  • 挙動: BPDUを処理しつつ、接続されている端末のMACアドレスをソースMACアドレステーブルに学習し始めます。これにより、いざデータ転送が始まった瞬間にフラッディングが発生するのを防ぎます。
  • 関わるタイマー: Forward Delay の後半

4. Forwarding(フォワーディング状態)

  • 役割: 完全な運用状態。
  • 挙動: ユーザーデータの送受信、BPDUの送受信、MACアドレスの学習のすべてが許可され、ポートが完全に「開いた」状態になります。

—

タイムラインで追う:ListeningからForwardingへの遷移

標準STP(802.1D)において、ポートがBlockingからForwardingに変わる瞬間、タイマーは以下のように厳密に刻まれます。

[物理リンクアップ / トポロジ変動検知]
       ↓
  Blocking     (BPDUのみ受信。ループ防止の安全地帯)
       ↓  (Max Age 経過 or ポート有効化)
  Listening    (BPDU送受信。ロール決定。データ×、MAC学習×)
       ↓  (Forward Delayタイマー起動: デフォルト15秒)
  Learning     (BPDU送受信。データ×、MAC学習○)
       ↓  (Forward Delayタイマー起動: デフォルト15秒)
  Forwarding   (完全解放:データ○、MAC学習○、BPDU送受信○)

お気づきでしょうか? Listening(15秒) + Learning(15秒) = 合計30秒。
これが、標準STP環境下でポートがフォワーディングに至るまでの「マジックナンバー(30秒)」の正体です。もしトポロジに変化が生じ、Max Age(20秒)のタイムアウトが絡むと、最悪の場合は 50秒 もの通信断が発生します。可用性を重視するモダンなインフラにおいて、このロスは決して無視できません。

—

実務・コンフィグレーションでのアプローチ

現代のネットワーク(Cisco CatalystやNexus、各社L2スイッチ)では、この遅延を解消するために様々な拡張機能が標準、あるいは推奨設定として使われています。

1. Cisco Catalystにおけるタイマー確認とチューニング例

実際のCisco IOS環境でSTPのステータスやタイマーを確認・調整するコマンドを見てみましょう。

# 現在のSTPステータスとタイマー設定を確認する
Switch# show spanning-tree vlan 1

VLAN0001
  Spanning tree enabled protocol ieee
  Root ID    Priority    32768
             Address     aabb.cc00.0100
             This bridge is the root
  Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec
  Aging Time   300 sec

  Interface           Role Sts Cost   Prio.Nbr Type
  ------------------- ---- --- ------ -------- ----------------
  Gi0/1               Desg FWD 4      128.1    P2p 
  Gi0/2               Altn BLK 4      128.2    P2p

もし、どうしてもデフォルトの収束時間を調整したい場合(非推奨ですがレガシー環境のチューニング等)、以下のようにグローバルコンフィグでタイマーを変更できます。

Switch(config)# spanning-tree vlan 1 hello-time 1
Switch(config)# spanning-tree vlan 1 forward-delay 12
Switch(config)# spanning-tree vlan 1 max-age 16

*(※注意:STPの直径(Diameter)を変更せずにタイマーを詰めすぎると、BPDUのロストによる不意のループや不安定化を招くため、変更には十分な計算が必要です)*

2. 現代の救世主:PortFast / BPDU Guard の活用

エンド端末(サーバーのNICやクライアントPC)が接続されるアクセスポートに対して、わざわざ30秒のSTPステータス遷移を適用するのは無駄であり、DHCPタイムアウトなどの障害の原因になります。

そのため、実務ではエンドポートに対して PortFast(RSTP/MSTPではEdge Portと呼称) を有効にし、即座に Forwarding へ遷移させます。

# 特定のインターフェースにPortFastを設定し、即座にForwardingへ移行させる
Switch(config)# interface GigabitEthernet 0/1
Switch(config)# spanning-tree portfast
Switch(config)# spanning-tree bpduguard enable
  • spanning-tree portfast: ListeningやLearningをスキップし、リンクアップと同時に即座に Forwarding へジャンプさせます。
  • spanning-tree bpduguard enable: 万が一、PortFastポートに別のスイッチが接続されBPDUが送られてきた際、ポートを即座に err-disabled に落とし、ループ事故を物理的に防ぎます。インフラ運用の現場では必須の鉄則設定です。

—

まとめ:パケットの挙動を想像できるエンジニアに

ネットワークの背後では、今回解説したようなタイマーやステータス機械(State Machine)が絶えず静かに動き、私たちのアプリケーション層(Web APIやデータベースの同期など)の安定性を下支えしています。

「なぜこのポートはすぐ通信しないのか?」
「なぜリンクアップ直後にパケットがドロップするのか?」

そんな疑問に直面したとき、頭の中に Blocking から Forwarding へ向かうパケットとタイマーのカウントダウンが鮮明に思い浮かべば、あなたも立派なネットワークスペシャリストです。現場のインフラ構築やトラブルシューティングに、ぜひこの知識を役立ててください。

コメント

タイトルとURLをコピーしました