| Internet-Draft | Aether Protocol | July 2026 |
| Fomicheva | Expires 28 January 2027 | [Page] |
This document specifies Aether, a transport-layer protocol (L4) designed for modern network environments requiring multiplexed streams without head-of-line blocking, mandatory encryption with post-quantum resistance, multi-path routing, and self-sovereign identity at the protocol layer. Aether operates entirely in userspace without kernel modifications.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 28 January 2027.¶
Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document.¶
Transport-layer protocols have evolved slowly. TCP [RFC9293] provides reliable, ordered delivery but suffers from head-of-line blocking and requires separate TLS for encryption. UDP [RFC768] is lightweight but unreliable. QUIC [RFC9000] addresses many of TCP's shortcomings but is tightly coupled to HTTP/3.¶
Aether is a general-purpose L4 transport protocol designed for:¶
| Principle | Application in Aether |
|---|---|
| Simple core | Fixed 16-byte base header; features via extensions |
| Security non-optional | AEAD encryption from first packet; no plaintext mode |
| Versioning | First packet declares version and capabilities |
| Self-describing | Protocol metadata embedded in handshake |
| Userspace-first | No OS kernel modifications required |
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Ver | Type |H|E|R| Stream ID | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Offset (32 bits) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Length (32 bits) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Connection ID (32 bits, short header) | | or Destination Connection ID (long header) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Field | Bits | Description |
|---|---|---|
| Ver | 4 | Protocol version. Starts at 0. |
| Type | 6 | Packet type (see Section 2.3) |
| H | 1 | 0 = Short header, 1 = Long header |
| E | 1 | Extensions present |
| R | 2 | Reserved (MUST be 0) |
| Stream ID | 18 | Stream identifier (0..262143) |
| Offset | 32 | Byte offset in stream |
| Length | 32 | Payload length (bytes) |
| Cnx ID | 32/64 | Short: 32-bit truncated CID. Long: 64-bit full Dest CID. |
Long header adds 8 additional bytes after the base header containing the Source Connection ID (64 bits). Total: Long Header = 24 bytes, Short Header = 16 bytes.¶
| Code | Name | Purpose | Header |
|---|---|---|---|
| 0x00 | Initial | First packet, ClientHello | Long |
| 0x01 | Handshake | Crypto handshake | Long |
| 0x02 | Data | User stream data | Short |
| 0x03 | Ack | Packet acknowledgement | Short |
| 0x04 | Close | Connection close + code | Short |
| 0x05 | Ping | Keep-alive | Short |
| 0x06 | PathChallenge | Validate new path | Short |
| 0x07 | PathResponse | Confirm path | Short |
| 0x08 | StreamOpen | Open new stream | Short |
| 0x09 | StreamClose | Close stream (FIN) | Short |
| 0x0A-0x3F | Reserved | For future use | - |
When bit E is set, a TLV extension chain follows the header. Chain terminates with Ext Type 0x00.¶
| Code | Name | Description |
|---|---|---|
| 0x01 | Timestamp | Sender timestamp (64-bit, microseconds) |
| 0x02 | Priority | Stream priority (8 bits) |
| 0x03 | Padding | Anti-traffic-analysis padding |
| 0x04 | PathId | Multi-path identifier |
| 0x05 | FlowControl | Window update |
The handshake completes in 1-RTT:¶
Client Server | | |--- Initial (ClientHello) ------------>| | | |<-- Initial (ServerHello) -------------| | | |--- Handshake (ClientFinished) ------->| Client can now send Data | | |<-- Handshake (ServerFinished) --------| Server can now send Data | | |<======= Data (Encrypted) ===========>|
CBOR-encoded, inside AEAD-encrypted Initial packet payload. Contains: protocol version (0), 64-bit random client CID, supported version list, crypto parameters (Kyber768 + X25519, AES-256-GCM, SHA-256), capabilities (multipath, max_streams, max_stream_data, ack_frequency, idle_timeout_ms), and an Ed25519 identity public key.¶
CBOR-encoded response containing: echoed client CID, server CID, Kyber768 ciphertext, X25519 ephemeral public key, server capabilities, and server Ed25519 identity with proof (signature of transcript).¶
After ClientHello and ServerHello exchange:¶
shared_secret = Kyber768.Decapsulate(kem_ciphertext)
|| X25519.DH(client_ephemeral, server_classical_pk)
transcript = ClientHello || ServerHello
session_key = HKDF-Expand(
HKDF-Extract("AETHER-v0", shared_secret),
transcript,
256 bits
)
client_tx_key = HKDF-Expand(session_key, "client-tx", key_len)
server_tx_key = HKDF-Expand(session_key, "server-tx", key_len)
ClientFinished and ServerFinished carry HMAC-SHA256(session_key, transcript). Symmetric keys are destroyed after 3x PTO following connection close, providing Perfect Forward Secrecy.¶
Each stream identified by 18-bit Stream ID (0..262143). Stream ID 0 reserved for control. Client opens streams with EVEN IDs; server with ODD IDs. Streams are independent: loss in one stream does not block others.¶
Stream lifecycle: IDLE -> (StreamOpen) -> OPEN -> (StreamClose FIN) -> HALF-CLOSED -> (StreamClose ACK) -> CLOSED.¶
Flow control operates at two levels: Connection-level (total in-flight data) and Stream-level (in-flight data per stream). Initial windows: Stream = 1 MiB, Connection = 16 MiB. Each Data packet carries an Offset (byte position). Receivers send Ack frames with received offset ranges. Unacknowledged packets are retransmitted with exponential back-off up to MAX_RETRANSMISSIONS (10).¶
Connections are identified by Connection ID, not IP address. This enables path migration:¶
Each path has a unique Path ID (Extension Type 0x04). Packets from different paths are multiplexed onto common streams; the receiver reassembles by Offset. When one path is lost, data automatically flows through remaining paths without connection interruption.¶
The default congestion control algorithm is Aether-CC, a hybrid of BBRv3 [BBR] and NewReno [RFC6582], optimized for high-latency satellite links, variable-bandwidth mobile networks, and noisy channels (distinguishing loss from congestion).¶
Bandwidth estimation: delivery_rate = bytes_acked / time_delta; max_bw = max(max_bw, delivery_rate). RTT estimation: min_rtt = min(min_rtt, latest_rtt) over 10-second window. Congestion window: cwnd = max_bw * min_rtt * gain (gain: 1.25 during probing, 0.75 during drain).¶
Loss classification: loss with low RTT and rising delivery_rate indicates congestion; loss with high RTT and stable delivery_rate indicates channel noise (window not reduced). Pluggable algorithms: "aether-cc" (default), "bbrv3", "cubic", "none" (testing).¶
Aether has no plaintext mode. All packets are encrypted: Initial packets with AEAD key derived from initial salt, Handshake packets with AEAD keys derived from shared_secret, Data packets with AEAD session_key.¶
The handshake uses Kyber-768 [FIPS203] as primary KEM with X25519 [RFC7748] as classical fallback, providing post-quantum resistance as long as at least one algorithm remains secure.¶
Metadata protection: Connection ID in short header is a 32-bit truncated value; Padding extension (0x03) allows random bytes for packet size obfuscation; Multipath data streams complicate passive traffic analysis.¶
Each connection generates ephemeral keys. Compromise of an identity key does not reveal past sessions (Perfect Forward Secrecy).¶
Aether introduces cryptographic identity at the transport layer. Each node has an Ed25519 [RFC8032] key pair. Identity is: identity = SHA-256("AETHER-ID-" || Ed25519_public_key). During handshake, the node proves key ownership by signing the transcript.¶
Advantages: DNS/CA/PKI independent (self-sovereign identity), IP mobility (IP changes do not affect identity), decentralized (no central registry required), W3C DID compatible (identity representable as a DID).¶
Graceful close: Sender -> Close (NO_ERROR), Receiver -> Close (NO_ERROR). Keys destroyed after 3x PTO.¶
| Code | Name | Description |
|---|---|---|
| 0x00 | NO_ERROR | Normal closure |
| 0x01 | INTERNAL_ERROR | Internal error |
| 0x02 | PROTOCOL_VIOLATION | Protocol violation |
| 0x03 | CRYPTO_ERROR | Cryptographic error |
| 0x04 | FLOW_CONTROL_ERROR | Flow control limit exceeded |
| 0x05 | TIMEOUT | Idle timeout |
| 0x06 | VERSION_NEGOTIATION | Incompatible version |
| 0x07 | REFUSED | Connection refused |
| 0x08 | IDENTITY_REJECTED | Identity not accepted |
Local discovery (LAN): Multicast group 224.0.0.251:9000 (IPv4), ff02::fb:9000 (IPv6). Periodic announcements every 30 seconds. Announcement format: Initial packet with type "Announce" in extensions.¶
Global discovery (WAN): Kademlia-based DHT (as in libp2p). DHT key = peer identity. DHT value = set of (IP, port, Connection ID) tuples. Enables peer location by identity without a centralized server.¶
| Constant | Value | Description |
|---|---|---|
| AETHER_DEFAULT_PORT | 9000 | Default port |
| AETHER_VERSION | 0 | Current protocol version |
| MAX_PACKET_SIZE | 1400 | Max packet size (MTU safe) |
| MAX_STREAM_ID | 262143 | Max Stream ID (18 bits) |
| IDLE_TIMEOUT_MS | 30000 | Connection idle timeout (ms) |
| PTO_BASE_MS | 100 | Base Probe Timeout (ms) |
| MAX_RETRANSMISSIONS | 10 | Max retransmit attempts |
| INITIAL_CWND | 10 * MSS | Initial congestion window |
| INITIAL_STREAM_WINDOW | 1048576 | Initial stream window (bytes) |
| INITIAL_CONNECTION_WINDOW | 16777216 | Initial connection window (bytes) |
| Feature | TCP | UDP | QUIC | SCTP | Aether |
|---|---|---|---|---|---|
| Reliable | Yes | No | Yes | Yes | Yes |
| Multiplexing | No | No | Yes* | Yes | Yes |
| Encryption | No** | No | Yes | No** | Yes |
| Multi-path | No | No | v2 | Yes | Yes |
| Userspace | No | Yes | Yes | No | Yes |
| Identity layer | No | No | No | No | Yes |
| PQC-ready | No | No | WIP | No | Yes |
| NAT friendly | Yes | No | Yes | No | Yes |
| HOL blocking | Yes | No | Per stream | No | No |
* HTTP-tied. ** Requires separate TLS/DTLS layer.¶
This document requires no IANA actions. Future revisions may request a well-known port assignment for port 9000.¶
A reference implementation of Aether Protocol v0.1 is available in the Rust programming language at https://github.com/nikaafo/aether-protocol.¶
Components:¶
License: MIT OR Apache-2.0.¶