Ethernetの抽象STPとリンクcostによる配送経路¶
文書バージョン:1.2.0
対象GitHubバージョン:v1.2.0
文書ID:guide-ethernet-stp-cost
文書状態:公開用完成稿
更新履歴¶
| 文書バージョン | 更新日 | 更新内容 |
|---|---|---|
1.2.0 |
2026-10-22 |
v1.2.0の対象タグ・文書版を確定。過去の測定基準と公開済み履歴を保持 |
1.1.0 |
2026-10-17 |
初版:三角網のL12 costだけを変える6入力実習、初期role・copy経路・正式版実測と実Viewerを追加 |
目的:costを通信速度と分けて経路を読む¶
Switchを三角形につなぐと、同じframeが循環しないように転送経路を制限する必要があります。動的Ethernetの抽象STPは、bridge IDとlinkのcostから共通treeとportのroleを計算します。今回の要求は、costを一つ変えたとき、どの入口が受理され、bまで何段を通るかを説明できることです。
比較するのはlink L12 の cost だけで、10と30にします。bitrate、伝搬遅延、Switch処理時間は固定です。costはtreeを選ぶ重みであり、bitの送信時間へ直接加算するps値ではありません。link復旧の実習のような時刻付きdown/upは行わず、初期状態の経路を比較します。
profileは ethernet.l2.dynamic.v1。数値と画面は正式v1.1.4 Release、source b45515644dfc65c205216d564d5bf7ef00280622 から取得しました。掲載時のmain 60e238e04c1a7fd1bd714d02e928f51f4683de88 の後続NED修正は、この正式版の実測へ含めていません。
構成と責務:配線、tree、宛先を分ける¶
公開dynamicサンプルの3 Switch・3 Endpoint配線をそのまま使います。各接続は往復で、NEDには12方向Linkがあります。
a ― s1 ―L12― s2 ― b
│ │
L13 L23
│ │
└── s3 ──┘
│
c
| 構成 | 責務・境界 | 固定する依存 |
|---|---|---|
| NED | 物理配線とLink時間を定める | 全Link 1Gbps・伝搬1000ps、全up |
| bridge設定 | 共通treeのrootを選ぶ | s1/s2/s3のIDは1/2/3。最小のs1がroot |
| dynamic.links | up graphと経路costを定める | L13/L23は10、L12だけ10/30 |
| Switch | 入口STP判定、送信元学習、出口候補選択 | 処理2000ps、全port VID10 tagged |
| a / b / c | aが時刻0にb宛の1 frameを生成する | 宛先はbのMAC、payload空。cには宛先不一致で受信filter |
宛先bへの静的FDBは、両条件で共通に空へ整理しました。元サンプルの固定出口を残すと、その出口を追う実験になってしまうためです。bは送信しないので、そのMACもまだ学習されていません。この最初のunknown unicastをfloodし、treeの入口/出口適格性で広がりを制限します。送信元aのMAC学習は起きますが、宛先bを学習したことにはなりません。
root portはrootへ向かう入口、designated portはそのlinkでの転送担当、alternateはdiscardingになる代替portです。root又はdesignatedはforwardingで、alternateの入口では受信を拒否します。送信側がdesignatedでも、対向側がalternateならそのcopyは対向で拒否されます。物理linkのdownとは別です。
利用フロー:roleから受理経路へつなぐ¶
- INIでNED・model・workloadを読み、validateします。時刻0の初期treeは準備済みで、収束待ちを追加しません。
- a→s1へframeが届き、s1はL12/L13へcopyを送ります。s1はrootなので、両方の出口がdesignatedです。
- lowではs2のrootまでのcostは直接10、s3経由は20なのでL12側がroot portです。bへはa→s1→s2→bで届きます。
- highでは直接30、s3経由20なのでs2のroot portはL23側です。L12側へ届いた早いcopyはs2で拒否され、a→s1→s3→s2→bの後続copyが受理されます。
- cにも枝のcopyが届きますが宛先はbなので、cでは
destination_mismatchです。tree選択とEndpointの宛先判定を分けて読みます。
lowでL23のdesignated側がs2なのは、s2/s3のrootまでのcostがともに10で、bridge ID2が3より小さいためです。highではs3まで10、s2まで20なのでs3側がdesignatedになります。
手順:公開入力でL12のcostだけを変える¶
独立6入力ZIPを展開するか、examples/guide/ethernet-stp-cost を使います。ZIPはリポジトリ相対の構成で、他の記事の入力は不要です。
| ファイル | 内容 |
|---|---|
models/ethdynamic/Main.ned |
公開dynamic配線とbyte同一 |
workload.json |
公開dynamic unicast負荷とbyte同一。時刻0の1 frame、controls空 |
low.json / high.json |
公開dynamic modelの静的FDBを共通に空へ整理し、L12 costだけを比較 |
low.ini / high.ini |
対応modelを選ぶ。profile・負荷・上限時刻は共通 |
low.json の比較対象は次のlinkです。high.json では cost だけを "30" にします。速度やNEDのdelayは変更しません。
{"id":"L12","ports":["Net.s1.tx_b","Net.s2.tx_b"],
"up":true,"cost":"10"}
正式v1.1.4の dir-simulator をPATHへ置き、リポジトリ又はZIP展開先ルートで実行します。次はBash用です。
mkdir -p stp-results
for case in low high; do
dir-simulator validate --config examples/guide/ethernet-stp-cost/$case.ini &&
dir-simulator run --config examples/guide/ethernet-stp-cost/$case.ini \
--output stp-results/$case &&
dir-simulator view --input stp-results/$case/results.json \
--output stp-results/$case-viewer.html
done
PowerShellでは $case の2値を順に各コマンドへ代入できます。親ディレクトリを先に作り、runは未使用の出力先を指定します。各終了0、manifestの status: complete と partial: false を確認してください。JSON・CSV・診断・manifestを保存し、同じresults.jsonから作ったViewer HTMLをブラウザーで開きます。サーバーは不要です。
実測:経路は1段増えるがcopy総数は同じ¶
| 観測 | low | high |
|---|---|---|
| L12 cost | 10 | 30 |
| s2のroot port | tx_b(L12) | tx_c(L23) |
| alternate port | s3.tx_c | s2.tx_b |
| b受信完了 ps | 1831000 | 2442000 |
| generated / serialized | 1 / 6 | 1 / 6 |
| forwarded / received | 3 / 1 | 3 / 1 |
| reception filtered / copy dropped | 2 / 0 | 2 / 0 |
tag付きMACは68byte、preamble/SFD込みwireは608bitなので、1Gbpsで608000ps、伝搬込みarrivalはSOFから609000ps後です。各Switchはさらに2000psを処理に使います。lowのb向け最後のSOFは1222000ps、highでは1833000psです。b到着の差611000psは1段分の 609000+2000 で、costの差20psを加算した結果ではありません。IFG込み占有704000psも、到着時刻と区別します。
両条件でcopyは6件ですが、通る枝と入口判定が異なります。lowではL23をs2→s3に進んだcopyが1831000psに stp_discarding、highではL12をs1→s2に進んだcopyが1220000psに同じ理由でfilterされます。もう1件はcで1831000psの destination_mismatch です。SOF済みcopyの送信完了と、その後のreception filterは別の記録です。
highの同じframeはs2に2回到達します。早いL12側の拒否と、後のL23側の受理を、異なるvisit/transfer IDとparentで対応付けます。拒否されたcopyを再送したのではなく、s1から分かれた別の枝です。
両runは上限10000000psまでのcomplete結果、events_exhausted・pending0です。最後のイベントはMAC学習の失効でlow6220000ps/high6831000psでした。これをbへの配送時刻やSTP収束時間と読み替えないでください。今回はtopology generationはずっと0で、時刻付きlink変更はありません。
Viewer:初期roleとcopyの親子を確認する¶
- 各Viewerで時刻
0へJumpし、PolicyのSTP roleを見ます。lowのs2.tx_bはroot、s3.tx_cはalternate。highはs2.tx_bがalternate、s2.tx_cがrootです。 - 時刻
3000000でb向けの行を選び、到着1831000/2442000psとb受信完了を照合します。 stp_discardingになった枝の行を選び、拒否した入口がlowのs3.rx_c/highのs2.rx_bであることを確認します。0へ戻すと同じ初期roleが復元されます。rootというroleはSwitch全体のroot選出とは別で、s1の各portがrootと表示されるわけではありません。
次は正式版の実Viewerの時刻0を600pxで取得したPolicy画面です。390pxで表が枠より広い場合は、表内を横スクロールして右端の有効VIDまで確認できます。


制約と仕様への入口¶
これは中央計算の単一共通treeで、実BPDUの送受信や分散STP protocol、IEEE全体適合の証明ではありません。costは入力modelの初期値で比較し、run中のcost変更機能を使った実験ではありません。convergence_psは共通設定に残っていますが、初期treeを待つ遅延ではなく、今回その収束性能を測定していません。
三角網・VID10・1 frameだけの範囲です。link down/up、非ゼロ収束中の切替、parallel link、非連結、VLAN分断、表容量、複数frameの競合は今回未測定です。unknown unicastのfloodを観察する共通条件であり、任意の静的FDBを自動で迂回経路へ書き換える機能は主張しません。正式sourceのclean dev buildを使い、最適化ビルドの実時間性能は比較していません。
詳しいtreeと入口判定は正式版の動的Ethernet仕様、検証済み範囲は動的Ethernet検証仕様を参照してください。日本語検索では「経路」「三角」でこの記事を探せます。