STP timerについてまとめます。hello, forward delay, max ageなどのパラメータを変更する事によってconvergence (収束) 時間をチューニングする事ができます。
コマンド一覧
このシナリオで重要なコマンド一覧は以下の通りです。
Switch(config)# spanning-tree vlan <vlan> hello-time <sec> Switch(config)# spanning-tree vlan <vlan> max-age <sec> Switch(config)# spanning-tree vlan <vlan> forward-time <sec>
構成図
以下の構成でSTPの動作確認を行います。SW1をRoot Bridgeとし、SW1, SW4間はcostが設定されています。なお、図中のR, D, BはそれぞれRoot, Designated, Blockingを表します。
NM-16ESWモジュールを使用したエミュレータで動作確認を行ったため、catalyst switchとはコマンドライン体系が異なる事に注意して下さい。また、ログを把握しやすくするためにntpの設定も投入しています。
+------------+ +------------+ | | | | | SW 2 +D----------R+ SW 3 | | | f0/1 f0/1| | +-----+------+ +-----+------+ Rf0/0 f0/0D │ │ │ │ │ │ Df0/0 f0/0R +-----+------+ +-----+------+ | | cost 1000 | | | SW 1 +D----------B+ SW 4 | | (Root) | f0/1 f0/1| | +------------+ +------------+
[SW1] vlan 2 ! spanning-tree vlan 1 priority 0 spanning-tree vlan 2 priority 0 ! interface FastEthernet0/0 switchport mode trunk ! interface FastEthernet0/1 switchport mode trunk spanning-tree cost 1000 ! interface Vlan1 ip address 192.168.0.1 255.255.255.0 ! ntp master [SW2] vlan 2 ! interface FastEthernet0/0 switchport mode trunk ! interface FastEthernet0/1 switchport mode trunk ! interface Vlan1 ip address 192.168.0.2 255.255.255.0 ! ntp server 192.168.0.1 [SW3] vlan 2 ! interface FastEthernet0/0 switchport mode trunk ! interface FastEthernet0/1 switchport mode trunk ! interface Vlan1 ip address 192.168.0.2 255.255.255.0 ! ntp server 192.168.0.1 [SW4] vlan 2 ! interface FastEthernet0/0 switchport mode trunk ! interface FastEthernet0/1 switchport mode trunk spanning-tree cost 1000 ! interface Vlan1 ip address 192.168.0.2 255.255.255.0 ! ntp server 192.168.0.1
設定全文は下記ファイルです。詳細設定は下記を参照ください。
Spannning-Tree Role
仕様説明
Spanning Treeには以下の5つの状態が存在します。まずはBPDUのみを取り扱い、次にMACアドレスを学習し、最後にフレームを転送するようになります。このように段階を経る事によって、STP計算が収束する前のデータ転送を防ぐにようになっています。
状態 | BPDU | MACアドレスの学習 | フレームの転送 |
---|---|---|---|
disable | 破棄 | × | × |
blocking | 受信のみ | × | × |
listening | 送受信 | × | × |
learning | 送受信 | ○ | × |
forwarding | 送受信 | ○ | ○ |
状態 | 説明 |
---|---|
disable | 管理者が意図的に無効にしている状態です。 |
blocking |
スイッチ起動直後の状態でBPDUの受信のみを行う状態です。
また、STP計算を行った結果、ループしないよう意図的にブロックしているポートもblockingの状態になります。max age(20秒)経過するかTopology Change BPDUを受信するとlisteningに遷移します。 |
listening | BPDUを送受信し、どのスイッチがRoot Bridgeになるか探している状態です。この時点では、MACアドレスの学習は行いません。forwarding delay(15秒)経過するとlearningに遷移します。 |
listening | MACアドレスを学習している状態です。forwarding delay(15秒)経過するとforwardingに遷移します。 |
forwarding | フレームの転送を行う状態です。 |
Spannning-Tree 切り替わり
仕様説明
Spanning-Treeはトポロジを把握したり障害を検知したりするのにBPDU(Bridge Protocol Data Unit)と呼ばれるフレームを使用します。BPDUのフォーマットは以下の通りです。なお、Flag以降のフィールドはTCN BPDUでは存在しません。
byte | field | description |
---|---|---|
2 | Protocol ID | 今のところ常に0が使用されます。 |
1 | version | STPのバージョンを表します。802.1dならば0になります。 |
1 | Type | configuration BPDUならば0x00、TCN BPDUならば0x80です。 |
1 | Flags | MSB(左端)がTCA flag、LSB(右端)がTC flagです。 |
省略 | 以降、Root ID, Bridge ID, Max Ageなどが含まれます。 |
configuration BPDUと、TCN(Topology Change Notification) BPDUの2種類が存在します。さらにconfiguration BPDUは3つに分類されます。表にまとめると以下の通りです。
種類 | 説明 |
---|---|
BPDU |
TCA flag = 0, TC flag = 0であるconfiguration BPDUです。
各スイッチは起動直後はこのBPDUを転送します。このフレームを各スイッチでやりとりした結果、自分のBridge IDが最も小さい(優先される)と判断した場合はこのBPDUを転送し続けます。 このBPDUは死活監視の意味も込められており、もしRoot Bridgeではないスイッチがmax age(20秒)間BPDUを受信できないとTopology Change Notification BPDUを送信します。 |
Topology Change Notification BPDU |
Message Typeが0x80であるBPDUです。
Root Bridgeではないスイッチにおいて、リンクダウンが発生するかmax age(20秒)間BPDUを受信できないと、Topology Change Notification BPDUを送信し、Root Bridgeに障害を通知します。 |
Topology Change Ack BPDU |
TCA flag = 1, TC flag = 1であるconfiguration BPDUです。
Topology Change Notification BPDUに対する確認応答です。 |
Topology Change BPDU |
TCA flag = 0, TC flag = 1であるconfiguration BPDUです。
Topologyが変わった旨を全体に伝えるためのBPDUです。Root BridgeはTCN BPDUを受信すると、max age + forwarding delay(20秒 + 15秒)間 TC BPDUを送信し続けます。TC BPDUを受信したスイッチは、mac address tableのaging timerを通常の300秒から15秒に変更し、mac address tableの更新を試みます。 |
フレームの観察
トポロジを把握したり障害を検知したりする最も基本的なBPDUは以下の通りです。Typeが0x00で、TCA flag, TC flagが0である事が読み取れます。また、Root Brigdge IDなど経路計算に必要な情報もBPDU内に含まれている事も把握して下さい。
Frame 65: 60 bytes on wire (480 bits), 60 bytes captured (480 bits) IEEE 802.3 Ethernet Logical-Link Control Spanning Tree Protocol Protocol Identifier: Spanning Tree Protocol (0x0000) Protocol Version Identifier: Spanning Tree (0) BPDU Type: Configuration (0x00) BPDU flags: 0x00 0... .... = Topology Change Acknowledgment: No .... ...0 = Topology Change: No Root Identifier: 0 / 0 / cc:00:13:18:00:00 Root Bridge Priority: 0 Root Bridge System ID Extension: 0 Root Bridge System ID: cc:00:13:18:00:00 Root Path Cost: 0 Bridge Identifier: 0 / 0 / cc:00:13:18:00:00 Bridge Priority: 0 Bridge System ID Extension: 0 Bridge System ID: cc:00:13:18:00:00 Port identifier: 0x8001 Message Age: 0 Max Age: 20 Hello Time: 2 Forward Delay: 15
Topology Chage Notification BPDUは以下の通りです。Typeが0x80である事が読み取れます。
Frame 16: 60 bytes on wire (480 bits), 60 bytes captured (480 bits) IEEE 802.3 Ethernet Logical-Link Control Spanning Tree Protocol Protocol Identifier: Spanning Tree Protocol (0x0000) Protocol Version Identifier: Spanning Tree (0) BPDU Type: Topology Change Notification (0x80)
Topology Chage Ack BPDUは以下の通りです。Typeが0x00で、TCA flag, TC flagが1である事が読み取れます。
Frame 17: 60 bytes on wire (480 bits), 60 bytes captured (480 bits) IEEE 802.3 Ethernet Logical-Link Control Spanning Tree Protocol Protocol Identifier: Spanning Tree Protocol (0x0000) Protocol Version Identifier: Spanning Tree (0) BPDU Type: Configuration (0x00) BPDU flags: 0x81 (Topology Change Acknowledgment, Topology Change) 1... .... = Topology Change Acknowledgment: Yes .... ...1 = Topology Change: Yes Root Identifier: 0 / 0 / cc:00:05:d0:00:00 Root Path Cost: 0 Bridge Identifier: 0 / 0 / cc:00:05:d0:00:00 Port identifier: 0x8001 Message Age: 0 Max Age: 20 Hello Time: 2 Forward Delay: 15
Topology Chage Ack BPDUは以下の通りです。Typeが0x00で、TCA flagが0で、TC flagが1である事が読み取れます。
Frame 19: 60 bytes on wire (480 bits), 60 bytes captured (480 bits) IEEE 802.3 Ethernet Logical-Link Control Spanning Tree Protocol Protocol Identifier: Spanning Tree Protocol (0x0000) Protocol Version Identifier: Spanning Tree (0) BPDU Type: Configuration (0x00) BPDU flags: 0x01 (Topology Change) 0... .... = Topology Change Acknowledgment: No .... ...1 = Topology Change: Yes Root Identifier: 0 / 0 / cc:00:05:d0:00:00 Root Path Cost: 0 Bridge Identifier: 0 / 0 / cc:00:05:d0:00:00 Port identifier: 0x8001 Message Age: 0 Max Age: 20 Hello Time: 2 Forward Delay: 15
トポロジ変化の観察
SW2, SW3間の障害をエミュレートします。SW2に以下のコマンドを投入します。
+------------+ +------------+ | | | | | SW 2 +D----×----R+ SW 3 | | | f0/1 f0/1| | +-----+------+ +-----+------+ Rf0/0 f0/0D │ │ │ │ │ │ Df0/0 f0/0R +-----+------+ +-----+------+ | | cost 1000 | | | SW 1 +D----------B+ SW 4 | | (Root) | f0/1 f0/1| | +------------+ +------------+
[SW2] SW2(config)#interface FastEthernet 0/1 SW2(config-if)#switchport trunk allowed vlan except 2 SW2(config-if)#^Z SW2# Jan 2 21:42:59.865: %SYS-5-CONFIG_I: Configured from console by console SW2#
SW3に予めデバッグを有効にしておき、この障害時のデバッグログを観察します。
リンクダウンした場合はすぐに障害を検知する事ができますが、今回のリンクダウンしていないものの通信断は発生している状態(実践ではメディアコンバーター越しの障害がよくあるパターンです)では、BPDUが受信できなくなったmax age(約20秒)後に障害を検知している事が読み取れます。
CCNA試験対策本などの入門者向きの参考書を見ると、「障害を検知したスイッチは自身がRoot Bridgeかのように振舞う」と書かれています。より正確な言い方をすれば、障害を検知したスイッチは、TCN BPDUを送信すると同時に、TC BPDUを送信し続けます。
[SW3] SW3#debug spanning-tree events Spanning Tree event debugging is on SW3# SW3# Jan 2 21:43:17.950: STP: VLAN2 we are the spanning tree root Jan 2 21:43:17.978: STP: VLAN2 heard root 0-cc00.04d0.0001 on Fa0/0 Jan 2 21:43:17.978: current Root has 32768-cc02.163c.0001 Jan 2 21:43:17.982: supersedes 32768-cc02.163c.0001 Jan 2 21:43:17.982: STP: VLAN2 new root is 0, cc00.04d0.0001 on port Fa0/0, cost 1019 Jan 2 21:43:17.986: STP: VLAN2 sent Topology Change Notice on Fa0/0 SW3#
SW4に予めデバッグを有効にしておき、この障害時のデバッグログを観察します。
SW4はBPDUが受信できなくなったmax age(約20秒)後にSW3からのTC BPDUを受信します。TC BPDUを受信した直後にlisteningに遷移している事が読み取れます。また、そのforwarding delay(15秒)後にlearningに遷移し、さらにforwarding delay(15秒)後にforwardingに遷移している様子が読み取れます。
[SW4] SW4# Jan 2 21:43:16.971: STP: VLAN2 new root port Fa0/1, cost 1000 Jan 2 21:43:17.027: STP: VLAN2 Fa0/1 -> listening Jan 2 21:43:17.959: STP: VLAN2 heard root 32768-cc02.163c.0001 on Fa0/0 Jan 2 21:43:17.959: current Root has 0-cc00.04d0.0001 Jan 2 21:43:18.003: STP: VLAN2 Topology Change rcvd on Fa0/0 Jan 2 21:43:18.003: STP: VLAN2 sent Topology Change Notice on Fa0/1 Jan 2 21:43:32.046: STP: VLAN2 Fa0/1 -> learning Jan 2 21:43:47.048: STP: VLAN2 sent Topology Change Notice on Fa0/1 Jan 2 21:43:47.048: STP: VLAN2 Fa0/1 -> forwarding SW4#
timer tuning
仕様説明
Cisco機器では、STPに関するタイマーをチューニングする事ができます。
Switch(config)# spanning-tree vlan <vlan> hello-time <sec> Switch(config)# spanning-tree vlan <vlan> max-age <sec> Switch(config)# spanning-tree vlan <vlan> forward-time <sec>
動作確認
下記の設定をSW1に投入し、STPの収束が早くなるようにします。
[SW1] spanning-tree vlan 2 hello-time 1 spanning-tree vlan 2 max-age 10 spanning-tree vlan 2 forward-time 7
先程と同様のSW2, SW3間の障害をエミュレートします。デフォルトの状態では障害復旧に50秒かかりますが、STPチューニング後は24( = 10 + 7 * 2)秒で障害復旧している事が読み取れます。
[SW2] SW2(config)#interface FastEthernet 0/1 SW2(config-if)#switchport trunk allowed vlan except 2 SW2(config-if)#^Z SW2# Jan 2 21:48:28.063: %SYS-5-CONFIG_I: Configured from console by console SW2# [SW4] SW4# Jan 2 21:48:35.135: STP: VLAN2 new root port Fa0/1, cost 1000 Jan 2 21:48:35.167: STP: VLAN2 Fa0/1 -> listening Jan 2 21:48:36.103: STP: VLAN2 heard root 32768-cc02.163c.0001 on Fa0/0 Jan 2 21:48:36.103: current Root has 0-cc00.04d0.0001 Jan 2 21:48:36.119: STP: VLAN2 Topology Change rcvd on Fa0/0 Jan 2 21:48:36.123: STP: VLAN2 sent Topology Change Notice on Fa0/1 Jan 2 21:48:38.103: STP: VLAN2 Topology Change rcvd on Fa0/0 Jan 2 21:48:38.107: STP: VLAN2 sent Topology Change Notice on Fa0/1 Jan 2 21:48:42.183: STP: VLAN2 Fa0/1 -> learning Jan 2 21:48:49.202: STP: VLAN2 sent Topology Change Notice on Fa0/1 Jan 2 21:48:49.206: STP: VLAN2 Fa0/1 -> forwarding SW4#