<?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.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-zheng-quic-fec-extension-01" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.30.1 -->
  <front>
    <title abbrev="QUIC FEC">FEC Extension for QUIC</title>
    <seriesInfo name="Internet-Draft" value="draft-zheng-quic-fec-extension-01"/>
    <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 important for FEC Framework to determine how to group QUIC packets into blocks, which needs to consider
the optimisation effects at the application layer and the FEC scheme support.</t>
      <t>For example, dividing data into fixed-size blocks is a more convenient approach and allows better control over
the packet repair rate.</t>
      <t>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. It requires the fec scheme to carry
the block size information with the FEC frame. For instance, certain algorithms employ a repair key field
to specify the number of packets and their indices within a block, enabling the receiver to determine
when decoding is possible. Without this information, the receiver cannot support encoding schemes with
flexible block sizes.</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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
AA==

-->

</rfc>
