MeshSky Docs

Protocol

The MeshSky wire format — message types, signing, framing, and version negotiation.

The MeshSky protocol is a versioned, length-framed, signed message stream spoken over QUIC (preferred) or TLS+TCP. It’s designed to be small, append-only, and trivial to implement in any language.

Goals

  • Small: a typical observation record is < 64 bytes on the wire.
  • Signed: every record carries an Ed25519 signature from its origin feeder.
  • Composable: messages stack into batches; batches stack into gossip frames.
  • Forward-compatible: unknown fields are ignored; protocol version is negotiated at handshake.

Handshake

client → server   HELLO { proto: "meshsky/1", node_id, capabilities }
server → client   HELLO { proto: "meshsky/1", node_id, accept }
client → server   AUTH  { sig(server_nonce) }
server → client   READY

The handshake establishes:

  • Protocol version (semver, with meshsky/1 as the current major).
  • The peer’s long-lived node identity (an Ed25519 public key).
  • Negotiated capabilities (compression, batching, MLAT participation, …).

Message types

CodeNameDirectionPurpose
0x01OBSERVATIONfeeder→hubA signed reception event from a feeder.
0x02BATCHany→anyA vector of OBSERVATION records.
0x03GOSSIP_FRAMEhub↔hubA fan-out unit on the AirBridge mesh.
0x10MLAT_REQUESThub→feedersSolicit raw timing for a target hex.
0x11MLAT_SOLUTIONhub→hubA signed MLAT position solution.
0x20REPUTATIONtower→towerA signed reputation rollup.
0x30RFC_VOTEtower↔towerA governance signal for active RFCs.

Observation record

field         type        size   notes
icao24        u24         3      aircraft 24-bit address
ts_ns         u64         8      receiver-local nanoseconds
freq_band     u8          1      0=1090ES, 1=978UAT, …
payload_len   u8          1      bytes
payload       bytes       N      raw radio frame
feeder_id     pubkey      32     Ed25519 public key
sig           sig         64     Ed25519 signature over the above

Signing

All signed messages use Ed25519 over the SHA-256 hash of the canonical serialization. Reference implementations vendor libsodium. Verification is mandatory at every hop; unsigned or invalid messages MUST be dropped.

Framing

Frames are length-prefixed:

[ varint length ][ msg_type u8 ][ body ... ]

A GOSSIP_FRAME packs many OBSERVATIONs, optionally compressed with Zstandard, and carries its own signature from the originating AirBridge.

Versioning

The protocol uses semantic versioning at the major level (meshsky/1, meshsky/2, …). Within a major version:

  • New message types may be added; old types are never repurposed.
  • New fields use TLV extensions; unknown TLVs are skipped.
  • Breaking changes require a new major version and an RFC (see Governance).