Hoe Tally werkt

Tally is een open netwerk dat de radioberichten van vliegtuigen verzamelt, ontvangen door ontvangers bij mensen thuis, en er posities van maakt die iedereen kan gebruiken. Deze pagina legt het hele ontwerp uit zonder voorkennis.

Drie woorden

  • Feeder: een ontvanger die doorgeeft wat hij hoort. Het is een radio-ontvanger bij iemand thuis met een klein programma dat elk bericht het exacte tijdstip van aankomst meegeeft, het ondertekent en doorstuurt.
  • Relay: het programma dat verzamelt wat feeders sturen, posities berekent en die deelt met andere relays. Elke taak in het netwerk is die van een relay, en iedereen mag er een draaien.
  • Client: alles wat Tally-data leest, zoals een website, een app of een kaart. Een client deelt nooit. Zijn toegang is ofwel de gratis kleine laag, ofwel het tegoed van de relay waaraan hij gekoppeld is: een bedrijf dat de volledige datastroom wil, draait een relay, en zijn clients lezen op het tegoed van die relay. Een client leest van een relay: van zijn eigen relay als hij de firehose wil (vaak draait hetzelfde bedrijf beide), of van een openbaar relay voor klein gebruik.

De onderdelen

Feeders sturen hun berichten naar relays. Relays doen al het werk: ze verzamelen, berekenen posities en geven data aan elkaar door. Clients lezen bij relays. Er is geen speciale server en geen centrale beheerder, want elke relay is hetzelfde programma.

FeedersRelaysClients
Feeders sturen hun berichten naar relays, relays delen met elkaar, en clients lezen bij relays.

Waar de data heen gaat

Een feeder stuurt zijn data naar de twee dichtstbijzijnde gezonde relays, op verschillende netwerken, zodat één storing of één oneerlijke relay hem niet het zwijgen kan opleggen. Dichtstbij wordt gemeten aan hoe lang een bericht erover doet om terug te komen, en dat kan niemand vervalsen.

Ruwe berichten blijven dicht bij huis: ze gaan hooguit één stap, naar de relays die hetzelfde gebied dekken, en die relays berekenen de posities van het gebied. Alleen kant-en-klare posities gaan de wereld rond, zo blijft de bandbreedte voor iedereen klein.

Eén gebiedRuwPositiesFeedersRelayRelayDe wereld
Binnen één gebied stuurt elke feeder ruwe berichten naar twee nabije relays. De posities die zij berekenen verlaten het gebied, de wereld in.

Vliegtuigen die niet zeggen waar ze zijn

De meeste vliegtuigen zenden hun eigen gps-positie uit. Sommige niet, maar ze antwoorden de radar nog steeds met korte pings. Als meerdere feeders dezelfde ping horen, komt die bij elk op een iets ander moment aan, omdat elk op een andere afstand staat. Elk tijdsverschil legt het vliegtuig ergens op een kromme, en waar de krommen elkaar snijden, is het vliegtuig. Dit heet multilateratie, kortweg MLAT, en het is het werk van een relay.

Zelfde tijdsverschilPingFeeder
Eén ping bereikt vier feeders op net iets andere momenten. Elk tijdsverschil tussen twee feeders tekent een kromme, en de krommen snijden elkaar waar het vliegtuig is.

Daarvoor moeten de klokken van feeders tot op een miljoenste seconde overeenkomen, en ontvangers thuis doen dat niet. Dus corrigeren relays elke klok met vliegtuigen die wel gps uitzenden: hun positie is bekend, dus is ook bekend wanneer hun bericht zou moeten aankomen, en het verschil is de fout van die klok.

Elk antwoord komt met eerlijke foutmarges: hoe ver het ernaast kan zitten, inclusief wat de klokcorrecties onzeker laten.

Klokken worden samen gecorrigeerd, in vaste groepen die tegels heten. De wereld is verdeeld in een vast raster van gebieden in vier formaten, ongeveer 50, 100, 200 en 400 km breed, en elke tegel neemt tot 48 nabije feeders op, alleen gekozen op basis van waar de feeders staan. Elk vliegtuig boven een gebied gebruikt de correctie van zijn tegel, dus het werk gebeurt één keer per gebied, niet één keer per vliegtuig. Elke relay berekent dezelfde tegels, zodat de resultaten controleerbaar blijven.

TegelVliegtuigVliegtuig
Feeders zijn gegroepeerd in vaste tegels die elkaar overlappen. Beide vliegtuigen boven de gemarkeerde tegel gebruiken de ene klokcorrectie van die tegel.

Elke relay berekent uit dezelfde data hetzelfde antwoord, tot op de laatste bit. Daardoor voegen antwoorden van verschillende relays zich zonder conflict samen, en kan iedereen bewijzen dat een relay ernaast zit als die een slecht antwoord publiceert.

Snel en definitief

Een positie goed controleren kost tijd, omdat een relay wacht tot de berichten van alle feeders binnen zijn. Daarom krijgt elk MLAT-vliegtuig twee antwoorden. Eerst een snel antwoord, ongeveer 1 tot 2 seconden na de ping, berekend met de nieuwste doorgetrokken klokcorrectie en met ruimere foutmarges. Daarna de gecontroleerde definitieve positie, die het vervangt. Clients kiezen zelf of ze snelle posities ontvangen.

In de cockpit telt het snelle antwoord: met 150 knopen legt een vliegtuig in 12 seconden een halve mijl af.

Twee producten

  • Regionaal: alles voor één gebied, ruwe berichten inbegrepen. Voor onderzoekers, lokale apps en de relays die het gebied dekken.
  • Wereld: één positie per vliegtuig per seconde, overal. Voor flighttrackers en bedrijven die het hele beeld willen.

Delen zoals BitTorrent

De data van een gebied bereikt eerst een paar relays die hem willen, en elk daarvan geeft hem door aan een paar andere. De relays met de feeders van een gebied sturen vast twee of drie kopieën, hoe populair het gebied ook is, zodat een druk gebied hun rekening nooit verhoogt.

Bron
De bron stuurt drie kopieën, en elke relay die er een ontvangt geeft die door aan twee andere.

Een gebied nemen is een plicht: elke stream wordt in strepen verdeeld, elke relay die het gebied neemt stuurt zijn eigen deel door naar een paar andere, en een relay die niet doorstuurt wordt uit het gebied verwijderd.

Gebieden vormen een boom

De wereld is verdeeld in een vaste boom van gebieden waar iedereen het over eens is: kleine gebieden liggen in regio's, regio's in landen, landen in continenten en continenten in de wereld. Niemand deelt hem uit; het is voor iedereen hetzelfde vaste raster.

Een relay neemt de gebieden die hij wil, op elk niveau: een regionale website neemt zijn regio, een nationale app zijn land, een wereldwijd bedrijf de wereld. Op welk niveau een relay ook werkt, hij deelt op dat niveau en stuurt de data van dat gebied door naar anderen die hem willen.

De wereldContinentContinentLandLandLandRegioRegioRegioRelaysClients
Gebieden liggen in grotere gebieden. Een relay op elk niveau verzamelt het niveau eronder tot een bundel en geeft die naar boven door, en clients lezen op het niveau dat ze nodig hebben.

Een relay die alle gebieden onder een groter gebied heeft verzameld, kan dat grotere aanbieden als één bundel. Zo verbindt een relay voor de hele wereld met een handvol bundels van continenten of landen, niet met elk klein gebied. Elk niveau wordt door meerdere relays aangeboden, dus als er een uitvalt, gaat er niets verloren.

Gebundelde data behoudt de handtekening van elke oorspronkelijke relay, dus een bundel vraagt geen extra vertrouwen: hij wordt precies zo gecontroleerd als zijn gebieden.

Eerlijk gebruik

Klein gebruik is gratis: een client kan posities voor een gebied lezen met alleen een verbinding. Grootschalig gebruik, dus ruwe data of posities voor grote regio's, verdient een relay die echt bijdraagt, door feeders te ontvangen of verse data te uploaden, en de clients die aan die relay gekoppeld zijn lezen op zijn tegoed. Een client deelt nooit, dus wie de meeste data wil, draait een relay en voegt capaciteit toe aan het netwerk.

Elke relay draait met een verplichte maximale uploadsnelheid, zodat de rekening nooit hoger kan worden dan dat maximum toelaat en geen beheerder voor verrassingen komt te staan.

Wat feeders terugkrijgen

Elke feeder heeft een openbare stationspagina met zijn uptime, berichtsnelheden, gehoorde vliegtuigen, bereik, de dekking die alleen hij levert, hoeveel hij MLAT helpt, en zijn plek in de ranglijsten.

Station zoeken

Alles wordt berekend uit openbare, ondertekende data, zodat iedereen het kan controleren.

Vertrouwen

  • Alles is ondertekend. Elke feeder heeft een eigen sleutel, en een relay kan de berichten van een feeder niet wijzigen of verzinnen, alleen niet doorgeven.
  • Antwoorden zijn reproduceerbaar. Iedereen met dezelfde ruwe data kan een positie opnieuw berekenen en krijgt precies hetzelfde resultaat.
  • Valsspelen is te bewijzen. Twee ondertekende antwoorden uit dezelfde invoer die elkaar tegenspreken, bewijzen een fout, en iedereen kan stoppen met die relay te gebruiken.
  • Feeders bouwen aanzien op. Een feeder wiens berichten steeds overeenkomen met die van alle anderen, krijgt na verloop van tijd meer gewicht.