<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.13 (Ruby 3.0.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-frochet-quicwg-reverso-for-quic-00" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.21.0 -->
  <front>
    <title>Reverso for the QUIC protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-frochet-quicwg-reverso-for-quic-00"/>
    <author fullname="Florentin Rochet">
      <organization>UNamur</organization>
      <address>
        <email>florentin.rochet@unamur.be</email>
      </address>
    </author>
    <date year="2024" month="September" day="16"/>
    <workgroup>QUICWG</workgroup>
    <keyword>internet-draft</keyword>
    <abstract>
      <?line 23?>

<t>This document describes a QUIC extension re-designing the layout of the
QUIC protocol to avoid memory fragmentation at the receiver and allows
implementers seeking a more efficient implementation to have the option
to implement contiguous zero-copy at the receiver. This document
describes the change from QUIC v1 required in packet formats,
variable-length integers and frame formats. Everything else from QUIC
v1 described in <xref target="RFC9000"/> is untouched.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-frochet-quicwg-reverso-for-quic/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/https://github.com/frochet/draft-rochet-reverso-generic"/>.</t>
    </note>
  </front>
  <middle>
    <?line 33?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>QUIC is a general-purpose transport protocol with mandatory encryption
leveraged from a TLS 1.3 key exchange. QUIC is specified in <xref target="RFC9000"/>,
and is the result of several years of efforts from several major
companies, independent individuals and academics. One of the main
benefits of QUIC is to resist ossification thanks to a two-levels
encryption design (header and payload), supporting extensions and
modifications of internal QUIC information to resist friction
from independent lower layers at deployment time.</t>
      <t>However, it is of notoriety that the QUIC design is CPU costly. The root
cause of QUIC's high CPU cost isn't unique, and this document addresses
one of them: a misalignment between QUIC's protocol specification and
encryption usage. Indeed, the QUIC design in <xref target="RFC9000"/> unavoidably
fragments Application Data and forces any implementation to perform at
least a memory copy to provide a contiguous bytestream abstraction to
the upper layer, at the receiver.</t>
      <t>This documents suggests slight changes to the QUIC protocol to offer the
opportunity for implementers to provide a contiguous zero-copy
abstraction at the receiver side, which is otherwise impossible to do
from <xref target="RFC9000"/>'s specifications using atomic interfaces from
crypgraphy backends. We temporally call this extensions QUIC VReverso.
With this extension, frames' content are encoded in reverse ordering and
would be processed from right to left at the receiver, instead of the
usual left to right as in any protocol.</t>
    </section>
    <section anchor="goals">
      <name>Goals</name>
      <t>We aim to change how the QUIC protocol specifies its frames to support
contiguous zero-copy. A few more bytes have also to be added within the
protected short header. Those changes are however engineered with goals
to:</t>
      <ul spacing="normal">
        <li>
          <t>Create minimal work for existing implementation to migrate to this
extension.</t>
        </li>
        <li>
          <t>Does not modify any of the QUIC's transport properties and does not
conflict with the goals of any ongoing work on QUIC extensions (e.g., MPQUIC).</t>
        </li>
        <li>
          <t>Does not impact QUIC's security.</t>
        </li>
        <li>
          <t>Does not modify encryption/decryption implementations such that compatibility
with existing crypto backends are preserved.</t>
        </li>
      </ul>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" 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>
      <?line -18?>

</section>
    <section anchor="Streams">
      <name>Streams</name>
      <t>Stream ID values start at 1. The value 0 is reserved to indicate within
the new short header (see <xref target="Header-Protection"/>) that no stream frame is
packed within the payload.</t>
    </section>
    <section anchor="frame-formats">
      <name>Frame Formats</name>
      <t>Frames' structure written on the wire are altered in this QUIC version
to support backward processing of QUIC packets. With the exception of
the ACK frame, all the other frames are straightforward to adapt from
<xref target="RFC9000"/>. Essentially, on <xref target="RFC9000"/>, each frame begins with a Frame
Type followed by additional type-dependent fields, and are represented
as this:</t>
      <artwork><![CDATA[
Frame {
  Frame Type (i),
  Type-Dependent Fields (..),
}
]]></artwork>
      <t>This representation follows the implicit rule that what we specify from
top to bottom is written and read from left to right on the wire.</t>
      <t>If QUIC VReverso is used, frames are reversed. Type-dependent fields
appear first (from left to right on the wire), and the frame terminates
with the Frame Type. We represent those frames by reversing as well
their representation in specifications:</t>
      <artwork><![CDATA[
Frame {
  Type-Dependent Fields (..),
  Frame Type (i),
}
]]></artwork>
      <t>Of course, within an implementation, the relative order of elements
within Structs or Objects does not matter, and can stay untouched. Only
writing on wire and reading from the wire would be altered.</t>
      <t>The choice of order of Type-Dependent Fields only matter to smooth
transition and adaptation of existing code handling <xref target="RFC9000"/>'s frame
format. Reversing the existing ordering, and not making other changes
within the relative order of elements supports straightforward
adaptation of existing code. For example, in <xref target="RFC9000"/>, the
MAX_STREAM_DATA Frame is defined as:</t>
      <artwork><![CDATA[
MAX_STREAM_DATA Frame {
  Type (i) = 0x11,
  Stream ID (i),
  Maximum Stream Data (i),
}
]]></artwork>
      <t>Which would translate to:</t>
      <artwork><![CDATA[
MAX_STREAM_DATA Frame {
  Maximum Stream Data (i),
  Stream ID (i),
  Type (i) = 0x11,
}
]]></artwork>
      <t>Other frames are altered with the same reversing logic. It includes
reversing internal structures in a given Frame if any, such as the ACK Frame.</t>
      <section anchor="ack-frames-details">
        <name>Ack Frame's details</name>
        <t>The Ack Frame is reversed as well, but requires further changes on the
ACK Range's specification and ECN Counts. The goal is to guarantee no change in
processing logic of a ACK Frame, and minimal change to existing code. We
have for this proposal the ACK Frame reversed:</t>
        <artwork><![CDATA[
ACK Frame {
  [ECN Counts (..)],
  ACK Range (..) ...,
  First ACK Range (i),
  ACK Range Count (i),
  ACK Dealy (i),
  Largest Acknowledged (i),
  Type (i)  = 0x02..0x03,
}
]]></artwork>
        <t>Where the ACK Range contains ranges of packets that are alternately not
acknowledged (Gap) and acknowledged (ACK Range). All other fields are
untouched, only their order on the wire is modifierd.</t>
        <section anchor="reversed-ack-ranges">
          <name>Reversed ACK Ranges</name>
          <t>In <xref target="RFC9000"/>, each ACK Range consists of alternating Gap and ACK Range
Length values <em>in descending packet number order</em> as appearing on the
wire. The ranges in <xref target="RFC9000"/> contain the information in reversed
ordering, starting from the largest acknowledged packets. In this
proposal, to accommodate backward processing of the frame and minimal
algorithmic changes, the ACK Range consists of alternating ACK Range
Length and Gap in <em>ascending packet number order</em>.</t>
          <figure anchor="ack-range-format">
            <name>ACK Ranges</name>
            <artwork><![CDATA[
ACK Range {
  ACK Range Length (i),
  Gap (i),
}
]]></artwork>
          </figure>
          <t>As explained in <xref target="RFC9000"/>, the fields that form each ACK Range are:</t>
          <dl>
            <dt>ACK Range Length:</dt>
            <dd>
              <t>A variable-length integer indicating the number of contiguous acknowledged
packets preceding the largest packet number, as determined by the
last processed Gap.</t>
            </dd>
            <dt>Gap:</dt>
            <dd>
              <t>A variable-length integer indicating the number of contiguous unacknowledged
packets preceding the packet number one lower than the smallest in the
last processed ACK Range.</t>
            </dd>
          </dl>
          <t>Since ACK Range Length and Gap are defined as relative integer; to keep
efficient processing, and unchanged algorithmic compared to <xref target="RFC9000"/>,
each ACK Range describes progressively lower-numbered packets while
being processed backwards. However, on the wire, from left to right,
each ACK Range describes progressively higher-numbered packets.</t>
          <t>Therefore, while processing this information backwards, and given the
largest packet number for the current range, the smallest value is
determined by the following formula (like <xref target="RFC9000"/>):</t>
          <artwork><![CDATA[
   smallest = largest - ack_range
]]></artwork>
          <t>Where the largest value for an ACK Range is determined by cumulatively
subtracting the size of all preceding ACK Range Lengths and Gaps. The
first largest value is obtained with the ACK Frame's Largest
Acknowledged field. Subsequent largest for each Ack Range is then
computed similarly to <xref target="RFC9000"/>:</t>
          <artwork><![CDATA[
   largest = previous_smallest - gap - 2
]]></artwork>
        </section>
        <section anchor="reversed-ecn-counts">
          <name>Reversed ECN Counts</name>
          <t>The ACK frame uses the least significant bit of the type value to
indicate ECN feedback. The ECN Counts order is reversed compared to
<xref target="RFC9000"/> to support minimal change to processing logic in existing
implementations while being processed backwards (i.e., the order of
processed elements stays the same).</t>
          <figure anchor="ecn-count-format">
            <name>ECN Count Format</name>
            <artwork><![CDATA[
ECN Counts {
  ECN-CE Count (i),
  ECT1 Count (i),
  ECT0 Count (i),
}
]]></artwork>
          </figure>
        </section>
      </section>
    </section>
    <section anchor="Packet-Format">
      <name>Packet Formats</name>
      <t>For implementers to take advantage of Reverso, we require to know the
Stream ID of any stream frame within the payload, and the data offset.
These two integers are added in the QUIC short header and protected with
the mask.</t>
      <section anchor="Header-Protection">
        <name>Header Protection</name>
        <t>Header of 1-RTT short header packets is extended to add at most 8 bytes
of information, requiring a 13-bytes mask. Application of the mask
follows the same procedure as specified in <xref target="RFC9001"/>, as a minimum of
16 bytes are currently available from the current header protection
algorithms.</t>
        <artwork><![CDATA[
1-RTT Packet {
  Header Form (1) = 0,
  Fixed Bit (1) = 1,
  Spin Bit (1),
  Reserved Bits (2),         # Protected
  Key Phase (1),             # Protected
  Packet Number Length (2),  # Protected
  Destination Connection ID (0..160),
  Packet Number (8..32),     # Protected
  Stream ID (8..32)          # Protected
  Offset (8..32)             # Protected
  Protected Payload (0..24), # Skipped Part
  Protected Payload (128),   # Sampled Part
  Protected Payload (..),    # Remainder
}
]]></artwork>
        <t>The 1-RTT packets has the following modifications from QUIC v1:</t>
        <ul spacing="normal">
          <li>
            <t>Packet Number: The Packet Number field is 1 to 4 bytes long with the
least significant two bits of the last byte containing the length of the
Stream ID. This length is encoded as an unsigned two-bit integer that is
one less than the length of the Stream ID field in bytes. This is field
is protected using <xref target="RFC9001"/>'s mask up to consume 5 bytes (including
the header's first byte) from the minimum guaranteed 16 bytes in total.</t>
          </li>
          <li>
            <t>Stream ID: The Stream ID field is 1 to 4 bytes long with the least
significant two bits of the last byte containing the length of the
Offset. This is length is encoded as an unsigned two-bit integer that is
one less than the length of the Offset field in bytes. A 1-byte value of
0 for the this field is reserved to indicate that the encrypted payload
does not contain any Stream frame. This field is protected using
<xref target="RFC9001"/>'s mask, up to consume 9 bytes from the minimum guaranteed 16
bytes in total.</t>
          </li>
          <li>
            <t>Offset: The Offset field is 1 to 4 bytes long, and encodes a value
based on the knowledge of the maximum acknowledged offset, similarly to
the Packet Number field encoding a value based on the maximum
acknowledged packet number. On the receiver, the decoding procedure is
similar to decoding packet numbers. This field is protected using
<xref target="RFC9001"/>'s mask, up to consume 13 bytes from the minimum guaranteed
16 bytes in total.</t>
          </li>
        </ul>
      </section>
      <section anchor="frame-ordering">
        <name>Frame ordering</name>
        <t>In Reverso, a Stream Frame, if any, <bcp14>MUST</bcp14> be the first frame within the
payload. The Stream frame can be followed by any number of control
frames up to the packet boundary. Any other Stream frame <bcp14>SHOULD NOT</bcp14> be
added within the same QUIC packet.</t>
      </section>
    </section>
    <section anchor="variable-length-integer-encoding">
      <name>Variable-Length Integer Encoding</name>
      <t>QUIC v1 uses variable-length encoding for non-negative integer values to
encode fewer bytes on the wire than usual host representations. In QUIC
v1 the encoding reserves the two most significant bits of the first
byte, and encode the integer in the remaining bits, in network byte
order. In this version, we encode the length in the two least
significant bits of the last byte to accommodate processing the
information by rewinding the buffer. The remaining bits encode the
integer value in network byte order.</t>
      <table anchor="integer-summary">
        <name>Summary of Integer Encodings with Reverso</name>
        <thead>
          <tr>
            <th align="left">2LSB</th>
            <th align="left">Length</th>
            <th align="left">Usable Bits</th>
            <th align="left">Range</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">00</td>
            <td align="left">1</td>
            <td align="left">6</td>
            <td align="left">0-63</td>
          </tr>
          <tr>
            <td align="left">01</td>
            <td align="left">2</td>
            <td align="left">14</td>
            <td align="left">0-16383</td>
          </tr>
          <tr>
            <td align="left">10</td>
            <td align="left">4</td>
            <td align="left">30</td>
            <td align="left">0-1073741823</td>
          </tr>
          <tr>
            <td align="left">11</td>
            <td align="left">8</td>
            <td align="left">62</td>
            <td align="left">0-4611686018427387903</td>
          </tr>
        </tbody>
      </table>
    </section>
    <section anchor="packing-frames">
      <name>Packing frames</name>
      <t>To take advantage of backward processing of QUIC VReverso packets, some
constraints <bcp14>SHOULD</bcp14> be respected. The order and number of data chunks
within a single encryption matters. The Stream frame if any <bcp14>MUST</bcp14> be the first
element within the encrypted payload, followed by any number of control frames,
up to the packet boundary. We <bcp14>SHOULD</bcp14> pack a single Stream frame per
encryption. More than one would force an unavoidable memory copy of all
but the first Stream frame within a packet.</t>
      <t>Lost frames being resubmitted <bcp14>SHOULD</bcp14> be packed within their own packet,
and other control frames <bcp14>SHOULD</bcp14> not be multiplexed with retransmissions.
This allows for spurious retransmissions that have been already
processed but not acknowledged fast enough to not require the two-levels
decryption. Only header decryption and information contained within the
QUIC VReverso short header would be enough to decide whether the packet
payload should be decrypted, or could be dropped before payload
decryption is attempted.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC9000">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="RFC9001">
          <front>
            <title>Using TLS to Secure QUIC</title>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <author fullname="S. Turner" initials="S." role="editor" surname="Turner"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document describes how Transport Layer Security (TLS) is used to secure QUIC.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9001"/>
          <seriesInfo name="DOI" value="10.17487/RFC9001"/>
        </reference>
      </references>
    </references>
    <?line 369?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA7Vb63IbuZX+j6fAyj9sTZG0KDm2Rhsnq5HsGVdsyyvJ8aZS
qSmwGyQ7ajaYvojm2J5n2WfZJ9vvnAOgL6Q9qdqsyiWTaDRwcC7fuUHj8VjV
WZ3bM31wbe9tWTk9d6Wul1b/5/tXF3pdutolLj9QiantwpXbM13VqUpdUpgV
XktLM6/H89IlS1uP/9FkyWYxLmWpMZbiofHRkbqz240r0zOdFbUtC0zmV9X9
mT5ReHK3KF2zPuNtP/yo7m3R2DOldX9Y63q7xrYf8EJWLPSP9JRmZfWymZ3p
ZV2vq7PHj+X7JHGrx562x0KpJzRQuLCFLbNEKdPUS1diwzFW03re5Lkc8GXu
SlvUWaGv+VV+7MqFKbJfTJ254ky/f2tWTckP7Mpk+Zmeh5cmst9/NAVNmcys
UlkBtqzw6j2f7/rlxfdHR0ftx+mZUuPxWJtZVZcmqZW6XWaVBsebFdbUqa2S
MpvZShuRkf1Y26ICJbq0YzzNFgWxhmSYm61rau3m9E31JKprp829y1K9sivI
Vc9Ls6AN+FDa1LxAaRMLQkttilSbPHebSmWrdW5pJjioK2tZEEZjEavtfJ4l
GZEZZ8l62G1p7i0v6tY0pDAUJ+nEgV2LxjWV/sWWbpy49XZIxET3OKFaTtCs
ZGmKhcUx3Er4cj/Fm1C/0qZQOr02yZ2ttTC/Gql7U2ZmlttxbotFvWS9XNCR
6KhgxsqGuRP9Artv6yUd1OZVZxOFTQIZvMunT16gX75o0NoUtWugAelEhLrK
0jSHEjzQr4q6dGmTMCtENBmJlDXS5ON1U64dtoIOFNXalXUruQ2UW69ApqlJ
cLZIyq2wNCe1NgubCoVG376+0dPJiYb1QU+ERRMddqvWNsnm2Q7lI0U8yCrP
/arJWYcqXj3XW2vAJgxA2iCsks3C05X5uysVLG8NE7HVCGundm3xi7SiSLP7
LG1MLnw2iUntKkvA46vCekXFElmhZmDEPKt5o0AwVAbkZBXIqSpQnnjlwrnu
+KnR9caNiQ15pVrGaDEL/WhpsZ9o89psc2fSw5GumjUxmKUbbInJUyuXxl2Y
EAEvnFIoCqYsCu5JmwNQWBrMlu7pYT7YHEbJakamvM7dlvW/zlYWOvITZoCN
YFpN58WOBYReZrbe0inrFpn9iTDp4t17mE9V51syEAjMuRpw3VQ2sO5hpZfZ
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
NDyemAZ05LM+fn3zg/4cgsLP+n3FUTDHnp99gj38+aw+n43px//X+bDnW2cc
+x0d0QJATVlJP+2uq4/GT092ttP83pQnHIeZ0yf996ZPT06Hr9J7U9nvSZh5
cjR47+jZybMn09Pjk8F7st9ppPO4/96Tp9Pp09OnR9PTJ8fPTk6ffX90gvco
H/WcHwPFVrDokI7e+K9QhaEd+nsNHqLaPFXK5gQYiDn3ZaHfussR2/4+RoUf
cStL98q4JUrZt8eUGd+WXjM8i1pJTs9t2IhgnJcmy6a4iz1Yo2nH3HYuivnu
cbUHIwVod3FW+XJBF8524oPRb2OrZ9VIfQNcP0QgpUftAXqErhHptyea6Dcu
IBhFTdJ05Wu7EmmFq762dzdXimeKuoutR7nZUwQwLWK/dsHrVL72QrfYZyu6
+ZF2pLVzg4jaT5vwtwJyDd43zXusCUtQmIVlVk1eZ8iCPobSXGm5l7zKKr5E
OJHbLPL3E+wEqnVTUrFsOFMCO25GzuhqtcnpfsK2UxIiPtC2vQBkTnBoC9cs
liQxeh5rKYKn4U58e/1Q7kSEpLxzLZHv/ndw08eR/YujfcvolTPi3YmWIKxO
F5Q3S8vMbDUqRAK0gn/LU8JNQeJ7GC4d56Qzrki30W7nOiXdqaf7xHX8cwsy
a8KAtiQqF0o+nYVy9/ODuckrS1Bxe3V51WXrRP0vIF26OB81AAA=

-->

</rfc>
