【実務・中級編】 STPのタイマー設定(Hello Timer, Forward Delay, Max Age) – インフラ・物理&L2/L3ネットワーク基礎実践ガイド

「まだSTPのデフォルト値で消耗してるの?」― ネットワーク収束を支配する3つのタイマーと現場の知恵

ネットワークエンジニアとして現場を渡り歩いていると、いまだに「STP(Spanning Tree Protocol)は遅い」という嘆きを耳にします。確かに、デフォルト設定のまま運用すれば、障害時に30秒から50秒もの通信断が発生するのは事実。現代のWeb APIやマイクロサービスが跋扈する環境において、それは「死」を意味します。

今日は、STPの心臓部であるタイマー設定にメスを入れ、いかにしてこの「レガシーな守護神」を現代のネットワークで適切に飼いならすか、その核心を解説しましょう。

—

収束の現場を支配する「3つのタイマー」の正体

IEEE 802.1Dで定義されたSTPは、ループを回避するために「慎重すぎる」ほど時間をかけて状態遷移を行います。その根拠となるのが以下の3つのパラメーターです。

1. Hello Time (デフォルト: 2秒)

  • ルートブリッジがBPDUを送信する間隔です。この間隔でトポロジの健康状態を監視します。

2. Forward Delay (デフォルト: 15秒)

  • ListeningからLearning、そしてForwardingへ移行する際に「待機」する時間です。ループを防ぐために、MACテーブルが学習されるまでの猶予期間を設けています。

3. Max Age (デフォルト: 20秒)

  • BPDUの有効期限です。最後にBPDUを受信してからこの時間が経過すると、その情報を破棄し、トポロジ変更を開始します。

これらが組み合わさり、障害発生から収束まで最大50秒(Max Age + Forward Delay + Forward Delay)かかる計算になります。この挙動は、まさに「石橋を叩いて渡る」という言葉そのものですが、今の時代にはあまりに重厚すぎます。

—

チューニングの鉄則:いじっていい場所、いけない場所

現場でタイマーをいじる際、必ず覚えておいてほしい鉄則があります。それは「タイマーの絶対値を下げるよりも、役割を分ける」ことです。

1. PortFast を活用する(アクセス層の常識)

サーバーやPCが接続されるエッジポートに対し、Forward Delayを待たせる必要はありません。PortFastを有効にすれば、ポートは即座にForwarding状態へ移行します。

# Cisco IOSの設定例
interface GigabitEthernet0/1
 description Server_Node_01
 switchport mode access
 # エッジポートにはPortFastを適用し、遷移時間を短縮する
 spanning-tree portfast
 # セキュリティのためにBPDUガードもセットで入れるのが鉄則
 spanning-tree bpduguard enable

2. RSTP (802.1w) への移行

タイマー設定を微調整して延命するより、根本的にRSTP(Rapid Spanning Tree)へ切り替えるのが現代の最適解です。RSTPは「提案と合意(Proposal/Agreement)」のプロセスにより、理論上ミリ秒単位での収束が可能です。

—

実践:ネットワーク監視とタイマーのズレを検知する

エンジニアとして、スイッチの設定だけでなく、ネットワーク越しに「今、通信がどれだけ安定しているか」を把握しておくことも重要です。例えば、Pythonで簡単な疎通監視コードを書いておくと、スパニングツリーの再計算による揺らぎを可視化できます。

import requests
import time

# ネットワークの収束状況をトレースする簡易スクリプト
TARGET_URL = "http://192.168.1.1/api/health"

def monitor_latency():
    while True:
        try:
            start = time.time()
            response = requests.get(TARGET_URL, timeout=2)
            latency = (time.time() - start) * 1000
            print(f"[OK] Latency: {latency:.2f}ms")
        except requests.exceptions.RequestException as e:
            # 収束中の通信断が発生するとここで検知できる
            print(f"[ALERT] Connection lost: {e}")
        
        # 1秒間隔で監視
        time.sleep(1)

if __name__ == "__main__":
    monitor_latency()

—

シニアエンジニアからの警告

最後に一つ、現場での痛い失敗から学んだ教訓を伝えます。

「タイマー値の極端な変更は、ネットワークの安定性を崩す」

Hello Timeを短くしすぎると、わずかなCPU負荷やトラフィックバーストでBPDUがドロップし、ネットワーク全体で「偽のトポロジ変更」が頻発するフラッピングを引き起こします。もしどうしてもタイマーを調整する必要があるなら、ルートブリッジでしか設定を変更してはいけません。

  • 推奨アクション:
  • アクセス層には PortFast を徹底する。
  • コア/ディストリビューション層は RSTP か MSTP へ移行する。
  • タイマー値は可能な限りデフォルトを維持し、物理的なトポロジ設計を見直す。

ネットワークは「いかに止めるか」ではなく「いかに復旧を意識させないか」の世界です。パケットがスイッチのASICを通過する瞬間の挙動を想像し、論理的な裏付けを持って設定を行ってください。それが、CCIEが目指す「見えないインフラ」の姿なのですから。

コメント

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