概要
スイッチで冗長化構成を取った際のスイッチドネットワークでのスイッチングループを防ぐためのIEEE802.1Dとして規格化されたプロトコル。防ぐことでレイヤ2のループ(ブロードキャストストーム)が発生しなくなる。ネットワーク構造をツリー構造として考える。
STPの考え方では、ルートブリッジから遠いポートをブロックする。
-
一部のポートのブロック
冗長化構成において全てのポートを使用するのではなく、一部のポートの通信を行わない状態にする。障害発生時、管理者が設定を変えなくても自動でブロックしているポートを通信できるように切り替える。 -
中心となるスイッチの決定
ツリー構造の起点となる中心のスイッチ(ルートブリッジ)を決定する必要がある。ルートブリッジを決定するには、スイッチ間で何らかの値を比較して優劣を決定する必要があり、その比較のために用いられるのがブリッジIDとなる。ブリッジIDを比較し、最も小さい値のスイッチがルートブリッジになる。
ブリッジID
STPのルートブリッジを選出するために用いられるIDで、通常はブリッジプライオリティとMACアドレスで構成される。デフォルトで32768という値が設定されていてコマンドより変更可能。MACアドレスは基本的に変更できないため、ルートブリッジとして使用したいスイッチは手動でブリッジプライオリティの値を小さくする設定が必要。
BPDU(Bridge Protocol Data Unit)
STPを実装しているスイッチ間で情報を交換するための管理用フレーム。0180.C200.0000
というマルチキャストアドレスで送信される。L2ヘッダ(イーサネットヘッダ)の後ろに格納される。BPDUを受信すると err-disabledにして通信できない状態にする機能を持ち、PortFastを有効にしているポートに設定する。
BPDUには、以下の種類が存在する。
-
TCN BPDU(Topology Change Notification BPDU)
障害があったことをルートブリッジに通知するためだけに使用される。 -
TCA BPDU(Topology Change Acknowledgement BPDU)
トポロジの変化を検出したスイッチからTCN BPDUを受け取ったことを知らせるために使用される。 -
TC BPDU(Topology Change BPDU)
ルートブリッジがTCN BPDUを受信すると、再計算が必要であることを通知するために、フラグ部分のTC(Topology Change)を1として送信する。デフォルトで最大エージタイマーと転送遅延タイマーを足した35秒間送信される。
-
コンフィギュレーションBRDU
STPの計算を行う際に使用される。
項目 | 内容 |
---|---|
ルートブリッジID | BPDUを送信しているスイッチがルートブリッジとして認識しているスイッチのIDが入っている |
ルートパスコスト | ルートブリッジまでのパスコスト |
ブリッジID | BPDUを送信しているスイッチ自身のブリッジID |
ポートID | 送信しているスイッチのポートIDで、ポートプライオリティとポートの番号の組み合わせになっている。ポートプライオリティはデフォルトで128 |
最大エージ | ルートブリッジから転送されてきたBRDUを保持しておく時間 |
Helloタイム | ルートブリッジがBPDUを送信する間隔 |
転送遅延 | リスニングとラーニングの状態に留まり続ける時間 |
ポートの役割
ルートブリッジが決定すると、各スイッチでのポートの役割を決めていく。
Root Port(RP:ルートポート)
ルートブリッジまでの最短のパスコストを持つポートのこと。デフォルトのパスコストは帯域幅により計算され、ショート法(16ビットの値)とロング法(32ビットの値)2通りの値が定められている。デフォルトではショート法の値が用いられている。
帯域幅 | パスコスト(ショート法) | パスコスト(ロング法) |
---|---|---|
10Mbps | 100 | 2000000 |
100Mbps | 19 | 200000 |
1Gbps | 4 | 20000 |
10Gbps | 2 | 2000 |
100Gbps | - | 200 |
1Tbps | - | 20 |
ルートポートは3つの基準によって選定される。
-
累計のパスコストが最も小さいポート
受け取ったポートに設定されているコスト値とBPDUに格納されているルートパスコストを計算して、ルートブリッジまでの累計のパスコストを計算する。 -
送信元ブリッジIDが最も小さいBPDUを受け取ったポート
累計のパスコストが各ポートで差がつかない場合、送信元ブリッジID
IDを比較して、最も小さいBPDUを受け取ったポートがルートポートになる。 -
送信元ポートIDが最も小さいBPDUを受け取ったポート
送信元ブリッジIDでも差がつかない場合は、送信元ポートIDを比較して最も小さいBPDUを受け取ったポートがルートポートになる。
ポートIDとは??
ポートプライオリティとポート番号の組み合わせで表される。デフォルトは128。ここでのポート番号はインターフェイスの番号であり、TCPやUDPの番号とは異なる。
Designated Port(DP:指定ポート)
スイッチ間のセグメント(区切られている範囲)で最も上位のBPDUを送信するポートのこと。上位かどうかを判断するには、それぞれのスイッチが送信するBPDU内のルートパスコストを比較し、小さい方が上位のBPDUになる。
指定ポートもルートポートと同様に3つの基準によって選定される。
ルートブリッジのポートは最もルートブリッジに近いことになるため、全て指定ポートになる
Non Designated Port(NDP:非指定ポート)
役割が決まらずに残ったポートのこと。非指定ポートがブロックするポート(ブロッキングポート)となり、ユーザからのフレームは転送されない。また、スイッチの機能であるMACアドレスの学習も行わないがBPDUは受信する。
ポートの状態
ルートポートや指定ポートに決まるとユーザのフレームを転送可能になるが、いきなり転送可能な状態になるわけではない。転送可能な状態になるまでいくつかの状態に遷移していく。
ステータス | 内容 | MACアドレス | データフレーム |
---|---|---|---|
Disabled | シャットダウンされていたり、障害が発生して無効となっていたりする状態 | 学習しない | 転送しない |
Blocking | BPDUを受信するが、データフレームを転送しない状態。初期や非指定ポートはこの状態になる | 学習しない | 転送しない |
Listening | BPDUを送受信し、各ポートの役割決定を行っている状態 | 学習しない | 転送しない |
Learning | BPDUを送受信し、MACアドレステーブルを学習している状態 | 学習する | 転送しない |
Forwarding | データの転送が可能な状態。ルートポート、指定ポートは最終的にこの状態になる | 学習する | 転送する |
状態遷移が行われ、全てのスイッチでポートの役割が決定し、安定した状態になることをコンバージェンス(収束)という。コンバージェンスした際のポートの状態は、ForwardingかBlockingとなる。
タイマー
-
Hello Time
BPDUを2秒ごとに送信するタイマーのこと。ルートブリッジはHelloタイマーに従ってBPDUを作成し送信する。 -
Max Age
最後に受け取ったBPDUを保持している時間。時間内に再度受け取ると最新のBPDUは更新されるが、この時間を経過してもBPDUが届かない場合は障害が発生したとみなし、スパニングツリーの再計算が必要が判断される。
デフォルトは20秒。 -
Forward Delay
ListeningとLearningの状態にとどまる時間。ルートブリッジからの距離によってBPDUの通知に時間差が生じるため、転送遅延タイマーを使ってBPDUが届くの待つ。デフォルトは15秒
STPの機能
PortFast
より高速にコンバージェンスさせるためのCisco独自の方法。通常のSTPの状態遷移を経由せずにすぐにForwarding状態になり通信が可能になる。PCなどが接続され、Forwardingになることがあらかじめ確定しているポートで設定を行う。
また、TCN(Topology Change Notification)を抑制する機能があり、トポロジに変更が生じた場合認識し変更通知によってルートブリッジに変更を伝える。
PCの電源オン/オフで発生するトポロジ変更通知を抑制するためにも使用される
あくまでPCやサーバなどといった確実にForwardingになるポートで有効にするもの。ループの発生原因となってしまうので、スイッチ間などには設定しない。
BPDUガード
BPDUを受け取るべきでないPortFastの設定されているようなポートがBPDUを受け取るというトラブルを防ぐ機能。デフォルトでは有効になっていないため、管理者が有効にする必要がある。
有効になっているポートが受け取ると、エラーディセーブル(Err-Disable)状態になる。その状態のポートはシャットダウンされるため、データを送受信できなくなる。
PortFastを有効にしたポートに設定することが多い
ルートガード
既存の環境よりもブリッジプライオリティの小さいスイッチが勝手に接続された際に、既存のSTPトポロジが変更されてしまうのを防ぐ仕組み。ルートガードを設定しているポートにルートブリッジよりも上位のBPDUが送信されてくると、ポートをルート不整合(root-inconsistent)状態にする。
Err-disable状態ではないため、BPDUが送信されてくると元に戻り、通常通りの動作を行う。
BPDUフィルタリング
設定したポートからBPDUの送信を止める機能。グローバルコンフィギュレーションモードとインターフェイスコンフィギュレーションモードの2つで設定が可能でそれぞれ動作が異なる。
-
グローバルコンフィギュレーションモードの場合
PortFastが設定されている全てのポートで有効になる。また、対向のスイッチが接続されBPDUが送信されてくると、BPDUフィルタリングが無効となり、BPDUを送信するようになる。 -
インターフェイスコンフィギュレーションモードの場合
PortFastが設定されているか関係なく、そのインターフェイスのみ有効になる。また、BRDUが対向から送信されてきても、BRDUフィルタリングが無効にならずBRDUの送信を止め続ける。
ループガード
ブロッキングとなっているポートが、設定ミスや障害などによりBPDUを受信できずForwardingとなった場合に、発生する可能性のあるループを防ぐ機能。BRDUが送信されてこなくなると再計算を行い、Forwardingの状態になる。
RSTP(Rapid Spanning Tree Protocol)
STPを改良したIEEE802.1wのプロトコルで、STPと同様に標準化されている。そのため、PortFastと異なりCisco以外のスイッチでも使用可能。また、STPと互換性があるため併用も可能。
基本的な目的は、STPと同様にスイッチで冗長化された構成でレイヤ2のループを防ぐこと。STPの上位互換の機能のため、大部分のネットワークにおいて使用されている。
プロポーザルとアグリーメントのやり取りにより、スイッチ間で高速に役割を決定できる。
RSTPではDisable,Blocking,ListeningをまとめてDiscardingというステータスに統一される。
RSTPポートの選出
基本的にはSTPと同じ方法になる。
- 最小ブリッジIDを持つスイッチが「ルートブリッジ」になる
- スイッチの中で最小ルートパスコストを持つポートが「ルートポート」になる
- ルートポートのルートパスコストを対向スイッチと比較して最小ルートパスコストを持つスイッチのポートが「指定ポート」になる
- 指定ポート以外のポートが「代替えポート」になる
ルートブリッジの選出方法
ルートブリッジの選出の際に使用される値は「ブリッジID」。ブリッジIDは、2バイトのブリッジプライオリティと6バイトのMACアドレスで構成されているので、
- プライオリティの最小値を比較し、一番低いスイッチを選出
- 複数選出された場合は、MACアドレスの最小値を比較し、一番低いスイッチを選出
RSTPポートの選出例
RSTPポートの選出例
この設定をもとに考えていく。各ポートの役割を導き出す前にルートブリッジを探す。ブリッジIDが最も小さいSwitchDが選出され、ルートブリッジのポートは全て指定ポートになる。
次に、ルートポートを探す。ルートブリッジに最も近いポート(ルートブリッジに到達するためのパスコストが最小のポート)が選出されるため、各ポートのルートパスコストを計算する。異なるインターフェイス同士で接続している場合は通信速度の遅いほうに合わせて動作する。
ルートブリッジから送信されるBPDUのコストは0になり、コストは受信時に加算される。
- SwitchD Fa0/1:100+100+19=219
- SwitchD Fa0/2:100(ルートブリッジに直結しているため)
- SwitchB E0/1:100+100+19=219
- SwitchB E0/2:100(ルートブリッジに直結しているため)
- SwitchA Fa0/1:100+19=119
- SwitchA Fa0/2:100+100=200
次に指定ポートを探す。各セグメントで、小さいルートパスコストを持つスイッチ側のポートが指定ポートになる。
そして、残ったSwitchA Fa0/2が代替えポートになる。
RSTPのポートの役割
非指定ポートが以下の様に役割が変わる。
Root Port(ルートポート)
各スイッチごとにルートブリッジへの最適なパスコストを持つルートブリッジ以外のポートのこと。
Designated Port(指定ポート)
各セグメントごとにルートブリッジへの最適なパスコストを持つポートのこと
Alternate Port(代替えポート)
ルートポートの予備で、上位のBPDUを受信しておりブロックされているポートがこれになる。ルートポートがダウンした場合は、即座に切り替えが行われて新しいルートポートになる。
Backup Port(バックアップポート)
指定ポートの予備で、ブロックされており同一セグメントに対して複数の接続を持つポートが該当する。
エッジポート
PCやルータなどが接続するポートのこと。Cisco製のスイッチでPortFastを有効にしたポートがエッジポートになる。
非エッジポート
スイッチ間などで接続されるポート
RSTPの動作
ルートブリッジからBPDUが来なくても、定期的に下流のスイッチにBPDUを送信する。BPDUが来なくなると、自身と1つ上のスイッチの間が障害部分と判断できる。
そのため、RSTPではSTPの様に20秒も待つことなく、6秒間で再計算が必要と判断する。
また、以下のBPDUを使用して、タイマーに依らない素早い役割決定と状態遷移をスイッチ間で行うようになる。
-
プロポーザル
両方のスイッチが相手に対して送信し、お互いのポートを指定ポートとすることを告げる。受信したスイッチは、受け取ったBPDUのブリッジIDやルートパスコストなどから、自身と相手のBPDUのどちらが上位のBPDUかを判定する。 -
アグリーメント
相手から来たBPDUの方が上位だった場合に送信する。アグリーメントを受け取った相手は、自身のポートを指定ポートとし、すぐForwardingにする。
スイッチ間の接続
RSTPは、スイッチ間の接続を2つに分類している。
シェアードリンク
スイッチ間にハブが入っている接続時に分類される。また、スイッチのポートが半二重に設定されている場合もシェアードリンクに分類される。
ポイントツーポイントリンク
スイッチのポートが全二重に設定され、スイッチが1対1で接続されている場合に分類される。STPタイマーに依存しない高速収束を行う。
CST(Common Spanning Tree)
VLANが各スイッチにどのように分散しているかなどとは関係なく、1つのSTPインスタンスを使うこと。
- 複数のVLANを1つのSTPインスタンスで管理するため、所属するVLANによって通信が効率の悪いルートを通る場合がある。
- STPの構成が1種類になるため、ユーザのトラフィックが特定のリンクに集中してしまう
- STPインスタンスを1つだけ記憶しておけばよいので、メモリへの負荷はPVST+より小さい
- BPDUが1種類で済むため、スイッチ間のトラフィック量が少ない
PVST+(Per VLAN Spanning Tree Plus)
前述の状況を避けるために使用されているCisco独自の方法。PVSTがトランキングプロトコルとしてISLしか対応していなかったものを、IEEE 802.1Qでも使えるように改良したもの。STPのツリー構成をVLAN毎に考えることができる。スイッチのプライオリティをVLANごとに設定できるため、各VLANで最適と思われるスイッチをルートブリッジにすることが可能。ルートブリッジの位置が変わるとブロックするポートも変わるため、VLANごとに効率の良いルートを利用することが可能となる。
- 1つのVLANにつき1つのインスタンスが作成されるが、増えると保持しておかなければならないSTPインスタンスが増えてしまうので注意が必要
- STPインスタンスを複数記憶しなければならないので、メモリへの負荷はCSTより大きい
- BPDUがVLANごとに作成されるため、スイッチ間のトラフィックが増加する
拡張システムID
VLANごとのSTPを識別するために使用する。拡張システムIDにはVLAN IDと同じ値が入り、デフォルトのままであれば32768、32769、32770とプラスされていく。
拡張システムIDを使用する場合、プライオリティは4096の倍数で指定することになる。
トラブルシューティング
トポロジ変更
RSTPが動作するネットワークにおいて、障害等によりトポロジ変更が発生した場合は、以下のような動作が行われる。
- トポロジ変更が発生した機器が、TC BPDU(Topology Change Bridge Protocol Data Unit)をフラッディング
- TC BPDUを受け取った機器は、MACアドレステーブルを削除する
- 各デバイスがMACアドレスを学習し直し、MACアドレステーブルを再構築する
MSTP(Mulitiple Spanning Tree Protocol)
IEEE 802.1sで標準化されたもので、同一のトポロジになるVLANは1つのインスタンスで管理することが出来る。共通の管理下にあるスイッチを、ひとまとめにしてグループにしたものをリージョンといい、同一のMSTPリージョンとして扱うためには以下の項目が一致している必要がある。
- リージョン名
- リビジョン番号
- MSTインスタンス
- VLANのマッピング
MSTインスタンス
1つのインスタンスに複数のVLANを対応付ける。デフォルトでインスタンス0だけが存在し、削除することは出来ない。初期状態では全てのVLANがインスタンス0に対応付けられている。
IST(Internal Spanning Tree)インスタンス
リージョン内でMSTPのBPDUを送受信するトポロジとなるインスタンス0のこと
STPの設定と確認
CiscoのCatalystスイッチでは、特に設定してなくてもデフォルトでSTP(PVST+)が動作する。接続して電源を入れると、自動でブロックするポートが選出される。
show spanning-treeコマンド
書式:show spanning-tree [vlan < VLAN番号>]
STPの状態を確認するコマンド。特権EXECモードで行う必要がある。VLAN番号を指定すると該当するVLANに関する状態だけが表示される。
show spanning-tree interfaceコマンド
書式:show spanning-tree interface [インターフェイス]
STPが動作しているインターフェイスの状態を確認するコマンド。特権EXECモードで行う必要がある。各インターフェイスがVLANごとにどの役割を与えられているかを確認できる。
show spanning-tree inconsistentportsコマンド
不整合のポートの情報を確認するためのコマンド。特権EXECモードで行う必要がある。
debugコマンド
パケットのやり取りや状態の変化を細かく確認でき、STPに限らず障害原因の究明に役に立つコマンド。ただし、何かが発生すると継続的に画面に状態を表示させるため、CPUに負荷がかかる。必要な時だけ動かし、それ以外は停止させておくほうが良い。
debug spanning-tree eventsコマンド
STPの動作を確認するコマンド。特権EXECモードで行う必要がある。停止させる場合は、先頭にnoコマンドを持ってくる。
STPの設定
spanning-tree vlan priorityコマンド
書式:spanning-tree vlan priority <プライオリティ>
ブリッジプライオリティを変更するコマンド。グローバルコンフィギュレーションモードで行う必要がある。プライオリティにはブリッジプライオリティの値を4096の倍数で指定する必要がある。
Cisco製スイッチの場合、デフォルトでPVST+となるためVLANごとにブリッジプライオリティの設定をおこなわなければならない
spanning-tree vlan root コマンド
書式:spanning-tree vlan [VLAN番号] root < primary | secondary>
自動でルートブリッジを指定するコマンド。グローバルコンフィギュレーションモードで行う必要がある。指定したVLAN上でルートブリッジに選出されているスイッチのブリッジプライオリティをチェックし、そのスイッチのブリッジプライオリティより小さい値が自動的に設定され、自身がルートブリッジに選出される。
オプション | 内容 |
---|---|
primary | ルートブリッジとなるような値が設定される。既存の環境のルートブリッジがデフォルトのブリッジプライオリティで動作していた場合は、24576となる。デフォルトでない場合は4096より小さい値が設定される |
secondary | 2番目にブリッジプライオリティの小さいスイッチとなるように、28672の値が設定される。他のスイッチのブリッジプライオリティによって2番目にならないこともあるため、あまり使用されない |
spanning-tree costコマンド
書式:spanning-tree [vlan < VLAN番号>] cost <コスト値>
ポートのパスコストを変更するコマンド。インターフェイスコンフィギュレーションモードで行う必要がある。VLANは省略することが可能で、省略した場合全てのVLANでポートのパスコストが設定した値となる。コスト値は1~200000000の間で指定可能。
パスコストの変更はBPDUを受信するポートで行う必要がある
spanning-tree pathcost methodコマンド
書式:spanning-tree pathcost method < short | long>
パスコストのデフォルト値を変更するコマンド。グローバルコンフィギュレーションモードで行う必要がある。ショート法とロング法を切り替えることができる。デフォルトではショート法が採用されている。
spanning-tree port-priorityコマンド
書式:spanning-tree [vlan < VLAN番号>] port-priority [プライオリティ]
ポートプライオリティを指定するコマンド。インターフェイスコンフィギュレーションモードで行う必要がある。VLANを指定しない場合は、全てのVLANで指定した値が使用される。プライオリティ値は0~240の値を16の倍数で指定する様になっている。
ポートプライオリティの変更はBPDUを送信するポートで行う必要がある
各種タイマーの変更
spanning-tree vlan hello-timeコマンド
書式:spanning-tree vlan [VLAN番号] [タイマーの種類] [時間(秒)]
STPの各種タイマーを設定するコマンド。グローバルコンフィギュレーションモードで行う必要がある。
タイマーの種類 | 時間範囲 |
---|---|
hello-time | 1~10 |
max-age | 6~40 |
forward-time | 4~30 |
PortFastの設定と確認
spanning-tree portfast defaultコマンド
非トランクポートでPortFastを有効にするコマンド。グローバルコンフィギュレーションモードで行う必要がある。
spanning-tree portfast コマンド
インターフェイス単位でPortFastを有効にするコマンド。インターフェイスコンフィギュレーションモードで行う必要がある。非トランクポートでなければ有効にならない。
spanning-tree portfast trunkコマンド
トランクポートでPortFastを有効にするコマンド。インターフェイスコンフィギュレーションモードで行う必要がある。
BPDUガードの設定と確認
spanning-tree portfast bpduguard defaultコマンド
BPDUガードを有効にするコマンド。グローバルコンフィギュレーションモードで行う必要がある。有効にした場合、PortFastの設定が行われているポートで有効になる。
spanning-tree portfast bpduguard enableコマンド
PortFastの有効無効関係なくBPDUガードをインターフェイス単位で有効にするコマンド。インターフェイスコンフィギュレーションモードで行う必要がある。
BPDUフィルタリングの設定
spanning-tree portfast bpdufilter defaultコマンド
BPDUフィルタリングを有効にするコマンド。グローバルコンフィギュレーションモードで行う必要がある。有効にした場合、PortFastの設定が行われているインターフェイス全てで有効になる。
spanning-tree portfast bpdufilter enableコマンド
PortFastの有効無効関係なくBPDUフィルタリングを有効にするコマンド。インターフェイスコンフィギュレーションモードで行う必要がある。
ルートガードの設定と確認
spanning-tree guard rootコマンド
ルートガードを有効にするコマンド。インターフェイスコンフィギレーションモードで行う必要がある。無効にする場合は、先頭にnoコマンドを追加し実行を行う。
ループガードの設定
spanning-tree loopguard defaultコマンド
ループガードの設定を有効にするコマンド。グローバルコンフィギュレーションモードで行う必要がある。全てのポートで有効になる。
spanning-tree guard loopコマンド
インターフェイス単位でループガードを有効にするコマンド。インターフェイスコンフィギュレーションモードで行う必要がある。
モードの変更
spanning-tree modeコマンド
書式:spanning-tree mode < pvst | rapid-pvst | mst]
動作モードをSTPからRSTPやMSTPに変更するためのコマンド。グローバルコンフィギレーションモードで行う必要がある。デフォルトはPVST+。
MSTPの設定
spanning-tree mst configurationコマンド
MSTPの設定モードに移行するコマンド。グローバルコンフィギュレーションモードで行う必要がある。実行後、以下のようなプロンプトに変わる
(config-mst)#
nameコマンド
書式:name <リージョン名>
リージョン名を設定するコマンド。MSTコンフィギュレーションモードで行う必要がある。
revisionコマンド
書式: revision <リビジョン番号>
リビジョン番号を設定するコマンド。MSTコンフィギュレーションモードで行う必要がある。
instance vlanコマンド
書式:instance <インスタンス番号> vlan < VLANリスト>
VLANのマッピング情報を設定するコマンド。MSTコンフィギュレーションモードで行う必要がある。インスタンス番号には1~4094の値を設定する。
MSTPの確認
show spanning-tree mst configurationコマンド
作成されているMSTインスタンスを確認するコマンド。特権EXECモードで行う必要がある。
show pendingコマンド
作成されているMSTインスタンスを確認するコマンド。MSTコンフィギュレーションモードで行う必要がある。
MSTコンフィギュレーションモードで確認した場合は、実際にその設定がまだ適用されておらず、モードを抜けた段階でその内容が反映される
show spanning-tree mstコマンド
書式:show spanning-tree mst [インスタンス番号]
MSTPの状態を簡潔に表示するコマンド。特権EXECモードで行う必要がある。インスタンス番号は省略可能で、省略した場合全てのインスタンスの情報が表示される。