STP【STPの概要】

CCNAの試験に向けて学習中。
復習に見返せるようにメモしていきます。
ほぼ自分の勉強メモです。
過度な期待はしないでください。



1.STPの概要
-
#### 1-1.STPとは？
STP（Spanning Tree Protocol）とは、円環上（ループ状）に形成されたレイヤー2ネットワークにおいて、
冗長化構成を取った際に、データトラフィックが永続的に流れ続ける事を防止する為のプロトコルです。
<font color="red"><b>IEEE 802.1D</b></font>で定義、及び規格化されています。

下記の画像のようにSTPを有効にしていない状態の、冗長化をした複数のスイッチを使用した
NW構成では、ブロードキャストされたフレームが冗長構成部分をループし続ける事になり
ブロードキャストストームが発生します。
<img width="550" alt="ファイル名" src="https://i.gyazo.com/06cb008313513095a6df6f8fd4e976aa.png">
ホストAがBと通信する為には、ホストBのMACアドレスを知る必要がある為 ARP要求を送信します。
ARP要求を受信したSWA（スイッチA）は、送信元MACアドレスをMACアドレステーブルに学習した後、
隣接スイッチにフラッディングします。
>
ARP要求は<font color="red">ブロードキャスト（FFFF.FFFF.FFFF）</font>通信となる為、SWAはARP要求を受け取った
ポート以外の全てのポートからARP要求を転送します（この場合、SWB、Cに向けて）

SWAからのARP要求を受信したSWB、Cは送信元MACアドレスをMACアドレステーブルに学習した後、
隣接スイッチにフラッディングします。
>
SWBは、SWAから受信したARP要求をブロードキャストする為、ARP要求を受け取った
ポート以外の全てのポートからARP要求を転送します（この場合、SWCに向けて）
>
SWCは、SWAから受信したARP要求をブロードキャストする為、ARP要求を受け取った
ポート以外の全てのポートからARP要求を転送します（この場合、SWBとホストBに向けて）

ここまでの動作では問題は発生しませんが、
続いて、SWBからのARP要求を受信したSWCは送信元MACアドレスをMACアドレステーブルに
学習した後、隣接スイッチにフラッディングします。
>
SWCは、SWBから受信したARP要求をブロードキャストする為、ARP要求を受け取った
ポート以外の全てのポートからARP要求を転送します（この場合、SWAとホストBに向けて）

そして、SWBも同様にSWCからのARP要求を受信したSWBは送信元MACアドレスを
MACアドレステーブルに学習した後、隣接スイッチにフラッディングします。
>
SWBは、SWCから受信したARP要求をブロードキャストする為、ARP要求を受け取った
ポート以外の全てのポートからARP要求を転送します（この場合、SWAに向けて）

このように、最初にSWAが送信したブロードキャストフレームがSWAに戻ってきます。
そして、SWAはそれを再びフラッディング、という動作を繰り返してループが発生してしまいます。
この状態を<font color="red"><b>「ブロードキャストストーム」</b></font>と言います。
下記の画像のようにループしてしまう状態です。
<img width="400" alt="ファイル名" src="https://i.gyazo.com/52f2342fb8351e6578ec84a2a3f0c860.png">

#### 1-2.ブロードキャストストーム
ブロードキャストストームとは、上記の画像のようにブロードキャストされたフレームが
冗長構成部分をループし続ける事をいいます。

フレームはパケットと異なり生存期間がない為、ブロードキャストで送信されたフレームは
送信され続ける事になります。複数台のPCがある環境で大量のARP要求が送信された場合、
ループしているフレームが邪魔となり通信が不安定になります。その上、無駄にフレームを
処理し続ける為、CPUの負荷が上がりネットワーク機器がダウンするといった事態が発生します。

また、フレームがループし続ける間、常にMACアドレスの書き換えが行われている為、
MACアドレスが不安定になったりします。

<br>
#### 1-3.STPが機能する仕組み
ループ状の構成にあるスイッチの全てのポートが転送できる状態である事から、
ブロードキャストストームが発生します。これを防ぐ為に、STPでは冗長化構成において
<font color="green"><b>全てのポートを使用するのではなく、一部のポートの通信を行わない状態</b></font>にします。
これをケーブルを抜いた状態などによって実現するのではなく、物理的には繋がっていても、
論理的にポートが閉じている状態にして、STPを使用することにより実現します。

STPを使用すると、そのアルゴリズムにより通信をブロックする設定がされるので、ポートが
自動的にブロッキング状態になり、ARP要求がが送信されてきても必ずそこで止まるように
なっている為、ループが発生しません（下記の画像参照）
<img width="550" alt="ファイル名" src="https://i.gyazo.com/6807f145a33a1cc0d291e5e8563621ef.png">

#### 1-4.STPの動作

##### ■ 1-4-1.中心となるスイッチの決定
STPでは、スイッチネットワークのループ構成をツリー状にする為に、ツリー状の中心となる
<font color="red"><b>ルートブリッジ</b></font>を先ず始めに選出します。STPの考え方では、<font color="green"><b>ルートブリッジから最も遠いポートを
ブロック</b></font>します。

ルートブリッジの選出には、<font color="red"><b>ブリッジID</b></font>を使用します。
ブリッジIDを比較して、<font color="green">最も小さい値</font>のスイッチがルートブリッジになります。
ブリッジIDは、<font color="red"><b>ブリッジプライオリティ</b></font>と<font color="red"><b>MACアドレス</b></font>から構成されています。
　　　<img width="380" alt="ファイル名" src="https://i.gyazo.com/d8ca0015288d0db59044e00314225108.png">
比較する時には、<font color="green">ブリッジプライオリティがMACアドレスより優先されるので、
先ずブリッジプライオリティ値を比較して、この値が同じ場合にはMACアドレス</font>を比較します。

ブリッジプライオリティは、デフォルトで <font color="red"><b>32768</b></font>という値が設定されていて、コマンドにより
設定可能です。MACアドレスは基本的には変更出来ない為、ルートブリッジとして使用したい
スイッチは手動でブリッジプライオリティの値を小さくして設定する必要があります。


##### ■ 1-4-2.スイッチ間での情報の交換
各スイッチでブリッジIDが決まっても、その値を他のスイッチと比較しなければ優劣が分かりません。
そこで、スイッチ間で情報を交換する為の仕組みが <font color="red"><b>BPDU（Bridge Protocol Data Unit）</b></font>という
管理用のフレームを使用します。
BPDUは、「0180.C200.0000」というマルチキャストアドレスで送信されます。

STPのBPDUフレームは以下の通りになります。
<img width="550" alt="ファイル名" src="https://i.gyazo.com/875a649b6dc2524bebc01d788fc002b8.png">
>
主要なパラメータだけ説明すると、
Root IDは、ルートブリッジと認識しているスイッチのブリッジIDです。
Root Path Costは、スイッチ自身からルートブリッジまでの最短距離を表すパスコスト値です。
Bridge IDは、BPDUの送信ブリッジIDです。


##### ■ 1-4-3.① ルートブリッジの選出
スイッチは、電源が入ると、全てのポートをブロックするように設定し、自分自身の
ブリッジIDをルートブリッジとして設定したBPDUを各ポートから <font color="red"><b>2秒間隔</b></font>で送信します。

他のスイッチからBPDUを受信すると、そのスイッチが認識しているルートブリッジIDの値と
受信したBPDUのルーブリッジIDの値を比較します。受信したBPDUの方が小さい値であった
場合、そのスイッチが認識しているルートブリッジIDの値を受信したものに変更します。

こうしてBPDUを交換していく事でルートブリッジが選出されます。
下記の画像でいくと、ブリッジIDが最も低い SWAがルートブリッジになります。
<img width="550" alt="ファイル名" src="https://i.gyazo.com/fad3f1729820e0e1f6c384961556a0cc.png">

##### ■ 1-4-3. ② ルートポート（RP）の選出
STPではルートブリッジの選出後、ルートポートと呼ばれるポートを選出する事になります。

ルートポート（RP）とは、ルートブリッジに最も近いポートです。何をもって最も近いかですが、
それは各スイッチのポートのうち、<font color="green"><b>ルートブリッジまでの最短のパスコストを持つポート</b></font>の事になります。
ポートのデフォルトのパスコストは帯域幅により計算されます。
ショート法とロング法の 2通りの値が定められていて、デフォルトではショート法の値が用いられています。

|帯域幅　　　|　　　ショート法（コスト値）　　　|　　　　ロング法（コスト値）　　　　|
|:---|:---:|:---:|
|10Gbps|2|2,000|
|1Gbps|4|20,000|
|100Mbps|19|200,000|
|10Mbps|100|2,000,000|

<br>
ルートポートは３つ基準によって選出されます。
① 累計のルートパスコストが最も小さいポート
スイッチは、BPDUを受け取ると、受け取ったポートに設定されている<b>コスト値</b>とBPDUに
格納されている<b>ルートパスコスト</b>を加算して、ルートブリッジまでの累計のパスコストを計算します。

ルートポート（RP）の選出は以下の通りです。
<img width="550" alt="ファイル名" src="https://i.gyazo.com/fcfd311e7ff72ffdf7f7d960e4fa4ab1.png">

SWAは自身がルートブリッジなので、ルートブリッジまでのパスコストは 0となります。
その為、SWBとSWCのポート①では受信したBPDUのパスコスト 0となり、それに自身の
コスト値 4（1Gbpsである為）を加算する為、SWBとSWCのポート①のルートパスコストは
0 + 4 = 4になります。

次にSWBとSWCもBPDUを送信し合い、受信したBPDUのパスコスト 4に自身の
コスト値 19（100Mbpsある為）を加算するので、SWBとSWCのポート②のルートパスコストは
4 + 19 = 23になります。

ルートポートは、非ルートブリッジごとに1ポートずつ選出されるので、
SWBでは、ポート①のパスコスト 4でポート②のパスコストが 23なので、ポート①がRPになります。
SWCでは、ポート①のパスコスト 4でポート②のパスコストが 23なので、ポート①がRPになります。

<br>
② 送信元ブリッジIDが最も小さいBPDUを受け取ったポート
累計のパスコストが各ポートで差がつかない場合、<font color="red"><b>送信元ブリッジID<b></font>を比較して、それが最も
小さいBPDUを受け取ったポートがルートポートになります。
>
ブリッジIDは、ブリッジプライオリティとMACアドレスから構成されています。

<img width="450" alt="ファイル名" src="https://i.gyazo.com/72406393f2196397d2af54b3d05a5e94.png">

<br>
③ 送信元ポートIDが最も小さいBPDUを受け取ったポート
送信元ブリッジIDでも差がつかない時には、<font color="red"><b>送信元ポートID<b></font>を比較して、それが最も
小さいBPDUを受け取ったポートがルートポートになります。

ポートIDは、<font color="red">ポートプライオリティ</font>と<font color="red">ポート番号</font>の組み合わせで表されます。
ポートプライオリティはデフォルトで <font color="red"><b>128<b></font>で、<font color="green">ポートプライオリティでも差がつかない時には
ポート番号で比較</font>します。

<img width="450" alt="ファイル名" src="https://i.gyazo.com/095a848207cfb64db933d5d6ca3bedd1.png">

##### ■ 1-4-4. ③ 指定ポート（DP）の選出
ルートポートの次に指定ポートを選出します。

指定ポート（DP）とは、スイッチ間のセグメントで最も上位のBPDUを送信するポートの事です。
BPDUが上位かどうかを判断するには、まずそれぞれのスイッチが送信するBPDU内の
<font color="red"><b>ルートパスコスト</b></font>を比較します。パスコストが小さい方が上位のBPDUです。
上位のBPDUを送信している方が指定ポートとなります。
>
他に指定ポート選出ルールとしては以下のものがあります。
● 各リンクごとに1ポートが指定ポートになります。
● ルートブリッジの全てのポートは必ず指定ポートになります。

指定ポートは、セグメントでルートブリッジまでのパスコストが最も小さいスイッチ側の
ポートという事になりますが、<font color="green"><b>パスコストに差がない場合は送信元のブリッジIDを比較して
値が小さい方</b></font>を指定ポートとして選出します。
また、ブリッジIDを比較しても差がない場合は、<font color="green"><b>送信元ポートIDを比較して値が小さい方</b></font>を
指定ポートとして選出します。

指定ポート（DP）の選出は以下の通りです。
<img width="500" alt="ファイル名" src="https://i.gyazo.com/c7b258ad99192f1d429d39911acdf723.png">
SWAは、自身がルートブリッジのなので、全てのポートが指定ポートとなります。
続いてSWBとSWCのセグメントでは、SWBルートパスコストは 4、SWCのルートパスコストは 4 で
ある事から、ルートパスコストは同じになります。ルートパスコストが同じ場合には、送信元ブリッジIDの
値を比較して、送信元ブリッジIDが最も小さい値のポートが指定ポートになります。
今回の場合は、SWBのブリッジIDが 4096でSWBのブリッジIDが 32768である事から
ブリッジID小さいSWBのポート②が指定ポートになります。

##### ■ 1-4-5. ④ 非指定ポート（NDP）の選出
そして最後に、ルートポート、指定ポートにも選出されなかった残りのポートが非指定ポートになります。
非指定ポートでは、データフレームが送受信されないブロッキング状態になりますが、BPDUは受信します。
BPDUを受信する事で、非指定ポートであり続けなければならないと認識します。
<img width="500" alt="ファイル名" src="https://i.gyazo.com/98e1deccebe0cf709ebe315fe3114c57.png">

#### 1-5.STPのポート状態

##### ■ 1-5-1. ポートの状態遷移
スイッチが起動して、ポートが初めてリンクアップした時に、データが転送出来る状態に
なっていると、ループの原因になってしまいます。
そのためSTPが有効なスイッチでは下図の順番でポート状態を遷移させています。
ポートが使用出来ない状態である「ディーゼブル」は状態遷移から外しています。
>
ディーゼブル状態は、シャットダウンしていたり、障害が発生して無効となっている状態です。

<img width="600" alt="ファイル名" src="https://i.gyazo.com/348a7576078f2e26f97dc2ad065cbe5d.png">

電源を入れた直後は、データが転送出来ない状態、<font color="red"><b>ブロッキング</b></font>の状態です。
初期の状態や非指定ポートがこの状態にあたります。
データフレームの転送はしないが、BPDUを受信する事が出来ます。

BPDUを送受信して、ルートブリッジ、ルートポート、指定ポートの選出を行っている状態
が<font color="red"><b>リスニング</b></font>の状態です。MACアドレスも学習せずデータも転送しない状態です。

その後、一定時間が経過すると、<font color="red"><b>ラーニング</b></font>の状態になります。
この状態では、BPDUを送受信し合い、非指定ポートになれば即座にブロッキングに遷移し、
受信したデータフレームの送信元MACアドレスを学習しているがデータは転送しないという状態です。

そして、ポートが最終的にルートポートまたは指定ポートになった状態を<font color="red"><b>フォワーディング</b></font>の状態に
遷移します。この状態になるとようやくそのポートで、ユーザのデータを転送するようになります。


以下の表はポートの状態遷移纏めたものです。
<img width="600" alt="ファイル名" src="https://i.gyazo.com/6cda1ca9485f09b0d258352359cec191.png">

こうして、状態遷移が行われ、全てのスイッチでポートの役割が決定し、収束した状態を
<font color="red"><b>コンバージェンス</b></font>といいます。コンバージェンスしたポートの状態は、フォワーディングか
ブロッキングとなります。

##### ■ 1-5-2.Helloタイマー
Helloタイマーは、BPDUが送信される間隔で、<font color="red"><b>デフォルトでは 2秒</b></font>に設定されています。
STPでは、ルートブリッジが決定すると、ルートブリッジはHelloタイマーに従ってBPDUを作成し
送信します。


##### ■ 1-5-3.最大エージタイマー
最大エージタイマーは、最後に受け取ったBPDUを保持している時間です。この時間を経過しても
BPDUが届かない場合は障害が発生したと判断してスパニングツリーも再計算が必要と判断します。
<font color="red"><b>デフォルトでは 20秒</b></font>に設定されています。


##### ■ 1-5-4.転送遅延タイマー
転送遅延タイマーは、ルートブリッジから離れているスイッチの事を考慮して、リスニングと
ラーニングの状態で待つ時間の事です。<font color="red"><b>デフォルトでは 15秒</b></font>に設定されています。


<br>
#### 1-6.障害発生時の動作
##### ■ 1-6-1.直接的な障害の場合
ブロッキングポートを持つスイッチが、直接リンクに障害が発生した場合は、
障害が発生した事を直ちに知り、最大エージタイマー（20秒）を待つ事なく、STPの再計算が
発生し、ルートポートをもう一方のポートに切り替えて、リスニングの状態に遷移します。
転送遅延タイマーに従って 15秒経過すると、ラーニング状態に遷移し、さらに 15秒経過すると
フォワーディングの状態に遷移します。

リスニングからラーニング状態を経て計30秒間で収束し、収束後には再計算の結果、
右下図のSTP状態になります。
<img width="600" alt="ファイル名" src="https://i.gyazo.com/11b8b0eba165803d848f7a86140ddf69.png">


##### ■ 1-6-2.間接的な障害の場合
間接的な障害があった場合、最大エージタイマー（20秒）の時間が経過するまで待った後、
リスニング状態に遷移し、その後、ラーニング（15秒）、フォワーディング（15秒）の状態を
遷移していきます。
<img width="600" alt="ファイル名" src="https://i.gyazo.com/13e88618bb1472969e824eca0f82651f.png">

<br>
## 関連投稿記事
[STP【STPに関する機能】](https://qiita.com/k-yasuhiro/items/fef6e7ceb985c478c436)
[STP【STPに関する設定と確認】](https://qiita.com/k-yasuhiro/items/0a495df9b522fa5412b7)