【CCNA】STP(スパニングツリープロトコル)ついて調べてみた

# はじめに
STPについて調べてみた

# STP種類
https://ping-t.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273424/5cb057e9-0129-3dff-52cd-eb54b59fb24b.png)

【STPとRSTPの主な違い】
STPとRSTPの主な違いは以下の通りです。
・ポートの状態（RSTPはディスカーディングを追加）
・ポートの役割（RSTPは代替ポートとバックアップポートを追加）
・収束までの時間（STPは最大50秒、RSTPは1～3秒）

# BPDUの役割
* 最初、STPが有効なスイッチはBPDUを２秒間隔で送信。**ルートスイッチ決定**
  - **最初は自分がルートブリッジ、というBPDUを送る。交換しているうちに、自分よりスイッチIDが小さいスイッチを知ったら、そのスイッチをルートブリッジとする**
* ルートブリッジが決まると、ポートの役割を決める **ルートポート、指定ポート、ブロックポートの3つ**
  - スイッチ間の接続しているリンクの帯域幅を考えて、ルートスイッチからの距離を計算する。そこからポートの役割を決める
  - **これでスパニングツリーが完成する**
* あとは、**ルートスイッチからBPDUが送信され続け、**他のスイッチはルートスイッチから送信されたBPDUを受信する。BPDUが届かなくなると障害とみなす(20秒間BPDUを受信しなかったら、再計算する。ポートの役割を再度決め治す)

ブロッキング -> リスニング(15秒) -> ラーニング(15秒) -> フォワーディング or ブロッキング

* リスニングは、再計算のため、BPDUを送受信する時間
* ラーニングは、再計算の特別な状態

【BPDU（Bridge Protocol Data Unit）に含まれる主な情報】
・ルートID（ルートブリッジのブリッジID）
・ブリッジID（自身のブリッジID）
・パスコスト（ルートブリッジに至るまでのルートパスコスト）
・ポートID（自身のポートID）
・Helloタイム（BPDUの送信間隔）

[代替ポートとバックアップポート]
代替ポートとバックアップポートはSTPのブロッキングポート（ループを防ぐためのポート）に相当するポートです。

## BPDUで決定されること

* **ルートブリッジ(ルートスイッチ)を決める**
  - ルートブリッジから送信され、他のスイッチはそれを他に流すだけ
* **ポートの役割を決定する**
  - ポートの役割が決まると、ポートステートが決まる。フォワーディング、ブロッキング
  - なので、**新しくスイッチを追加してケーブルをつないだり**するとBPDUが流れポートの役割が変更される可能性があり、再計算がはしる(**ルートブリッジまでコストが低いのがわかると、そのスイッチでのルートポートの変更、ブロッキングポートの変更などが起こり得るので**)

## TC BPDU
* TC BPDUは、STPトポロジに変更があったことを伝えるBPDUです。トポロジに変更があった場合フレームの転送先が変わることになるため、現在のMACアドレステーブルを削除します。
* TC BPDU（Topology Change BPDU）を受信すると MACアドレステーブルを即座に削除し、TC BPDUをフラッディングする
* TC BPDUが無いと、MACアドレスエントリのエージングタイム（デフォルト300秒）が経過するまではMACアドレスエントリを削除しないため PC_BからPC_Aへの通信が発生したとしても、そのフレームはCatBからCatAに送られて破棄されてしまいます

## BPDUの中身
https://beginners-network.com/supplement/bpdu_frame_format.html

ルートブリッジIDとブリッジIDが異なる場合、ルートパスコストやメッセージ経過時間はそれまでスイッチが経由したパスコスト合計や段数が入ります。

**パスコスト**が入っているので、例えば新しくスイッチを接続して、BPDUを受け取ったときに、パスコストが小さかったりしたら、再計算がはしる。
**よって、今までBPDUを受け取っていなかったポートがBPDUを新しく受け取っても、再計算がはしる。**

# STPの再計算とは
スイッチのポートの役割をもう一度決定すること、**再計算するときは最初にすべてのポートをブロッキングにして再計算を開始する**

# STPの再計算が起こるときとは
http://www5e.biglobe.ne.jp/aji/30min/sw11.html

# STPの再計算が起こるパターン1
ルートスイッチから送信されるBPDUが届かなくなくなったら障害
(BPDUはルートスイッチから送信され、他のスイッチはそれを下位へ流している)

# STPの再計算が起こるパターン2
* 新しいスイッチのNWへの追加
  + BPDUが届くので
  + プライオリティが低けれれば、ルートブリッジが変更され、すべてのスイッチに影響が出る場合もある 
* ケーブルを抜く
  + BPDUが届かなくなるので
* 障害のあったポートの復旧
  + BPDUが届くので
* スイッチの削除(リンクアップ)
  - おそらく、BDDUの受信がなくなるので、障害と認識

http://nw.seeeko.com/archives/50534786.html
STPが有効になっているスイッチであれば、1ポートに接続しただけでもSTPの計算行われます。たとえば、PCを1台SWに接続した場合でも、STPの計算が行われます（もちろんループはありません。）
ですから、PCが使えるまでに、40秒ほどの時間がかかってしまいます。ですから、PCが接続するポートにはSTPを無効にする（PortFastの設定）を入れます。（以下に説明）


# STPの再計算の時間
* 対向のポートが何かしらの原因で障害、結果、BDPUが受信できなくなる
  - 50秒
* 自スイッチのポートが障害(リンクダウン)
  - 自ら検知できるので、50秒ではなく30秒



# STPとは
* **レイヤ2プロトコル**
* Spanning Tree Protocol (スパニングツリープロトコル)
* ループ状に形成されたレイヤー2ネットワークにおいてループが発生しないように**自動的にあるポートを論理的にブロッキング状態**にする
* 障害発生時には、自動的にそのポートがフォワーディング状態になり、通信ができるようになります

**LAN内のスイッチがBPDUを交換して、あるポートを論理的にブロックしてループ状態をなくすプロトコル**

## 論理的にブロックを作る流れ
**BPDUを用いてルートブリッジを決定。各スイッチのポート役割を決定してブロッキングするポートを決定**



【コマンド構文：スパニングツリーモードの設定】
(config)#spanning-tree mode {pvst | rapid-pvst | mst} 
pvst・・・PVST+（STP）を有効にする
rapid-pvst・・・Rapid PVST+（RSTP）を有効にする
mst・・・MSTを有効にする（MSTはRSTP上で動作するため、RSTPも有効になる）

# 論理的なブロックの作り方
https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%91%E3%83%8B%E3%83%B3%E3%82%B0%E3%83%84%E3%83%AA%E3%83%BC%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB

本プロトコルは、BPDU(bridge protocol data unit)と呼ばれるフレームのやり取りによって、木構造の根となるブリッジ（ルートブリッジ）を定める。その上でさらにBPDUを交換することでルートブリッジまでの仮想的な距離をしらべ、その情報をもとに不要な経路を遮断する。



# BPDUとは
https://www.infraexpert.com/study/stpz1.html

* STP（スパニングツリープロトコル）は IEEE802.1D で標準化されたプロトコル

【BPDU（Bridge Protocol Data Unit）に含まれる主な情報】

* ルートID（ルートブリッジのブリッジID）
* ブリッジID（自身のブリッジID）
* パスコスト（ルートブリッジに至るまでのルートパスコスト）
* ポートID（自身のポートID）
* Helloタイム（BPDUの送信間隔）

## BPDUの送り方
https://www.n-study.com/layer2switch/stp-bpdu/

### BPDUによるルートスイッチの決定
STPが有効なスイッチは、自分がルートスイッチであるというBPDUを流す。それぞれ受信すると、自分の優先度をしることになり、ルートスイッチが自ずと決定する

### ルートブリッジ決まってから
* ルートブリッジが決まってからは**ルートブリッジとして選出されたレイヤ2スイッチが定期的にコンフィグレーションBPDUを送信します。**
* 他のスイッチは受信して、他のスイッチに流すのみ。
* **デフォルトでは、2秒ごとにコンフィグレーションBPDUを送信**します。


# STPにおけるスイッチのポート
**論理的なブロックを構成する際に、各ポートが以下のポートの役割を持つようになる**

* ルートポート
* 指定ポート(代表ポート)
* 非指定ポート(ブロッキングポート、非代表ポート)


全てのポートは最初はブロッキング状態から開始する


# ポート役割決定の流れ
1) ルートスイッチ(ルートブリッジ)の選出
2) ルートポートの選出 フォワーディング状態になる
3) 指定ポートの選出 
4) ブロックポートの決定

# ルートブリッジ
* ブリッジIDが最小　(ブリッジプライオリティとMACアドレス)
* **L2ネットワークに一つ**　一つのネットワークに一つ

# ブリッジID
* STPのルートブリッジを選出するために用いられるIDで、通常はブリッジプライオリティとMACアドレスで構成
* CiscoのSTP（PVST+）はVLANごとに動作するので、ブリッジプライオリティとMACアドレスだけではVLANごとのSTPを識別できません。この問題を解決するため、PVST＋では拡張システムIDを使用します。
* 拡張システムIDを使用する場合、「ブリッジIDの形式」の図にあるように、通常16ビットあるプライオリティのうち12ビットは拡張システムID（VLAN ID）で使用するので、実際に指定できるプライオリティは上位4ビットの部分のみです。従って、プライオリティは4096の倍数で指定することになります。


# ルートポート
* **ルートブリッジ以外の各スイッチに一つ**
* ルートスイッチに最も近道になるポートがルートポートになります。この近道かどうかの判断をパスコスト(通信の速さのスコア)により算出します。パスコストの小さい方(通信が速い)が近道になり、ルートポートになります。
* RSTPでは、代替：ルートポートがダウンした時にルートポートの役割を引き継ぐがある

パスコストが同じ場合
**ポートの若い番号**がルートポートになる

# 指定ポート
* **ルートスイッチの全てのポートは指定ポート**
* 指定ポートは1つのセグメント(ポートとポートがつながっている箇所)の中から1つだけ選出
* RSTPではバックアップ：指定ポートの代替ポートがある

# ブロッキングポート(非指定ポート)
* ルートポート、指定ポート以外のポート
* BPDUの送信や、データの送受信はできませんが、BPDUを受信することはできます。

* https://ping-t.com/mondai3/mondais/practice/0が分かりやすい




# STPで気を付けること
## ルートスイッチの配置
* もし、ルートスイッチが途中から変わるようなことがあれば、**全てのスイッチでポートロールの変更のための再計算が走る**
* なので、最初からルートスイッチにするスイッチは固定にしておく

## トポロジの変更によるSTP再計算
**障害・障害復旧・追加・削除などによりトポロジに変更が合った場合、STPの再計算が必要**

### 再計算とは
**スイッチがBUDUを送信しはじめて、ポートロールの計算をやり直すこと**

### 障害
* **最大タイマの間(20秒)、BPDUが届かなければ障害とみなす。**
* そのスイッチの元指定ポート(障害でブロッキングにしたポート)と非指定ポート(もともとブロッキングだったポート)をリスニングにする。なので、**スイッチ全体のポートに影響あり**
* まずブロッキング　→　リスニング(15秒続く)　→　ラーニング(15秒続く)　→　ブロッキングorフォワーディング(**ポートロール決定**)

リスニング= 再計算中の特別な状態
ラーニング = 再計算の終了処理

20 + 15 + 15 = 50秒


### インターフェースの障害
インターフェースの障害はスイッチ自身がすぐに分かるので、最大タイマ20秒はかからない
ただし、もちろん再計算の処理は走る

15 + 15 = 30秒


### 障害復旧
障害が起きて、再計算してポートを変えて、ループを抑えて構成にしたのに、復旧して通信がきたらまたループになる可能性があるので、また再計算が走る


### 追加・削除
スイッチの追加、スイッチでなくても何かを追加した場合、その先にループを起こす可能性が発生するので再計算が走る

```
まぁ、つまり障害・障害復旧・追加・削除などによりトポロジに変更が合った場合、STPの再計算が必要、ということだな。
STPの再計算が必要になったスイッチは、すべてのポートをブロックにする。

ハイパーネット助手
全部ですか？ 新しくBPDUを受け取ったとか、受け取らなかったポートだけじゃなくて？

スーパーインター博士
全部ブロックだ。トポロジがどういう状態かわからないのに、フォワーディング状態のポートを残しておくとループが発生する可能性があるからな。
```

参考:http://www5e.biglobe.ne.jp/aji/30min/sw11.html


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273424/fb3e21d3-81db-8999-ccf4-7a088d0dfae9.png)

* **新たなBPDUを受け取ったり(新しいSTP有効なスイッチの追加)してSTPの再計算が必要**
* **STPの再計算が必要になったスイッチは、すべてのポートをブロックにする**



http://nw.seeeko.com/archives/50534786.html

STPが有効になっているスイッチであれば、1ポートに接続しただけでもSTPの計算行われます。たとえば、PCを1台SWに接続した場合でも、STPの計算が行われます（もちろんループはありません。）
ですから、PCが使えるまでに、40秒ほどの時間がかかってしまいます。ですから、PCが接続するポートにはSTPを無効にする（PortFastの設定）を入れます。


# STP再計算にかかる時間
参考:http://nw.seeeko.com/archives/50534786.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273424/08444940-dc77-412e-b46c-69380ea74fb7.png)

* リスニングとラーニングの違い
  - 基本的にSTPの計算、というかループを防ぐための時間はリスニング中に終了していると思っていい。ラーニングはその後の転送のためMACアドレスを覚えるための時間だ。

# STPの無効化
http://nw.seeeko.com/archives/50534786.html

スイッチ全体で無効にする場合と、ポート単位で無効にする(portfast)場合がある。


# PVST+（Per-VLAN Spanning Tree Plus）
VLANごとにSTPトポロジーを構成

# STP(スパニングツリープロトコル)イメージ
参考: https://milestone-of-se.nesuke.com/nw-basic/stp/stp-summary/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273424/bbfe684c-8240-309e-68df-2764ae7b2f59.png)

PVST+ではVLAN毎に上記のRP、DP、BLKが異なる


https://www.infraexpert.com/study/stpz3.html

https://www.infraexpert.com/study/stpz1.html#:~:targetText=STP%EF%BC%88Spanning%20Tree%20Protocol%EF%BC%89%E3%81%AF,%E3%82%92%E9%98%B2%E6%AD%A2%E3%81%99%E3%82%8B%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB%E3%81%A7%E3%81%99%E3%80%82


# STPとオプション
STPが有効なSwitchingHUBにPCを接続しても、IEEE802.1Dによる通常のSTPの場合、BPDUのやりとりが行われるので、正常に接続されるまでに40秒ほどかかってしまう。
この場合にPortFastを使用する

## PortFast
* そのポートに端末を接続したら**すぐにフォワーディング**に遷移して、接続したと同時にパケット転送ができる
* サーバーやPCのポートには**STPの計算は必要ない**のでPortFastを有効

## ルートガード
想定していないスイッチがルートブリッジになる事を防ぐ機能です。ルートガードを設定したポートで上位BPDU（現在のルートブリッジよりもブリッジIDの小さいBPDU）を受信すると、そのポートをルート不整合という状態にして、ユーザデータの送受信をできなくします。

## BPDUガード
* PortFastを設定しているポートでBPDUを受け取ったときに、そのポートを強制的にダウンする。
* POrtFastを設定しているポートには本来PCとかサーバーが接続されるが、**間違えてスイッチを接続したときにBPDUを送信してしまって、ループになることを防ぐ**
* err-disabledにして通信できない状態にする

**管理外のスイッチを誤って接続するのを防ぐためにサーバーやPCを接続するポートにはPortFastを設定してBPDUガードも設定するべし。**

**また、shutdownすることも必要**


# CAMテーブル
https://www.infraexpert.com/study/catalyst21.html

CAMを利用していることからCatalystスイッチのMACアドレステーブルのことをCAMテーブルと呼ぶ場合もあります

# RSTP
https://www.infraexpert.com/study/stpz8.html

[代替ポートとバックアップポート]
代替ポートとバックアップポートはSTPのブロッキングポート（ループを防ぐためのポート）に相当するポートです。
代替ポートはルートポートの代替になるので、ルートポートがダウンしたときは即座にルートポートの代わりとして動作します。
バックアップポートは指定ポートのバックアップになるので、指定ポートがダウンしたときは即座に指定ポートの代わりとして動作します。

【RSTP】
RSTPはSTPの後継プロトコルで、STPにいくつかの機能を追加することで収束するまでの時間を短縮しています。
用語や基本的な動作などはSTPと同じため、RSTPはSTPと互換性があります。

【STPとRSTPの主な違い】
STPとRSTPの主な違いは以下の通りです。
・ポートの状態（RSTPはディスカーディングを追加）
・ポートの役割（RSTPは代替ポートとバックアップポートを追加）
・収束までの時間（STPは最大50秒、RSTPは1～3秒）

# stpタイマー
https://ping-t.com/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273424/fcd5a770-7cb9-2041-2ea6-8fb43b7837a5.png)

**MAX時間BPDUが届かない場合、STPを再計算するので注意**

# スイッチのデフォルト機能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273424/febd44d4-5da9-2169-c428-8acbc2b93e34.png)

# ブリッジID
ブリッジIDはSTPのルートブリッジを選出するために用いられるIDで、通常はブリッジプライオリティとMACアドレスで構成されます。
しかし、CiscoのSTP（PVST+）はVLANごとに動作するので、ブリッジプライオリティとMACアドレスだけではVLANごとのSTPを識別できません。
この問題を解決するため、PVST+では拡張システムIDを使用します。（Rapid PVST+も同じ）

デフォルトのプライオリティは「32768＋VLAN番号」です。
拡張システムIDにはVLAN IDと同じ値が入ります。
例えば、MACアドレスがXXXX.XXXX.XXXXの機器で、全てのVLANのブリッジプライオリティがデフォルトの32768のままの場合、VLAN1のブリッジIDは「32769 XXXX.XXXX.XXXX」、VLAN2のブリッジIDは「32770 XXXX.XXXX.XXXX」、VLAN10のブリッジIDは「32778 XXXX.XXXX.XXXX」となります。つまり、プライオリティ(32768)にVLAN IDをプラスしています。これによりVLANごとにブリッジIDを識別できるようになっています。

# コマンド
【コマンド構文：ブリッジプライオリティの設定】
(config)#spanning-tree vlan {VLAN番号} {priority {プライオリティ値} | root primary | root secondary}
priority・・・プライオリティ値を指定する（0～61440から4096の倍数で指定。デフォルトは32768）
root primary・・・現在のルートブリッジのプライオリティより小さい値にする
root secondary・・・プライオリティを「28672」にする

「Role」が
* Desg = 指定ポート
* Root = ルートポート
* BACK = バックアップポート
* Altn = 非指定ポート

リンクタイプは「Type」から読み取ることができます。
シェアードリンクになっている場合は「Shr」、ポイントツーポイントリンクになっている場合は「P2p」という表示になります。
Fa0/1とFa0/2のTypeを見ると、どちらも「P2p」になっているので、ポイントツーポイントリンクになっていることがわかります。


# RSTPの役割ポート
ポートは4つ

・ルート：各スイッチごとに選出される
・指定：ルートブリッジに到達するために経由するポート
・バックアップ：トラフィックを転送しない
・代替：ルートポートがダウンした時にルートポートの役割を引き継ぐ

# RSTPでの障害動作
https://www.infraexpert.com/study/stpz9.5.html
TC BPDU（Topology Change BPDU）を受信すると MACアドレステーブルを即座に削除し、TC BPDUをフラッディングするので誤りです。
TC BPDUは、STPトポロジに変更があったことを伝えるBPDUです。トポロジに変更があった場合フレームの転送先が変わることになるため、現在のMACアドレステーブルを削除します。

RSTPではスイッチ間接続のリンクをポイントツーポイントリンクとシェアードリンクの2つに分類し


【ポートの状態と役割】
RSTPのポートの状態は Discarding,Learning,Forwardingの3種類で、STPに比べてDiscardingが新たに定義されました。（逆にSTPのDisabledとBlockingとListeningはDiscardingに統合されて無くなりました。）

また、RSTPのポートの役割では、STPのブロッキングポートに、「代替ポート」または「バックアップポート」という役割を与えて、ルートポート(Root Port) , 指定ポート(Designated Port) , 代替ポート(Alternate Port) , バックアップポート(Backup Port) という4つの役割にわけています。


[代替ポートとバックアップポート]
代替ポートとバックアップポートはSTPのブロッキングポート（ループを防ぐためのポート）に相当するポートです。
代替ポートはルートポートの代替になるので、ルートポートがダウンしたときは即座にルートポートの代わりとして動作します。
バックアップポートは指定ポートのバックアップになるので、指定ポートがダウンしたときは即座に指定ポートの代わりとして動作します。