スイッチングハブはMACアドレスを基にフレームを中継するネットワーク機器です。レイヤー2で動作し、単にスイッチとも呼ばれます。ネットワークを組む際、スイッチングハブはどんな構成においても必ずと言って良いほど、使われる機器ですね。
そのスイッチングハブですが、アドレス学習機能やフィルタリング機能など様々な機能を持っており、それらの演算を行うため、CPUやメモリなどが搭載されています。これは裏を返せば、スイッチングハブが壊れる要因がたくさん存在するとも言えます。
スイッチングハブが故障すると、ネットワーク全体にまで影響を及ぼすことがあり、その範囲はとても大きくなります。そのため、スイッチングハブには、冗長化の仕組みを取り入れるのが望ましく、業務などで使用するネットワークにおいては、まず、冗長化の仕組みが取り入れられていると言えます。
スイッチングハブの冗長化の仕組みはいくつかありますが、今回は昔から存在し、今でも使われているSTP(スパニングツリー)について見てきます。
スイッチングハブは壊れやすい
前書きにもありますが、スイッチングハブは結構壊れます。国税庁が発表するハブやルータなどの法廷耐用年数は10年とされていますが、大抵はサーバーの法廷耐用年数である5年を目途にリプレースしているところが多いと思います。
私の経験上でも、もちろん中には10年以上動作し続けているものもありますが、一方で1、2年で故障するものもあります。設置台数が多いシステムでは毎月のように(とは言い過ぎですが…)CE(カスタマーエンジニア)の方が設置現場に訪れて部品の交換作業をしています。特に熱がこもりやすかったり、埃がたまりやすい場所に設置しているものは壊れるのも早いです。
サーバーの冗長化をしっかりやっていても、スイッチングハブが壊れてしまっては元も子もありません。そのため、スイッチングハブの冗長化もとても重要な設計要素となります。
スイッチングハブの基本機能
STPの話に入る前に、スイッチングハブの基本機能についておさらいします。スイッチングハブには様々な機能がありますが、その中でも最も基本的な機能はフレーム転送です。学習したMACアドレステーブルに基づき、該当ポートにのみフレームを転送します。
MACアドレステーブルはメモリ上にあるため、電源を入れた時点では何も登録されていません。そこで、スイッチングハブはMACアドレスを学習し、MACアドレステーブルに登録します。そのMACアドレステーブルを参照し、必要なポートのみにフレームを転送することで、不要な通信をフィルタリングすることができます。
上図のように、PC1からPC2宛てに送られたパケットを受信すると、フレームを受信したポートから、MACアドレス(MAC-A)を学習し、MACアドレステーブルに登録します。以降、MAC-A宛てのパケットはポート1にのみに転送され、他のポートには転送されません(フィルタリングされる)。スイッチングハブの中核となる機能は、このアドレス学習とフィルタリング機能のふたつです。
スイッチングハブの配下に別のスイッチングハブを接続した構成を見たことがあります。このような場合はMACアドレステーブルはどうなるのですか?
そのような構成の場合は、MACアドレステーブルには1つのポートに対して複数のMACアドレスが登録されます(1対多の関係)。
MACアドレスの学習はフレームの送信元MACアドレスですか?それとも宛先MACアドレスですか?
送信元MACアドレスです。MACアドレスをどのように学習するのが効率的かを考えた場合、フレームを受信した際、つまり送信元MACアドレスから学習するのが最も効率的と言えます。
STPとは
STPはネットワークの冗長構成を可能にするためのプロトコルです。
冗長化されたネットワークとは
冗長化されたネットワークとは、送信先への経路が複数用意されているネットワークのことです。
上図のようにスイッチA、B間を接続するリンクを2本用意しておくことで、そのうちの1本のリンクに障害が発生しても、もう一方のリンクを通ることにより、ネットワークの接続を継続させることができます。
しかし、ただ単に、リンクを2本つなげただけだと、TTL(パケットの有効期間)のような仕組みが備わっていないレイヤー2のレベルにおいて、ブロードキャストをはじめとする全てのフレームが永遠にループし続けてしまいます。結果、ネットワークの帯域を全て消費し、ダウンしてしまいます。
このような現象を防ぎ、冗長化構成を可能にするための仕組みがSTP(スパニングツリープロトコル)です。
STPとは
STPは、BPDUと呼ばれる制御情報をスイッチ間でやり取りし、リンクの状態を把握します。そして、障害が発生していない通常の状態のときは、片方のリンクを使えない状態にしておき、障害が発生したとき、もう一方の経路に切り替えます。
各スイッチは1~10秒の間で設定した間隔でBPDU(Bridge Protocol Data Unit)を送信し、リンクの状態を確認します。BPDUには、ブリッジIDとパスコストの情報が含まれています。
STPの説明としてIPAでは以下のように定義しています。
L2SW間にLANケーブルを増設して経路を冗長化すると、経路がループ構成になり、ブロードキャストストームが発生する。STPはループ構成となった経路の一部をフレームが流れないようにブロックすることで論理的にツリー構成に変更して、経路の冗長化を可能にするプロトコルである。
STPの目的は以下の二つです。
- ループ構成によるブロードキャストストーム発生の回避
- 冗長化による信頼性の向上
では、STPの理解を深めるために以下の問題を考えてみます。
下図は、レイヤ2スイッチによって、STPを用いて構成されるLANを示す。各スイッチのブリッジプライオリティ設定値は等しく、パスコストは10M/ビット秒ポートに100、100Mビット/秒ポートに19が設定されている。
上記において、PC1とPC2の通信に使用される経路はどれか。(ここで、i、j、kはそれぞれ同じ数値を示す。)
最小のブリッジID(プライオリティ+MACアドレス)を持つ機器がルートブリッジになります。上記例の場合は、問題文からプライオリティ設定値はすべて等しいので、MACアドレスの値が最も小さい機器がルートブリッジになります。つまり、優先度が高い順に並べると、スイッチC→スイッチB→スイッチAとなり、結果、スイッチCがルートブリッジになります。
次にプロッキングポートを決めます。距離の近い、遠いはパスコストをもとに計算します。
- 各スイッチで、ルートブリッジに最も近いポートがルートポート
- 各セグメント(機器と機器をつないだ線)で、ルートブリッジに最も近いポートが代表ポート
- それ以外がブロッキングポート
上記を順番に解いていくと、経路は「スイッチA→スイッチC→スイッチB」となります。
このように、各種ポートを計算するのはとても面倒です。しかし、実際はここまで面倒なことをせずに、もっと単純な考え方で導き出せます。
それは、「ルートブリッジに最も遠いポートがブロックされる」ということです。
この考え方で導き出した答えは大抵正解になります。
STPのデメリット
ネットワークの冗長構成を可能にしてくれるとても便利なSTPですが、デメリットもあります。
それは、PCを接続しても直ちに通信が可能な状態にならないことです。STPが有効なスイッチングハブにPCを接続した場合、STPの状態遷移の待ち時間があるので、通信できるまでに40秒ほどかかります。
それぐらいなら問題ないと思うかもしれませんが、これが結構やっかいな問題を引き起こします。それは、PCがDHCPによるIPアドレス取得を要求した場合です。STPの処理が長いため、DHCPの要求がタイムアウトしてしまい、DHCPサーバーからIPアドレスが取得できないというものです。
また、STPでは、BPDUを定期的に受信することによって障害を検知しますが、最後に受信してから設定した時間(エージングタイム)経過してはじめて障害が発生したとみなすため、通信経路が切り替わるまで数十秒の時間がかかるという問題もあります。
さらに、基本的にSTP(従来規格であるIEEE 802.1D)はVLAN未対応であり、VLANを使用した環境でうまく動作しません。今どきのネットワークではVLANは当たり前のように使われているのでこれでは困ります。
STPの発展
従来のSTP規格であるIEEE 802.1Dでは、通信できるようになるまで時間がかかることやVLAN未対応であるなどの問題がありました。そのため、発展形としての規格がいくつかあります。
RSTP
STPでの通信の切り替わり時間を短縮するために考えられたのがRSTP(Rapid Spanning Tree Protocol)です。RSTPは、IEEE 802.1Wで定義されています。RSTPでは、障害時の切り替わりにかかる時間は1~3秒程度と、かなり短縮されています。
MSTP
STPをVLANに対応させたのがMSTP(Multiple Spanning Tree Protocol)です。MSTPを使用することで、VLANごとにブロッキングポートを設定することが可能になり、通信に柔軟に対応できるようになります。IEEE 802.1Qで定義されています。
その他
STPの分類には入りませんが、イーサネットで経路を冗長化する技術としてSTPにかわって普及してきている規格にTRILL(TRansparent Interconnection of Lots of Links)があります。
TRILLでは、最短経路が複数あるときには、負荷分散を行うことで冗長化と高速化の両方を実現できるようになります。