Protocol in Code · OSPF Session 02

Neighbor State Machine

Session 02 では neighbor.py を読み、Hello phase が `Init` / `2-Way` / `ExStart` を作り、その後の database exchange phase が `Loading` / `Full` まで進めることを state machine として追います。

IntermediateSession 02state machineOSPF

Bridge

Hello gate の出力を adjacency state へ載せる

Session 01 の出力は `accepted` と `saw_self` でした。Session 02 ではまずその 2 つを `Init` / `2-Way` / `ExStart` に変え、そのあと database exchange の進み具合を見て `Loading` / `Full` まで進めます。

Read The Source

Hello phase と exchange phase を分けて読む

if not inputs.should_form_full_adjacency:
    return NeighborState.TWO_WAY
if not inputs.request_list_empty:
    return NeighborState.LOADING
return NeighborState.FULL

この session で大事なのは、Hello event だけで `Full` になるわけではないことです。Hello phase は `2-Way` か `ExStart` まで、`Full` は DBD / request list / retransmission clearance を通った後の話です。

Walkthrough

`2-Way`, `ExStart`, `Loading`, `Full` を順に見る

cd protocol-in-code
PYTHONPATH=src python3 examples/ospf/session_02_walkthrough.py

walkthrough では Hello result を入力にして、`2-Way`, `ExStart`, `Loading`, `Full` を順に出します。Session 01 の result object が Session 02 の input になっていることを確認します。

Done Check

Session 02 を終えたと言える条件

  • 一部の neighbor が `2-Way` で止まる理由を説明できる
  • `database_description_ok` と request list が `Full` の前提になると説明できる
  • Hello の結果と adjacency state machine を分けて話せる

Next Session

次は shared segment の代表を選びます

Session 03 では DR / BDR election をコードで読みます。priority と router ID がどう tie-break になるかを見ます。