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/1as the current major). - The peer’s long-lived node identity (an Ed25519 public key).
- Negotiated capabilities (compression, batching, MLAT participation, …).
Message types
| Code | Name | Direction | Purpose |
|---|---|---|---|
0x01 | OBSERVATION | feeder→hub | A signed reception event from a feeder. |
0x02 | BATCH | any→any | A vector of OBSERVATION records. |
0x03 | GOSSIP_FRAME | hub↔hub | A fan-out unit on the AirBridge mesh. |
0x10 | MLAT_REQUEST | hub→feeders | Solicit raw timing for a target hex. |
0x11 | MLAT_SOLUTION | hub→hub | A signed MLAT position solution. |
0x20 | REPUTATION | tower→tower | A signed reputation rollup. |
0x30 | RFC_VOTE | tower↔tower | A 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).