<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE rfc [
<!ENTITY RFC2119 SYSTEM "https://www.rfc-editor.org/info/rfc2119">
<!ENTITY RFC8174 SYSTEM "https://www.rfc-editor.org/info/rfc8174">
]>
<!-- name="GENERATOR" content="github.com/mmarkdown/mmark Mmark Markdown Processor - mmark.miek.nl" -->
<rfc version="3" ipr="trust200902" docName="draft-collette-sinip-transport-00" submissionType="IETF" category="exp" xml:lang="en" xmlns:xi="http://www.w3.org/2001/XInclude" indexInclude="true">

<front>
<title abbrev="SIN/IP Transport">SIN/IP: Secure In-Network Transport Protocol over IP</title><seriesInfo value="draft-collette-sinip-transport-00" stream="IETF" status="experimental" name="Internet-Draft"></seriesInfo>
<author initials="R." surname="Collette" fullname="Rick Collette"><organization>VextCODE</organization><address><postal><street></street>
</postal><email>rcollet@gmail.com</email>
</address></author><date year="2026" month="February" day="13"/>
<area>Transport</area>
<workgroup></workgroup>
<keyword>transport</keyword>
<keyword>security</keyword>
<keyword>multiplexing</keyword>
<keyword>encryption</keyword>

<abstract>
<t>SIN/IP is a secure, multiplexed transport protocol designed for kernel residency and incremental deployment. It provides authenticated encryption (AEAD), multiplexed streams over a single connection to avoid head-of-line blocking, connection IDs for NAT rebinding and path migration, and pluggable congestion control and pacing. SIN/IP can run as a native IP protocol in controlled networks or be encapsulated in UDP for Internet deployment. This document specifies the wire format, packet and frame layout, connection establishment, packet protection, loss recovery, flow control, congestion control, path management, and connection termination. It also defines IANA registries for SIN/IP parameters and codepoints.</t>
</abstract>

<note><name>Status of This Memo</name>
<t>This document is not an Internet Standards Track specification; it is published for examination, experimental implementation, and evaluation.</t>
<t>This document defines an Experimental Protocol for the Internet community. This is a contribution to the RFC Series, independently of any other RFC stream. The RFC Editor has chosen to publish this document at its discretion and makes no statement about its value for implementation or deployment. Documents approved for publication by the RFC Editor are not candidates for any level of Internet Standard; see Section 2 of RFC 7841.</t>
<t>Information about the current status of this document, any errata, and how to provide feedback on it may be obtained at <eref target="https://www.rfc-editor.org/info/rfcXXXX">https://www.rfc-editor.org/info/rfcXXXX</eref>.</t>
</note>

<note><name>Copyright Notice</name>
<t>Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved.</t>
<t>This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (<eref target="https://trustee.ietf.org/license-info">https://trustee.ietf.org/license-info</eref>) 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.</t>
</note>

<note><name>Table of Contents</name>
<t>{:toc}</t>
</note>

</front>

<middle>

<section anchor="introduction"><name>Introduction</name>
<t>SIN/IP (Secure In-Network over IP) is a transport protocol that provides confidentiality, integrity, multiplexed streams, and connection identity decoupled from the network path. It is designed to run in the kernel for consistent policy, zero-copy integration, and congestion control, while remaining deployable on the public Internet via UDP encapsulation.</t>
</section>

<section anchor="goals"><name>Goals</name>

<ul spacing="compact">
<li><strong>Secure by default:</strong> All post-handshake data is protected with an AEAD. Key exchange uses X25519; keys are derived with HKDF. Replay is prevented by authenticating packet numbers and optional token binding.</li>
<li><strong>Multi-stream within one connection:</strong> Multiple streams share one connection; each stream has its own offset space and reassembly. Loss on one stream does not block delivery on others (no head-of-line blocking).</li>
<li><strong>Pluggable congestion control and pacing:</strong> The design exposes hooks for CC modules (e.g., CUBIC, BBR) and pacing; ACK ranges feed loss detection and RTT estimation.</li>
<li><strong>NAT rebinding support:</strong> Connection IDs decouple the logical connection from the 4-tuple; path validation (PATH_CHALLENGE / PATH_RESPONSE) confirms reachability before migrating traffic.</li>
<li><strong>Kernel residency:</strong> The transport is intended to run in the kernel to enable zero-copy, stable socket API, policy enforcement, and observability.</li>
</ul>
</section>

<section anchor="non-goals"><name>Non-Goals</name>

<ul spacing="compact">
<li><strong>Replacing TLS for application security semantics:</strong> SIN/IP provides transport-layer encryption and optional server authentication (e.g., Ed25519 signature over the handshake). Application-level certificate verification and TLS-specific features remain the responsibility of the application or an optional TLS layer above SIN/IP.</li>
<li><strong>Full Internet deployability without encapsulation:</strong> A new IP protocol number is often blocked or altered by middleboxes. SIN/IP specifies UDP encapsulation as the primary deployable mode for Internet use; native IP protocol is for controlled networks only.</li>
<li><strong>Perfect compatibility with every existing socket behavior:</strong> The API is designed to be familiar (stream, seqpacket, datagram) but may not mirror every legacy TCP or UDP quirk.</li>
</ul>
</section>

<section anchor="rationale"><name>Rationale and Design Principles</name>
<t>Modern applications need low-latency connection setup, multiple logical streams without head-of-line blocking, mobility across NATs, and encryption by default. TCP plus TLS adds RTTs and does not multiplex; QUIC meets many of these goals but is typically implemented in userland, which complicates kernel policy, zero-copy, and observability. SIN/IP targets environments where kernel control and transport evolution matter: datacenters, enterprise edges, and embedded or gateway deployments.</t>
<t>Design principles include: (1) authenticate and encrypt all post-handshake traffic; (2) use a single, well-defined wire format for interoperability; (3) resist ossification via GREASE and &quot;MUST ignore unknown&quot; rules; (4) limit amplification and state allocation until the client is validated; (5) support both native IP and UDP encapsulation with the same wire format.</t>
</section>

<section anchor="overview"><name>Protocol Overview (One-Page Summary)</name>
<t>A <strong>connection</strong> is identified by connection IDs (dcid, scid) and carries one or more <strong>streams</strong>. Each <strong>packet</strong> has a fixed 32-byte header and a payload of <strong>frames</strong>. <strong>Packet numbers (PN)</strong> are per space (Initial, Handshake, 1-RTT) and drive ACKs and nonce derivation.</t>
<t><strong>Lifecycle:</strong> The client sends an INITIAL packet (type 0) with its X25519 public key and connection ID. The server may respond with RETRY (type 5) and a token for stateless retry; the client resends INITIAL with the token. The server responds with SIN_ACK (type 1) with its public key. Both derive the shared secret via X25519 and HKDF. The client sends CONFIRM (type 2); once both have sent and received 1-RTT packets (type 3), the connection is ESTABLISHED. Data transfer uses 1-RTT packets carrying STREAM, ACK, PING, and other frames. Teardown uses CONNECTION_CLOSE or FIN; STATELESS_RST (type 6) allows the server to reject unknown connections without state.</t>
<t><strong>Deployment:</strong> In <strong>native</strong> mode, SIN/IP is carried directly in IP (IPv4 or IPv6) with a dedicated protocol number. In <strong>UDP-encapsulated</strong> mode, each SIN/IP packet is sent inside a UDP datagram. UDP encapsulation is the primary deployable mode for Internet use; implementations intended for general Internet use MUST support it.</t>
</section>

<section anchor="conventions-and-definitions"><name>Conventions and Definitions</name>

<section anchor="req-language"><name>Requirements Language</name>
<t>The key words &quot;MUST&quot;, &quot;MUST NOT&quot;, &quot;REQUIRED&quot;, &quot;SHALL&quot;, &quot;SHALL NOT&quot;, &quot;SHOULD&quot;, &quot;SHOULD NOT&quot;, &quot;RECOMMENDED&quot;, &quot;NOT RECOMMENDED&quot;, &quot;MAY&quot;, and &quot;OPTIONAL&quot; in this document are to be interpreted as described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they appear in all capitals, as shown here.</t>
</section>

<section anchor="terminology"><name>Terminology</name>

<ul spacing="compact">
<li><strong>Connection:</strong> The long-lived association between two endpoints, keyed by connection IDs.</li>
<li><strong>Stream:</strong> A unidirectional or bidirectional logical channel within a connection, with its own offset space for data.</li>
<li><strong>Frame:</strong> A typed unit inside the protected payload (STREAM, ACK, PING, PATH_CHALLENGE, etc.).</li>
<li><strong>Packet:</strong> A unit of transmission consisting of a fixed 32-byte header plus payload (frames) and, when encrypted, a 16-byte AEAD tag.</li>
<li><strong>Packet number (PN):</strong> A monotonically increasing value per packet number space, used for acknowledgments, loss detection, and nonce derivation.</li>
<li><strong>Connection ID (CID):</strong> An opaque identifier used for demultiplexing. The receiver uses the <strong>destination CID (dcid)</strong> to identify the connection; the <strong>source CID (scid)</strong> identifies the sender.</li>
<li><strong>Endpoint:</strong> Either peer in a SIN/IP connection (client or server).</li>
</ul>
</section>

<section anchor="notation"><name>Notation</name>

<ul spacing="compact">
<li>All multi-byte integer fields in the wire format are <strong>big-endian</strong> unless otherwise specified.</li>
<li>Byte ranges and offsets are 0-based.</li>
<li>&quot;Payload&quot; refers to the protected payload (frames) only; the 16-byte AEAD tag, when present, is not part of the payload length.</li>
</ul>
</section>
</section>

<section anchor="architecture-and-service-model"><name>Architecture and Service Model</name>

<section anchor="connection-model"><name>Connection Model</name>
<t>A SIN/IP connection is identified by connection IDs. The receiver demultiplexes packets by destination connection ID (dcid). The connection persists across path changes (e.g., NAT rebind) as long as the peer can be reached and path validation succeeds. Each connection has distinct packet number spaces (Initial, Handshake, 1-RTT) and keying material per direction.</t>
</section>

<section anchor="streams"><name>Streams and Application Semantics</name>
<t>Streams are identified by a stream ID. Each stream has an independent send offset and receive offset. The protocol ensures ordered delivery within a stream but not across streams. Streams can be full-duplex. The receiver reassembles data by stream_id and offset; loss on one stream does not block delivery on others.</t>
</section>

<section anchor="reliability"><name>Reliability vs Datagram Service (Optional Extension)</name>
<t>The default service is reliable, ordered delivery per stream. Optional extensions (e.g., capability version 1.1) may define partial reliability (deadline-based drop, unordered delivery) with normative semantics when enabled. Such extensions are out of scope for the base wire format and are signaled via transport parameters or capability negotiation.</t>
</section>
</section>

<section anchor="deployment-modes"><name>Deployment Modes</name>

<section anchor="udp-mode"><name>UDP Encapsulation Mode</name>
<t>In UDP encapsulation mode, each SIN/IP packet is sent as the payload of a UDP datagram. This is the <strong>primary deployable mode</strong> for use on the public Internet, because many middleboxes drop or alter non-TCP/UDP traffic. Implementations intended for general Internet use MUST support UDP encapsulation.</t>
<t>The same 32-byte fixed header and frame encoding are used; only the outer delivery (UDP/IP) and PMTU handling differ. Implementations MUST support a conservative default MTU (e.g., 1200 bytes for UDP payload) or process ICMP Packet Too Big when available.</t>
</section>

<section anchor="native-mode"><name>Native IP Protocol Mode</name>
<t>In native mode, SIN/IP is carried directly in IPv4 or IPv6 with a dedicated protocol number (to be assigned by IANA). This mode is for controlled networks (datacenter, enterprise) where the operator controls or trusts middleboxes. The wire format is identical to UDP encapsulation; only the outer layer (IP next header / protocol) differs.</t>
</section>

<section anchor="middlebox"><name>Middlebox Traversal Considerations</name>
<t>Use of a new IP protocol number on the public Internet is NOT RECOMMENDED. SIN/IP specifies UDP encapsulation as the normal mode for Internet deployment. Middleboxes that allow UDP typically allow SIN/IP over UDP; those that block or alter non-TCP/UDP traffic will not affect UDP-encapsulated SIN/IP. NAT rebinding is handled by connection IDs and path validation; no middlebox changes are required.</t>
</section>
</section>

<section anchor="packet-format"><name>Packet Format</name>

<section anchor="packet-structure"><name>Common Packet Structure</name>
<t>Every SIN/IP packet has:</t>

<ol spacing="compact">
<li><strong>Fixed header:</strong> 32 bytes (see {{fixed-header}}).</li>
<li><strong>Payload:</strong> Zero or more bytes. For handshake packets (INITIAL, SIN_ACK, CONFIRM, RETRY), the payload is unencrypted. For 1-RTT and 0-RTT, the payload is encrypted and authenticated.</li>
<li><strong>AEAD tag:</strong> 16 bytes, present only when the payload is encrypted. Immediately follows the payload.</li>
</ol>
<t>The total length of a packet is 32 + payload_len + (16 if encrypted). Implementations MUST reject packets shorter than 32 bytes. If the payload_len field is inconsistent with the actual received length (e.g., extends beyond the packet), the packet MUST be discarded.</t>
</section>

<section anchor="fixed-header"><name>Fixed Header</name>
<t>The fixed header is exactly 32 bytes. All multi-byte fields are big-endian.</t>
<table>
<thead>
<tr>
<th>Offset</th>
<th>Size</th>
<th>Name</th>
<th>Description</th>
</tr>
</thead>

<tbody>
<tr>
<td>0</td>
<td>1</td>
<td>ver_type</td>
<td>High 4 bits: version (see {{version-registry}}). Low 4 bits: packet type (see {{packet-types}}).</td>
</tr>

<tr>
<td>1</td>
<td>1</td>
<td>flags</td>
<td>Header flags (ACK_ELICITING, FIN, KEY_PHASE, etc.). See {{header-flags}}.</td>
</tr>

<tr>
<td>2</td>
<td>1</td>
<td>hlen_words</td>
<td>Header length in 4-octet units. For version 1, this MUST be 8 (32 bytes).</td>
</tr>

<tr>
<td>3</td>
<td>1</td>
<td>reserved</td>
<td>Reserved. Senders MUST set to 0; receivers MUST ignore.</td>
</tr>

<tr>
<td>4</td>
<td>2</td>
<td>epoch</td>
<td>Key phase (handshake, 0-RTT, 1-RTT).</td>
</tr>

<tr>
<td>6</td>
<td>2</td>
<td>payload_len</td>
<td>Length in bytes of the protected payload only (excluding the 16-byte AEAD tag when present).</td>
</tr>

<tr>
<td>8</td>
<td>1</td>
<td>stream_id</td>
<td>Optional default stream for this packet (0 means no default).</td>
</tr>

<tr>
<td>9</td>
<td>1</td>
<td>reserved2</td>
<td>Reserved. Senders MUST set to 0; receivers MUST ignore.</td>
</tr>

<tr>
<td>10</td>
<td>4</td>
<td>pn</td>
<td>Packet number in the space implied by packet type.</td>
</tr>

<tr>
<td>14</td>
<td>8</td>
<td>dcid</td>
<td>Destination connection ID (8 bytes).</td>
</tr>

<tr>
<td>22</td>
<td>8</td>
<td>scid</td>
<td>Source connection ID (8 bytes). May be zero in INITIAL.</td>
</tr>

<tr>
<td>30</td>
<td>2</td>
<td>hdr_ext</td>
<td>Extension / reserved. Senders MAY set to 0; receivers MUST ignore unless specified.</td>
</tr>
</tbody>
</table><t>There is no padding between the header and the payload; the payload immediately follows the header.</t>
</section>

<section anchor="header-semantics"><name>Header Field Semantics</name>

<ul spacing="compact">
<li><strong>ver_type:</strong> The high nibble is the SIN/IP wire version. The low nibble is the packet type. Unknown versions or types MUST cause the packet to be discarded (see {{ossification}}).</li>
<li><strong>payload_len:</strong> Must not exceed the remaining packet length. If payload_len indicates more data than received, the packet MUST be discarded.</li>
<li><strong>pn:</strong> Monotonically increasing within each packet number space. Used for ACKs, loss detection, and nonce derivation (see {{nonce}}).</li>
<li><strong>dcid, scid:</strong> Opaque 8-byte identifiers. The receiver uses dcid to demultiplex to the correct connection.</li>
</ul>
</section>

<section anchor="cids"><name>Connection IDs</name>
<t>Connection IDs are 8 bytes. The <strong>destination connection ID (dcid)</strong> is the identifier of the connection at the receiver; the <strong>source connection ID (scid)</strong> identifies the sender. In an INITIAL packet, scid MAY be zero. The receiver MUST use dcid to look up the connection. CIDs allow the connection to survive address changes (NAT rebind, path migration) because the connection identity is not tied to the 4-tuple.</t>
</section>

<section anchor="pn-spaces"><name>Packet Numbers and Spaces</name>
<t>Packet numbers are maintained in separate spaces: <strong>Initial</strong>, <strong>Handshake</strong>, and <strong>1-RTT</strong> (and optionally <strong>0-RTT</strong>). Each space has its own keys and PNs. Within a space, PN is monotonically increasing. Key update MUST be triggered before PN wrap (e.g., at 2^31 - 1 or by byte/time limits) so that (key, PN) remains unique for the lifetime of the key.</t>
</section>

<section anchor="versioning"><name>Versioning and Extensibility</name>
<t>The wire version (high 4 bits of ver_type) identifies the packet format. Version 1 is defined in this document. Unknown versions MUST be discarded. Reserved and GREASE values (e.g., 0x0F) MUST be handled without fatal error (see {{ossification}}). New wire-incompatible formats require a new version; new optional behaviors may be negotiated via transport parameters or capability version within the same wire version.</t>
</section>

<section anchor="ossification"><name>Ossification Resistance</name>
<t>Implementations MUST ignore <strong>unknown packet types</strong> (ver_type low nibble not in the assigned set): such packets MUST be discarded without failing the connection. Implementations MUST ignore <strong>unknown frame types</strong>: skip the frame using the length field and continue parsing. Implementations MUST ignore <strong>unknown transport parameter IDs</strong> within TRANSPORT_PARAMS. Reserved and GREASE values (e.g., ver_type 0x0F, packet type 15, frame type 255) MUST be handled without causing a fatal error. Receivers MUST NOT treat unknown or reserved values as a reason to abort the connection. This prevents ossification and allows future extensions.</t>
</section>
</section>

<section anchor="frame-format"><name>Frame Format</name>

<section anchor="frame-encoding"><name>Frame Encoding</name>
<t>Frames are encoded as TLV: 1 byte type, 2 bytes length (big-endian), then value. <strong>Frames MUST NOT span packets;</strong> each frame is fully contained in a single packet's payload. If a frame's length field indicates a value that extends beyond the remaining payload, the packet MUST be discarded. <strong>Unknown frame types</strong> MUST be ignored: the implementation skips the frame (using the length field to advance) and continues parsing; unknown frames MUST NOT cause the connection to fail. Reserved and GREASE frame type values MUST be handled the same way.</t>
</section>

<section anchor="frame-registry"><name>Frame Type Registry (Normative Table)</name>
<table>
<thead>
<tr>
<th>Type</th>
<th>Name</th>
<th>Description</th>
</tr>
</thead>

<tbody>
<tr>
<td>0</td>
<td>PADDING</td>
<td>Padding; may be used for alignment or GREASE.</td>
</tr>

<tr>
<td>1</td>
<td>STREAM</td>
<td>Stream data (stream_id, offset, length, data).</td>
</tr>

<tr>
<td>2</td>
<td>STREAM_FIN</td>
<td>Stream data with end-of-stream.</td>
</tr>

<tr>
<td>3</td>
<td>ACK</td>
<td>Acknowledgment with ranges (largest PN, delay, ranges).</td>
</tr>

<tr>
<td>4</td>
<td>PING</td>
<td>Keepalive; ACK-eliciting.</td>
</tr>

<tr>
<td>5</td>
<td>PATH_CHALLENGE</td>
<td>Path validation (8 bytes data).</td>
</tr>

<tr>
<td>6</td>
<td>PATH_RESPONSE</td>
<td>Path validation response (echo 8 bytes).</td>
</tr>

<tr>
<td>7</td>
<td>TRANSPORT_PARAMS</td>
<td>Transport parameter TLV.</td>
</tr>

<tr>
<td>8</td>
<td>NEW_CONNECTION_ID</td>
<td>Issue new connection ID.</td>
</tr>

<tr>
<td>9</td>
<td>RETIRE_CONNECTION_ID</td>
<td>Retire connection ID.</td>
</tr>

<tr>
<td>10</td>
<td>CONNECTION_CLOSE</td>
<td>Close connection with reason code.</td>
</tr>

<tr>
<td>11-254</td>
<td>Reserved</td>
<td>Reserved for future use.</td>
</tr>

<tr>
<td>255</td>
<td>GREASE</td>
<td>Reserved for GREASE.</td>
</tr>
</tbody>
</table><t>Allocation policy for new frame types: Specification Required.</t>
</section>

<section anchor="frame-stream"><name>STREAM</name>
<t>STREAM carries data for a stream. Format: type (1) = 1, length (2), then stream_id (1), offset (8), data length (2), data (variable). The receiver reassembles by stream_id and offset; duplicate data (same stream_id and offset) is deduplicated.</t>
</section>

<section anchor="frame-stream-fin"><name>STREAM_FIN</name>
<t>Same as STREAM with an end-of-stream indication (e.g., a flag or separate type 2). The receiver delivers data in order and then signals end-of-stream to the application.</t>
</section>

<section anchor="frame-ack"><name>ACK</name>
<t>ACK carries the largest received PN, an ACK delay, and a list of (count, first_pn) ranges indicating which packets were received. Format: type (1) = 3, length (2), largest_pn (4), ack_delay (2), num_ranges (1), then for each range: count (2), first_pn (4). This provides SACK-like information for loss recovery.</t>
</section>

<section anchor="frame-ping"><name>PING</name>
<t>Type 4, length 0 (or minimal). ACK-eliciting; used for keepalive or RTT measurement.</t>
</section>

<section anchor="frame-path-challenge"><name>PATH_CHALLENGE</name>
<t>Type 5, length 8, value = 8 random bytes. Sent to validate a new path; the peer echoes the bytes in PATH_RESPONSE.</t>
</section>

<section anchor="frame-path-response"><name>PATH_RESPONSE</name>
<t>Type 6, length 8, value = 8 bytes (echo of PATH_CHALLENGE). Proves the peer received the challenge and holds the connection keys.</t>
</section>

<section anchor="frame-transport-params"><name>TRANSPORT_PARAMS</name>
<t>Type 7. Value is a TLV-encoded set of transport parameters (parameter ID, length, value). Used in handshake for version negotiation, flow control limits, max streams, etc. Unknown parameter IDs MUST be ignored.</t>
</section>

<section anchor="frame-connection-close"><name>CONNECTION_CLOSE</name>
<t>Type 10. Carries a 16-bit reason code (see {{error-codes}}) and optional reason phrase. Signals graceful or error close.</t>
</section>

<section anchor="frame-new-cid"><name>NEW_CONNECTION_ID</name>
<t>Type 8. Issues a new connection ID to the peer for migration or load balancing. Format and semantics are implementation-defined; typically includes sequence number and the new CID.</t>
</section>

<section anchor="frame-retire-cid"><name>RETIRE_CONNECTION_ID</name>
<t>Type 9. Tells the peer to retire a previously issued connection ID.</t>
</section>

<section anchor="frame-grease"><name>Reserved / GREASE Frames</name>
<t>Frame type 255 and reserved types (11-254) MUST be ignored. Senders MAY send PADDING or GREASE for ossification resistance. Receivers MUST NOT treat unknown or reserved frame types as fatal.</t>
</section>
</section>

<section anchor="transport-parameters"><name>Transport Parameters</name>

<section anchor="tp-encoding"><name>Encoding and Negotiation Rules</name>
<t>Transport parameters are carried in TRANSPORT_PARAMS frames (or in the INITIAL/SIN_ACK payload in some implementations). Each parameter has a 16-bit ID, 16-bit length, and value. Parameters are negotiated during the handshake; the server can send its parameters in SIN_ACK, the client in CONFIRM or INITIAL. Unknown parameter IDs MUST be ignored.</t>
</section>

<section anchor="tp-defined"><name>Defined Transport Parameters</name>
<t>At minimum, the following are used for interoperability:</t>

<ul spacing="compact">
<li><strong>Supported versions / capability version:</strong> List or single value indicating supported capability set (e.g., 1.0, 1.1). The selected version is the highest mutually supported.</li>
<li><strong>Max streams:</strong> Maximum number of streams the endpoint will accept.</li>
<li><strong>Initial flow control window:</strong> Initial connection-level and/or stream-level flow control window in bytes.</li>
<li><strong>Idle timeout:</strong> Connection idle timeout in milliseconds.</li>
</ul>
<t>Additional parameters (ECN support, pacing, etc.) may be defined in extension documents. Allocation policy: Specification Required.</t>
</section>

<section anchor="tp-defaults"><name>Defaults and Error Handling</name>
<t>If a required parameter is missing, implementations MAY use a safe default or close the connection with PROTOCOL_VIOLATION. Invalid or out-of-range values SHOULD result in CONNECTION_CLOSE with an appropriate error code.</t>
</section>
</section>

<section anchor="connection-establishment"><name>Connection Establishment</name>

<section anchor="handshake-overview"><name>Handshake Overview</name>
<t>The handshake is 1-RTT: INITIAL -&gt; SIN_ACK -&gt; CONFIRM. Optionally, the server sends RETRY before SIN_ACK to enforce address validation (stateless retry). 0-RTT data may be sent with CONFIRM if the client has a session ticket.</t>
</section>

<section anchor="packet-types"><name>Packet Types</name>
<table>
<thead>
<tr>
<th>Type</th>
<th>Name</th>
<th>Description</th>
</tr>
</thead>

<tbody>
<tr>
<td>0</td>
<td>INITIAL</td>
<td>Client first flight; carries client public key, CID, optional token.</td>
</tr>

<tr>
<td>1</td>
<td>SIN_ACK</td>
<td>Server response; carries server public key, selected version.</td>
</tr>

<tr>
<td>2</td>
<td>CONFIRM</td>
<td>Client confirmation; may carry early 1-RTT or 0-RTT data.</td>
</tr>

<tr>
<td>3</td>
<td>1RTT</td>
<td>Encrypted 1-RTT data (frames only).</td>
</tr>

<tr>
<td>4</td>
<td>0RTT</td>
<td>Encrypted 0-RTT data (with 0-RTT keys).</td>
</tr>

<tr>
<td>5</td>
<td>RETRY</td>
<td>Stateless retry; server sends token, no state allocated.</td>
</tr>

<tr>
<td>6</td>
<td>STATELESS_RST</td>
<td>Stateless reset; server rejects unknown connection.</td>
</tr>

<tr>
<td>7-15</td>
<td>Reserved</td>
<td>Reserved / GREASE.</td>
</tr>
</tbody>
</table></section>

<section anchor="client-state"><name>Client State Machine</name>
<t>CLOSED -&gt; (send INITIAL) -&gt; INITIAL_SENT -&gt; (recv RETRY -&gt; resend INITIAL with token) -&gt; (recv SIN_ACK) -&gt; SIN_ACK_RCVD -&gt; (send CONFIRM) -&gt; (recv 1RTT) -&gt; ESTABLISHED. On timeout or invalid response, transition to CLOSED.</t>
</section>

<section anchor="server-state"><name>Server State Machine</name>
<t>LISTEN -&gt; (recv INITIAL) -&gt; INITIAL_RCVD -&gt; (optional: send RETRY) -&gt; (send SIN_ACK) -&gt; SIN_ACK_SENT -&gt; (recv CONFIRM) -&gt; ESTABLISHED. The server does not allocate full per-connection state until CONFIRM is received (see {{anti-amplification}}).</t>
</section>

<section anchor="stateless-retry"><name>Stateless Retry</name>
<t>The server MAY respond to an INITIAL with RETRY, sending a token. The token MUST be integrity-protected (e.g., HMAC with server secret) and SHOULD bind the client address and expire (e.g., 60 seconds). The client MUST resend INITIAL including the token. The server MUST NOT allocate full connection state until the client has echoed a valid token. This limits state exhaustion and supports anti-amplification.</t>
</section>

<section anchor="zerortt"><name>0-RTT Data</name>
<t>If the server provided a session ticket, the client MAY send 0-RTT data with CONFIRM. The server MUST apply replay protection (e.g., accept 0-RTT only once per ticket or within a time window). Non-idempotent 0-RTT data SHOULD be treated as potentially replayed; the server MAY reject or delay it.</t>
</section>

<section anchor="anti-amplification"><name>Address Validation and Anti-Amplification</name>
<t>Until the client has been validated (e.g., by echoing a RETRY token or completing the handshake), the server MUST NOT send more than <strong>3 times</strong> the number of bytes it has received from that client. That is, for each unvalidated client address, (bytes sent in response) &lt;= 3 * (bytes received from that client). The server allocates full per-connection state only after receiving a valid CONFIRM. Under load, the server MAY reject new INITIALs with RETRY or STATELESS_RST.</t>
</section>
</section>

<section anchor="packet-protection"><name>Packet Protection</name>

<section anchor="crypto-agility"><name>Cryptographic Agility</name>
<t>SIN/IP version 1 uses X25519 for key exchange, HKDF-SHA256 for key derivation, and either XChaCha20-Poly1305 or AES-256-GCM for AEAD. Future versions may define other algorithms via the version or transport parameters.</t>
</section>

<section anchor="key-exchange"><name>Key Exchange</name>
<t>The client sends its X25519 public key (32 bytes) in the INITIAL payload; the server sends its X25519 public key (32 bytes) in SIN_ACK. Both compute the 32-byte ECDH shared secret. Optional server authentication: the server may include an Ed25519 signature over (client_pubkey || server_pubkey); the client MUST verify it when server identity is required.</t>
</section>

<section anchor="key-schedule"><name>Key Schedule</name>
<t>The shared secret is input to HKDF-SHA256. The info string (e.g., &quot;SINIPv1 Key Material&quot;) and output length (e.g., 56 bytes) yield: 32-byte session key, 12-byte client send IV, 12-byte server send IV. The initiator uses client IV for sending and server IV for receiving; the responder does the opposite.</t>
</section>

<section anchor="nonce"><name>Nonce Construction</name>
<t>The nonce is 12 bytes: <strong>nonce = IV XOR (0x00000000 || PN)</strong> where PN is 32 bits big-endian in the low four bytes. This ensures a unique nonce per (key, PN). PN spaces are separate, so keys differ per space; key update MUST occur before PN wrap.</t>
</section>

<section anchor="aead"><name>AEAD and Associated Data</name>
<t>The AEAD authenticated data (AD) is the entire 32-byte header. The plaintext is the payload (frames); the ciphertext and 16-byte tag replace the plaintext on the wire. Tampering with the header causes verification to fail.</t>
</section>

<section anchor="key-update"><name>Key Update and Epoch Handling</name>
<t>Rekeying can be triggered by bytes encrypted, time, or packet number window. The KEY_PHASE bit in the header indicates the phase. New keys are derived from the existing key or a new handshake. The endpoint MUST trigger key update before PN wrap in a space.</t>
</section>

<section anchor="replay"><name>Replay Protection</name>
<t>Each packet uses a distinct nonce; replay of a ciphertext is detected (same PN under same key). For 0-RTT, the server MUST apply replay protection (e.g., one-time use per ticket or time window).</t>
</section>
</section>

<section anchor="reliability-and-loss-recovery"><name>Reliability and Loss Recovery</name>

<section anchor="ack-generation"><name>ACK Generation</name>
<t>The receiver SHOULD send an ACK for every ACK-eliciting packet. It MAY coalesce ACKs within a short delay (e.g., max ack_delay). ACK frames carry the largest received PN and ranges; ACK delay can be included for RTT estimation.</t>
</section>

<section anchor="retransmit"><name>Retransmission and PTO</name>
<t>Lost data is retransmitted in <strong>new</strong> packets with new packet numbers. The sender declares a packet lost when it has been outstanding for at least the PTO (RTO) or when a reorder threshold (e.g., 3 later packets acked) is met. RTO is computed using an RFC 6298-style algorithm: SRTT, RTTVAR, RTO = SRTT + 4*RTTVAR, clamped to 1-60 seconds. Implementations MUST use a single normative algorithm for a given capability version.</t>
</section>

<section anchor="reorder"><name>Reordering, Duplicate Detection, and Thresholds</name>
<t>The receiver deduplicates by (stream_id, offset) for STREAM data. The sender deduplicates ACKs by packet number. A reorder threshold (e.g., 3 packets) avoids declaring loss too early when packets are reordered. The reorder window (in packets or time) MUST be defined to minimize spurious retransmits.</t>
</section>
</section>

<section anchor="flow-control"><name>Flow Control</name>

<section anchor="fc-conn"><name>Connection-Level Flow Control</name>
<t>The receiver advertises a connection-level flow control window (total bytes in flight across all streams). The sender MUST NOT send beyond this window. Window updates are sent via transport parameters or dedicated frames.</t>
</section>

<section anchor="fc-stream"><name>Stream-Level Flow Control</name>
<t>Each stream has an advertised receive window. The sender MUST NOT send stream data beyond the stream's window. When the advertised window is zero, the sender MUST send periodic probes (e.g., PING or minimal STREAM) at most every T seconds (e.g., 5) so the receiver can send a window update.</t>
</section>

<section anchor="stream-limits"><name>Stream Limits</name>
<t>The maximum number of streams and the maximum stream ID are negotiated via transport parameters. Exceeding the limit results in connection close or stream rejection.</t>
</section>
</section>

<section anchor="congestion-control"><name>Congestion Control</name>

<section anchor="cc-requirements"><name>Requirements</name>
<t>Implementations MUST implement a congestion controller. The algorithm MUST reduce the send rate in response to loss (and to ECN CE when ECN is in use). The default MAY be NewReno-like, CUBIC, or BBR.</t>
</section>

<section anchor="cc-default"><name>Default Congestion Controller</name>
<t>This document does not mandate a single algorithm; implementations choose among standard algorithms (e.g., CUBIC {{?RFC8312}}, BBR). The choice is configurable (e.g., socket option or sysctl).</t>
</section>

<section anchor="pacing"><name>Pacing</name>
<t>Sending MUST be paced according to the congestion controller's allowed rate to avoid bursts. Pacing is a normative requirement for capability versions that specify it (e.g., v1.1).</t>
</section>

<section anchor="plpmtud"><name>PLPMTUD (If Supported)</name>
<t>Over UDP encapsulation, endpoints MUST implement safe MTU handling: process ICMP Packet Too Big and reduce the effective payload size, or use a conservative default (e.g., 1200 bytes). Probe-based PLPMTUD (e.g., RFC 4821) may be added in a future version.</t>
</section>
</section>

<section anchor="path-management-and-mobility"><name>Path Management and Mobility</name>

<section anchor="nat-rebinding"><name>NAT Rebinding</name>
<t>Connection IDs decouple the connection from the 4-tuple. When the client's address changes (e.g., new NAT binding), it continues to use the same dcid/scid so the server can route packets to the correct connection. No change to the wire format is required.</t>
</section>

<section anchor="migration"><name>Connection Migration</name>
<t>Before using a new path for data, the endpoint MUST complete path validation (PATH_CHALLENGE / PATH_RESPONSE). Until validation succeeds, only PATH_CHALLENGE and PATH_RESPONSE frames MAY be sent on the new path. This prevents redirect attacks.</t>
</section>

<section anchor="path-validation"><name>Path Validation Using PATH_CHALLENGE/PATH_RESPONSE</name>
<t>The endpoint sends PATH_CHALLENGE with 8 random bytes. The peer echoes them in PATH_RESPONSE. Only the holder of the connection (with the right keys) can produce a valid response. After validation succeeds, the endpoint may use the new path for 1-RTT data.</t>
</section>
</section>

<section anchor="connection-termination"><name>Connection Termination</name>

<section anchor="graceful-close"><name>Graceful Close</name>
<t>Either endpoint sends a packet with the FIN flag or a CONNECTION_CLOSE frame. The peer acknowledges and may send its own FIN. The connection enters TIME_WAIT (see {{time-wait}}). State machine: ESTABLISHED -&gt; FIN_WAIT_1 -&gt; FIN_WAIT_2 or CLOSING -&gt; TIME_WAIT -&gt; CLOSED.</t>
</section>

<section anchor="stateless-reset"><name>Stateless Reset</name>
<t>The server may send STATELESS_RST (packet type 6) without looking up the connection. The payload is typically an HMAC of the dcid with a server secret, truncated. Only the server can generate a valid reset. The client treats it as connection closed.</t>
</section>

<section anchor="time-wait"><name>TIME_WAIT and Reuse Rules</name>
<t>The endpoint in TIME_WAIT MUST retain state for at least 2*MSL or 30 seconds, whichever is greater. During this time, the same (4-tuple, dcid) MUST NOT be reused for a new connection. This prevents delayed segments from being mistaken for segments of a new connection.</t>
</section>
</section>

<section anchor="middlebox-considerations"><name>Middlebox Considerations</name>
<t>Middleboxes that allow UDP typically allow SIN/IP over UDP. No middlebox changes are required. Use of a new IP protocol number on the public Internet is NOT RECOMMENDED; UDP encapsulation is the primary deployable mode. NAT rebinding is handled by connection IDs and path validation; the 4-tuple may change without breaking the connection.</t>
</section>

<section anchor="implementation-considerations"><name>Implementation Considerations</name>

<section anchor="kernel"><name>Kernel Integration Considerations</name>
<t>When SIN/IP is implemented in the kernel: (1) Session keys and keying material MUST be zeroized when the connection is destroyed or the key phase is retired. (2) Header and frame parsers MUST validate all lengths and bounds before use; invalid or truncated data MUST NOT be dereferenced. (3) Protocol updates may be decoupled from kernel release cadence (e.g., loadable module). (4) The API between kernel and user space MUST NOT expose raw keys or unvalidated packet data; only decrypted, reassembled data and metadata appropriate to the socket abstraction MAY be exposed.</t>
</section>

<section anchor="dos"><name>Resource Limits and DoS Hardening</name>
<t>Implementations SHOULD enforce connection limits, rate limiting per address, and idle timeouts. The amplification limit (Section 8.7) and state allocation rules (state only after CONFIRM) are normative. Under load, the server MAY send RETRY or STATELESS_RST to shed load.</t>
</section>

<section anchor="buffering"><name>Buffering, Reassembly, and Zero-Copy</name>
<t>The receiver reassembles by stream_id and offset. Implementations may use scatter-gather and zero-copy (e.g., sendfile, splice) when the transport is in the kernel; such optimizations are implementation-defined.</t>
</section>
</section>

<section anchor="security-considerations"><name>Security Considerations</name>

<ul spacing="compact">
<li><strong>Confidentiality and integrity:</strong> All post-handshake traffic is protected with an AEAD; the header is authenticated as associated data. Passive and active attackers cannot read or modify payloads without detection.</li>
<li><strong>Replay:</strong> Unique nonces (IV XOR PN) prevent replay. 0-RTT requires server-side replay protection.</li>
<li><strong>Downgrade:</strong> Version and capability are in the wire and transport params; implementations MUST NOT accept unsupported versions or fall back to weaker options.</li>
<li><strong>DoS:</strong> Amplification is limited to 3*; state is allocated only after client validation. Stateless retry and STATELESS_RST allow the server to shed load.</li>
<li><strong>Key material:</strong> Keys MUST be zeroized when no longer needed. Kernel implementations MUST NOT expose keys to user space.</li>
</ul>
</section>

<section anchor="privacy-considerations"><name>Privacy Considerations</name>
<t>SIN/IP does not intentionally expose identifiers beyond what is necessary for demultiplexing (connection IDs). Connection IDs are opaque and may be changed (NEW_CONNECTION_ID / RETIRE_CONNECTION_ID). Packet numbers and timing may leak side-channel information; implementations should consider constant-time crypto and traffic analysis resistance where applicable.</t>
</section>

<section anchor="iana-considerations"><name>IANA Considerations</name>
<t><strong>IP Protocol Number Allocation:</strong> IANA is requested to assign an IP Protocol Number for &quot;SIN/IP&quot; in the &quot;Protocol Numbers&quot; registry, for use as IPv4 Protocol and IPv6 Next Header when SIN/IP is used in native mode. The assignment is for experimental use.</t>
<t><strong>UDP Port Allocation for Encapsulation:</strong> IANA is requested to assign a UDP destination port for SIN/IP encapsulation in the &quot;Service Name and Transport Protocol Port Number&quot; registry. Until assignment, implementations MAY use a configurable port (e.g., for testing). Suggested service name: sinip.</t>
<t><strong>SIN/IP Version Registry:</strong> IANA is requested to create a new registry &quot;SIN/IP Versions&quot; under &quot;SIN/IP Parameters&quot;. Initial allocation:</t>
<table>
<thead>
<tr>
<th>Value</th>
<th>Description</th>
</tr>
</thead>

<tbody>
<tr>
<td>0x0</td>
<td>Invalid / reserved</td>
</tr>

<tr>
<td>0x1</td>
<td>Version 1 (this document)</td>
</tr>

<tr>
<td>0x2-0xE</td>
<td>Unassigned</td>
</tr>

<tr>
<td>0xF</td>
<td>GREASE</td>
</tr>
</tbody>
</table><t>Allocation policy: Specification Required.</t>
<t><strong>SIN/IP Packet Type Registry:</strong> IANA is requested to create &quot;SIN/IP Packet Types&quot; (low 4 bits of ver_type). Initial values: 0=INITIAL, 1=SIN_ACK, 2=CONFIRM, 3=1RTT, 4=0RTT, 5=RETRY, 6=STATELESS_RST. Values 7-14 reserved; 15 GREASE. Allocation policy: Specification Required.</t>
<t><strong>SIN/IP Header Flags Registry:</strong> IANA is requested to create &quot;SIN/IP Header Flags&quot; (8-bit bitmap). Initial: bit 0 = ACK_ELICITING, bit 1 = FIN, bit 2 = KEY_PHASE. Remaining bits reserved. Unknown flags MUST be ignored. Allocation policy: Specification Required.</t>
<t><strong>SIN/IP Frame Type Registry:</strong> IANA is requested to create &quot;SIN/IP Frame Types&quot; (8-bit). Initial values as in the table in Section 6.2. Allocation policy: Specification Required.</t>
<t><strong>SIN/IP Transport Parameter Registry:</strong> IANA is requested to create &quot;SIN/IP Transport Parameters&quot; (16-bit IDs). Allocation policy: Specification Required.</t>
<t><strong>SIN/IP Error Code Registry:</strong> IANA is requested to create &quot;SIN/IP Error Codes&quot; (16-bit). Initial values: 0x0000=NO_ERROR, 0x0001=INTERNAL_ERROR, 0x0002=PROTOCOL_VIOLATION, 0x0003=UNSUPPORTED_VERSION, 0x0004=IDLE_TIMEOUT, 0x0005=INVALID_TOKEN, 0x0006=CONNECTION_REFUSED, 0x0007=RESOURCE_EXHAUSTED, 0x0008=CRYPTO_ERROR. 0x0009-0xFFFF reserved. Allocation policy: Specification Required.</t>
</section>

<section anchor="references"><name>References</name>

<section anchor="normative"><name>Normative References</name>
<t>[RFC2119] Bradner, S., &quot;Key words for use in RFCs to Indicate Requirement Levels&quot;, BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, <eref target="https://www.rfc-editor.org/info/rfc2119">https://www.rfc-editor.org/info/rfc2119</eref>.</t>
<t>[RFC8174] Leiba, B., &quot;Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words&quot;, BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017, <eref target="https://www.rfc-editor.org/info/rfc8174">https://www.rfc-editor.org/info/rfc8174</eref>.</t>
<t>[RFC6298] Paxson, V., et al., &quot;Computing TCP's Retransmission Timer&quot;, RFC 6298, DOI 10.17487/RFC6298, June 2011, <eref target="https://www.rfc-editor.org/info/rfc6298">https://www.rfc-editor.org/info/rfc6298</eref>.</t>
</section>

<section anchor="informative"><name>Informative References</name>
<t>[RFC9000] Iyengar, J., Ed. and M. Thomson, Ed., &quot;QUIC: A UDP-Based Multiplexed and Secure Transport&quot;, RFC 9000, DOI 10.17487/RFC9000, May 2021, <eref target="https://www.rfc-editor.org/info/rfc9000">https://www.rfc-editor.org/info/rfc9000</eref>.</t>
<t>[RFC3168] Ramakrishnan, K., et al., &quot;The Addition of Explicit Congestion Notification (ECN) to IP&quot;, RFC 3168, DOI 10.17487/RFC3168, September 2001, <eref target="https://www.rfc-editor.org/info/rfc3168">https://www.rfc-editor.org/info/rfc3168</eref>.</t>
<t>[RFC4821] Mathis, M. and J. Heffner, &quot;Packetization Layer Path MTU Discovery&quot;, RFC 4821, DOI 10.17487/RFC4821, March 2007, <eref target="https://www.rfc-editor.org/info/rfc4821">https://www.rfc-editor.org/info/rfc4821</eref>.</t>
<t>[RFC8312] Rhee, I., et al., &quot;CUBIC for Fast Long-Distance Networks&quot;, RFC 8312, DOI 10.17487/RFC8312, February 2018, <eref target="https://www.rfc-editor.org/info/rfc8312">https://www.rfc-editor.org/info/rfc8312</eref>.</t>
</section>
</section>

<section anchor="appendix-a-wire-image-examples-hex-field-decode"><name>Appendix A. Wire Image Examples (Hex + Field Decode)</name>
<t>Example: minimal INITIAL packet (32-byte header only; payload and tag omitted for brevity). Header layout per Section 5.2 (big-endian).</t>

<ul spacing="compact">
<li>ver_type = 0x10 (version 1, type INITIAL=0)</li>
<li>flags = 0x00</li>
<li>hlen_words = 8</li>
<li>reserved = 0</li>
<li>epoch = 0x0000</li>
<li>payload_len = 0x0029 (41 bytes: client pubkey 32 + CID 8 + version 1)</li>
<li>stream_id = 0</li>
<li>reserved2 = 0</li>
<li>pn = 0x00000000</li>
<li>dcid = 0x0123456789ABCDEF (example client CID)</li>
<li>scid = 0x0000000000000000 (zero in INITIAL)</li>
<li>hdr_ext = 0x0000</li>
</ul>
<t>Hex (32 bytes): 10 00 08 00 00 00 00 29 00 00 00 00 00 00 01 23 45 67 89 AB CD EF 00 00 00 00 00 00 00 00 00 00</t>
<t>A 1RTT packet carrying encrypted payload would have ver_type = 0x13 (version 1, type 1RTT=3), non-zero pn, and dcid/scid set to receiver/sender CIDs; the payload would contain TLV frames (e.g., type 1 STREAM, length, value) followed by the 16-byte AEAD tag.</t>
</section>

<section anchor="appendix-b-state-machines-full"><name>Appendix B. State Machines (Full)</name>
<t>Handshake (simplified):</t>

<ul spacing="compact">
<li><strong>Client:</strong> CLOSED -&gt; (send INITIAL) -&gt; INITIAL_SENT -&gt; (recv RETRY -&gt; resend INITIAL with token) -&gt; (recv SIN_ACK) -&gt; SIN_ACK_RCVD -&gt; (send CONFIRM) -&gt; (recv 1RTT) -&gt; ESTABLISHED.</li>
<li><strong>Server:</strong> LISTEN -&gt; (recv INITIAL) -&gt; INITIAL_RCVD -&gt; (optional: send RETRY) -&gt; (send SIN_ACK) -&gt; SIN_ACK_SENT -&gt; (recv CONFIRM) -&gt; ESTABLISHED.</li>
</ul>
<t>Connection close and TIME_WAIT (normative): The endpoint that initiates close sends a packet with the FIN flag (or CONNECTION_CLOSE frame) and enters FIN_WAIT_1. When it receives an ACK for the FIN, it enters FIN_WAIT_2 (if it may still receive data) or CLOSING (if both sides have sent FIN). When the peer's FIN is acknowledged, the endpoint enters TIME_WAIT. The TIME_WAIT duration MUST be at least 2*MSL or 30 seconds, whichever is greater; during this time the endpoint MUST NOT allow a new connection to reuse the same (4-tuple, dcid). After TIME_WAIT expires, the connection enters CLOSED.</t>
<t>Connection-close state diagram:</t>

<sourcecode type="text"><![CDATA[ESTABLISHED
     | (application close; send FIN)
     v
FIN_WAIT_1 ----(recv ACK for FIN)----> FIN_WAIT_2 ----(recv FIN; send ACK)----> TIME_WAIT
     |                                                                              |
     | (recv FIN; send ACK for peer FIN)                                            | (after 2*MSL or 30s)
     v                                                                              v
CLOSING ----(recv ACK for our FIN)----> TIME_WAIT ------------------------------> CLOSED
]]></sourcecode>
</section>

<section anchor="appendix-c-test-vectors-crypto"><name>Appendix C. Test Vectors (Crypto)</name>
<t>X25519 key exchange, HKDF key derivation, and AEAD (e.g., ChaCha20-Poly1305 or AES-256-GCM) test vectors for SIN/IP v1 are to be provided in a companion document or a future revision. Implementations should derive keys as specified in Section 9 (Key Schedule): shared secret from X25519 -&gt; HKDF-SHA256 with info &quot;SINIPv1 Key Material&quot; -&gt; 56 bytes (32-byte key, 12-byte client send IV, 12-byte server send IV). Nonce = IV XOR (0x00000000 || PN) with PN in the low 32 bits (big-endian). AEAD authenticated data is the serialized 32-byte header.</t>
</section>

<section anchor="appendix-d-design-notes-non-normative"><name>Appendix D. Design Notes (Non-Normative)</name>
<t>SIN/IP is designed for environments where kernel control and transport evolution matter: datacenters, enterprise edges, and gateway deployments. The same wire format is used for native IP and UDP encapsulation to simplify implementation and testing. Connection IDs and path validation enable mobility without middlebox changes. The Bridge (gateway) component, which terminates SIN/IP and proxies to TCP/UDP, is specified separately and allows incremental deployment toward existing services.</t>
</section>

<section anchor="acknowledgments"><name>Acknowledgments</name>
<t>Thanks to the reviewers and contributors who provided feedback on earlier versions of this document.</t>
</section>

<section anchor="authors-addresses"><name>Authors' Addresses</name>
<t>{: align=&quot;left&quot;}
Rick Collette
VextCODE
Email: rcollet@gmail.com</t>
</section>

<section anchor="building-this-draft"><name>Building This Draft</name>
<t>This draft is written in mmark (RFC-style markdown). To produce the canonical .txt and .html for submission:</t>

<ul spacing="compact">
<li>Install mmark (<eref target="https://github.com/mmarkdown/mmark">https://github.com/mmarkdown/mmark</eref>) and xml2rfc (<eref target="https://pypi.org/project/xml2rfc/">https://pypi.org/project/xml2rfc/</eref>).</li>
<li>Run: <tt>mmark draft-collette-sinip-transport-00.md &gt; draft-collette-sinip-transport-00.xml</tt></li>
<li>Run: <tt>./fix-idnits-xml.sh draft-collette-sinip-transport-00.xml</tt> (adds date, BCP 14 refs, and ENTITY declarations so idnits passes)</li>
<li>Run: <tt>xml2rfc draft-collette-sinip-transport-00.xml --text --html</tt></li>
</ul>
<t>Alternatively, use the IETF draft submission tool (<eref target="https://datatracker.ietf.org/submit/">https://datatracker.ietf.org/submit/</eref>) to upload the .md or .xml and let it generate the .txt output.</t>
</section>

</middle>

<back>
<references>
<name>Normative References (BCP 14)</name>
<reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
<front><title>Key words for use in RFCs to Indicate Requirement Levels</title><author><organization>IETF</organization></author><date year="1997" month="March"/></front>
<seriesInfo name="BCP" value="14"/><seriesInfo name="RFC" value="2119"/>
</reference>
<reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
<front><title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title><author><organization>IETF</organization></author><date year="2017" month="May"/></front>
<seriesInfo name="BCP" value="14"/><seriesInfo name="RFC" value="8174"/>
</reference>
</references>
</back>


</rfc>
