Eine vollständige technische Erklärung von MeshRoutes geo-geclustertem, Multi-Pfad, lastverteiltem Routing-Protokoll — vom Start bis zur Zustellung.
Jedes Routing-Protokoll beantwortet eine Frage: Wenn Knoten A eine Nachricht an Knoten Z senden will, welche Zwischenknoten sollen sie weiterleiten?
Das aktuelle Meshtastic verwendet Managed Flooding: Jeder Knoten sendet jede Nachricht weiter, in der Hoffnung, dass sie das Ziel erreicht. Das funktioniert für kleine Netzwerke, erzeugt aber eine Bandbreitenexplosion bei Skalierung — 100 Knoten bedeuten ~100 Übertragungen pro Nachricht.
System 5 verfolgt einen grundlegend anderen Ansatz: Knoten organisieren sich selbst in geografische Cluster, entdecken Multi-Hop-Routen und senden jede Nachricht über einen spezifisch berechneten Pfad. Die Kosten pro Nachricht sind proportional zur Anzahl der Hops, nicht zur Anzahl der Knoten.
Die folgenden Abschnitte erklären jeden Schritt im Detail.
Wenn ein System 5-Knoten hochfährt, weiß er noch nichts über das Netzwerk. Hier ist die genaue Abfolge:
"u33d"). Die ersten 4 Zeichen definieren den Cluster des Knotens. Knoten mit dem gleichen 4-Zeichen-Präfix befinden sich im selben Cluster.Ein Geohash kodiert eine GPS-Koordinate in einen String, bei dem gemeinsame Präfixe geografische Nähe bedeuten. Zwei Knoten mit Geohash "u33d8" und "u33d9" teilen das Präfix "u33d" — sie sind im selben Cluster. Ein Knoten mit "u33e1" ist in einem benachbarten Cluster. Bei 4-Zeichen-Genauigkeit deckt jeder Cluster ungefähr 40km × 20km ab.
Alle 30 Sekunden sendet jeder Knoten eine OGM (Originator Message). Das ist ein kompaktes Paket (~20 Bytes) mit folgendem Inhalt:
| Feld | Größe | Zweck |
|---|---|---|
| Node ID | 4 Bytes | Eindeutige Kennung (abgeleitet von der Hardware-MAC) |
| Position | 8 Bytes | Breitengrad + Längengrad (oder Cluster-ID falls kein GPS) |
| Batterie | 1 Byte | Aktueller Ladestand (0–100%) |
| Cluster-ID | 4 Bytes | Geohash-Präfix des Clusters dieses Knotens |
| Nachbaranzahl | 1 Byte | Wie viele Nachbarn dieser Knoten aktuell hat |
| NHS | 1 Byte | Network Health Score des Clusters dieses Knotens |
Wenn ein Knoten eine OGM empfängt, geschieht Folgendes:
Speicherbeschränkung. Jeder Nachbareintrag kostet ~80 Bytes. Auf nRF52-Geräten mit 256KB RAM bedeuten 16 Nachbarn × 80 Bytes = 1.280 Bytes — leistbar. Falls ein Knoten mehr als 16 Nachbarn hört, wird der mit der niedrigsten Verbindungsqualität entfernt. Das ist unproblematisch, da das Routing nur die besten Nachbarn braucht, nicht alle.
Ein kritisches Detail: Die Verbindung von A→B kann eine andere Qualität haben als B→A. Ein Berggipfel-Knoten mit freier Sichtlinie sendet möglicherweise mit Qualität 0,95 zum Talknoten, aber der Talknoten (umgeben von Gebäuden) kann nur mit Qualität 0,3 zurücksenden. System 5 verfolgt beide Richtungen unabhängig.
Nach einigen OGM-Runden (~1–2 Minuten) haben die Knoten ihre Nachbarn entdeckt. Nun organisiert sich das Netzwerk selbst in geografische Cluster.
Es gibt keinen zentralen Koordinator. Jeder Knoten handelt unabhängig:
Das ist komplett dezentral — kein Knoten muss das gesamte Netzwerk „kennen". Wenn ein neuer Knoten in München eingeschaltet wird, berechnet er seinen Geohash ("u281") und ist automatisch Teil des München-Clusters. Er braucht keine Genehmigung und keine Koordination.
Ein Border Node ist jeder Knoten, der Nachbarn in einem anderen Cluster hat. Border Nodes sind entscheidend — sie sind die Brücken für das clusterübergreifende Routing.
System 5 begrenzt Brückenverbindungen auf 2 pro Clusterpaar, um eine Routenexplosion zu verhindern. Die zwei stärksten Verbindungen zwischen jedem Paar benachbarter Cluster werden ausgewählt.
Jeder Knoten muss nur Folgendes kennen:
Ein Knoten in San Francisco muss nicht jeden einzelnen Knoten in Oakland kennen. Er muss nur wissen: „Um Oakland zu erreichen, route über Border Node #47 auf dem Bay Bridge-Kamm."
Sobald Cluster und Border Nodes bekannt sind, berechnet jeder Knoten bis zu 5 Routen zu jedem Ziel, das er erreichen möchte.
Für jede Route ist die Qualität das Produkt aller Verbindungsqualitäten entlang des Pfades:
Wenn eine einzelne Verbindung Qualität 0,5 hat, sinkt die Gesamtroutenqualität erheblich. Das bestraft natürlich lange Pfade und Pfade mit schwachen Verbindungen.
Wenn Knoten A eine Nachricht an Knoten Z senden will, ist dies der genaue Entscheidungsprozess:
Ist die Priorität dieser Nachricht hoch genug für den aktuellen Netzwerkzustand? (Siehe Schritt 6)
Alle gecachten Routen zum Ziel Z nachschlagen. Typischerweise 2–5 Routen.
Routen entfernen, bei denen ein Zwischenknoten ausgefallen ist (Batterie = 0) oder eine Verbindung unterbrochen ist.
Für jede verbleibende Route wird ein Gewicht berechnet, das drei Faktoren ausbalanciert:
| Faktor | Gewicht | Was er misst | Warum er wichtig ist |
|---|---|---|---|
| Q(r) — Qualität | 0,4 (40%) | Produkt aller Verbindungsqualitäten entlang des Pfades | Höher = weniger Paketverluste, weniger Wiederholungen nötig |
| 1−Load(r) — Freie Kapazität | 0,35 (35%) | Durchschnittliche Warteschlangenauslastung der Zwischenknoten (invertiert) | Vermeidet Routing durch überlastete Knoten |
| Batt(r) — Batterie | 0,25 (25%) | Minimaler Batteriestand über alle Knoten im Pfad | Knoten mit niedrigem Akku nicht entleeren; sie könnten solar sein und Reserven brauchen |
Dies ist eine kritische Designentscheidung. System 5 wählt nicht immer die beste Route. Es wählt Routen probabilistisch, proportional zu ihrem Gewicht:
Beispiel: Wenn Route 1 Gewicht 0,8 und Route 2 Gewicht 0,4 hat:
Das hält sekundäre Routen „warm" — gelegentlich fließt Verkehr durch sie, sodass das Netzwerk weiß, dass sie noch funktionieren. Wenn Route 1 ausfällt, ist Route 2 sofort mit aktuellen Qualitätsdaten verfügbar.
Die Nachricht wird entlang des gewählten Pfades gesendet, ein Hop nach dem anderen:
Verbindungen mit Qualität > 0,5 bekommen 3 Wiederholungen (werden wahrscheinlich schnell erfolgreich). Verbindungen mit Qualität ≤ 0,5 bekommen 5 Wiederholungen (brauchen mehr Versuche). Das balanciert Zustellwahrscheinlichkeit gegen Sendezeit-Kosten.
Wenn die Warteschlange eines Zwischenknotens sich füllt, wendet System 5 graduellen Gegendruck an:
| Warteschlangenlast | Aktion |
|---|---|
| < 80% | Normaler Betrieb — Routengewicht unverändert |
| 80–95% | Routengewicht bestraft (× 0,8–0,95) — Verkehr verlagert sich auf Alternativen |
| > 95% | Route vollständig blockiert — kein neuer Verkehr durch diesen Knoten |
Das verhindert kaskadierende Überlastung: Wenn ein Knoten beginnt, überlastet zu werden, verteilt sich der Verkehr natürlich auf andere Pfade, bevor der Knoten Pakete verwirft.
Nicht alle Nachrichten sind gleich. System 5 verwendet einen Network Health Score (NHS) pro Cluster, um niedrig priorisierten Verkehr zu drosseln, wenn das Netzwerk belastet ist.
NHS ist ein Wert von 0,0 bis 1,0, der den Gesundheitszustand des Clusters repräsentiert, basierend auf:
| NHS-Bereich | Netzwerkzustand | Erlaubte Prioritäten | Beispiel |
|---|---|---|---|
| 0,8 – 1,0 | Gesund | Alle (0–7) | Alles kommt durch |
| 0,6 – 0,8 | Mäßig | Nur 0–5 | Niedrig priorisierte Telemetrie gedrosselt |
| 0,4 – 0,6 | Verschlechtert | Nur 0–3 | Nur wichtige Nachrichten |
| 0,2 – 0,4 | Kritisch | Nur 0–1 | Nur Notfall/SOS |
| < 0,2 | Zusammengebrochen | Nur 0 | Nur SOS-Nachrichten |
Priorität 0 = SOS/Notfall — kommt immer durch, unabhängig vom Netzwerkzustand. Das stellt sicher, dass in einem Katastrophenszenario kritische Nachrichten niemals durch routinemäßige Telemetrie blockiert werden.
Wenn alle 5 gecachten Routen versagen (nach Wiederholungen auf jeder einzelnen), gibt System 5 nicht auf. Es fällt zurück auf begrenztes Cluster-Flooding — eine gezielte Mini-Flut entlang des Korridors zwischen Quelle und Ziel.
Das ist dramatisch günstiger als netzwerkweites Flooding. In einem 500-Knoten-Netzwerk mit 10 Clustern betrifft ein vollständiges Flooding alle 500 Knoten. Ein begrenztes Korridor-Flooding betrifft ~100 Knoten (2 vollständige Cluster + Border Nodes).
Wenn das Korridor-Flooding häufig ausgelöst wird (wie im Bay Area Half-Duplex-Szenario), kann es dennoch hohe TX-Zahlen erzeugen. Dies ist das wichtigste Optimierungsziel: mehr alternative gerichtete Routen versuchen, bevor das Korridor-Flooding ausgelöst wird.
Netzwerke ändern sich ständig: Knoten bewegen sich, Batterien entleeren sich, Verbindungen verschlechtern sich. System 5 wartet sich durch mehrere Mechanismen selbst:
Inspiriert von der Ameisenkolonie-Optimierung: Alle 30 Sekunden klingen alle gecachten Routenqualitäten um 5% ab:
Routen, die tatsächlich genutzt werden, erhalten ihre Qualität aktualisiert aus realen Verbindungsmessungen. Routen, die nie genutzt werden, verblassen allmählich auf null und werden schließlich ersetzt. Das stellt sicher, dass die Routing-Tabelle immer die aktuellen Netzwerkbedingungen widerspiegelt, nicht veraltete historische Daten.
Nach jedem Nachrichtenzustellungsversuch:
Wenn ein Knoten einen neuen Nachbarn entdeckt, aber seine Tabelle voll ist (16 Einträge), wird der Nachbar mit der niedrigsten Verbindungsqualität verdrängt. Das stellt sicher, dass die Routing-Tabelle immer die besten verfügbaren Verbindungen enthält.
Anders als Meshtastics festes 3–7 Hop-Limit verwendet System 5 ein dynamisches Limit, das mit der Netzwerkgröße skaliert:
Für ein 100-Knoten-Netzwerk: max_hops = √100 × 3 = 30. Für ein 1000-Knoten-Netzwerk: max_hops = 40 (gedeckelt). Das ermöglicht Nachrichten, große Netzwerke zu durchqueren, ohne künstliche Grenzen, und verhindert gleichzeitig Endlosschleifen.
Dies ist die wichtigste reale Beschränkung, die Simulatoren typischerweise ignorieren. LoRa-Funkmodule sind Half-Duplex: Ein Knoten kann nicht senden, während er empfängt.
Betrachten wir einen Berggipfel-Router auf 600m Höhe, der 100 Knoten hören kann. Wenn eine Nachricht durch das Netzwerk flutet:
Ergebnis: 5% tatsächliche Nutzung wird zu 50% Kanalauslastung am Berggipfel, und Nachrichten schaffen es nicht über den ersten Hop hinaus.
Mit gerichtetem Routing empfängt der Berggipfel-Knoten ein gezieltes Paket (nicht 14 gleichzeitige Weitersendungen). Er verarbeitet es, wartet auf ein freies TX-Fenster und leitet an den nächsten Hop weiter. Die Funk-Zustandsmaschine ist einfach:
Wir haben eine Bay Area-artige Simulation mit 235 Knoten in 3 Höhenstufen und Half-Duplex-Funkmodellierung erstellt. Die Ergebnisse bestätigen die realen Beobachtungen:
| Szenario | Router | Zustellung | Gesamt-TX |
|---|---|---|---|
| Bay Area ohne Half-Duplex | Managed Flood | 87,5% | 908.785 |
| System 5 | 80,5% | 47.094 | |
| Bay Area mit Half-Duplex | Managed Flood | 6,0% | 6.752 |
| System 5 | 77,5% | 540.780 |
Half-Duplex lässt Flooding von 87,5% → 6% Zustellung zusammenbrechen. System 5 hält bei 77,5%. Probiere das Bay Area-Szenario im Live-Simulator →
Reale Mesh-Geräte haben enge Speichergrenzen. Der nRF52840 (verwendet im RAK4631 Solar-Router) hat 256KB RAM, mit ~64KB verfügbar nach BLE- und LoRa-Stacks.
| Struktur | Größe | Anzahl | Gesamt |
|---|---|---|---|
| Nachbareintrag | ~80 Bytes | max. 16 | 1.280 Bytes |
| Routeneintrag (pro Ziel) | ~410 Bytes | 5 Routen × N Ziele | variabel |
| Cluster-Metadaten | ~100 Bytes | 8 Cluster | 800 Bytes |
| Eigener Knotenzustand | ~100 Bytes | 1 | 100 Bytes |
| Netzwerkgröße | Verfolgte Ziele | Routing-Speicher | Passt auf nRF52? |
|---|---|---|---|
| 20 Knoten (lokal) | 20 | ~10 KB | Ja |
| 100 Knoten (Stadt) | 100 | ~43 KB | Ja (knapp) |
| 500 Knoten (regional) | ~70 (Cluster-Sicht) | ~30 KB | Ja |
| 1000 Knoten | ~70 (Cluster-Sicht) | ~30 KB | Ja |
| 10.000 Knoten | ~200 (Cluster + Grenzen) | ~84 KB | Braucht reduzierte Parameter |
Die Kernidee: Geo-Clustering bedeutet, dass ein Knoten nur seinen eigenen Cluster + Grenzrouten verfolgt. Ein 10.000-Knoten-Netzwerk bedeutet nicht 10.000 Routeneinträge — es bedeutet ~200 Einträge (eigene Cluster-Mitglieder + Border Nodes zu benachbarten Clustern).
Für speicherbeschränkte Geräte können diese Firmware-Konstanten reduziert werden:
S5_MAX_ROUTES: 5 → 2 (spart 60% Speicher)S5_MAX_PATH_LEN: 15 → 8 (reduziert Routengröße um 47%)Basierend auf Feedback von Bay Area Mesh-Betreibern haben wir eine Simulation erstellt, die die tatsächliche Netzwerkstruktur modelliert:
| Stufe | Knoten | Höhe | Reichweite | Gelände | Rolle |
|---|---|---|---|---|---|
| Berg | 7 (3%) | 600–1200m | 45km | Freiraum | Backbone-Router (Mt Diablo, Mt Tam, etc.) |
| Hügel/Dach | 35 (15%) | 150–500m | 10km | Vorstadt | Brücke zwischen Berg und Tal |
| Tal/Innenraum | 193 (82%) | 0–100m | 0,75–2,5km | Urban/Innen | Endnutzer-Handgeräte und Indoor-Knoten |
Probiere dieses Szenario im Live-Simulator → — wähle „Bay Area Mesh (235 nodes, 3-tier elevation)" aus dem Dropdown.
Lies die vollständige Q&A mit der Bay Area Mesh-Community →
Eines der wirkungsvollsten v2.0-Features, inspiriert durch Feedback der Bay Area Mesh-Community. Die Kernerkenntnis: In einem 235-Knoten-Netzwerk sind die meisten Talknoten redundant — ihre Nachbarn können alle über andere Pfade erreicht werden. Jedes Mal, wenn diese redundanten Knoten weitersenden, fügen sie Kollisionsrauschen an Berggipfel-Empfängern hinzu, ohne zur Nachrichtenzustellung beizutragen.
silence_priority = redundancy × 0.6 + (1 - battery) × 0.4. Knoten mit niedrigem Akkustand werden zuerst stummgeschaltet. Solarknoten (immer 100%) bleiben am längsten aktiv.| Aktion | Stummgeschalteter Knoten | Aktiver Knoten |
|---|---|---|
| OGMs empfangen | Ja — bleibt über das Netzwerk informiert | Ja |
| Direkte Nachrichten empfangen | Ja — kann adressiert werden | Ja |
| Eigene Nachrichten senden | Ja — kann initiieren | Ja |
| Flooding weitersenden | Nein — bleibt still | Ja |
| OGMs senden | Nein — spart Sendezeit | Ja |
| Gerichtete S5-Pakete weiterleiten | Ja — wenn auf dem berechneten Pfad | Ja |
Dieselben Knoten können nicht für immer stummgeschaltet sein — ihre Batterien würden länger halten, aber die aktiven Knoten würden schneller entladen. System 5 rotiert die stille Gruppe alle 10 Minuten:
Ergebnis: Jeder Knoten verbringt ungefähr gleich viel Zeit aktiv und still. Der Batterieverbrauch wird gleichmäßig über das Netzwerk verteilt.
| Bay Area-Szenario | S5-Zustellung | S5-TX | Stummgeschaltete Knoten |
|---|---|---|---|
| Ohne Node Silencing | 77,5% | 540.780 | 0 |
| Mit Node Silencing | 74,5% | 267.927 | 134 (57%) |
| 128 Talknoten stummgeschaltet, 6 Hügelknoten stummgeschaltet, 0 Bergknoten stummgeschaltet | |||
Wenn alle 5 gecachten Routen versagen (jeder Hop wurde mit Wiederholungen versucht), löste das ursprüngliche System 5 sofort begrenztes Korridor-Flooding aus. Das war teuer — im Bay Area-Szenario lösten 73 von 200 Nachrichten Fallback-Floods aus.
Die v2.0-Verbesserung fügt einen weiteren Schritt vor dem Flooding hinzu:
failed_nodes-Menge sammelnDas ist günstig (eine BFS-Berechnung, keine zusätzlichen TX außer der Pfad funktioniert) und oft erfolgreich, weil die gescheiterten Knoten das eigentliche Problem waren — der Rest des Netzwerks hat möglicherweise einwandfreie Pfade.
Multi-Pfad-Routing kann Nachrichten in falscher Reihenfolge zustellen. Wenn Nachrichten A, B, C über drei verschiedene Pfade mit unterschiedlichen Latenzen gesendet werden, könnte der Empfänger C, B, A sehen — oder schlimmer, C, A (B auf einem gescheiterten Pfad verloren).
Das v2.0-Übertragungsprotokoll fügt einen 2-Byte-Sequenzzähler (uint16_t seq) pro (Quelle, Ziel)-Paar hinzu:
seq für jede Nachricht an ein bestimmtes ZielErneutes Senden erfordert einen ACK + Wiederholungs-Zyklus. Bei LoRa benötigt jedes Paket 500ms–2s Sendezeit. Eine 5-Hop-Wiederholung kostet 5–10 Sekunden Kanalzeit — während derer der Berggipfel für allen anderen Verkehr blockiert ist. Sequenznummern bieten Lückenerkennung bei null TX-Kosten (nur 2 zusätzliche Bytes im Header). Die Anwendungsschicht kann entscheiden, ob eine Wiederholung angefordert wird oder einfach „1 Nachricht fehlt" angezeigt wird.
Die Sequenzzähler werden effizient in der Firmware gespeichert: Nachbar-indiziertes Array für bekannte Nachbarn (32 Bytes) + LRU-Cache für andere (96 Bytes) = insgesamt 128 Bytes, unabhängig von der Netzwerkgröße.
Jedes System 5-Paket hat einen 22-Byte-Header:
| Offset | Feld | Größe | Beschreibung |
|---|---|---|---|
| 0 | Version | 1 Byte | Protokollversion (aktuell 0x01) |
| 1 | Typ | 1 Byte | DATA (0x01), OGM (0x02), ACK (0x03), CLUSTER_ANNOUNCE (0x04) |
| 2 | Quell-ID | 4 Bytes | Ursprungsknoten-ID |
| 6 | Ziel-ID | 4 Bytes | Zielknoten-ID (0xFFFFFFFF = Broadcast) |
| 10 | Paket-ID | 4 Bytes | Eindeutig pro Paket (zur Deduplizierung) |
| 14 | Hop-Zähler | 1 Byte | Aktueller Hop-Zähler (wird bei jedem Hop erhöht) |
| 15 | Max Hops | 1 Byte | TTL — dynamisch, basierend auf √n × 3 |
| 16 | Priorität | 1 Byte | QoS-Priorität (0 = SOS, 7 = niedrigste) |
| 17 | Flags | 1 Byte | Fallback-Bit, Route-Request-Bit, etc. |
| 18 | Nutzlastlänge | 2 Bytes | Nutzlastgröße in Bytes |
| 20 | Prüfsumme | 2 Bytes | CRC-16 von Header + Nutzlast |
| 22+ | Nutzlast | variabel | Anwendungsdaten (max. ~230 Bytes für LoRa) |
| Eigenschaft | Naives Flooding | Managed Flooding | Next-Hop | System 5 |
|---|---|---|---|---|
| TX-Kosten pro Nachricht | O(n) | O(n) × 0,5 | O(Hops)* | O(Hops) |
| Funktioniert für Broadcasts | Ja | Ja | Nein | Ja |
| Hop-Limit nötig | Ja (3–7) | Ja (3–7) | Teilweise | Nein (dynamisch) |
| Multi-Pfad-Failover | Nein | Nein | Nein | 5 Routen |
| Lastverteilung | Nein | Nein | Nein | Gewichtet |
| Stau-Vermeidung | Nein | Nein | Nein | Backpressure |
| QoS-Priorität | Nein | Nein | Nein | 8 Stufen + NHS-Gate |
| Half-Duplex-resistent | Nein | Nein | Teilweise | Ja |
| GPS erforderlich | Nein | Nein | Nein | Ja** |
| Speicher-Overhead | Minimal | Minimal | Gering | Moderat (~8–30KB) |
* Next-Hop funktioniert nur für Direktnachrichten nach einem lernenden Flood. Die erste Nachricht flutet trotzdem.
** GPS erforderlich für Clustering, aber RSSI-Triangulation und Cluster-Übernahme bieten Fallbacks.