【実務・中級編】 STPにおけるBPDU(Bridge Protocol Data Unit)のメッセージフォーマットと各種タイマー設定 – インフラ・物理&L2/L3ネットワーク基礎実践ガイド

STPの深淵を覗く:BPDUとタイマーが支配する「L2の秩序」を完全理解する

ネットワークエンジニアの諸君、今日もパケットの海を泳いでいるか?
Web APIのレスポンスが遅い原因を追っていたら、結局のところ物理層やL2の設計ミスだった、なんていう「あるある」は、この業界に長く身を置く者なら一度は経験するものだ。

今回は、ネットワークの基礎にして、今なおL2ループという悪夢を食い止める最後の砦、STP(Spanning Tree Protocol)について掘り下げていこう。教科書的な記述は一旦横に置いて、現場で「なぜそのパラメータを触るのか」「障害時に何が起きているのか」をリアルに解説する。

—

1. BPDU:ネットワークの「生存報告」を読み解く

STPがループを回避できるのは、スイッチ同士が BPDU(Bridge Protocol Data Unit)という小さなパケットを交換し、お互いの立ち位置を確認し合っているからだ。

BPDUには大きく分けて2種類ある。

  • Configuration BPDU: ルートブリッジ選出やポート状態維持のための「平常時の挨拶」。
  • TCN(Topology Change Notification)BPDU: ネットワーク構成が変わった際に「大変だ、トポロジが崩れたぞ!」と叫ぶ「緊急通知」。

BPDUのフィールド構造と実務的解釈

Wiresharkでパケットをキャプチャすると見えるフィールドの中で、特に注目すべきは以下の項目だ。

  • Root Identifier / Bridge Identifier: 誰がルートで、誰が自分か。これが一致しなければ、トポロジは収束しない。
  • Message Age: ルートから発生して、現在何ホップ目(厳密には時間経過)か。これが Max Age を超えると、その経路は破棄される。
  • Flags: TCN のフラグが立っているかを確認せよ。ネットワークが不安定な時、ここが頻繁に書き換わっているはずだ。

—

2. STPタイマー:3つの「魔法の数字」と最適化の罠

STPの収束を遅くしているのは、設計者が無頓着にデフォルト値を設定しているこの3つのタイマーだ。

1. Hello Time (Default: 2s): 「生きてるか?」と尋ねる間隔。
2. Max Age (Default: 20s): 「返事がないから、このBPDUはもう古い」と判断するまでの猶予。
3. Forward Delay (Default: 15s): 状態遷移(Listening/Learning)にかかる時間。

なぜデフォルト値は「遅い」のか?

802.1D(従来のSTP)のタイマーは、大規模なネットワークで最大7ホップまでを想定して算出されている。しかし現代のデータセンターやオフィス環境で、物理的なスイッチを7段も重ねることはまずない。

現場のTips: もしネットワークの収束を早めたいなら、むやみにタイマーをいじる前に、まずは RSTP (802.1w) への移行を強く推奨する。RSTPは Proposal/Agreement メカニズムにより、タイマーを待たずに即時収束が可能だ。

—

3. 実践:トポロジ変更を検知する(Python/Scapyの視点)

「今、ネットワークでTCNが発生しているか?」を監視したい場合、CLIを叩き続けるのは非効率だ。Scapy を使えば、流れてくるBPDUをパケットキャプチャしてログを吐き出させることができる。

from scapy.all import sniff, Dot3, LLC, STP

# BPDUをキャプチャしてTCNの発生を監視するスクリプト
def packet_callback(packet):
    if packet.haslayer(STP):
        # TCNフラグが立っているかチェック
        if packet[STP].flags & 0x01:
            print(f"[!] トポロジ変更通知を受信しました: {packet.src}")
        else:
            print(f"[*] 通常のBPDUを受信: Root={packet[STP].rootid}")

# STPはLLCヘッダの中にカプセル化されている
print("STP監視を開始します...")
sniff(filter="ether proto 0x4242", prn=packet_callback, store=0)

—

4. インフラ運用の現場で絶対守るべき「鉄則」

最後に、トラブルシューティングで私が必ず確認する設定例を載せておく。これらは「STPの事故」を防ぐための最低限のガードレールだ。

! Cisco IOSでの推奨設定例
interface GigabitEthernet0/1
 description サーバー接続用ポート
 spanning-tree portfast          ! 接続した瞬間からForwardingにする(エンドデバイス用)
 spanning-tree bpduguard enable  ! ここからBPDUが来たらポートをシャットダウンする(ループ防止)

! ブリッジ優先度の固定(ルートブリッジがフラフラ移動しないようにする)
spanning-tree vlan 1 priority 4096

最後に:エンジニアへのアドバイス

BPDUの値を変更する際、Hello Time を短くしすぎると、わずかなパケットロスだけで「トポロジが不安定」と誤判定され、ネットワーク全体が再計算(コンバージェンス)の嵐に巻き込まれる。

「速くしたいなら、タイマーを削るな。設計をシンプルにせよ。」

これが、数々のトラブルを乗り越えてきた私の結論だ。STPは古臭いプロトコルに見えるかもしれないが、そのロジックにはネットワークの本質が詰まっている。パケットがスイッチを通り抜けるその瞬間に、バックグラウンドで何が起きているのか。常にその想像力を働かせていてほしい。

それでは、また次の「深淵」で会おう。

コメント

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