Framing defines how raw byte streams are structured into discrete MOSH frames.
Responsibilities include:
Start-of-frame detection (SOF) Field layout and byte ordering Payload length encoding CRC calculation and validation Frame boundary recovery in noisy streams
Framing ensures that receivers can:
Synchronize to incoming data streams Validate structural integrity before processing Recover from partial or corrupted transmissions
This layer is strictly deterministic and must be bit-for-bit compatible across all implementations.
A MOSH frame is a maximum 1470 bytes. Depending on the transport, frames can/will be segmented if the frames length is longer than the transport maximum.
All MOSH packets follow this structure:
| Header (13 Bytes) |
| Payload (1,456 Bytes max) |
| Footer (CRC16) (2 Bytes) |
Note: All multi-byte fields are serialized little-endian.
| Field | Length (Bytes) | Description |
|---|---|---|
| Start of Frame | 1 | Fixed marker for frame synchronization |
| TTL | 1 | Time-to-live (decremented on forwarding) |
| Message ID | 2 | Unique ID per message (for ACK/retry/dedupe) |
| Version + Flags | 1 | Upper 4 bits = protocol version, lower 4 bits = flags |
| Source Address | 2 | 6-bit Network ID + 10-bit Node ID |
| Destination Address | 2 | 6-bit Network ID + 10-bit Node ID |
| Context | 2 | 3-bit Domain, 5-bit Operations Code, 8-bit Context ID |
| Payload Length | 2 | Length of payload in bytes |
| Field | Size (Bytes) | Description |
|---|---|---|
| CRC16 | 2 | Frame integrity check |
Protocol version (0–15).
| Bit | Name | Description |
|---|---|---|
| 0x00 | NONE | No flags are set |
| 0x01 | ACK_REQUIRED | Sender requests acknowledgment |
| 0x02 | ACK | Frame is an acknowledgment |
| 0x04 | IS_RETRY | Frame is a retransmission |
| 0x08 | IS_FRAGMENT | Frame is part of a fragment |
Each address field is 16 bits: [ Network ID (6 bits) | Node ID (10 bits) ]
The Context byte determines which manager processes the payload.
| Domain | Context | Description |
|---|---|---|
| 0x00 | Core/system messages (discovery, sync, error) | |
| 0x01 | Node-level (hardware) operations | |
| 0x02 | Element-level operations | |
| 0x03 | Virtual wire messaging | |
| 0x04 | Transport-level operations | |
| 0x05 | Routing messages | |
| 0x06 | RESERVED1 | |
| 0x07 | RESERVED2 |
The Context ID byte is the ID of the element or virtual wire being targeted.
The payload format will vary based on the various message types.
The transport layer does not interpret payload contents.
16-bit error detection code generated per frame