スパニングツリープロトコル(STP)

【暗記いらず】分かりやすいSTP(スパニングツリー)の本質とアルゴリズム

スパニングツリーとは

STP とは、Spanning Tree Protocol (スパニングツリープロトコル) の略で、Ethernet の経路冗長化の技術です。

Ethernet の経路を物理的に冗長構成 (複数経路) にすると、通常は L2 ループが発生し、使い物にならないネットワークになります

ですが各スイッチでこの STP を有効にすることで、論理的に L2 ループの無い単一経路にすることができます。そして、もしその単一経路が障害で使えなくなった場合、自動で別の経路に切り替えることができます

近年は LinkAggregation という技術により、L2 の経路冗長と同時に負荷分散も可能になりましたので、実装されることは少なくなってきています。

さらに、ポートに PC を挿すだけでもリンクアップが遅れるなどの害もあるので、初期設定で有効なスイッチではそれが理由ですぐに無効にされるケースがほとんどです。

STP の中にも PVSTP, Rapid PVSTP, MSTP という、VLAN 単位での負荷分散をするものもありますが、LinkAggregation に比べると設定の容易性も機能も劣ります。

また、WAN の網内での経路冗長への適用として、STP から発展した SPB という技術がやや注目されていることにも触れておきます。

STPの本質

STP は設定は比較的簡単ですが、教科書通りに覚えようとしてもなかなか難しいです。

STP を簡単に覚えるためには、本質を掴むことが大切です。

STP の本質は、以下に集約できます。

  1. まず RootBridge が決まり、RootBridge を最上流として BPDU が下流スイッチに流れていく。
  2. BPDU が流れる向きに依って、各スイッチが UpLink と DownLink を区別する。BPDU を受信するポートUpLinkBPDU を送信するポートDownLink となる。
  3. UpLink については、Path Cost が最小の 1 ポートのみを開放し (Root Portのこと)、他のポートをブロックする (RSTP で言う Alternate Port, 代替ポートのこと)。
  4. DownLink については基本的にすべて開放する (Designated Port) が、例外的に自分のスイッチ内でループする場合は片方をブロックする (RSTP で言う Backup Portのこと)。

この本質を押さえれば分かる通り、この次に押さえるべき重要な事項が、BPDU の動きを把握することです。

STP は種類が色々ありますが、共通して言えるのは、先程の本質と BPDU の動きさえ押さえてしまえば、大抵の動作は理解できる、ということです。

ここでは分かり易い説明を試みるため、教科書に書かれているような説明とは違ったアプローチをしますが、本質的には同じことを言っています

BPDUの動作を理解する

STP ではまず最初に Root Bridge を決めます。最小の Bridge ID を持つスイッチが Root Bridge になります。

この Bridge ID は以下のように表現されます。

[Priority(0000〜FFFF)]:[MAC address(0000:0000:0000〜FFFF:FFFF:FFFF]

Priority を小さくすれば、MAC アドレスの大小に関係なく Root Bridge になるので、設定次第でどのスイッチを Root Bridge にするかを変更できます。

この Root Bridge を頂点として BPDU が下位のスイッチに伝搬されていきます。

例えるならば、Root Bridge が源泉BPDU が水です。

BPDU は上流 (Root Bridge) から下流(下位スイッチ) に流れていきます。

BPDU には流れの強さがあり、当然強いほうから弱い方に押し流されるので、強いほうが上流、弱いほうが下流になり、弱いほうは BPDU の送信を止めます。

流れの強さというのはPath Cost送信元 Bridge ID送信元 Port ID の 3 つで決まります。

より流れの強い BPDU のことを、『優位な BPDU』と呼びます。

上記の例では、Path Cost がともに 4 で同じであるため、送信元 Bridge ID を比較し、小さいほうである SW#2 から出る BPDU が優位な BPDU、すなわち流れの強い BPDU になりますので、SW#3 は BPDU の送信を止めます

下位の各スイッチにおいて、BPDU を受信するポートが UpLink (上流へ向かうポート)、BPDU を送信するポートが DownLink (下流へ向かうポート) です。

この UpLinkは、uplinkfast で使われてるのと同じ意味です。

UpLink (ルートブリッジへのルート) が複数ある時は、優位な BPDU を受信しているポートのみが Root Port として通信できるようになり、それ以外のポートは Block Portとなります (RSTP においては Alternate Port (代替ポート) として定義されます)。

また、DownLink は基本的には全てDesignated Port として通信許可されますが、例外として、自身で送出した BPDU が STP 非対応のハブ経由で別ポートに戻ってくる場合は、優位な BPDU を送信する 1 ポートのみが Designated Port として通信許可され、それ以外はBlock Portとなります (RSTP においては Backup Port として定義されます)。

補足ですが、Backup Port は STP 対応スイッチと非対応ハブを接続するので、素人目から見て L2 ループの発生を思わせるためか、実装されているのを見たことがありません

さらに補足ですが、ハブを介さなくても同じスイッチの別ポートを LAN ケーブルを直結すれば片方が Backup Port になりますが、この構成に意味はありません。結線誤り時のループ回避にはなります。

まとめ

  • BPDU 受信ポートは UpLink と呼ばれ、1 ポートだけ通信可 (Root Port) でそれ以外は通信不可 (Alternate Port: 代替ポート)
  • BPDU 送信ポートは DownLink と呼ばれ、基本全て通信可 (Designated Port)、ただし例外で自身の BPDU を送受信し合うポートは、1 ポートだけ通信可 (Designated Port) になり、それ以外は通信不可 (Backup Port)

Path Costの決まり方

Ethernet の速度に応じて Port Cost が決められており (ただし設定で変更可)、Root Bridge からそのスイッチまでに経由するポートの Port Cost を合算した Path Cost を、BPDU で伝搬します。Root Bridge は PathCost=0 で下位スイッチに BPDU を送信します。

1 つのスイッチから DownLink へ送信される BPDU は必ず同じ Path Cost を持っています。つまり、スイッチは BPDU を受信する際に受信ポートの Port Cost を Path Cost に足します。このとき対向スイッチの BPDU 送信ポートの Port Cost は無関係です。

Bridge ID と Port ID は、1 つ上流にあるスイッチのものを利用します。同じスイッチから 2 つの経路で BPDU を受信しているときは Path Cost と Bridge ID は同一ですので、 Port ID により優位性が決まります

まとめ

  • Port Cost は UpLink に対して適用し、DownLink にも影響を与える
  • Port Priority は DownLink に対して適用し、直下のスイッチのみに影響を与える

STPとLoop Detection(ループディテクション)の違い

STP のことを"ループ防止を実現するもの"、とする記載もたまに見かけますが、個人的にはこの表現は目的を外していると考えています。

STP の本質は経路冗長であり、物理的に L2 ループ状態が作られているのが正しい構成なのです。

そのため、ループが発生したときにループを止めることが出来ても、人間がログなり SNMP trap を見ても、それが正しい構成なのか誤りなのかが判断しにくいです。

一方、Loop Detectionという機能はまさにループ防止・検知のための技術なので、アラームが来れば、それはループが発生したことを意味しますので、人間にとって分かり易いです。

また、Loop Detection では、STP では実現できないループ検知手法を持っていることが多いです。

例えば、STP 有効スイッチの配下にあるハブでループが起きたときは検知できませんが、Loop Detection 有効スイッチの配下にあるループは検知可能です。

また、メーカによっては uplink, downlink を設定し、uplink ではループ検知フレームを送出するが、検知時にポートをブロックしない、という設定を入れることができます。

STP と Loop Detection の違いは、まさに目的の違いであり、Loop Detection のほうがループ検知・防止に特化しているのです。

コメント

  1. ケンタウロス より:

    本質的な解説のおかげで理解が進みました。
    本当にありがとうございます。

    1点質問です。
    BridgeIDが最小のものがRootBridgeに決まる、とのことですが、
    この過程がよくわかりませんでした。

    自分が最小であると判断するためには、BridgeIDの交換が必要なように思いますが、
    その際にはBPDUの交換は不要なのでしょうか?

    • nesuke より:

      コメントありがとうございます。
      この辺りの詳細説明が抜けてましたね。。少し内容を書き直そうと思います。

      簡単に説明すると、BPDUフレームの中には自分のBridgeIDだけでなく、ルートブリッジのBridgeIDを示すフィールドがあります。

      スイッチの起動時は全てのスイッチがこのフィールドを使って『俺こそがルートブリッジだ』と主張して各方面にBPDUを送信しますが、優位なBPDUを受信すると送信を止めます。

      なので最後まで自分より小さいルートブリッジのBridgeIDを受信しないブリッジが、結果的に最小となります。

  2. Maggie より:

    CCNAの学習の中でどうしてもSTPのポート選出がわかりずらく、こちらの本質的な説明で理解が深まりました。「Root Bridge が源泉、BPDU が水」の例えが私には良かったです。ありがとうございます。

    • nesuke より:

      Maggieさん、コメントありがとうございます。

      私もSTP習いたての頃は黒本の説明を見て丸暗記しては忘れてしまっていましたが、ある時水のイメージをして忘れなくなりました。

      お役にたてて何よりです。

  3. AS2527 より:

    いつも大いに勉強させていただいています
    図があるのがたいへん助かっています!

    スパニングツリーとは で記載の
    ” 近年は LinkAggregation という技術により、L2 の経路冗長と同時に負荷分散も可能になりましたので、実装されることは少なくなってきています。 ”
    とは、LAGのうち複数回線を束ねる技術をSTPによる冗長性の代替として採用しつつある、ということでしょうか?
    スタック+LAGがあったらSTP使わなくて済むのかな? とは個人的に考えておるのですが、考え方合ってるのかなというのを知りたくて。

    • nesuke より:

      AS2527 さん、こんばんは。
      はい、仰る通り、スタック+LAG でSTPを使わなくてよい構成が組める、という意図です。考え方同じです。

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