弱者は決して許すことができない。許しは強者の態度である── ガンディー
ネットワーク

線はつないだまま、口を 1 か所だけ止める

スイッチを輪につなぐと全員あてのフレームが回り続ける。STP が根を決め、どの口をブロックするかを決めるまでと、線が切れてから戻るまでの秒数を 1 枚の図で見る

ぴぐおv1人の校閲なし(AI のみ)訂正なし
ネットワークstpスイッチconcept
目次

図 13 までは、機器と機器を 1 本の線で結んでいました。 ここから図 16 までは「壊れても止まらない」の塊で、まず線を 2 本以上にします。

図 4 ではスイッチ 2 台をトランク 1 本で結びました。 線を足して輪にすると、1 本切れても落ちない代わりに、止めないとその VLAN の通信がほぼ止まります。 図 2 のフラッディング(全員あてのフレームを、入ってきた口以外の全部にコピーして流す)が輪を回り続け、イーサネットのフレームには IP の TTL に当たる欄が無いからです。 同じ送信元 MAC が別の口から何度も入るので、MAC アドレステーブルも揺れます。

STP(スパニングツリープロトコル)は、線をつないだまま、口を 1 か所だけ論理的に止めて、通り道を木(輪のない形)にします。

この連載は、ネットワークの言葉を 3 つの層に置いて読みます。 もの(物理か論理か)、結びつき(人が設定で付ける手動か、機器が学習する自動か、製造時に決まる固定か)、通信フロー(1 本の通信がそれらを順に通る道筋)の 3 つです。

登場するもの

BPDU

論理のものです。 スイッチ同士だけが交換する STP 用のフレームで、中身は[ルート ID][根までのコスト][送信元ブリッジ ID][ポート ID]です。 宛先は決まった番地で、隣のスイッチより先へは転送されません。

ブリッジ ID

優先度と MAC を並べた値です。 優先度の欄は論理・手動で、4096 刻みの値に VLAN 番号を足します(既定 32768 の機器は VLAN 10 では 32778)。 MAC の部分は、製造時に決まる固定です。

ポートの役割とコスト

どちらも論理で、自動で決まります。 役割はルートポート・指定ポート・ブロックの 3 つです。 コストは線の速さから決まり、100 Mb/s は 19、1 Gb/s は 4 です。

結びつき

  • 人が設定するのは、優先度(どれを根にするか)と、後述する守りの設定をどの口に付けるかだけです。
  • 根とポートの役割の決定は、スイッチが BPDU を比べて自分で計算します。人は「どこを止めろ」とは書きません。
  • 木は VLAN ごとに別です(PVST+)。図 4 のトランクの上を、VLAN 10 と VLAN 20 で別の道に流せます。

通信フロー

スイッチ 4 台を輪につなぎ、スイッチ 1 だけ優先度を 4096(VLAN 10 では 4106)に下げてあります。

① 電源を入れた直後、各スイッチは「根は自分」と書いた BPDU を全ポートへ出します。

② 受け取った側はルート ID を比べます。優先度は数値が小さい方が優先され、同じなら MAC が小さい方が根になります。

③ 各スイッチは、根までのコストが最小の口を 1 つだけルートポートにします。同点なら送信元ブリッジ ID が小さい側です。

④ 線の 1 区間ごとに、根に近い側の口が指定ポートになります。

⑤ ルートポートでも指定ポートでもない口をブロックします。輪が 1 か所だけ切れ、通り道が木になります。

⑥ 線が切れたとき、切れた口を持つスイッチはすぐ気づきます。持たないスイッチは、良い BPDU が来なくなるのを待ってから計算し直します。

図 14

図の上半分が輪の状態と STP を入れた後の形、中ほどが復旧の秒数と守りの設定、下半分が役割の推移と BPDU の中身の推移です。

STP:スイッチを輪につないだとき、どの口を論理的に止めるか 線を 2 本以上にすると輪ができる。輪は落ちない代わりに、止めないとネットワーク全体が使えなくなる。STP は輪を 1 か所だけ切って木にする STP が無いとき:全員あてのフレームが輪を回り続ける スイッチ 1 スイッチ 2 スイッチ 4 スイッチ 3 コピーが回り続ける (誰も止められない) ・全員あてのフレームは各スイッチでコピーされ、輪を回り続ける ・イーサネットのフレームには、IP の TTL に当たる欄が無い ・同じ送信元 MAC が別の口から何度も入り、MAC テーブルが揺れる ・輪ができた瞬間に、その VLAN の通信がほぼ止まる STP を入れた後:1 か所を止めて、輪を木にする 根(ルートブリッジ) スイッチ 1 2 スイッチ 2 スイッチ 4 スイッチ 3 指定 ルート 19 指定 ルート 19 指定 ルート 19 指定 ブロック 5 19 ・根=ブリッジ ID(優先度+MAC)がいちばん小さいスイッチ ・各スイッチは根までのコストが最小の口をルートポートにする ・区間ごとに根に近い側が指定ポート、残った口をブロック ・線は 100 Mb/s(1 本のコスト 19)。1 Gb/s なら 1 本 4 フロー ① 電源を入れた直後、各スイッチは「根は自分」と書いた BPDU(スイッチ同士だけが交換する STP 用のフレーム)を全ポートへ出す ② 受け取った側はルート ID(優先度+MAC)を比べる。優先度は数値が小さい方が優先され、同じなら MAC が小さい方が根になる ③ 根が決まると、各スイッチは根までのコスト(通った線のコストの足し算)が最小の口を 1 つだけ選び、ルートポートにする。同点なら送信元ブリッジ ID の小さい側 ④ 線の 1 区間ごとに、根に近い側の口が指定ポートになる。コストが同じなら送信元ブリッジ ID の小さい側が指定ポートになる ⑤ ルートポートでも指定ポートでもない口をブロックする。ここで輪が 1 か所だけ切れ、通信の通り道が木になる ⑥ 線が切れると、切れた口を持つスイッチはすぐ気づき、持たないスイッチは BPDU が来なくなるのを待って気づく(秒数が違う) 802.1D(もとの STP)の復旧にかかる秒数 既定のタイマー:Hello 2 秒/Max Age 20 秒/Forward Delay 15 秒 直接検知:自分の口が down したと自分で分かる場合  ブロックしていた口を Listening 15+Learning 15 = 約 30 秒 間接検知:自分の口は生きているが、良い BPDU が来ない場合  Max Age 20 秒待ってから上の 30 秒 = 約 50 秒 この間、その道を通る通信は落ちる(勉強会の ping 試験) RSTP(802.1w)が速い理由 隣同士の握手(提案と同意)で、タイマーを待たずに口を開ける BPDU が 3 回続けて来なければ(2 秒×3)隣を失ったと判断する 状態は 3 つ(破棄・学習・転送)に整理された 役割に「代替ポート」「バックアップポート」が加わった PC しか付かない口は「エッジポート」= PortFast と同じ扱い いまの機種の既定は Rapid PVST+(VLAN ごとに RSTP の木) 守りの設定:どの口を、何から守るか(PortFast だけが「速くする」道具。残りは BPDU の出入りが前提と違ったときの処置) PortFast:PC しか付かない口を、待たずにいきなり転送状態にする(BPDU は来ない前提の口) BPDU guard:その前提の口に BPDU が来たら、口を止める(errdisable)。無断で置かれたスイッチを締め出す Root guard:その口の向こうが根になろうとしたら(より小さいルート ID の BPDU が来たら)、その口をブロックする Loop guard:ルートポート・代替ポートで BPDU が来なくなったとき、開けずにブロックのままにする(片方向だけ壊れた線の対策) BPDU filter:その口で BPDU を出しも受けもしない。インターフェースに付けると STP を止めるのと同じで、輪ができる危険がある(Cisco の注意) 3 層で見ると もの:BPDU(論理。スイッチ同士が交換する STP 用のフレーム)/ブリッジ ID(優先度は手動、MAC の部分は製造時の固定)/ポートの役割(論理・自動) 結びつき:優先度・PortFast・各 guard は人が設定(手動)。根・ルートポート・指定ポート・ブロックの決定はスイッチの計算(自動) フロー:図 2 のフラッディングが輪では止まらない。STP が 1 か所を止めるので、図 2〜4 の通信は 1 本道を通る。VLAN ごとに木は別(PVST+) 各スイッチの根までのコストとポートの役割の推移(○番のフローで決まった行。青字) 前提:スイッチ 4 台の輪、全部の線は 100 Mb/s(1 本のコスト 19)。VLAN 10 の木。スイッチ 1 だけ優先度 4096(VLAN 10 では 4106)。スイッチ 2 の MAC < スイッチ 4 の MAC とする ① 電源投入の直後(各スイッチの言い分) 全員が「根は自分」と名乗る スイッチ 1:根=自分/コスト 0 スイッチ 2:根=自分/コスト 0 スイッチ 3:根=自分/コスト 0 スイッチ 4:根=自分/コスト 0 ②③④⑤ 収束した後(VLAN 10 の木) ② スイッチ 1 が根(優先度 4106) ③ スイッチ 2:根まで 19、1 側=ルート ③ スイッチ 4:根まで 19、1 側=ルート ③ スイッチ 3:2 側も 4 側も 38 で同点 ③ 送信元ブリッジ ID(優先度が同じなので MAC)が  小さい 2 側をルートポートにする  ※この図で MAC の大小が効くのはここだけ ⑤ スイッチ 3:4 側=ブロック(ここで切れる) 優先度と VLAN 番号(PVST+) 優先度=4096 刻みの値+VLAN 番号 既定 32768 → VLAN 10 では 32778 優先度 4096 → VLAN 10 では 4106 VLAN 20 では 32788 / 4116 VLAN ごとに根も止める口も別にできる ⑥-a 直接検知:スイッチ 2・3 間が切れた ⑥ スイッチ 3 は自分の口が down したと分かる ⑥ ブロックしていた 4 側を開けにいく ⑥ Listening 15+Learning 15 = 約 30 秒 ⑥ スイッチ 3:根まで 38(4 側経由)に更新 スイッチ 2 は 1 側で根とつながったまま ⑥-b 間接検知:スイッチ 1・2 間が切れた スイッチ 3 の口はどれも down しない ⑥ 2 側から良い BPDU が来なくなる ⑥ Max Age 20 秒待ってから再計算する ⑥ 20+15+15 = 約 50 秒 勉強会の「抜く線で秒数が違う」はこの差 RSTP(802.1w)なら 隣との握手で口を開ける タイマー待ちが要らない 直接・間接とも 1 秒未満になりうる (相手が古い STP だと、この速さは出ない) PortFast の口は最初から転送状態 BPDU の中身の推移(どの欄が、どこで書き換わるか) ① 電源投入の直後に各スイッチが出す BPDU 中身は[ルート ID=自分のブリッジ ID][根までのコスト 0][送信元ブリッジ ID=自分][ポート ID] BPDU の宛先 MAC(決まった番地) 標準の BPDU は 01:80:C2:00:00:00 あて。Cisco の PVST+ では VLAN 1 以外は 01:00:0C:CC:CC:CD あて(タグ付き)。どちらも隣のスイッチより先へは転送されない ② 受け取った BPDU と自分の BPDU を比べる順番 ルート ID → 根までのコスト → 送信元ブリッジ ID → 送信元ポート ID の順に比べ、小さい方が優勢。優勢な BPDU が来た口は、自分が指定ポートをやめる ③ 根からの BPDU を隣へ中継するとき、書き換わる欄 ルート ID はそのまま。根までのコストに受けた口のコスト(100 Mb/s なら 19)を足し、送信元ブリッジ ID を自分に書き換える ④ 収束した後(平常時) (802.1D)根だけが Hello 2 秒ごとに BPDU を出し、他は中継する。RSTP では各スイッチが Hello ごとに自分で BPDU を出す。ブロックした口も受け取り続ける ⑤ 線が切れた後 根への道を失ったスイッチは「根は自分」と書いた BPDU を出す。受け取った側は Max Age 20 秒かけて古い情報を捨ててから計算し直す(その間は通信が戻らない) PortFast・BPDU guard を付けた口では PC しか付かない口なので BPDU は来ない前提。来たらスイッチが挿されたということなので、BPDU guard が口を止める(errdisable) 出典(1)タイマーの既定値(Hello 2 秒・Forward Delay 15 秒・Max Age 20 秒)と Max Age の役割:Cisco Understand and Tune Spanning Tree Protocol Timers   https://www.cisco.com/c/en/us/support/docs/lan-switching/spanning-tree-protocol/19120-122.html 出典(2)優先度の既定 32768・4096 刻み・拡張システム ID=VLAN 番号・同点なら MAC が小さい方・コスト(100 Mb/s は 19、1 Gb/s は 4)・状態ごとに Forward Delay:   Cisco Catalyst 9200 Layer 2 Configuration Guide「Configuring Spanning Tree Protocol」 出典(3)直接検知は Forward Delay の 2 倍=30 秒・RSTP はタイマーに頼らない握手で速い・エッジポート=PortFast:Cisco Understand Rapid Spanning Tree Protocol (802.1w)   https://www.cisco.com/c/en/us/support/docs/lan-switching/spanning-tree-protocol/24062-146.html 出典(4)PortFast と BPDU guard(BPDU を受けたら errdisable):https://www.cisco.com/c/en/us/support/docs/lan-switching/spanning-tree-protocol/10586-65.html 出典(5)Root guard(root-inconsistent でブロック)と Loop guard:Cisco Catalyst 9300 Layer 2 Configuration Guide「Configuring Optional Spanning-Tree Features」 出典(5-2)BPDU filter の注意(インターフェースに付けると STP を止めるのと同じで輪ができうる):Cisco Catalyst 3750-X/3560-X Software Configuration Guide   https://www.cisco.com/c/en/us/td/docs/switches/lan/catalyst3750x_3560x/software/release/12-2_55_se/configuration/guide/3750xscg/swstpopt.html 出典(6)L2 には TTL が無く、輪に入ったフレームは止まらない:Cisco Troubleshoot Layer-2 Loops on Catalyst 9000 Series Switches   https://www.cisco.com/c/en/us/support/docs/switches/catalyst-9200-series-switches/221191-troubleshoot-layer-2-loops.html 出典(8)BPDU の宛先 MAC(VLAN 1 は 0180.c200.0000 でタグなし、VLAN 1 以外は PVST+ の 0100.0ccc.cccd でタグ付き):   Cisco Troubleshoot Spanning Tree PVID- and Type-Inconsistencies   https://www.cisco.com/c/en/us/support/docs/lan-switching/spanning-tree-protocol/24063-pvid-inconsistency-24063.html 出典(7)BPDU の比較順序・直接 30 秒/間接 50 秒(二次資料):https://www.infraexpert.com/study/stpz2.html / https://www.infraexpert.com/study/stpz3.html 未検証(1)50 秒を 1 つの数字として書いた Cisco の文書は見つけられなかった。Max Age 20+Forward Delay 15×2 の足し算で、30 秒と 50 秒を直接書いているのは上の二次資料 未検証(2)「新しい製品ほど MAC が大きいので、新しいスイッチが根を奪わない設計になっている」という見立ては、規格にそう書かれた記述を見つけられなかった   規格が決めているのは「ブリッジ ID(優先度+MAC)が小さい方が根」だけで、MAC の大小と製造時期の関係は確認できていない(未検証)   なお「優先度が低い順に根になる」という読み方は Cisco の表現と一致する( the highest device priority (the lowest numerical priority value)) 図 1〜7 との接続:図 2 のフラッディング(全員あてをコピーして流す)が、輪では止まらないのがこの図の出発点。図 3・4 の VLAN ごとに木が別(PVST+) この図は線を 100 Mb/s(コスト 19)として描いている。1 Gb/s なら 1 本 4 になり、同じ形でも選ばれる道が変わることがある ## 復旧までの秒数

タイマーの既定は Hello 2 秒・Max Age 20 秒・Forward Delay 15 秒です。

自分の口が down したと自分で分かる場合(図の直接検知)は、ブロックしていた口を Listening 15 秒と Learning 15 秒で開けるので約 30 秒です。 自分の口は生きていて良い BPDU だけが来なくなった場合(図の間接検知)は、Max Age 20 秒待ってからその 30 秒に入るので約 50 秒です。 RSTP(802.1w)は隣同士の握手でタイマーを待たずに口を開けるので、これが 1 秒未満になりえます。

守りの設定

図の中ほどに 5 つ並べています。速くする道具は PortFast(PC しか付かない口を待たずに転送状態にする)だけで、BPDU guard・Root guard・Loop guard は BPDU の出入りが前提と違ったときの処置です。 毛色が違うのは BPDU filter で、その口で BPDU を出しも受けもしません。インターフェースに付けると STP を止めるのと同じで、輪ができる危険があります。

図 4・図 15 との接続

図 4 では、スイッチ 2 台の間の 1 本にタグが付きました。線が増えてもタグの付き方は変わりません。STP が決めるのは、どの口を通すかだけです。

次の図 15 では、同じ 2 台の間の 2 本を、そもそも輪にしない形で使います。

未検証・注意

  • 約 50 秒を 1 つの数字として書いた Cisco の文書は見つけられませんでした。この 50 秒は Max Age 20 と Forward Delay 15 の 2 倍を足した値で、30 秒・50 秒を直接書いているのは二次資料です。
  • 「新しい製品ほど MAC が大きいので、新しいスイッチが根を奪わない設計になっている」という見立ては、根拠を見つけられませんでした(未検証)。規格が決めているのは「ブリッジ ID が小さい方が根」だけです。
  • 「優先度が低い順に根になる」という読み方は、Cisco の表現(the lowest numerical priority value)と一致します。
  • RSTP の 1 秒未満は、相手が古い STP だと出ません。
  • この記事は線を 100 Mb/s(1 本のコスト 19)として書いています。1 Gb/s なら 4 になり、同じ形でも選ばれる道が変わることがあります。
  • PVST+ の優先度の値(32778・4106 など)は、上の規則から計算したものです。

出典

関連

この記事の校閲記録

誰が・いつ・どの版の・どの段落を・何の観点で見て、何と言ったかを全件そのまま出す(追記のみ・削除しない)。

段落 37 のうち出典つき 14・出典なし 23

v1 1 件
  • AIAI (claude-fable-5) が AI 確認未解決

    出典 URL 9 本を再取得して到達を確かめた。タイマーの既定値(Hello 2 秒・Forward Delay 15 秒・Max Age 20 秒)は Cisco の Tune STP Timers、優先度の既定 32768・4096 刻み・拡張システム ID = VLAN 番号・コスト(100 Mb/s は 19、1 Gb/s は 4)は Catalyst 9200 の設定ガイド、直接検知が Forward Delay の 2 倍で 30 seconds of disruption と提案・同意がタイマーに頼らないことは 802.1w のページ、BPDU guard の errdisable は PortFast/BPDU Guard のページ、Root guard の root-inconsistent と Loop guard は Catalyst 9300 の設定ガイド、BPDU filter の警告文は Catalyst 3750-X/3560-X の設定ガイド、L2 に TTL に当たる仕組みが無いことは Layer-2 Loops のページ、BPDU の宛先 MAC の 2 通りは PVID-Inconsistency のページで確認した。約 50 秒は Max Age 20 と Forward Delay 15 の 2 倍を足した値で、30 秒・50 秒を 1 つの数字として書いているのは二次資料だけだった。MAC の大小と製造時期の関係は根拠を見つけられず未検証として残した。校正チェックリストを通し、例え話・体言止め・藁人形・未定義語の初出を検査した。守秘: 実名・社名・会場名・地名・金額なし

参考文献

更新履歴

  • 連載のトピックを「ネットワーク基礎」から「ネットワーク」へ改名(32 本+目次。slug と URL は不変)
  • 公開: 連載「ネットワーク基礎」図 8〜24 の記事 17 本と目次の更新

機械可読の記録