Files
fips/docs/design/fips-node-architecture.svg
T
Johnathan Corgan 73129f16d7 Rename design docs for clarity, reorganize node architecture diagram
- fips-architecture.md → fips-software-architecture.md with all
  cross-references updated (4 files)
- fips-transport-abstraction.svg → fips-node-architecture.svg, moved
  from Transport Abstraction section to Architecture Overview in
  fips-intro.md
- Added descriptive paragraph for node architecture diagram covering
  three-layer design (application interfaces, router core, transports)
2026-02-13 15:03:06 +00:00

175 lines
8.6 KiB
XML

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 520" font-family="monospace" font-size="12">
<style>
rect.outer { fill: #151525; stroke: #505070; stroke-width: 2; rx: 6; }
rect.layer { rx: 4; }
rect.api { fill: #1a3a2a; stroke: #40a060; stroke-width: 1.5; }
rect.tun { fill: #1a2a3a; stroke: #4080c0; stroke-width: 1.5; }
rect.router { fill: #2a2040; stroke: #8060c0; stroke-width: 1.5; }
rect.xport { fill: #2a1a1a; stroke: #c06040; stroke-width: 1.5; }
rect.cat { fill: none; stroke: #404060; stroke-width: 1; stroke-dasharray: 4,3; rx: 3; }
text { fill: #e0e0e0; }
text.label { font-size: 13px; font-weight: bold; }
text.sub { font-size: 10px; fill: #909090; }
text.cat { font-size: 9px; fill: #707090; font-style: italic; }
text.title { font-size: 16px; font-weight: bold; }
text.subtitle{ font-size: 12px; fill: #909090; }
line.conn { stroke: #606080; stroke-width: 1.5; }
line.peer { stroke: #505060; stroke-width: 1; stroke-dasharray: 3,3; }
</style>
<!-- Background -->
<rect width="800" height="520" fill="#0d1117" rx="8"/>
<!-- Title -->
<text x="400" y="28" text-anchor="middle" class="title">FIPS Node Architecture</text>
<text x="400" y="46" text-anchor="middle" class="subtitle">Application interfaces, router core, and transport abstraction layer</text>
<!-- Outer node box -->
<rect x="40" y="60" width="720" height="310" class="outer"/>
<text x="56" y="80" class="sub">FIPS Node</text>
<!-- === Application layer (centered) === -->
<!-- Router core center = 390, gap = 20, each box = 200 wide -->
<!-- Left box: 390 - 10 - 200 = 180..380, center = 280 -->
<!-- Right box: 390 + 10 = 400..600, center = 500 -->
<!-- FIPS-native API (left) -->
<rect x="180" y="90" width="200" height="50" class="layer api"/>
<text x="280" y="108" text-anchor="middle" class="label">FIPS-Native API</text>
<text x="280" y="121" text-anchor="middle" class="sub">Datagram service</text>
<text x="280" y="133" text-anchor="middle" class="sub">Addressed by npub</text>
<!-- IPv6 TUN adapter (right) -->
<rect x="400" y="90" width="200" height="50" class="layer tun"/>
<text x="500" y="108" text-anchor="middle" class="label">IPv6 TUN Adapter</text>
<text x="500" y="121" text-anchor="middle" class="sub">fips0 + DNS (.fips)</text>
<text x="500" y="133" text-anchor="middle" class="sub">npub → fd::/8 IPv6</text>
<!-- External app labels -->
<text x="280" y="74" text-anchor="middle" class="sub">FIPS-aware apps</text>
<text x="500" y="74" text-anchor="middle" class="sub">Legacy IP apps (ping, curl, ...)</text>
<!-- Arrows from apps down to API/TUN -->
<line x1="280" y1="78" x2="280" y2="90" class="conn"/>
<line x1="500" y1="78" x2="500" y2="90" class="conn"/>
<!-- === Router Core === -->
<rect x="80" y="170" width="620" height="60" class="layer router"/>
<text x="390" y="196" text-anchor="middle" class="label">Router Core</text>
<text x="390" y="212" text-anchor="middle" class="sub">Spanning tree · Bloom filters · Greedy routing · Session management · Noise IK</text>
<!-- Connections: API/TUN → Router -->
<line x1="280" y1="140" x2="280" y2="170" class="conn"/>
<line x1="500" y1="140" x2="500" y2="170" class="conn"/>
<!-- === Router → Transport connections (single trunk, branching to groups) === -->
<!-- Single vertical trunk from router bottom center -->
<line x1="390" y1="230" x2="390" y2="252" class="conn"/>
<!-- Horizontal bar at branch point -->
<line x1="160" y1="252" x2="690" y2="252" class="conn"/>
<!-- Vertical drops to each category group outline -->
<line x1="160" y1="252" x2="160" y2="276" class="conn"/>
<line x1="400" y1="252" x2="400" y2="276" class="conn"/>
<line x1="580" y1="252" x2="580" y2="276" class="conn"/>
<line x1="690" y1="252" x2="690" y2="276" class="conn"/>
<!-- === Transport layer === -->
<!-- Overlay transports -->
<rect x="60" y="276" width="200" height="80" class="cat"/>
<text x="160" y="289" text-anchor="middle" class="cat">Overlay</text>
<rect x="72" y="296" width="56" height="36" class="layer xport"/>
<text x="100" y="312" text-anchor="middle" font-size="10" font-weight="bold" fill="#e0e0e0">UDP</text>
<text x="100" y="324" text-anchor="middle" class="sub">IP</text>
<rect x="134" y="296" width="56" height="36" class="layer xport"/>
<text x="162" y="312" text-anchor="middle" font-size="10" font-weight="bold" fill="#e0e0e0">QUIC</text>
<text x="162" y="324" text-anchor="middle" class="sub">IP</text>
<rect x="196" y="296" width="56" height="36" class="layer xport"/>
<text x="224" y="312" text-anchor="middle" font-size="10" font-weight="bold" fill="#e0e0e0">WS</text>
<text x="224" y="324" text-anchor="middle" class="sub">TCP</text>
<!-- Shared medium transports -->
<rect x="270" y="276" width="260" height="80" class="cat"/>
<text x="400" y="289" text-anchor="middle" class="cat">Shared Medium</text>
<rect x="282" y="296" width="56" height="36" class="layer xport"/>
<text x="310" y="312" text-anchor="middle" font-size="10" font-weight="bold" fill="#e0e0e0">Ether</text>
<text x="310" y="324" text-anchor="middle" class="sub">802.3</text>
<rect x="344" y="296" width="56" height="36" class="layer xport"/>
<text x="372" y="312" text-anchor="middle" font-size="10" font-weight="bold" fill="#e0e0e0">WiFi</text>
<text x="372" y="324" text-anchor="middle" class="sub">802.11</text>
<rect x="406" y="296" width="56" height="36" class="layer xport"/>
<text x="434" y="312" text-anchor="middle" font-size="10" font-weight="bold" fill="#e0e0e0">BT</text>
<text x="434" y="324" text-anchor="middle" class="sub">RFCOMM</text>
<rect x="468" y="296" width="56" height="36" class="layer xport"/>
<text x="496" y="312" text-anchor="middle" font-size="10" font-weight="bold" fill="#e0e0e0">LoRa</text>
<text x="496" y="324" text-anchor="middle" class="sub">radio</text>
<!-- Point-to-point transports -->
<rect x="540" y="276" width="80" height="80" class="cat"/>
<text x="580" y="289" text-anchor="middle" class="cat">P-to-P</text>
<rect x="552" y="296" width="56" height="36" class="layer xport"/>
<text x="580" y="312" text-anchor="middle" font-size="10" font-weight="bold" fill="#e0e0e0">Serial</text>
<text x="580" y="324" text-anchor="middle" class="sub">UART</text>
<!-- Anonymity transports -->
<rect x="630" y="276" width="120" height="80" class="cat"/>
<text x="690" y="289" text-anchor="middle" class="cat">Anonymity</text>
<rect x="642" y="296" width="46" height="36" class="layer xport"/>
<text x="665" y="312" text-anchor="middle" font-size="10" font-weight="bold" fill="#e0e0e0">Tor</text>
<text x="665" y="324" text-anchor="middle" class="sub">.onion</text>
<rect x="694" y="296" width="46" height="36" class="layer xport"/>
<text x="717" y="312" text-anchor="middle" font-size="10" font-weight="bold" fill="#e0e0e0">I2P</text>
<text x="717" y="324" text-anchor="middle" class="sub">tunnel</text>
<!-- === Peer networks below node box === -->
<!-- Overlay peers -->
<text x="160" y="396" text-anchor="middle" class="sub">Internet Peers</text>
<line x1="160" y1="370" x2="160" y2="386" class="peer"/>
<!-- Shared medium peers -->
<text x="400" y="396" text-anchor="middle" class="sub">Local / Radio Peers</text>
<line x1="400" y1="370" x2="400" y2="386" class="peer"/>
<!-- Point-to-point peers -->
<text x="580" y="396" text-anchor="middle" class="sub">Wired Peer</text>
<line x1="580" y1="370" x2="580" y2="386" class="peer"/>
<!-- Anonymity peers -->
<text x="690" y="396" text-anchor="middle" class="sub">Anonymous Peers</text>
<line x1="690" y1="370" x2="690" y2="386" class="peer"/>
<!-- === Legend === -->
<rect x="40" y="420" width="720" height="85" fill="#151520" stroke="#404060" stroke-width="1" rx="4"/>
<rect x="60" y="438" width="24" height="14" class="layer api"/>
<text x="92" y="450" class="sub">Application interface</text>
<rect x="60" y="460" width="24" height="14" class="layer tun"/>
<text x="92" y="472" class="sub">IPv6 compatibility layer</text>
<rect x="60" y="482" width="24" height="14" class="layer router"/>
<text x="92" y="494" class="sub">Router core (protocol engine)</text>
<rect x="300" y="438" width="24" height="14" class="layer xport"/>
<text x="332" y="450" class="sub">Transport plugin</text>
<rect x="300" y="460" width="24" height="14" fill="none" stroke="#404060" stroke-width="1" stroke-dasharray="4,3" rx="2"/>
<text x="332" y="472" class="sub">Transport category grouping</text>
<text x="300" y="494" class="sub">All transports use the same Router Core interface</text>
</svg>