What A BGP Neighbor Needs
`session.py` を読み、neighbor を張るために何が必要かを設定項目ではなく関数の入力として読む。AS 番号、peer address、session state、message exchange を整理する。
Protocol in Code
この講座では、GitHub 上のプロトコルコードを「読み物」として扱い、pathvector.dev 側でその各所を解説します。 現在は BGP と OSPF を公開していて、BGP では policy-heavy な control plane を、OSPF では state machine と graph logic を code の形で読みます。
これは中級者向けの独立コースです。従来の containerlab コースは初級として別に完結させ、こちらは GitHub 上の実コードを読みながら protocol logic を説明することに集中します。
What This Course Is
初級は `containerlab を使って動かしながら学ぶコース`、中級は `Protocol in Code として GitHub 上のロジックを読むコース` として分けます。 どちらも独立して完結する前提にして、混線しないようにします。現在の題材は BGP と OSPF で、今後も他のプロトコルを同じ型で足せるようにします。
Current Track · BGP
最初の題材は BGP です。ここでは「neighbor を張るには何が必要か」と「best path selection はどういう条件分岐か」を中心に、 RFC 4271 の説明を input / state / decision の形にほどいていきます。Session 01-05 で部品を分け、Session 06-10 で control plane の中心をつなぎ、 Session 11-15 で peer gate、event dispatch、speaker loop まで閉じます。コード本体は GitHub の `protocol-in-code` repo に置き、ここではその各所を順番に読みます。
`session.py` を読み、neighbor を張るために何が必要かを設定項目ではなく関数の入力として読む。AS 番号、peer address、session state、message exchange を整理する。
`update.py` を読み、UPDATE を「route を入れる関数」と「route を消す関数」の両方として読む。announcement、withdrawal、re-advertise を state transition として見る。
`best_path.py` を読み、best path selection を魔法の優先順位ではなく条件分岐の列として読む。同じ prefix に複数 path が来たとき、どの条件で 1 本に決まるかを考える。
`validation.py` を読み、best path selection のあとに走る origin authorization を別ロジックとして読む。VRP、coverage、max length、valid / invalid / not_found を分けて考える。
`policy.py` を読み、validation result が local policy によって action へ変換される流れを読む。invalid route が自動で消えるわけではないことを分けて考える。
ribs.py を読み、Adj-RIB-In、Loc-RIB、Adj-RIB-Out を別の store として読む。Session 02 の received state と Session 03 の best-path input をどこでつないでいるかを見る。
import_policy.py を読み、best-path selection の前に local policy が candidate をどう書き換え、どう early drop するかを見る。comparison に入る前の入力を明確にする。
export_policy.py を読み、local に install された route が、そのまま全 peer に出るわけではないことを見る。deny、next-hop-self、AS_PATH prepend を outbound logic として読む。
recompute.py を読み、peer down によって per-peer state が消えたあと、affected prefix ごとに best-path recompute が走る流れを見る。backup path が best に上がる条件を追う。
pipeline.py を読み、received state から validation、import policy、policy action、Loc-RIB install、export までを 1 本の function chain として追う。ここで小さい BGP 実装の骨格が見えるようにする。
peer_state.py を読み、peer が Established になって初めて UPDATE が Adj-RIB-In に入ることを gate として読む。Session 01 の state machine を route flow の前提条件に戻す。
export_refresh.py を読み、Loc-RIB の変化が peer ごとの advertise / withdraw にどう変換されるかを読む。Adj-RIB-Out を reconciliation の結果として見る。
events.py を読み、announce、withdraw、peer down がそれぞれどの control-plane branch を通るかを event dispatch として読む。
decision_process.py を読み、1 prefix に集まる複数 path を validation と policy を通した decision set として読み、best-path がそのあとに走ることを確認する。
speaker.py を読み、peer state、RIBs、decision set、event handlers、export refresh を 1 つの speaker object にまとめる。ここで BGP core 15 sessions が閉じる。
Flow Review
流れは `neighbor formation` → `UPDATE mutations` → `best path decision` → `origin authorization` → `policy action` → `RIB placement` → `import rewrite` → `export decision` → `peer loss recompute` → `whole pipeline` → `peer gate` → `export refresh` → `event dispatch` → `prefix decision set` → `speaker loop` です。 ここで大事なのは、best path、authorization、local action、RIB placement、import/export を一つに潰さず、 最後の Session 15 で初めて 1 つの speaker object と event flow として再接続することです。
Current Track · OSPF
OSPF 編では、Hello の gate、adjacency state machine、DR / BDR election、Router-LSA object、flooding、LSDB、SPF、route derivation、 cost-based winner selection、topology recompute、area summary、speaker loop を 12 sessions で閉じます。コード本体は GitHub の `protocol-in-code` repo に置き、ここではその source file を順番に読みます。なおこの最初の OSPF arc は router-only graph を使う teaching model で、Network-LSA と transit network vertex は意図的に省いています。
Hello packet が neighbor relationship の最初の gate になることを読む。
Open Session 01accepted Hello が `Init`, `2-Way`, `Full` にどう変わるかを読む。
Open Session 02priority と router ID が DR / BDR election にどう入るかを読む。
Open Session 03Router-LSA を flood と SPF の共通入力 object として読む。
Open Session 04newer LSA がどの interface へ進むかを読む。
Open Session 05Router-LSA が area ごとの store でどう置き換わるかを読む。
Open Session 06LSDB が graph を経由して shortest-path tree になるところを読む。
Open Session 07SPF tree が reachable route に変わるところを読む。
Open Session 08同じ prefix の route candidates から winner を選ぶところを読む。
Open Session 09changed Router-LSA が route table recompute をどう起こすかを読む。
Open Session 10summary route が area boundary で見え方を書き換えることを読む。
Open Session 11Hello, LSDB, SPF, area summary を 1 つの speaker loop へ戻す。
Open Session 12Flow Review
流れは `Hello gate` → `adjacency state` → `DR/BDR election` → `Router-LSA object` → `flooding` → `LSDB replace` → `SPF tree` → `route derivation` → `cost winner` → `topology recompute` → `area summary` → `speaker loop` です。 BGP 編が policy-heavy な control plane をほどくのに対して、OSPF 編は packet gate と graph logic を段階的に接続します。Session 03 と 05 は broadcast segment / flood scope の branch lesson で、Session 12 ではそれも speaker の state と receive path に戻します。
Future Tracks
BGP と OSPF は最初の題材です。今後は IS-IS の level / TLV / SPF、DNS の resolution flow、TCP の state machine、TLS の handshake、HTTP/QUIC の stream 処理も、 同じく function / state / if 文として読めるように足していけます。
Beginner Track
こちらは初級者向けの独立レーンです。環境を立てて、route を見て、pcap を見て、hands-on の流れだけで理解を積み上げる前提にします。
2 router 構成で 1 本の route を観測する、初級コースの入口。
Open beginner labwithdrawal と re-advertise を手元で見る、初級コースの 2 本目。
Open beginner labcompeting origins を topology 上で再現する、初級コースの 3 本目。
Open beginner lab