<?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.23 (Ruby 3.3.6) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-zheng-quic-fec-extension-00" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.27.0 -->
  <front>
    <title abbrev="QUIC FEC">FEC Extension for QUIC</title>
    <seriesInfo name="Internet-Draft" value="draft-zheng-quic-fec-extension-00"/>
    <author initials="H." surname="Zheng" fullname="Zheng Huanhuan">
      <organization>Alibaba Inc.</organization>
      <address>
        <email>zhenghuanhuan.zhh@taobao.com</email>
      </address>
    </author>
    <author initials="Y." surname="Liu" fullname="Yanmei Liu">
      <organization>Alibaba Inc.</organization>
      <address>
        <email>miaoji.lym@alibaba-inc.com</email>
      </address>
    </author>
    <date/>
    <area>Transport</area>
    <workgroup>QUIC Working Group</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 44?>

<t>This document specifies a Forward Error Correction (FEC) extension
for the QUIC protocol, which provide protection against packet loss.</t>
    </abstract>
  </front>
  <middle>
    <?line 49?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document specifies an extension to QUIC version 1 <xref target="QUIC-TRANSPORT"/>
to supports Forward Error Correction (FEC).
FEC is a method of erasure control in data transmission by simultaneously
sending redundant data (see <xref target="RFC6363"/>). This redundancy allows the receiver
to detect and recover limited lost data without waiting for retransmission,
which can be beneficial in latency-sensitive scenarios.</t>
      <t>For instance, real-time communication frameworks like WebRTC, which is widely
applied in scenarios such as video conferenceing and voice call. FEC plays
an important role by recovering lost packets under unreliable network,
thereby optimizing user experience.</t>
      <t>QUIC-FEC might become a crucial foundation for MoQ (Media over QUIC),
which is primarily used for video stream transmission, which can migrate
the impact of packet loss on media transmission.</t>
      <t>This document defines how FEC framework take effects in QUIC transport process.
Since FEC extension introduce new QUIC frames and parameters, it requires
negotiation between two endpoints.</t>
      <t>This document does not define how the flows to be protected are determined,
nor does it defines how the redundant data are calculated via FEC schemes.</t>
      <t>For further discussion, the FEC mechanism might effect data retransmissions
by notifying the remote of successfully recovered packets, thereby effectively
avoiding bandwidth waste.</t>
      <section anchor="definition">
        <name>Conventions and Definitions</name>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
"OPTIONAL" 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>
        <t>We assume that the reader is familiar with the terminology used in
<xref target="QUIC-TRANSPORT"/>. In addition, we introduce the following FEC-related terms:</t>
        <ul spacing="normal">
          <li>
            <t>Source symbol: piece of information exchanged by two endpoints.
This document considers QUIC packets payloads as source symbols.</t>
          </li>
          <li>
            <t>Repair symbol: redundant information constructed from the combination
of several source symbols.</t>
          </li>
          <li>
            <t>Erasure: loss of one or more symbols</t>
          </li>
          <li>
            <t>Erasure correction code: algorithm generating repair symbols and reconstructing
missing source symbols from a set of source and repair symbols.</t>
          </li>
          <li>
            <t>Forward Erasure Correction: process of recovering erased symbols
before the detection of their erasure.</t>
          </li>
          <li>
            <t>FEC scheme: the conjunction of an erasure correction code and the specific protocol
elements required to use it with the design described in this document.</t>
          </li>
          <li>
            <t>Encoder: entity producing repair symbols using an erasure correction code.
The encoder can be a library used by the protocol implementation or a program
running in a separate process or machine.</t>
          </li>
          <li>
            <t>Decoder: entity reconstructing missing source symbols using an erasure correction code.
The decoder can be a library used by the protocol implementation or a program running
in a separate process or machine.</t>
          </li>
          <li>
            <t>Coding window: window of source symbols that are required to decode a repair symbol.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="architecture-overview">
      <name>Architecture Overview</name>
      <t>FEC Framework is designed as a module within QUIC-Transport layer.
The primary target of current draft is to establish
common mechanism for integrating FEC logic into the QUIC protocol,
thus ensuring interoperability across different QUIC instances.</t>
      <t>Endpoints use transport parameters in <xref target="QUIC-TRANSPORT"/> to negotiate
whether to enable the FEC mechanism. The FEC Framework specifies necessary
configuration information that needs to be exchanged between QUIC endpoints
using transport parameters during the QUIC handshake process.</t>
      <t>The FEC Framework operates within the QUIC-Transport layer. It facilitates
the transmission of FEC information and redundant data using QUIC frames.</t>
      <t>The FEC framework calls upon the FEC scheme to manage the detailed processes of FEC encoding and decoding.
The FEC scheme defines detailed algorithm process, and the procedures used to
identidy packet payload data in the context of FEC scheme. This draft will describe
the interface specification between FEC Framework and FEC scheme.</t>
      <t>FEC Framework MUST ensure compatibility with existing modules within the QUIC protocol.
Special attention is given to ensuring interoperability with the congestion control
and the ACK handling and retransmission decisions (see <xref target="QUIC-RECOVERY"/> and <xref target="RFC9265"/>).</t>
      <figure anchor="fig-fec-framework">
        <name>FEC Framework</name>
        <artwork><![CDATA[
       +----------------------------------------+
       |                                        |
       |            Application layer           |
       |                                        |
       +--------^----------------------^--------+
                |                      |
 Source packet  |                      | Recovered Source packet
                |                      |
       +--------v----------------------|--------+
       |                      +--------|------+ |    +------------+
       | QUIC-Transport layer |FEC Framework <-------> FEC Scheme |
       |                      +---------------+ |    +------------+
       +--------^----------------------^--------+
                |                      |
 Source packet  |                      | Repair packet
                |                      |
       +--------v----------------------v--------+
       |                                        |
       |              UDP layer                 |
       |                                        |
       +----------------------------------------+
]]></artwork>
      </figure>
    </section>
    <section anchor="handshake-negotiation-and-transport-parameter">
      <name>Handshake Negotiation and Transport Parameter</name>
      <section anchor="transport-params">
        <name>Transport Parameter</name>
        <t>This extension defines several new transport parameters used to negotiate
the use of the FEC extension and specific FEC schemes during the connection handshake (see <xref target="QUIC-TRANSPORT"/>).
The new transport parameters are defined as follows:</t>
        <ul spacing="normal">
          <li>
            <t>fec_encode_schemes (current version uses 0xfece01): A list of variable-length integers
specifying the FEC schemes supported by endpoints for encoding. The presence of this transport parameter
indicates whether FEC functionality is enabled for encoding.</t>
          </li>
          <li>
            <t>fec_decode_schemes (current version uses 0xfecd02): A list of variable-length integers
defining the FEC schemes supported by endpoints for decoding. The content of this transport parameter
determines which FEC scheme is used for decoding.</t>
          </li>
        </ul>
        <t><xref target="fig-transport-param"/> introduce the transport parameter format of fec_encode_schemes and fec_decode_schemes:</t>
        <figure anchor="fig-transport-param">
          <name>Transport Parameter for FEC</name>
          <artwork><![CDATA[
FEC_ENCODER_SCHEMES TRANSPORT_PARAM{
  0xfece01 (i),
  Transport Parameter Length (i),
  Transport Parameter Value {
    FEC Encoder Schemes Length (i),
    FEC Scheme1 ID(i),
    FEC Scheme2 ID(i),
    ...
  }
}

FEC_DECODER_SCHEMES TRANSPORT_PARAM{
  0xfecd01 (i),
  Transport Parameter Length (i),
  Transport Parameter Value {
    FEC Encoder Schemes Length (i),
    FEC Scheme1 ID(i),
    FEC Scheme2 ID(i),
    ...
  }
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>fec_max_symbol_num (current version uses 0xfecb02): A variable-length integer indicating
the block size (i.e., the number of symbols in each encoding group) used in block encoding.
This is an optional transport parameter and SHOULD be sent only when an endpoint uses block code schemes
for encoding. For coding methods such as convolutional codes that do not require a fixed block size,
this parameter SHOULD NOT be included.</t>
          </li>
        </ul>
        <t>For a single endpoint, FEC encoding and decoding are independent processes. By negotiating these separately,
the framework can support distinct FEC schemes for encoding and decoding, or enable unidirectional
encoding/decoding only. This flexibility allows FEC operations to adapt to diverse requirements
and configurations.</t>
        <t>To ensure interoperability of FEC negotiation across QUIC protocol stacks, FEC schemes MUST
use standardized identifiers registered with IANA (Internet Assigned Numbers Authority).
This standardization guarantees seamless communication and compatibility between implementations.</t>
        <t>During negotiation, if a receiver's encoder scheme matches any of the sender's encoder schemes,
the negotiation for that direction is considered successful.</t>
      </section>
      <section anchor="handshake-nego">
        <name>Handshake Negotiation</name>
        <t>Endpoints negotiate the transport parameters for FEC during the connection handshake,
as outlined in Section 3.1.</t>
        <t><xref target="fig-fec-handshake"/> illustrates an example of the negotiation process:</t>
        <figure anchor="fig-fec-handshake">
          <name>Handshake negotiation for FEC</name>
          <artwork><![CDATA[
Client                                       Server
        ------------------------------------>

        fec_encode_schemes={REED_SOLOMON,XOR}

        fec_decode_schemes={XOR}

        fec_max_symbol_num=10

        <------------------------------------

                     fec_encode_schemes={XOR}

            fec_decode_schemes={REED_SOLOMON}

                         fec_max_symbol_num=5
]]></artwork>
        </figure>
        <t>Please note that in the actual process, the Client first declare the list of encoder/decoder algorithms
it can handle. When the server receive the fec_encode_schemes and fec_decode_schemes,
it chooses one proper scheme for each direction, and set fec_decode_schemes and fec_encode_schemes params
as corresponding scheme for decoding and encoding.</t>
        <t>Note that if the client wants to specify the FEC algorithm, it can provide only one FEC algorithm
for fec negotiation process, the server could choose to support or not; otherwise, the algorithm selection
SHOULD be based on the server's priority.</t>
        <t>For example, if the client's FEC schemes parameter is set as follows:</t>
        <ul spacing="normal">
          <li>
            <t>fec_encode_schemes {Algorithm1, Algorithm2, Algorithm3, ...}</t>
          </li>
          <li>
            <t>fec_decode_schemes {Algorithm1, Algorithm2, Algorithm3, ...}</t>
          </li>
        </ul>
        <t>The encoder/decoder algorithm used in practice is chosen and returned by the Server:</t>
        <ul spacing="normal">
          <li>
            <t>supported_fec_encode_schemes {Algorithm1}</t>
          </li>
          <li>
            <t>supported_fec_decode_schemes {Algorithm3}</t>
          </li>
        </ul>
        <t>Note that the encoding/decoding option and the selected algorithm may differ after
negotiation.</t>
      </section>
    </section>
    <section anchor="transport-mechanism">
      <name>Transport mechanism</name>
      <t>The FEC module directly participates in and influences the sending and receiving stages
of packet transmission:</t>
      <t>As the sender, the FEC Framework takes the original data frame as source symbols and provides
the required source symbols to the FEC scheme module. The FEC scheme can encode the data grouped
by streams, or mixed data from different streams.</t>
      <t>FEC Framework retrieves the following information from the FEC scheme:</t>
      <ol spacing="normal" type="1"><li>
          <t>Source Symbol ID (SID) frame: SID frame is viewed as an unique identification for source symbol,
which is composed of block ID and symbol index typically.</t>
        </li>
        <li>
          <t>Repair packets: When the incoming source symbols meets the encoding conditions, the FEC scheme
could generate original source symbol with repair packets. Repair packet contains FEC Payload ID,
repair symbol, and optional repair key.</t>
        </li>
      </ol>
      <t>At the sender, FEC Framework is required to acquire and insert the SID frame into the packet
that includes the source symbols. Subsequently, FEC Framework SHOULD generate and transmit repair packets
to the receiver after processing a sufficient number of source symbols. Generally, the repair packets
SHOULD be sent immediately following the source packets from the same block.</t>
      <t>As the receiver, the source packets can be normally parsed by ignoring SID frame, but it might be
necessary to store source symbols and identifications to perform FEC decoding after receiving
repair packets from the same block.</t>
      <figure anchor="fig-fec-work-flow">
        <name>Work Flow for FEC</name>
        <artwork><![CDATA[
 +------------------------------------------------------------------------------+
 |                               Application                                    |
 +------------------------------------------------------------------------------+
            |                                                      ^
            | Application data                Received & recovered |
            |                                     application data |
            |                                                      |
      +-----v-----+                                          +-----|-----+
|-----| Send API  |------------------------------------------| Recv API  |------|
|     +-----|-----+                                          +-----^-----+      |
|           |                                                      |            |
|           |                                       Source packets |            |
|           | Source packet                     & recovered source |            |
|           |                                              packets |            |
|    +------v------+                QUIC                    +------|------+     |
|    | FEC Encoder |                                        | FEC Decoder |     |
|    +------|------+                                        +------^------+     |
|           |                                                      |            |
|           | Source packets                        Source packets |            |
|           | with SID frame                        with SID frame |            |
|           | & Repair packets                    & Repair packets |            |
|           |                                                      |            |
|   +-------v-------+                                      +-------|-------+    |
----| Packet Sender |--------------------------------------|Packet Receiver|-----
    +---------------+                                      +-------^-------+
            |                                                      |
            | QUIC packets                            QUIC packets |
            v                                                      |
+-------------------------------------------------------------------------------+
|                                 Network                                       |
+-------------------------------------------------------------------------------+
]]></artwork>
      </figure>
      <section anchor="sender-operation">
        <name>Sender Operation</name>
        <t>### Define FEC-protected QUIC payload</t>
        <t>Endpoints can decide which types of data require FEC protection.
As applying equal protection to all data types may result in inefficient bandwidth utilization,
it is RECOMMENDED that protocol implementations selectively prioritize protection for critical data,
such as restricting FEC to stream frames and datagram frames.
For retransmitted frames or non-time-sensitive data, FEC SHOULD NOT be applied.</t>
        <section anchor="identify-source-symbols-using-sid-frame">
          <name>Identify source symbols using SID frame</name>
          <t>In the context of packets that require protection through FEC (Forward Error Correction),
it is necessary to define a SID (Source Identifier) frame that conveys the identity information
of the data. This is intended to help the receiver clarify the following information
during the decoding process:</t>
          <ul spacing="normal">
            <li>
              <t>Which part of data insides the packet will be taken part in the FEC decode process.</t>
            </li>
            <li>
              <t>Which block and the index inside the block the source symbol belongs to.</t>
            </li>
          </ul>
          <t>Therefore, it's recommended to append the SID frame after the fec-protected QUIC packet data
to indicate that the data preceding this frame is identified by the current SID frame and
is involved in the decoding process at the receiver.</t>
          <t>Based on the above reason, generating and inserting the SID frame SHOULD occur
before the encryption process of packets.</t>
          <t>As the FEC module requires an additional data frame to be appended after the protected packet,
developers MUST consider reserving space for the FEC data frames within the packet.
This ensures that the length of the packet does not exceed the MTU (Maximum Transmission Unit) limit.
Additionally, the SID MUST include Explicit Source Payload ID information to facilitate
the resolution of the current data's identity, as shown in Figure 6.</t>
        </section>
        <section anchor="generate-and-send-repair-symbols">
          <name>Generate and send repair symbols</name>
          <t>The encoding content of the Repair package originates from the original data identified by the SID frame.
It requires encoding the identity information of the FEC for the receiver to recognize the protection
object of the current Repair package, as shown in Figure 6.</t>
          <t>The specific encoding process is carried out by the FEC scheme module, which typically requires
the sender to pre-set the following parameters:</t>
          <ul spacing="normal">
            <li>
              <t>Block size: How many original packets are involved in the calculation for a computing unit,
which directly affects the frequency of Repair symbol generation.</t>
            </li>
            <li>
              <t>Redundancy level of FEC: How many redundant packets can be generated from the block.</t>
            </li>
            <li>
              <t>Repair key (optional): The encoding key required by the FEC scheme module, which usually
needs to be included in the Repair package for the receiver to use for decoding.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="receiver-operation">
        <name>Receiver Operation</name>
        <section anchor="process-recovered-symbols">
          <name>Process recovered symbols</name>
          <t>In the FEC module, the block triggering the decoding module generally needs to satisfy the following conditions:</t>
          <ol spacing="normal" type="1"><li>
              <t>The block receives a sufficient number of source symbols;</t>
            </li>
            <li>
              <t>The block receive at least one repair symbol.</t>
            </li>
          </ol>
          <t>However, the specific required amounts of source symbols and repair symbols SHOULD be
determined by the FEC schemes module.</t>
        </section>
      </section>
    </section>
    <section anchor="fec-frame-types">
      <name>FEC Frame Types</name>
      <t>FEC will introduce two new frames into QUIC protocol: one is the Source Symbol ID frame,
which SHOULD be attached to the original packet, and the other is the Repair Frame,
which contains repair data, and SHOULD be encapsulated and transmitted independently.</t>
      <section anchor="SID-Frame">
        <name>Source Symbol ID Frame</name>
        <t>FEC SID FRAME contains the identification of the current source packet,
which declares the encoding flow and the block current symbol is involved.</t>
        <t>SID Frame SHOULD be inserted after the fec-protected QUIC frame to indicate
the range of FEC protected data.
Since the maximum length of the repair symbol is equal to that of the source symbol,
it is necessary to restrict the content length of the source packet to prevent
the content length of the repair packet from exceeding the MTU limit.</t>
        <t>SRC_SYMBOL_ID Frame Structure:</t>
        <figure anchor="fig-src-symbol-id-frame">
          <name>SRC_SYMBOL_ID Frame</name>
          <artwork><![CDATA[
SRC_SYMBOL_ID Frame {
  Type (i) = 0xfec5,
  Flow ID (i),
  Explicit Source Payload ID(i),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Flow ID (i): A variable-length integer that identifies which data stream the symbol belongs to.</t>
          </li>
          <li>
            <t>Explicit Source Payload ID (SID): A variable-length integer that serves as a unique identifier
for the source symbol. It MUST includes the block id and the symbol index of current source symbol.
This can be formatted as follows.</t>
          </li>
        </ul>
        <figure anchor="fig-explicit-source-payload-id">
          <name>Explicit Source Payload ID</name>
          <artwork><![CDATA[
       3 bytes            1 byte
+---------------------+------------+
|      block id       | symbol idx |
+---------------------+------------+
]]></artwork>
        </figure>
      </section>
      <section anchor="Repair-Symbol-Frame">
        <name>Repair Symbol Frame</name>
        <t>In contrast to the SID Frame mentioned above, the Repair Frame SHOULD include not only the identification
but also the encoded content of the source symbols.</t>
        <t>Repair symbol frame SHOULD incorporate the following informations:</t>
        <figure anchor="fig-repair-symbol-frame">
          <name>REPAIR_SYMBOL Frame</name>
          <artwork><![CDATA[
REPAIR_SYMBOL Frame {
  Type (i) = 0xfec6,
  Repair ID {
    Flow ID(i),
    Expilicit Repair payload id (4 bytes),
  }
  Repair Key (4 bytes),
  Repair Symbol Payload (E),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Repair ID(i):
      - Flow ID(i): A variable-length integer that identifies which data stream the symbol belongs to;
      - Explicit Repair Payload ID (4 bytes): A variable-length integer that serves as a unique identifier
   for the repair symbol. It MUST includes the block id and the symbol index of current repair symbol.</t>
          </li>
          <li>
            <t>Repair Key (4 bytes): An optional key generated by fec scheme, and is used for FEC decoding.</t>
          </li>
          <li>
            <t>Repair Symbol Payload: The content of repair symbol, whose length is typically aligns with the
block's longest symbol. This can be formatted as Figure above.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="operation-management-consideration">
      <name>Operation &amp; Management Consideration</name>
      <t>The QUIC-FEC protocol are expected to be a universal solution against packet loss.</t>
      <t>When implemented, the QUIC packets will be finally divided into different FEC blocks according to the
stream size or fixed size. Since that, the FEC Framework only needs to focus on whether the symbols
within the block satisfy the encoding/decoding conditions, regardless of the upper layer protocols.</t>
      <t>It's complex for FEC Framework to group QUIC packets into blocks, which needs to consider
the optimisation effects at the application layer, and is closely related to the FEC scheme at the same time.</t>
      <t>For example, it's convenient to group block using a fixed block size, the only step to do is compose
the packets into blocks in the order of encoding. However, this may result in some repair packets
arriving too late for the source packets to be protected, just as for source packet 4 belows,
repair packet of packet 4 will not be send until stream 2 finish the sending:</t>
      <figure anchor="fig-fix-block-implementation-steps">
        <name>FIXED BLOCK Implementation Steps</name>
        <artwork><![CDATA[
              +-------------------------------------------------+
              |                Application Data                 |
              +-------------------------------------------------+
                                   |
                                   |
                                   v
              +----------+ +----------+ +----------+ +----------+
   Stream 1   | Source   | | Source   | | Source   | | Source   |
              | packet 1 | | packet 2 | | packet 3 | | packet 4 |
              +----------+ +----------+ +----------+ +----------+

              +----------+ +----------+
   Stream 2   | Source   | | Source   |
              | packet 1 | | packet 2 |
              +----------+ +----------+
                                   |
                                   |
                             +-----v-----+        +-----------+
   block size = 3 ---------> | FEC       <--------> FEC       |
                             | Framework |        | Scheme    |
                             +-----|-----+        +-----------+
                                   |
                                   v
              +----------+ +----------+ +----------+    +----------+
   Block 1    | Source   | | Source   | | Source   |    | Repair   |
              | packet 1 | | packet 2 | | packet 3 |    | packet 1 |
              +----------+ +----------+ +----------+    +----------+

              +----------+ +----------+ +----------+    +----------+
   Block 2    | Source   | | Source   | | Source   |    | Repair   |
              | packet 4 | | packet 1 | | packet 2 |    | packet 2 |
              +----------+ +----------+ +----------+    +----------+
]]></artwork>
      </figure>
      <t>Dividing the block according to the QUIC Stream can avoid the problem of long time difference
between the generation of repair packets and the arrival of protected packets.</t>
      <t>But not all the fec schemes supports variable-length block codecs, as this requires the fec scheme
to support passing decoding timing and computation parameters to the peer.</t>
      <figure anchor="fig-flex-block-implementation-steps">
        <name>FLEXIBLE BLOCK Implementation Steps</name>
        <artwork><![CDATA[
              +------------------------------------------------+
              |               Application Data                 |
              +------------------------------------------------+
                                   |
                                   |
                                   v
              +----------+ +----------+ +----------+ +----------+
   Stream 1   | Source   | | Source   | | Source   | | Source   |
              | packet 1 | | packet 2 | | packet 3 | | packet 4 |
              +----------+ +----------+ +----------+ +----------+

              +----------+ +----------+
   Stream 2   | Source   | | Source   |
              | packet 1 | | packet 2 |
              +----------+ +----------+
                                   |
                                   |
                             +-----v-----+        +-----------+
   block size = 3 ---------> | FEC       <--------> FEC       |
                             | Framework |        | Scheme    |
                             +-----|-----+        +-----------+
                                   |
                                   v
              +----------+ +----------+ +----------+ +----------+    +----------+
   Block 1    | Source   | | Source   | | Source   | | Source   |    | Repair   |
              | packet 1 | | packet 2 | | packet 3 | | packet 4 |    | packet 1 |
              +----------+ +----------+ +----------+ +----------+    +----------+

              +----------+ +----------+    +----------+
   Block 2    | Source   | | Source   |    | Repair   |
              | packet 1 | | packet 2 |    | packet 2 |
              +----------+ +----------+    +----------+
]]></artwork>
      </figure>
      <t>In short, the FEC scheme determines which block partitioning method can be chosen,
and the application layer optimization effect determines which partitioning method should be chosen.
And the specific codec flow and repair key design should be decided by the fec scheme.</t>
      <t>The both steps can be applied to most application layer requests based on the QUIC protocol,
and it's been proven to work with the HTTP/3 and MoQ protocols as the above steps.</t>
      <t>However, FEC should not protect all application layer data without discrimination in the QUIC connection.
In order to reduce the bandwidth overhead, the FEC module should provide the upper layers with an interface
to switch off the FEC module at the Stream level.</t>
      <t>It did make differences on when and how to switch off FEC among different application layer.
We offers an abstract steps as an example here:</t>
      <figure anchor="fig-close-fec-implementation-steps">
        <name>CLOSE FEC Implementation Steps</name>
        <artwork><![CDATA[
      Client-APP                                      Server-APP
          |
          v
set_fec_close_API(stream_id)
          |
          v
stream_state.enable_fec = false
          |
          v
generate close_fec_frame to packet
          |
          v
            --------------------------------------------->
            QUIC_Packet {                                 |
              ...Frames,                                  |
              CLOSE_FEC_FRAME{stream_id}                  |
            }                                             |
                                            parse close_fec_frame from packet
                                                          |
                                                          v
                                            stream_state.enable_fec = false
]]></artwork>
      </figure>
    </section>
    <section anchor="security-consideration">
      <name>Security Consideration</name>
      <t>TBD</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document defines three new transport parameters for the negotiation of enable fec for QUIC, and two new frame types.</t>
      <section anchor="new-transport-parameters">
        <name>New transport parameters</name>
        <t>The following entry in <xref target="transport-parameters"/> should be added to the "QUIC Transport Parameters" registry under the "QUIC Protocol" heading.</t>
        <table anchor="transport-parameters">
          <name>Addition to QUIC Transport Parameters Entries</name>
          <thead>
            <tr>
              <th align="left">Parameter ID</th>
              <th align="left">Parameter name</th>
              <th align="left">Specification</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0xfece01</td>
              <td align="left">fec_encode_schemes</td>
              <td align="left">
                <xref target="transport-params"/></td>
            </tr>
            <tr>
              <td align="left">0xfecd02</td>
              <td align="left">fec_decode_schemes</td>
              <td align="left">
                <xref target="transport-params"/></td>
            </tr>
            <tr>
              <td align="left">0xfecb02</td>
              <td align="left">fec_max_symbol_num</td>
              <td align="left">
                <xref target="transport-params"/></td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="new-frames">
        <name>New frames</name>
        <t>The following frame types defined in <xref target="frame-types"/> should be added to the "QUIC Frame Types" registry under the "QUIC Protocol" heading.</t>
        <table anchor="frame-types">
          <name>Addition to QUIC Frame Types Entries</name>
          <thead>
            <tr>
              <th align="left">Frame ID</th>
              <th align="left">Frame name</th>
              <th align="left">Specification</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0xfec5</td>
              <td align="left">SID Frame</td>
              <td align="left">
                <xref target="SID-Frame"/></td>
            </tr>
            <tr>
              <td align="left">0xfec6</td>
              <td align="left">Repair Frame</td>
              <td align="left">
                <xref target="Repair-Symbol-Frame"/></td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The specification has been materially improved through technical discussions with Ian Swett.
Thanks to his recommendations with the draft and FEC mechanism.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="QUIC-TRANSPORT">
          <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="QUIC-TLS">
          <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>
        <reference anchor="RFC6363">
          <front>
            <title>Forward Error Correction (FEC) Framework</title>
            <author fullname="M. Watson" initials="M." surname="Watson"/>
            <author fullname="A. Begen" initials="A." surname="Begen"/>
            <author fullname="V. Roca" initials="V." surname="Roca"/>
            <date month="October" year="2011"/>
            <abstract>
              <t>This document describes a framework for using Forward Error Correction (FEC) codes with applications in public and private IP networks to provide protection against packet loss. The framework supports applying FEC to arbitrary packet flows over unreliable transport and is primarily intended for real-time, or streaming, media. This framework can be used to define Content Delivery Protocols that provide FEC for streaming media delivery or other packet flows. Content Delivery Protocols defined using this framework can support any FEC scheme (and associated FEC codes) that is compliant with various requirements defined in this document. Thus, Content Delivery Protocols can be defined that are not specific to a particular FEC scheme, and FEC schemes can be defined that are not specific to a particular Content Delivery Protocol. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6363"/>
          <seriesInfo name="DOI" value="10.17487/RFC6363"/>
        </reference>
        <reference anchor="RFC2199">
          <front>
            <title>Request for Comments Summary RFC Numbers 2100-2199</title>
            <author fullname="A. Ramos" initials="A." surname="Ramos"/>
            <date month="January" year="1998"/>
          </front>
          <seriesInfo name="RFC" value="2199"/>
          <seriesInfo name="DOI" value="10.17487/RFC2199"/>
        </reference>
        <reference anchor="RFC9174">
          <front>
            <title>Delay-Tolerant Networking TCP Convergence-Layer Protocol Version 4</title>
            <author fullname="B. Sipos" initials="B." surname="Sipos"/>
            <author fullname="M. Demmer" initials="M." surname="Demmer"/>
            <author fullname="J. Ott" initials="J." surname="Ott"/>
            <author fullname="S. Perreault" initials="S." surname="Perreault"/>
            <date month="January" year="2022"/>
            <abstract>
              <t>This document describes a TCP convergence layer (TCPCL) for Delay-Tolerant Networking (DTN). This version of the TCPCL protocol resolves implementation issues in the earlier TCPCL version 3 as defined in RFC 7242 and provides updates to the Bundle Protocol (BP) contents, encodings, and convergence-layer requirements in BP version 7 (BPv7). Specifically, TCPCLv4 uses BPv7 bundles encoded by the Concise Binary Object Representation (CBOR) as its service data unit being transported and provides a reliable transport of such bundles. This TCPCL version also includes security and extensibility mechanisms.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9174"/>
          <seriesInfo name="DOI" value="10.17487/RFC9174"/>
        </reference>
        <reference anchor="RFC5226">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author fullname="T. Narten" initials="T." surname="Narten"/>
            <author fullname="H. Alvestrand" initials="H." surname="Alvestrand"/>
            <date month="May" year="2008"/>
            <abstract>
              <t>Many protocols make use of identifiers consisting of constants and other well-known values. Even after a protocol has been defined and deployment has begun, new values may need to be assigned (e.g., for a new option type in DHCP, or a new encryption or authentication transform for IPsec). To ensure that such quantities have consistent values and interpretations across all implementations, their assignment must be administered by a central authority. For IETF protocols, that role is provided by the Internet Assigned Numbers Authority (IANA).</t>
              <t>In order for IANA to manage a given namespace prudently, it needs guidelines describing the conditions under which new values can be assigned or when modifications to existing values can be made. If IANA is expected to play a role in the management of a namespace, IANA must be given clear and concise instructions describing that role. This document discusses issues that should be considered in formulating a policy for assigning values to a namespace and provides guidelines for authors on the specific text that must be included in documents that place demands on IANA.</t>
              <t>This document obsoletes RFC 2434. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5226"/>
          <seriesInfo name="DOI" value="10.17487/RFC5226"/>
        </reference>
        <reference anchor="RFC9265">
          <front>
            <title>Forward Erasure Correction (FEC) Coding and Congestion Control in Transport</title>
            <author fullname="N. Kuhn" initials="N." surname="Kuhn"/>
            <author fullname="E. Lochin" initials="E." surname="Lochin"/>
            <author fullname="F. Michel" initials="F." surname="Michel"/>
            <author fullname="M. Welzl" initials="M." surname="Welzl"/>
            <date month="July" year="2022"/>
            <abstract>
              <t>Forward Erasure Correction (FEC) is a reliability mechanism that is distinct and separate from the retransmission logic in reliable transfer protocols such as TCP. FEC coding can help deal with losses at the end of transfers or with networks having non-congestion losses. However, FEC coding mechanisms should not hide congestion signals. This memo offers a discussion of how FEC coding and congestion control can coexist. Another objective is to encourage the research community to also consider congestion control aspects when proposing and comparing FEC coding solutions in communication systems.</t>
              <t>This document is the product of the Coding for Efficient Network Communications Research Group (NWCRG). The scope of the document is end-to-end communications; FEC coding for tunnels is out of the scope of the document.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9265"/>
          <seriesInfo name="DOI" value="10.17487/RFC9265"/>
        </reference>
        <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="RFC5510">
          <front>
            <title>Reed-Solomon Forward Error Correction (FEC) Schemes</title>
            <author fullname="J. Lacan" initials="J." surname="Lacan"/>
            <author fullname="V. Roca" initials="V." surname="Roca"/>
            <author fullname="J. Peltotalo" initials="J." surname="Peltotalo"/>
            <author fullname="S. Peltotalo" initials="S." surname="Peltotalo"/>
            <date month="April" year="2009"/>
            <abstract>
              <t>This document describes a Fully-Specified Forward Error Correction (FEC) Scheme for the Reed-Solomon FEC codes over GF(2^^m), where m is in {2..16}, and its application to the reliable delivery of data objects on the packet erasure channel (i.e., a communication path where packets are either received without any corruption or discarded during transmission). This document also describes a Fully-Specified FEC Scheme for the special case of Reed-Solomon codes over GF(2^^8) when there is no encoding symbol group. Finally, in the context of the Under-Specified Small Block Systematic FEC Scheme (FEC Encoding ID 129), this document assigns an FEC Instance ID to the special case of Reed-Solomon codes over GF(2^^8).</t>
              <t>Reed-Solomon codes belong to the class of Maximum Distance Separable (MDS) codes, i.e., they enable a receiver to recover the k source symbols from any set of k received symbols. The schemes described here are compatible with the implementation from Luigi Rizzo. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5510"/>
          <seriesInfo name="DOI" value="10.17487/RFC5510"/>
        </reference>
        <reference anchor="RFC5052">
          <front>
            <title>Forward Error Correction (FEC) Building Block</title>
            <author fullname="M. Watson" initials="M." surname="Watson"/>
            <author fullname="M. Luby" initials="M." surname="Luby"/>
            <author fullname="L. Vicisano" initials="L." surname="Vicisano"/>
            <date month="August" year="2007"/>
            <abstract>
              <t>This document describes how to use Forward Error Correction (FEC) codes to efficiently provide and/or augment reliability for bulk data transfer over IP multicast. This document defines a framework for the definition of the information that needs to be communicated in order to use an FEC code for bulk data transfer, in addition to the encoded data itself, and for definition of formats and codes for communication of that information. Both information communicated with the encoded data itself and information that needs to be communicated 'out-of-band' are considered. The procedures for specifying new FEC codes, defining the information communication requirements associated with those codes and registering them with the Internet Assigned Numbers Authority (IANA) are also described. The requirements on Content Delivery Protocols that wish to use FEC codes defined within this framework are also defined. The companion document titled "The Use of Forward Error Correction (FEC) in Reliable Multicast" describes some applications of FEC codes for delivering content. This document obsoletes RFC 3452. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5052"/>
          <seriesInfo name="DOI" value="10.17487/RFC5052"/>
        </reference>
        <reference anchor="QUIC-RECOVERY">
          <front>
            <title>QUIC Loss Detection and Congestion Control</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="I. Swett" initials="I." role="editor" surname="Swett"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document describes loss detection and congestion control mechanisms for QUIC.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9002"/>
          <seriesInfo name="DOI" value="10.17487/RFC9002"/>
        </reference>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
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
bwAA

-->

</rfc>
