Relay betreiben

Ein Relay nimmt Feeder, Abonnenten und andere Relays auf einem Port an. Es prüft die Signatur jedes Batches, verwirft Duplikate und gibt jeden Batch einmal unverändert weiter. Es dekodiert nichts und entscheidet nichts über Flugzeuge.

So startest du eins

tally-relay keygen > /etc/tally/relay.key
tally-relay --key /etc/tally/relay.key --max-upload 8Mbit/s --listen 0.0.0.0:10900 --beast-out 127.0.0.1:30105

--beast-out stellt jeden Empfang als reines BEAST für einen lokalen Decoder wie readsb bereit. Es gibt keine Authentifizierung, also binde es an Loopback.

--stats-listen stellt als JSON bereit, was das Relay über jeden Empfänger weiß (GET /stations und GET /stations/KEY mit dem Schlüssel als base64url): Sitzungen, erstes und letztes Auftreten, Batches, Sequenzlücken, Nachrichten pro Sekunde sowie Standort und Software, die jeder Empfänger angibt. Binde auch das an Loopback.

Als Dienst: Die Unit tally-relay.service aus dem Release startet ein Relay als dynamischen Benutzer, mit dem Schlüssel in /etc/tally/relay.key, den Argumenten in TALLY_RELAY_ARGS und der Upload-Obergrenze in TALLY_RELAY_MAX_UPLOAD, beide in /etc/default/tally-relay.

Wem es vertraut

Ein Relay vertraut standardmäßig nur eng begrenzt. Nur Schlüssel, die du mit --accept-relay nennst, dürfen sich als weiteres Relay verbinden, und --upstream hängt es an ein anderes Relay. Jeder Feeder ist auf --max-feeder-bytes-per-sec begrenzt, standardmäßig 256 KiB/s und dem Feeder vorab mitgeteilt, und Verbindungen sind insgesamt und pro Adresse begrenzt.

Was es bereitstellt

Ein Abonnent wählt seine Streams und kann sie jederzeit ändern:

  • Roh: die signierten Batches jedes Empfängers, nach Region, für das MLAT der Relays und für Forschung. Eine Region ist der Ort, an dem der Empfänger nach eigener Angabe steht, nie der Ort eines Flugzeugs.
  • Dedupliziert: eine Kopie jeder Mode-S-Nachricht, vom Relay als eigene Aussage signiert. Das ist der Stream, den die meisten Clients wollen, etwa 30 Mbit/s für die ganze Welt bei 20.000 Empfängern.
  • Positionen: Flugzeuge, die das MLAT der Relays geortet hat, jeweils signiert von dem Relay, das sie berechnet hat.

Wie Relays die Arbeit teilen

Ein Feeder schickt an die zwei nächsten funktionierenden Relays in verschiedenen Netzen. Am nächsten heißt: innerhalb eines Bands von Umlaufzeiten, und innerhalb dieses Bands trifft jeder Feeder eines Gebiets dieselbe Wahl, gewichtet nach der freien Kapazität, die jedes Relay angibt, sodass sich die Feeder eines Gebiets auf denselben wenigen Relays sammeln. Ein volles Relay leitet einen neuen Feeder an das nächste in der Reihe weiter.

Das MLAT eines Gebiets erledigen zwei oder drei Relays, ausgewählt nach derselben Art gemeinsamer Regel unter den Relays, die MLAT-Kapazität anbieten. Die anderen Relays mit Feedern des Gebiets geben dessen Rohdaten einen Schritt weit an sie weiter, so gehen Rohdaten nie weit.

Daten verbreiten sich nach Gebiet, wie bei BitTorrent. Die Relays mit den Feedern eines Gebiets schicken fest zwei oder drei Kopien, egal wie viele sie wollen. Jeder Stream wird in Streifen geteilt, und jedes Relay, das das Gebiet übernimmt, gibt seinen eigenen Teil an einige andere weiter: Diesen Teil weiterzugeben ist die Pflicht, die mit dem Gebiet kommt.

Gebiete bilden einen festen Baum, von kleinen Gebieten über Regionen, Länder und Kontinente bis zur Welt. Ein Relay übernimmt Gebiete auf der Ebene, die es braucht, und teilt auf dieser Ebene, und sobald es alle Gebiete unter einem größeren gesammelt hat, kann es das größere als ein einziges Bündel anbieten.

So funktioniert der Baum der Gebiete

Ein langsamer Abonnent wird getrennt, auf ihn wird nie gewartet. Daten anzunehmen kostet ein Relay nichts außer seinem Server; was es ausliefert, wird abgerechnet, deshalb legt jedes Relay mit --max-upload eine Upload-Obergrenze fest, und seine Rechnung kann nie mehr betragen als die Obergrenze mal die Sekunden eines Monats: 10 Mbit/s sind höchstens etwa 3,3 TB. Die Obergrenze ist nie aufgebraucht. Wird mehr verlangt, als sie trägt, geht Steuerverkehr zuerst, dann Positionen und Uhrenmodelle, dann Rohdaten an andere Relays, und einfache Abonnenten zuletzt. Ein neuer Feeder wird abgewiesen, solange die Obergrenze nicht tragen kann, was das Relay für ihn weiterleiten müsste, und einfache Abonnenten werden vor jedem Relay getrennt, die größten zuerst. Was ein Relay bei gängigen Hostern kostet, steht in der README unter „What a relay costs“.

Die Regel für den Produktivbetrieb

Wenn du auf die Daten von Tally angewiesen bist, lies sie über ein Relay, das du selbst betreibst, nicht über das eines anderen. Ein anderer Betreiber kann dann nur die Feeder beeinträchtigen, die er trägt, und jeder Feeder veröffentlicht an zwei Relays in verschiedenen Netzen.