パケットキャプチャでSTPを学ぶ(6) Port Costの変更
前回のおさらい
STP(Spanning Tree Protocol)構成をLinuxの中にLinux Bridgeで作成して、パケットキャプチャを取りながらSTPトポロジが完成するところまで確認しました。また、Bridge Priorityを変更することで指定したBridgeをRoot Brideにすることができました。
Root Bridgeを頂点とした木構造で書くとこのような構成です。
ネットワーク構成図っぽく書くとこのような構成です。
今回の目的
Root Bridgeはcore1にしたままで以下の図のようにEast-Westトラフィックを短い距離で通信できるようにします。もう少し具体的に言うとaccess2_e0とaccess4_e0がRoot Portになるようにします。
方針
Root Portの決定に使われる条件は以下の通りです。各ポートが受信したBPDUを見て、条件1が同位の場合は条件2で、条件2が同位の場合は条件3で決定します。
- ルートパスコストが最小
- Bridge IDが最小
- ポートIDが最小
ルートパスコストを変更
core1がRoot Bridgeで、各リンクがすべて10Gbpsの場合、access2のe0とe1はどちらもRoot Path Cost=4です。
勘違いしやすいのがこの「4」が何を足し算しているかです。
以下の図の赤の丸囲みがポートに設定されたコストを示しています。ピンクの数字はネットワークを流れるBPDUのRoot Path Costフィールドの値です。
- core1はRoot Path Cost=0でBPDUを送信
- access1はe1でBPDUを受信
- access1はaccess1のe1のコストである2を加算した0+2=2をaccess1 e1のRoot Path Costであると認識
- access1はRoot Path Cost=2でBPDUを送信
- access2はe0でBPDUを受信
- access2はaccess2のe0のコストである2を加算した2+2=4をaccess0 e0のRoot Path Costであると認識
パケットキャプチャも一応見ておくと、以下がaccess2_e0で受信しているBPDUです。Root Path Cost=2です。
access2のe1も同じようにRoot Path Cost=2のBPDUを受信し、access2が自分のe1のコストを加算してRoot Path Cost=4と認識しています。
BPDUの送信側のコストは関係ない、受信したBridgeがコスト計算しているというのがポイントのひとつです。
このRoot Path Costを上げる、または下げることでaccess2のRoot Portをコントロールできます。
ではどこのコストを変更するべきかですね。数値を上げるか下げるかはあまり重要じゃないと思うのですが、STPの上流で変更するか下流で変更するかは重要です。
各ポートのコストと受信BPDUのRoot Path Cost値を確認するコマンドは以下の通りです。ポートのコストはすべて10Gbpsのデフォルトの2であることが分かります。
# ip -o -d link show type veth | sed -ne 's/[^ ]* \([^@]*\)@.*\(cost [^ ]*\).*\(designated_cost [^ ]*\).*/\1\t\2\t\3/p' | sort
access1_e0 cost 2 designated_cost 2
access1_e1 cost 2 designated_cost 0
access1_e2 cost 2 designated_cost 2
access2_e0 cost 2 designated_cost 2
access2_e1 cost 2 designated_cost 2
access2_e2 cost 2 designated_cost 4
access3_e0 cost 2 designated_cost 2
access3_e1 cost 2 designated_cost 0
access3_e2 cost 2 designated_cost 2
access4_e0 cost 2 designated_cost 2
access4_e1 cost 2 designated_cost 2
access4_e2 cost 2 designated_cost 4
core1_e0 cost 2 designated_cost 0
core1_e1 cost 2 designated_cost 0
core1_e2 cost 2 designated_cost 0
core2_e0 cost 2 designated_cost 0
core2_e1 cost 2 designated_cost 2
core2_e2 cost 2 designated_cost 2
ルートパスコストを変更(下流)
まずは分かりやすくaccess2_e1のコストを変更してみます。
bridge link set dev access2_e1 cost 3
上位Bridgeから受信するBPDUは2で変わっていないです。
# ip -o -d link show type veth | sed -ne 's/[^ ]* \([^@]*\)@.*\(cost [^ ]*\).*\(designated_cost [^ ]*\).*/\1\t\2\t\3/p' | sort
access1_e0 cost 2 designated_cost 2
access1_e1 cost 2 designated_cost 0
access1_e2 cost 2 designated_cost 2
access2_e0 cost 2 designated_cost 2
access2_e1 cost 3 designated_cost 2
access2_e2 cost 2 designated_cost 4
access3_e0 cost 2 designated_cost 2
access3_e1 cost 2 designated_cost 0
access3_e2 cost 2 designated_cost 2
access4_e0 cost 2 designated_cost 2
access4_e1 cost 2 designated_cost 2
access4_e2 cost 2 designated_cost 4
core1_e0 cost 2 designated_cost 0
core1_e1 cost 2 designated_cost 0
core1_e2 cost 2 designated_cost 0
core2_e0 cost 2 designated_cost 0
core2_e1 cost 2 designated_cost 2
core2_e2 cost 2 designated_cost 2
access2_e1のcostが3になりました。
トポロジは以下のように変わりました。うまいことaccess1とaccess2の間が通れるようになりました。
access2と同じようにaccess4のcostも変更します。
bridge link set dev access4_e1 cost 3
目的のSTPトポロジに収束しました。
次の実験のために、変更した設定値を元に戻しておきます。
bridge link set dev access2_e1 cost 2
bridge link set dev access4_e1 cost 2
ルートパスコストを変更(上流)
今度はSTPの上流に位置するcore2(のRoot Portであるe0)を変更してみます。
bridge link set dev core2_e0 cost 3
# ip -o -d link show type veth | sed -ne 's/[^ ]* \([^@]*\)@.*\(cost [^ ]*\).*\(designated_cost [^ ]*\).*/\1\t\2\t\3/p' | sort
access1_e0 cost 2 designated_cost 2
access1_e1 cost 2 designated_cost 0
access1_e2 cost 2 designated_cost 2
access2_e0 cost 2 designated_cost 2
access2_e1 cost 2 designated_cost 3
access2_e2 cost 2 designated_cost 4
access3_e0 cost 2 designated_cost 2
access3_e1 cost 2 designated_cost 0
access3_e2 cost 2 designated_cost 2
access4_e0 cost 2 designated_cost 2
access4_e1 cost 2 designated_cost 3
access4_e2 cost 2 designated_cost 4
core1_e0 cost 2 designated_cost 0
core1_e1 cost 2 designated_cost 0
core1_e2 cost 2 designated_cost 0
core2_e0 cost 3 designated_cost 0
core2_e1 cost 2 designated_cost 3
core2_e2 cost 2 designated_cost 3
core2の下流に位置するaccess2_e1、access4_e1のRoot Path Costが2から3に変わりました。Root Path Costは上流から下流に向けて加算されていくので、こんな風にまとめてトポロジを変更することができます。
パケットキャプチャでもRoot Path Costが2から3に変わったことが分かります。
Blockingポートがどこかも確認しておきます。access2_e1、access4_e1がBlocking状態になっています。
# bridge link | sed -ne 's/[^ ]* \([^@]*\)@.*\(state [^ ]*\).*/\1\t\2/p' | sort
access1_e0 state forwarding
access1_e1 state forwarding
access1_e2 state forwarding
access2_e0 state forwarding
access2_e1 state blocking
access2_e2 state forwarding
access3_e0 state forwarding
access3_e1 state forwarding
access3_e2 state forwarding
access4_e0 state forwarding
access4_e1 state blocking
access4_e2 state forwarding
core1_e0 state forwarding
core1_e1 state forwarding
core1_e2 state forwarding
core2_e0 state forwarding
core2_e1 state forwarding
core2_e2 state forwarding
次の実験のために、変更した設定値を元に戻しておきます。
bridge link set dev core2_e0 cost 2
まとめ
BPDU受信ポートのコストを変更することでSTPトポロジを変えることができました。
次はポートコスト以外の方法でSTPトポロジを変えてみます。
Discussion