aboutsummaryrefslogtreecommitdiffstats
path: root/docs/design/006-native-protocol.md
Commit message (Collapse)AuthorAgeFilesLines
* Specify the link (012) and make it the default between nodes (011)eunhhu2026-09-291-2/+5
| | | | | | | | | | | | | | | | | | 012 says what goes on the wire, enough for another implementation: the header, the key id, the version and why it is not negotiated on the wire, the static secret, HKDF's salt and infos, the nonce, epochs' chain, the thirteen frames byte by byte, what each side must do, the values that are the spec's and those each side picks, the two words a receiver says (LOST, REFUSED), what an attacker gets, and what is known not to hold. A receiver written from it alone, in Python, links with a pure-serve node through epoch 1 (check.py). 011's last row of its stop table is met: H1-H4 held, every check passes, CPU within 10 % of QUIC at 61 B and 25 % under it from 1 KiB, the share with TCP within 25 %, 3,097 lines of C. Links without connections are now the default between Pure nodes; HTTP stays the boundary to others, and relayed sealed sends stay as they are. 006, 009 and the README say so.
* Redesign 011: no connections, the transport's state as the app's dataeunhhu2026-09-281-2/+3
| | | | | | | | | | | | | | | | | | | | | | | | | The first draft replaced a few of QUIC's layers with what Pure already has, every technique known and the gains constant factors, and it kept the connection. This one removes it. Nodes have keys, links are the app's wiring, paths are a cache of where the last authenticated packet came from, and a link's transport state (key epoch, stored-through number, heard numbers, packet-number reservation) is a row committed atomically with the app's state; memory holds only active links and per-path congestion state. So a restart of either node is invisible to the other (no handshake, nothing lost or doubled), an idle link costs a row on disk rather than process memory, and moving the store moves its links. Forward secrecy comes from key epochs rather than per-connection handshakes; replay protection survives restarts because heard numbers are stored with the events they applied (OSCORE, the closest prior art, needs an Echo round trip there). Hypotheses H1-H4 and a measurement plan against quinn and ngtcp2: memory per idle link at 10k to 1M links, kill -9 under load with 10k active links, moving the store, first contact, and CPU, loss and fairness as guardrails; stop if an idle link is not at least a hundred times cheaper than a QUIC connection, if restarts need handshakes, or if anything is lost or doubled. Beyond it: speculative execution of verified, deterministic modules, for interactions that do not wait.
* Design the Pure transport: stored records sent straight over UDP (011)eunhhu2026-09-281-0/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | Outside feedback 002 asks for a protocol of Pure's own that beats QUIC. Pure's delivery is already stored, numbered, applied once, and sealed per link; QUIC and TCP with TLS own the same things again (retransmission buffers, replay protection, encryption, flow control, acknowledgment). The design takes the end-to-end argument literally: the sending app's store is the retransmission buffer, one packet carries both the packet ACK and the stored-through number, a direct link is sealed once with the nodes' session keys, first contact carries records in its first packet (the receiver's key is wired in advance and applying once makes replays harmless), credits come from what the next save can take, the session is known by its key rather than its addresses, and stored bytes are the bytes on the wire. Loss detection, congestion control and cryptography stay standard (RFC 9002, NewReno then CUBIC, HPKE), plain UDP sockets rather than SOCK_RAW, HTTP stays the boundary to others. Written before any code: the decision (this transport, QUIC with Pure's format, or neither), the open questions, the smallest checks, a measurement plan against quinn, ngtcp2 and the current HTTP delivery (seven workloads, RAM and SD stores, loss and delay from unprivileged namespaces with netem, checked to work on this Pi), and stop criteria: no transport if it is under 30 % of a delivery's CPU; stop below 1.5x the best QUIC per CPU; adopt at 2x with a round trip fewer, a quarter of the memory per idle link, fair to TCP, every correctness and security check passing, and under 5,000 lines.
* Establish native micro runtime checkpointeunhhu2026-09-241-0/+139