-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsummary.html
More file actions
488 lines (455 loc) · 38.3 KB
/
Copy pathsummary.html
File metadata and controls
488 lines (455 loc) · 38.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>MeshRoute v2.0 — Executive Summary</title>
<link rel="stylesheet" href="css/styles.css">
<style>
/* Summary page specific styles */
.summary-hero {
min-height: 50vh; display: flex; align-items: center; justify-content: center;
text-align: center; padding: 6rem 2rem 3rem; position: relative;
}
.summary-hero::before {
content: ''; position: absolute; inset: 0;
background: radial-gradient(ellipse at 50% 80%, rgba(34,211,238,0.06) 0%, transparent 60%);
pointer-events: none;
}
.summary-hero .hero-tag { opacity: 1; animation: none; }
.summary-hero .hero-title { opacity: 1; animation: none; font-size: clamp(2.2rem, 5vw, 4rem); }
.summary-hero .hero-sub { opacity: 1; animation: none; }
.back-link {
display: inline-flex; align-items: center; gap: 0.5rem;
font-family: var(--font-mono); font-size: 0.8rem;
color: var(--cyan); text-decoration: none;
padding: 0.4rem 1rem; border: 1px solid var(--cyan-dim);
border-radius: 6px; transition: all 0.2s; margin-top: 1.5rem;
}
.back-link:hover { background: var(--cyan-glow); }
.summary-section { max-width: 1000px; margin: 0 auto; padding: 3rem 2rem; }
.summary-section h2 {
font-family: var(--font-display); font-size: 1.8rem; font-weight: 700;
margin-bottom: 1.5rem; padding-bottom: 0.75rem;
border-bottom: 1px solid var(--border);
}
.summary-section p, .summary-section li {
color: var(--text-dim); font-size: 1rem; line-height: 1.8;
}
.summary-section ul { padding-left: 1.5rem; margin: 1rem 0; }
.summary-section li { margin-bottom: 0.5rem; }
.summary-section strong { color: var(--text); }
.highlight-box {
background: var(--bg-card); border: 1px solid var(--border);
border-radius: 12px; padding: 1.5rem 2rem; margin: 1.5rem 0;
}
.highlight-box.cyan { border-color: var(--cyan-dim); background: rgba(34,211,238,0.03); }
.highlight-box h4 {
font-family: var(--font-mono); font-size: 0.85rem; color: var(--cyan);
margin-bottom: 0.5rem;
}
.formula-inline {
font-family: var(--font-display); font-size: 1.2rem;
color: var(--cyan); display: block; text-align: center;
padding: 0.75rem 0; letter-spacing: 0.02em;
}
.comparison-mini {
display: grid; grid-template-columns: 1fr 1fr; gap: 1.5rem; margin: 1.5rem 0;
}
.comparison-mini > div { padding: 1.5rem; border-radius: 10px; }
.comparison-mini .before {
background: rgba(248,113,113,0.04); border: 1px solid var(--red-dim);
}
.comparison-mini .after {
background: rgba(34,211,238,0.04); border: 1px solid var(--cyan-dim);
}
.comparison-mini h4 { font-family: var(--font-mono); font-size: 0.8rem; margin-bottom: 0.5rem; }
.comparison-mini .before h4 { color: var(--red); }
.comparison-mini .after h4 { color: var(--cyan); }
@media (max-width: 768px) {
.comparison-mini { grid-template-columns: 1fr; }
}
.toc {
background: var(--bg-card); border: 1px solid var(--border);
border-radius: 12px; padding: 1.5rem 2rem; margin: 2rem 0;
}
.toc h4 { font-family: var(--font-mono); font-size: 0.8rem; color: var(--cyan); margin-bottom: 0.75rem; }
.toc ol { padding-left: 1.5rem; }
.toc li { margin-bottom: 0.3rem; }
.toc a { color: var(--text-dim); text-decoration: none; font-size: 0.9rem; }
.toc a:hover { color: var(--cyan); }
</style>
</head>
<body>
<!-- NAV -->
<nav id="navbar" class="scrolled">
<div class="nav-inner">
<a href="index.html" class="logo">MESH<span>ROUTE</span></a>
<ul id="nav-menu">
<li><a href="index.html">Presentation</a></li>
<li class="nav-sep"></li>
<li><a href="simulator.html" style="color:var(--cyan)">Live Simulator</a></li>
<li><a href="how-it-works.html">How It Works</a></li>
<li><a href="docs/esp-test-results.html" style="color:var(--green)">ESP32 Test</a></li>
<li><a href="summary.html" class="active">Summary</a></li>
<li class="nav-sep"></li>
<li><a href="de/summary.html" title="Deutsch" style="font-size:1.2rem;line-height:1;padding:0.2rem 0.5rem">🇩🇪</a></li>
</ul>
</div>
</nav>
<!-- NAV -->
<nav id="navbar" class="scrolled">
<div class="nav-inner">
<a href="index.html" class="logo">MESH<span>ROUTE</span></a>
<ul>
<li><a href="index.html">Full Documentation</a></li>
<li><a href="#abstract" class="active">Summary</a></li>
</ul>
</div>
</nav>
<!-- HERO -->
<div class="summary-hero">
<div>
<div class="hero-tag">Executive Summary</div>
<h1 class="hero-title">Mesh<span class="accent">Route</span></h1>
<p class="hero-sub">Optimal Multi-Path Routing for LoRa Mesh Networks — replacing naive flooding with intelligent, self-healing communication.</p>
<p style="font-family:var(--font-mono);font-size:0.8rem;color:var(--text-muted);margin-top:0.75rem">by Clemens Simon · 2026</p>
<a href="index.html" class="back-link">← Full Interactive Documentation</a>
</div>
</div>
<!-- TABLE OF CONTENTS -->
<div class="summary-section">
<div class="toc">
<h4>Contents</h4>
<ol>
<li><a href="#abstract">Abstract</a></li>
<li><a href="#problem">The Problem</a></li>
<li><a href="#approaches">Approaches Evaluated</a></li>
<li><a href="#system5">System V6 — The Solution</a></li>
<li><a href="#math">Mathematical Evaluation</a></li>
<li><a href="#resilience">Resilience & Adaptive QoS</a></li>
<li><a href="#results">Results</a></li>
<li><a href="#roadmap">Roadmap & Next Steps</a></li>
</ol>
</div>
</div>
<!-- ABSTRACT -->
<div class="summary-section" id="abstract">
<h2>1. Abstract</h2>
<p>Meshtastic (v2.6/2.7) uses <strong>managed flooding</strong> with SNR-based suppression for broadcasts and <strong>next-hop routing</strong> for direct messages. These are clever optimizations over naive flooding — but both still scale as <strong>O(n)</strong> per message, requiring a hop limit (default 3–7) that caps network range.</p>
<p>This paper presents <strong>System V6</strong>, a routing protocol that achieves <strong>O(hops)</strong> cost for all message types. Simulated against Meshtastic's actual managed flooding with <strong>realistic hop limits (3, 5, 7)</strong> across 21 scenarios (20–1500 nodes, 6 routers each), System V6 delivers <strong>92–100% fewer transmissions</strong> in small-to-medium networks while achieving <strong>dramatically higher delivery rates</strong> (half-duplex collapses managed flooding to 0–87% delivery across all scenarios).</p>
<p>The most significant finding: <strong>Half-duplex radio physics — not just hop limits — collapse flooding delivery.</strong> At 500 nodes, managed flooding delivers only <strong>3%</strong> of messages. At 1000 nodes, <strong>0%</strong>. Even at 100 nodes, only <strong>27%</strong>. System V6 delivers <strong>46–100%</strong> in the same scenarios. Half-duplex and collisions are now enabled on ALL scenarios, revealing that managed flooding is fundamentally unreliable with realistic radio physics.</p>
</div>
<!-- PROBLEM -->
<div class="summary-section" id="problem">
<h2>2. What Meshtastic Does Today</h2>
<p>Meshtastic's routing (v2.6/2.7) is already substantially better than naive flooding:</p>
<ul>
<li><strong>Managed Flooding</strong> — Before rebroadcasting, nodes listen briefly. If they hear another rebroadcast, they suppress. SNR-based priority gives distant nodes shorter contention windows. ROUTER/ROUTER_LATE roles always rebroadcast. This saves ~40–50% of transmissions vs. naive flooding.</li>
<li><strong>Next-Hop Routing (v2.6+)</strong> — For direct messages only. First DM floods; the system learns which relay succeeded. Subsequent DMs use only that one cached relay. Falls back to flooding if the next-hop fails.</li>
<li><strong>Congestion Scaling (v2.6+)</strong> — Networks with 40+ nodes stretch broadcast intervals: <code>Interval × (1 + (Nodes-40) × 0.075)</code>.</li>
</ul>
<p><strong>The remaining limitation:</strong> Both managed flooding and next-hop still scale as O(n) per message. The hop limit (3–7) is necessary because each hop multiplies transmissions proportional to network size. But this creates a <strong>double penalty</strong>: not only does each message waste bandwidth — messages that need more hops than the limit simply <strong>never arrive</strong>. With half-duplex enabled, at 100 nodes delivery drops to 27%. At 500 nodes, to 3%. At 1000 nodes, to 0%. Half-duplex radio physics and hop limits together make flooding fundamentally unreliable.</p>
</div>
<!-- APPROACHES -->
<div class="summary-section" id="approaches">
<h2>3. Approaches Compared</h2>
<p>Four routing strategies are simulated and compared on identical network topologies:</p>
<div class="highlight-box">
<h4>Naive Flooding (Reference Baseline)</h4>
<p>Every node rebroadcasts once. TX = n per message. Not used by Meshtastic — included only as a theoretical worst case for context.</p>
</div>
<div class="highlight-box" style="border-color:rgba(251,191,36,0.3)">
<h4>Managed Flooding (Meshtastic Current — All Messages)</h4>
<p>SNR-based suppression + ROUTER priority. TX ≈ 0.5n per message. Still O(n) but ~50% cheaper than naive. Proven effective up to ~100 nodes. Hop limit required.</p>
</div>
<div class="highlight-box" style="border-color:rgba(251,146,60,0.3)">
<h4>Next-Hop Routing (Meshtastic v2.6 — DMs Only)</h4>
<p>Learns one relay per destination. TX = hops after learning, but first message still floods. Only works for direct messages — broadcasts unchanged. Single cached relay, no load balancing, no multi-path.</p>
</div>
<div class="highlight-box cyan">
<h4>System V6 — Adaptive Load-Balanced Mesh (Proposed)</h4>
<p>Geo-clustering + multi-path + weighted load balancing + adaptive QoS + fallback. TX = hops for <strong>all message types</strong>. Score: <strong>9.2/10</strong> vs. 5.5 for managed flooding. Details in Section 4.</p>
</div>
</div>
<!-- SYSTEM 5 -->
<div class="summary-section" id="system5">
<h2>4. System V6 — The Solution</h2>
<p>System V6 combines six proven concepts, each borrowed from a different domain:</p>
<ul>
<li><strong>OSPF Areas → Geo-Clusters</strong> — Nodes self-organize by geohash prefix. Full topology shared within clusters, only summarized routes between. Scales from 10 to 50,000+ nodes.</li>
<li><strong>B.A.T.M.A.N. OGMs → Quality Metric</strong> — Periodic originator messages measure link quality by counting reception rates. No complex calculation — just counting arrivals.</li>
<li><strong>Weighted ECMP → Load Balancing</strong> — Traffic distributed proportionally across 2–3 routes. Good paths get more traffic, but never all. No single bottleneck.</li>
<li><strong>Back-Pressure → Congestion Control</strong> — Overloaded nodes report queue pressure via piggyback (2 bytes, 0.8% overhead). Traffic naturally avoids congested paths.</li>
<li><strong>Ant Colony Optimization → Self-Optimization</strong> — Successful deliveries strengthen routes, timeouts weaken them. Unused paths fade. The network learns through experience.</li>
<li><strong>DNS → Node Discovery</strong> — Hierarchical location cache. Ask locally first, then cluster, then region. Scoped flooding only as last resort. Answers are cached.</li>
</ul>
<div class="highlight-box cyan">
<h4>Route Weight Function</h4>
<span class="formula-inline">W(r) = α · Q(r) + β · (1 − Load) + γ · Batt</span>
<p>Where Q = accumulated route quality from distance-vector, Load = queue pressure of the <strong>next-hop</strong> node (from its last OGM), Batt = battery level of the <strong>next-hop</strong> node. All metrics are locally observable — no path-wide data collection needed. Traffic share: Share(r) = W(r) / Σ W(all routes).</p>
</div>
<p>The proportional distribution creates a <strong>negative feedback loop</strong>: overloaded paths lose weight → traffic shifts → path recovers → weight increases. The network self-balances without central control.</p>
</div>
<!-- MATH -->
<div class="summary-section" id="math">
<h2>5. Mathematical Evaluation</h2>
<p>Each system was scored 0–10 across seven weighted criteria:</p>
<div class="highlight-box">
<table style="width:100%;border-collapse:collapse;font-family:var(--font-mono);font-size:0.85rem">
<thead>
<tr style="border-bottom:2px solid var(--border)">
<th style="text-align:left;padding:0.5rem;color:var(--text-dim)">Criterion (Weight)</th>
<th style="padding:0.5rem;color:var(--red)">Naive</th>
<th style="padding:0.5rem;color:var(--yellow)">Managed</th>
<th style="padding:0.5rem;color:var(--orange)">Next-Hop</th>
<th style="padding:0.5rem;color:var(--cyan)">System V6</th>
</tr>
</thead>
<tbody style="color:var(--text-dim)">
<tr><td style="padding:0.4rem">TX Cost per Message (20%)</td><td style="text-align:center">1</td><td style="text-align:center">4</td><td style="text-align:center">5</td><td style="text-align:center;color:var(--cyan);font-weight:600">10</td></tr>
<tr><td style="padding:0.4rem">Delivery Reliability (20%)</td><td style="text-align:center">9</td><td style="text-align:center">9</td><td style="text-align:center">8</td><td style="text-align:center;color:var(--cyan);font-weight:600">9</td></tr>
<tr><td style="padding:0.4rem">Scalability (15%)</td><td style="text-align:center">1</td><td style="text-align:center">3</td><td style="text-align:center">4</td><td style="text-align:center;color:var(--cyan);font-weight:600">9</td></tr>
<tr><td style="padding:0.4rem">Fault Tolerance (15%)</td><td style="text-align:center">8</td><td style="text-align:center">8</td><td style="text-align:center">7</td><td style="text-align:center;color:var(--cyan);font-weight:600">9</td></tr>
<tr><td style="padding:0.4rem">Hop Limit Freedom (10%)</td><td style="text-align:center">1</td><td style="text-align:center">2</td><td style="text-align:center">3</td><td style="text-align:center;color:var(--cyan);font-weight:600">10</td></tr>
<tr><td style="padding:0.4rem">Energy Efficiency (10%)</td><td style="text-align:center">1</td><td style="text-align:center">3</td><td style="text-align:center">5</td><td style="text-align:center;color:var(--cyan);font-weight:600">8</td></tr>
<tr><td style="padding:0.4rem">Broadcast Support (10%)</td><td style="text-align:center">10</td><td style="text-align:center">10</td><td style="text-align:center">3</td><td style="text-align:center;color:var(--cyan);font-weight:600">9</td></tr>
<tr style="border-top:2px solid var(--cyan-dim)">
<td style="padding:0.5rem;font-weight:700;color:var(--text)">WEIGHTED TOTAL</td>
<td style="text-align:center;font-weight:600;color:var(--red)">4.3</td>
<td style="text-align:center;font-weight:600;color:var(--yellow)">5.5</td>
<td style="text-align:center;font-weight:600;color:var(--orange)">5.1</td>
<td style="text-align:center;font-weight:700;color:var(--cyan);font-size:1.1rem">9.2</td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- RESILIENCE -->
<div class="summary-section" id="resilience">
<h2>6. Resilience & Adaptive QoS</h2>
<p>System V6 handles every critical failure mode with graceful degradation:</p>
<ul>
<li><strong>Node failure</strong> — Instant failover to cached backup route (0ms). If a border node dies, a second border node takes over. If all borders fail, the cluster falls back to local flooding.</li>
<li><strong>GPS failure</strong> — Neighbor consensus: if 4 of 5 neighbors report geohash "u0x8", the GPS-less node adopts that cluster. If no neighbors have GPS: "homeless" mode with local flooding fallback.</li>
<li><strong>MQTT bridge failure</strong> — LoRa relay subnets activate. Small relay nodes between cities form a physical radio bridge. Slower (more hops) but functional without internet.</li>
<li><strong>Full internet outage</strong> — Local mesh continues operating. Clusters communicate via LoRa relay chains. Cross-continental traffic uses DTN (store-and-forward).</li>
</ul>
<div class="highlight-box cyan">
<h4>Local Network Health Score (NHS)</h4>
<span class="formula-inline">NHS<sub>local</sub>(node) = 0.25·Connectivity + 0.20·Redundancy + 0.20·LinkQuality + 0.20·BorderHealth + 0.15·Gateway</span>
<p><strong>Critically, NHS is computed locally per cluster, not globally.</strong> A node failure in Asia does not affect QoS in Munich. Each node evaluates its own neighborhood: its direct links, its cluster's border nodes, its route redundancy to local destinations, and whether it can reach an internet gateway. This means Cluster A can be GREEN while Cluster C is RED — each cluster manages its own traffic independently.</p>
<p style="margin-top:0.75rem">NHS drives adaptive QoS — eight priority classes from P0 (SOS, always passes) to P7 (firmware updates, only at NHS > 0.9). As local NHS drops, that cluster automatically throttles low-priority traffic. Self-healing loop: less traffic → fewer collisions → links recover → NHS rises.</p>
</div>
<div style="font-family:var(--font-mono);font-size:0.85rem;margin-top:1.5rem">
<table style="width:100%;border-collapse:collapse">
<thead>
<tr style="border-bottom:1px solid var(--border)">
<th style="text-align:left;padding:0.4rem;color:var(--text-dim)">NHS Range</th>
<th style="text-align:left;padding:0.4rem;color:var(--text-dim)">Level</th>
<th style="text-align:left;padding:0.4rem;color:var(--text-dim)">Allowed Traffic</th>
<th style="text-align:left;padding:0.4rem;color:var(--text-dim)">Max Rate</th>
</tr>
</thead>
<tbody style="color:var(--text-dim)">
<tr><td style="padding:0.3rem">0.9 – 1.0</td><td style="color:#4ade80">GREEN</td><td>Everything: text, files, firmware, bulk</td><td>100%</td></tr>
<tr><td style="padding:0.3rem">0.7 – 0.9</td><td style="color:#fbbf24">YELLOW</td><td>Messages + telemetry, no bulk</td><td>60%</td></tr>
<tr><td style="padding:0.3rem">0.4 – 0.7</td><td style="color:#fb923c">ORANGE</td><td>Priority messages only</td><td>30%</td></tr>
<tr><td style="padding:0.3rem">0.2 – 0.4</td><td style="color:#f87171">RED</td><td>Emergency + position only</td><td>10%</td></tr>
<tr><td style="padding:0.3rem">0.0 – 0.2</td><td style="color:#f87171;font-weight:700">CRITICAL</td><td>SOS beacon only</td><td>3%</td></tr>
</tbody>
</table>
</div>
</div>
<!-- RESULTS -->
<div class="summary-section" id="results">
<h2>7. Results</h2>
<div class="comparison-mini">
<div class="before">
<h4>Before (Managed Flooding)</h4>
<ul>
<li>Score: 5.5 / 10</li>
<li>TX ≈ 0.5n per message</li>
<li>~50% suppression via SNR</li>
<li>Still O(n) scaling</li>
<li>Hop limit 3–7 required</li>
<li><strong>Delivery collapses at 500+ nodes</strong></li>
<li>No load awareness</li>
</ul>
</div>
<div class="after">
<h4>System V6 (Proposed)</h4>
<ul>
<li>Score: <strong>9.2 / 10</strong></li>
<li><strong>TX = hops</strong> (not proportional to n)</li>
<li><strong>92–100%</strong> less TX (≤200 nodes)</li>
<li><strong>~1 TX per hop</strong> (hop limit irrelevant)</li>
<li>46x more delivery at 1000+ nodes</li>
<li>Battery-aware load balancing</li>
<li>Honest: more total TX at 1000+ nodes</li>
</ul>
</div>
</div>
<div class="highlight-box" style="border-color:var(--red-dim);background:rgba(248,113,113,0.03)">
<h4 style="color:var(--red)">Critical Finding: Delivery Rate Collapse Under Realistic Hop Limits</h4>
<p>Previous simulations used an unrealistic TTL of 30 hops — far above Meshtastic's actual default of 3–7. With realistic hop limits, managed flooding's delivery rate <strong>collapses</strong> in larger networks:</p>
<table style="width:100%;border-collapse:collapse;font-family:var(--font-mono);font-size:0.82rem;margin-top:0.75rem">
<thead>
<tr style="border-bottom:1px solid var(--border)">
<th style="text-align:left;padding:0.4rem;color:var(--text-dim)">Scenario</th>
<th style="text-align:right;padding:0.4rem;color:var(--text-dim)">Nodes</th>
<th style="text-align:right;padding:0.4rem;color:var(--red)">3-hop Del.</th>
<th style="text-align:right;padding:0.4rem;color:var(--orange)">5-hop Del.</th>
<th style="text-align:right;padding:0.4rem;color:var(--yellow)">7-hop Del.</th>
<th style="text-align:right;padding:0.4rem;color:var(--cyan)">Sys5 Del.</th>
</tr>
</thead>
<tbody style="color:var(--text-dim)">
<tr><td style="padding:0.3rem">Small Local (1km)</td><td style="text-align:right">20</td><td style="text-align:right;color:var(--yellow)">87%</td><td style="text-align:right;color:var(--yellow)">87%</td><td style="text-align:right;color:var(--yellow)">87%</td><td style="text-align:right;color:var(--green)">100%</td></tr>
<tr><td style="padding:0.3rem">Medium City (5km)</td><td style="text-align:right">100</td><td style="text-align:right;color:var(--red);font-weight:700">25%</td><td style="text-align:right;color:var(--red)">27%</td><td style="text-align:right;color:var(--red)">27%</td><td style="text-align:right;color:var(--green)">100%</td></tr>
<tr><td style="padding:0.3rem">Large Regional (20km)</td><td style="text-align:right">500</td><td style="text-align:right;color:var(--red);font-weight:700">1%</td><td style="text-align:right;color:var(--red);font-weight:700">2%</td><td style="text-align:right;color:var(--red);font-weight:700">3%</td><td style="text-align:right;color:var(--yellow)">76%</td></tr>
<tr><td style="padding:0.3rem">Dense Urban (3km)</td><td style="text-align:right">200</td><td style="text-align:right;color:var(--orange)">51%</td><td style="text-align:right;color:var(--orange)">51%</td><td style="text-align:right;color:var(--orange)">51%</td><td style="text-align:right;color:var(--green)">100%</td></tr>
<tr><td style="padding:0.3rem">1000 Nodes (40km)</td><td style="text-align:right">1000</td><td style="text-align:right;color:var(--red);font-weight:700">0%</td><td style="text-align:right;color:var(--red);font-weight:700">0%</td><td style="text-align:right;color:var(--red);font-weight:700">0%</td><td style="text-align:right;color:var(--orange)">46%</td></tr>
<tr><td style="padding:0.3rem">1500 Nodes (50km)</td><td style="text-align:right">1500</td><td style="text-align:right;color:var(--red);font-weight:700">0%</td><td style="text-align:right;color:var(--red);font-weight:700">1%</td><td style="text-align:right;color:var(--red);font-weight:700">1%</td><td style="text-align:right;color:var(--orange)">44%</td></tr>
<tr style="border-top:1px solid var(--border)"><td style="padding:0.3rem">Rural Long Range</td><td style="text-align:right">50</td><td style="text-align:right;color:var(--red)">20%</td><td style="text-align:right;color:var(--red)">25%</td><td style="text-align:right;color:var(--red)">25%</td><td style="text-align:right;color:var(--green)">100%</td></tr>
<tr><td style="padding:0.3rem">Maritime / Coastal</td><td style="text-align:right">30</td><td style="text-align:right;color:var(--red)">20%</td><td style="text-align:right;color:var(--red)">24%</td><td style="text-align:right;color:var(--red)">24%</td><td style="text-align:right;color:var(--green)">100%</td></tr>
<tr><td style="padding:0.3rem">Disaster Relief</td><td style="text-align:right">80</td><td style="text-align:right;color:var(--red);font-weight:700">15%</td><td style="text-align:right;color:var(--red)">19%</td><td style="text-align:right;color:var(--red)">19%</td><td style="text-align:right;color:var(--yellow)">78%</td></tr>
<tr><td style="padding:0.3rem">Mountain Valley</td><td style="text-align:right">60</td><td style="text-align:right;color:var(--red);font-weight:700">2%</td><td style="text-align:right;color:var(--red);font-weight:700">4%</td><td style="text-align:right;color:var(--red);font-weight:700">4%</td><td style="text-align:right;color:var(--red);font-weight:700">5%</td></tr>
</tbody>
</table>
<p style="margin-top:0.75rem;color:var(--red)"><strong>Half-duplex collapses flooding to 0–60% delivery in ALL scenarios.</strong> At 1000+ nodes, managed flooding delivers 0–1% of messages. Even at 100 nodes, only 27% arrive. System V6 maintains 46–100% delivery across all scales. Note: Mountain Valley (poor propagation, sparse nodes) is bad for both — directed routing cannot help when the physical network is too sparse.</p>
</div>
<div class="highlight-box cyan" style="margin-top:1.5rem">
<h4>TX Cost Comparison (Realistic Hop Limits)</h4>
<table style="width:100%;border-collapse:collapse;font-family:var(--font-mono);font-size:0.82rem;margin-top:0.75rem">
<thead>
<tr style="border-bottom:1px solid var(--border)">
<th style="text-align:left;padding:0.4rem;color:var(--text-dim)">Scenario</th>
<th style="text-align:right;padding:0.4rem;color:var(--text-dim)">Nodes</th>
<th style="text-align:right;padding:0.4rem;color:var(--yellow)">Managed 7h TX</th>
<th style="text-align:right;padding:0.4rem;color:var(--cyan)">Sys5 TX</th>
<th style="text-align:right;padding:0.4rem;color:var(--green)">TX Savings</th>
</tr>
</thead>
<tbody style="color:var(--text-dim)">
<tr><td style="padding:0.3rem">Small Local (1km)</td><td style="text-align:right">20</td><td style="text-align:right;color:var(--yellow)">16,459</td><td style="text-align:right;color:var(--cyan)">115</td><td style="text-align:right;color:var(--green)">99.3%</td></tr>
<tr><td style="padding:0.3rem">Medium City (5km)</td><td style="text-align:right">100</td><td style="text-align:right;color:var(--yellow)">201,920</td><td style="text-align:right;color:var(--cyan)">402</td><td style="text-align:right;color:var(--green)">99.8%</td></tr>
<tr><td style="padding:0.3rem">Dense Urban (3km)</td><td style="text-align:right">200</td><td style="text-align:right;color:var(--yellow)">1,490,555</td><td style="text-align:right;color:var(--cyan)">105,320</td><td style="text-align:right;color:var(--green)">92.9%</td></tr>
<tr><td style="padding:0.3rem">Festival (2km)</td><td style="text-align:right">150</td><td style="text-align:right;color:var(--yellow)">912,953</td><td style="text-align:right;color:var(--cyan)">107</td><td style="text-align:right;color:var(--green)">100%</td></tr>
<tr><td style="padding:0.3rem">Hiking Trail (8km)</td><td style="text-align:right">40</td><td style="text-align:right;color:var(--yellow)">28,894</td><td style="text-align:right;color:var(--cyan)">215</td><td style="text-align:right;color:var(--green)">99.3%</td></tr>
<tr><td style="padding:0.3rem">Duty Cycle</td><td style="text-align:right">100</td><td style="text-align:right;color:var(--yellow)">404,779</td><td style="text-align:right;color:var(--cyan)">918</td><td style="text-align:right;color:var(--green)">99.8%</td></tr>
<tr style="border-top:1px solid var(--border)"><td style="padding:0.3rem">30% Degraded Links</td><td style="text-align:right">100</td><td style="text-align:right;color:var(--yellow)">208,164</td><td style="text-align:right;color:var(--cyan)">11,866</td><td style="text-align:right;color:var(--green)">94.3%</td></tr>
<tr><td style="padding:0.3rem">20% Nodes Killed</td><td style="text-align:right">100</td><td style="text-align:right;color:var(--yellow)">132,780</td><td style="text-align:right;color:var(--cyan)">4,072</td><td style="text-align:right;color:var(--green)">96.9%</td></tr>
</tbody>
</table>
<p style="margin-top:0.75rem">System V6 saves <strong>92–100% of transmissions</strong> in small-to-medium networks compared to managed flooding — while delivering <strong>dramatically higher</strong> message delivery rates (100% vs 27–87% for managed flooding). Half-duplex collapses flooding delivery in ALL scenarios, making System V6 the only viable approach for reliable communication.</p>
</div>
<div class="highlight-box" style="margin-top:1.5rem;border-color:var(--cyan-dim);background:rgba(34,211,238,0.03)">
<h4 style="color:var(--cyan)">Consequences</h4>
<ul>
<li><strong>Half-duplex is the real killer — not just hop limits.</strong> With half-duplex and collisions enabled on all scenarios, managed flooding collapses to 0–60% delivery everywhere. Raising the hop limit from 3 to 7 barely helps when the radio physics prevent rebroadcasts.</li>
<li><strong>Flooding cannot scale at any size with realistic radio physics.</strong> At 1000+ nodes, managed flooding delivers 0–1% of messages. Even at 100 nodes (Medium City), only 27% arrive. The network spends enormous bandwidth to deliver almost nothing.</li>
<li><strong>System V6 is the only approach that maintains high delivery.</strong> At 1000 nodes, System V6 delivers 46% vs managed flooding's 0%. At 100 nodes, 100% vs 27%. Directed routing avoids the collision cascade that destroys flooding.</li>
<li><strong>Small-to-medium networks are the sweet spot.</strong> At 20–200 nodes, System V6 delivers 100% with 92–100% less bandwidth. This covers the vast majority of real-world Meshtastic deployments.</li>
<li><strong>Sparse networks remain challenging.</strong> Mountain Valley (60 nodes, poor propagation) shows 5% S5 vs 4% MF delivery — when the physical network is too sparse, no routing algorithm can help. System V6 is not magic.</li>
<li><strong>Stress scenarios devastate flooding.</strong> Under 30–50% link degradation, managed flooding delivers only 15–19% while System V6 delivers 73%. Under 20% node failure, MF delivers 16% vs S5's 80%. Directed routing with multi-path failover survives where flooding collapses.</li>
<li><strong>Spread-out and large networks need directed routing.</strong> Rural (25%), maritime (24%), disaster (19%), and 500+ node scenarios (0–3%) show flooding's delivery collapse most clearly. These are exactly the scenarios where Meshtastic is most needed.</li>
</ul>
</div>
<p style="margin-top:1.5rem">Key advantages over Meshtastic's current routing:</p>
<ul>
<li><strong>O(hops) vs O(n)</strong> — cost depends on path length, not network size. The fundamental scaling improvement.</li>
<li><strong>Delivery rate</strong> — System V6 delivers dramatically more messages in all scenarios. At 1000 nodes: 46% vs 0%. At 100 nodes: 100% vs 27%.</li>
<li><strong>Hop limit eliminated</strong> — 20 hops cost less than managed flooding costs for 1. Unlocks range and preset freedom.</li>
<li><strong>All traffic types</strong> — unlike next-hop (DMs only), System V6 routes all messages including broadcasts.</li>
<li><strong>Multi-path resilience</strong> — 2 cached routes per destination (distance-vector) with instant failover + scoped corridor flooding as last resort.</li>
<li><strong>Load balancing</strong> — proportional distribution prevents bottlenecks. Meshtastic has no load awareness.</li>
<li><strong>Adaptive QoS</strong> — NHS per cluster with priority gate. SOS always gets through.</li>
</ul>
<div class="highlight-box cyan" style="margin-top:1.5rem">
<h4 style="color:var(--cyan)">v2.0 — Real-World Improvements (Bay Area Mesh Feedback)</h4>
<p style="margin-bottom:0.8rem">Feedback from Bay Area Mesh operators revealed that <strong>half-duplex radio physics</strong> — not routing algorithms — is the true scaling bottleneck at elevated nodes. Five features were built in response:</p>
<ul>
<li><strong>Half-Duplex Radio Model</strong> — Simulator now models TX/RX exclusion on ALL scenarios. Flooding collapses from ~87% → ~6% delivery in Bay Area, and to 0–60% across all scenarios. System V6 holds at ~74% in Bay Area.</li>
<li><strong>Node Silencing</strong> — Redundant nodes are muted (listen but don't rebroadcast). Battery-fair rotation every 10 min. In Bay Area: 128 of 193 valley nodes silenced, <strong>TX halved</strong> with only ~4% less delivery. All mountain nodes stay active.</li>
<li><strong>Sequence Numbers</strong> — 2-byte per-(src,dst) counter in packet header for out-of-order and gap detection. Zero extra TX cost.</li>
<li><strong>Emergency Re-Route</strong> — Failover to backup route (from distance-vector table), then corridor flooding as last resort.</li>
<li><strong>Cluster-Distributor Broadcast</strong> — Broadcasts propagate via elected distributors + mini-floods per cluster, not network-wide flooding. 88-99% TX savings on the 98% of Meshtastic traffic that is broadcast.</li>
<li><strong>Bay Area 3-Tier Topology</strong> — 7 mountain (45km range) + 35 hill (10km) + 193 valley (2.5km) nodes with asymmetric links and half-duplex.</li>
</ul>
<table style="width:100%;border-collapse:collapse;font-family:var(--font-mono);font-size:0.82rem;margin-top:0.75rem">
<thead>
<tr style="border-bottom:1px solid var(--border)">
<th style="text-align:left;padding:0.4rem;color:var(--text-dim)">Bay Area Scenario</th>
<th style="text-align:right;padding:0.4rem;color:var(--yellow)">Flood Del.</th>
<th style="text-align:right;padding:0.4rem;color:var(--cyan)">S5 Del.</th>
<th style="text-align:right;padding:0.4rem;color:var(--cyan)">S5 TX</th>
<th style="text-align:right;padding:0.4rem;color:var(--text-dim)">Silenced</th>
</tr>
</thead>
<tbody style="color:var(--text-dim)">
<tr><td style="padding:0.3rem">Bay Area (half-duplex)</td><td style="text-align:right;color:var(--red);font-weight:700">~6%</td><td style="text-align:right;color:var(--green)">~74%</td><td style="text-align:right">~516K</td><td style="text-align:right">—</td></tr>
<tr><td style="padding:0.3rem;font-weight:600">Bay Area + Silencing</td><td style="text-align:right;color:var(--red);font-weight:700">~6%</td><td style="text-align:right;color:var(--green)">~70%</td><td style="text-align:right;color:var(--cyan);font-weight:600">~284K</td><td style="text-align:right;color:var(--cyan)">57%</td></tr>
<tr><td style="padding:0.3rem">Bay Area + Stress</td><td style="text-align:right;color:var(--red);font-weight:700">~5%</td><td style="text-align:right;color:var(--yellow)">~55%</td><td style="text-align:right">~283K</td><td style="text-align:right">—</td></tr>
<tr><td style="padding:0.3rem">Bay Area + Silencing + Stress</td><td style="text-align:right;color:var(--red);font-weight:700">~5%</td><td style="text-align:right;color:var(--yellow)">~49%</td><td style="text-align:right;color:var(--cyan)">~132K</td><td style="text-align:right;color:var(--cyan)">57%</td></tr>
</tbody>
</table>
<p style="margin-top:0.6rem"><a href="how-it-works.html#silencing" style="color:var(--cyan)">Technical deep-dive on all v2.0 features →</a></p>
</div>
</div>
<!-- ROADMAP -->
<div class="summary-section" id="roadmap">
<h2>8. Roadmap & Next Steps</h2>
<div class="concl-roadmap">
<div class="concl-timeline">
<div class="concl-phase done">
<div class="concl-phase-marker"></div>
<div class="concl-phase-content">
<h4>Phase 1 — Research & Design</h4>
<p>Algorithm comparison, mathematical analysis, interactive documentation with live simulations. <strong>Complete.</strong></p>
</div>
</div>
<div class="concl-phase done">
<div class="concl-phase-marker"></div>
<div class="concl-phase-content">
<h4>Phase 2 — Python Simulator</h4>
<p>26 scenarios (20–1500 nodes), 6 routers, realistic EU868 LoRa model with half-duplex radio, collision capture, duty cycle. Bay Area 3-tier topology with node silencing. Confirms 92–100% TX savings and dramatically higher delivery rates — half-duplex collapses flooding to 0–87% delivery in all scenarios. <strong>Complete.</strong></p>
</div>
</div>
<div class="concl-phase done">
<div class="concl-phase-marker"></div>
<div class="concl-phase-content">
<h4>Phase 3 — ESP32 Firmware Prototype</h4>
<p>Standalone firmware for Heltec V3, T-Beam, RAK4631. System V6 routing core (14 functions), OGM discovery, OLED display, serial CLI. Wire protocol v2.0 with sequence numbers and node silencing control. <strong>Complete — <a href="firmware/README.md" style="color:var(--cyan)">installation guide</a>.</strong></p>
</div>
</div>
<div class="concl-phase">
<div class="concl-phase-marker"></div>
<div class="concl-phase-content">
<h4>Phase 4 — Community & Upstream</h4>
<p>Open source release on GitHub. Pull request to Meshtastic project. Community testing at scale. Documentation and conference presentations.</p>
</div>
</div>
</div>
</div>
<!-- Call to Action -->
<div class="concl-cta" style="margin-top:3rem">
<h3>Want to Help?</h3>
<p>This is an open research project. Whether you're a firmware developer, network theorist, LoRa enthusiast, or just curious — every perspective makes the protocol better.</p>
<div class="concl-cta-links">
<a href="how-it-works.html" class="concl-cta-item" style="text-decoration:none">🔧 How It Works (Technical Deep Dive)</a>
<a href="simulator.html" class="concl-cta-item" style="text-decoration:none">🎮 Live Simulator</a>
<a href="docs/bay-area-feedback-response.md" class="concl-cta-item" style="text-decoration:none">🌊 Bay Area Feedback & Response</a>
<a href="https://github.com/ClemensSimon/MeshRoute" class="concl-cta-item" style="text-decoration:none" target="_blank" rel="noopener">💻 GitHub</a>
<a href="https://discord.com/invite/meshtastic" class="concl-cta-item" style="text-decoration:none" target="_blank" rel="noopener">📡 Meshtastic Discord</a>
</div>
<a href="index.html" class="back-link" style="margin-top:2rem">← Explore the Full Interactive Documentation</a>
</div>
</div>
<footer>
<p>MeshRoute — Algorithm Research for Meshtastic / LoRa Mesh Networks</p>
<p style="margin-top:0.5rem">By <strong style="color:var(--cyan)">Clemens Simon</strong> — 2026</p>
<p style="margin-top:0.3rem;font-size:0.75rem">Built with pure HTML, CSS & Canvas. No dependencies. · MIT License</p>
</footer>
</body>
</html>