L3スイッチで冗長構成を作るときに注意すべきことはパケットのループである。ルーターならばブロードキャストを止められるが,L3スイッチはブロードキャストを素通りさせてしまうからだ。このようなループを解消する仕組みであるスパニングツリーは,ネットワークがツリー状になるようにポートを制御する。
今回はスパニングツリーの仕組みと,より快適に使うためのノウハウを紹介する。スパニングツリーでは,まずスイッチ同士がBPDU(Bridge Protocol Data Unit)というパケットをやり取りしてツリーの頂点とポートの役割を決める。このため初期状態から始める場合は,ブリッジを起動してからパケットを転送するまでに時間がかかる。また,スパニングツリーはタグを付ける機能がないため,タグVLANごとにスパニングツリーを設定できない。これらを克服する新たな仕組みが登場している。より高速にツリーを構築し安定させるRSTP(Rapid Spanning-Tree Protocol)である。
| ||
|
Step1:
ツリーを構築する仕組み
パソコンをLANに接続したのに,なかなかDHCPサーバーからアドレスがもらえない。そんな経験はないだろうか。これは新品のLANスイッチ,特に何も設定しないで使っているスイッチで起こりがちの現象である。LANスイッチ製品には初期状態でスパニングツリーが有効になっているものが多い。例えば市場占有率の高い米Cisco Systems社のCatalystシリーズもその一つだ。
スパニングツリーが動いていると,リンクアップ(装置同士がケーブルでつながりどちらも電源が入っている状態)してから数十秒間はパケットが転送されない。そのため,パソコンから見るとリンクアップしているはずなのにどことも通信できない,という現象に見舞われる。
まずはツリーが完成するまでの流れを簡単に見ていく。スパニングツリーによるツリー構築は瞬時に完成するわけではなく,比較的ゆっくりとツリーが形作られる。スパニングツリーは,ツリーの頂点となるルートブリッジがBPDU(Bridge Protocol Data Unit)という特殊なパケットを定期的にマルチキャストすることで作られていく。スイッチは起動後に「自分がルートブリッジだ」と思い込むところからスタートする。そのため最初はすべてのブリッジがBPDUを送信する。受信したBPDUのルートID(ルートブリッジのブリッジID)を見て自分よりも数値が小さいブリッジID(プライオリティ+MACアドレス)だったら,自分はルートブリッジではない,と判断してBPDUの生成を中止する。こうして最後まで生き残った,ブリッジIDが一番小さいスイッチがルートブリッジになる(図1[拡大表示])。
このようにしてルートブリッジが決まるため,ツリーの起点が固定されるまでには比較的長い時間が必要になる。頂点が決まるまでの時間は,スイッチの総数そのものよりも,スイッチの段数(ホップ数)に依存する。というのも,ネットワークの両端のスイッチが同時に「自分がルートブリッジだ」と思い込んだとすると,相手の作ったBPDUが到達するまでに,その段数(ホップ数)だけ時間が必要となるからだ。ルートブリッジはなるべくネットワークの中心部に配置した方が早く頂点を固定でき,望ましい結果が得られる。
ちなみにスパニングツリーを取り決めているIEEE802.1D仕様ではルートブリッジが決まるまでの時間をForward Delay(デフォルト15秒)としている。BPDUパケットがブリッジを中継する間隔であるHello Time(デフォルト2秒)を考慮して,ブリッジ段数は最大7段程度が設計の目安となっているためだ。段数が7段を超えても動作するし,実際にはもっと速くルートブリッジは決定する。
頂点が固定し安定した状態になると,BPDUを出すスイッチはルートブリッジただ1台だけになる。他のスイッチはルートブリッジが出すBPDUのコストを見て,各ポートの役割を決めていく。
まず最も小さいコストのBPDUを受信したポートをルートポートにする。これはツリーを形作るためのポートなのでブロックされない。そして,ルートポートで受信したBPDUに各インタフェースのコストを足して,残りのインタフェースにBPDUを転送する。BPDUを転送したポートは代表ポートとなる。代表ポートもまたツリーを形作るためのポートなのでブロックされない。結局,このようにしてBPDUの通り道がツリーを形成する(図2[拡大表示])。
代表ポートはBPDUを転送するという働きをするはずだが,冗長構成を採っていると代表ポートでBPDUを受信する場所が出てくる。この場所がループの発生場所になる。ループを解消するために,代表ポート自身か相手側のポートのどちらかをブロックする。
ブロックするポートを決めるルールはいたって簡単だ。まず,自分がそのポートにBPDUを送信するとしたらコストはいくつになるか計算する。相手が送信してきたBPDUのコスト値と比べて,相手の方が小さいコストになっていたら自分をブロックポートにする。自分の方が小さければ引き続き代表ポートとなる(相手がブロックしてくれる)。コストが同じだった場合には,ブリッジIDの大小を比較する。