<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     category="info"
     docName="draft-oancea-avtcore-opus-ulpfec-00"
     ipr="trust200902"
     submissionType="IETF"
     version="3"
     xml:lang="en"
     tocInclude="true"
     tocDepth="3"
     sortRefs="true"
     symRefs="true">

  <front>
    <title abbrev="Opus In-Band FEC with ULPFEC">Guidelines for Combining Opus In-Band Forward Error Correction with the RTP Generic FEC (ULPFEC) Payload Format</title>
    <seriesInfo name="Internet-Draft" value="draft-oancea-avtcore-opus-ulpfec-00"/>

    <author fullname="Dragos Oancea" initials="D." surname="Oancea">
      <address>
        <email>dragos.oancea.3.141592@gmail.com</email>
      </address>
    </author>

    <date year="2026" month="October" day="25"/>

    <area>Web and Internet Transport</area>
    <workgroup>Audio/Video Transport Core Maintenance</workgroup>

    <keyword>Opus</keyword>
    <keyword>FEC</keyword>
    <keyword>ULPFEC</keyword>
    <keyword>LBRR</keyword>
    <keyword>RTP</keyword>
    <keyword>packet loss</keyword>

    <abstract>
      <t>The Opus codec can carry low-bitrate redundancy for the preceding
      frame inside each packet ("in-band FEC").  The RTP payload format for
      generic Forward Error Correction (RFC 5109, commonly called ULPFEC)
      protects groups of RTP packets with XOR parity packets.  The two
      mechanisms recover different loss patterns, have different delay and
      overhead characteristics, and interact in ways that are not described
      in either specification.</t>
      <t>This document gives informational guidance on when the
      combination is worthwhile, how a sender should configure each
      mechanism, how a receiver should order recovery, how to signal the
      combination in SDP, how middleboxes affect it, and how to keep the
      combined redundancy consistent with congestion control.  It
      complements, and does not change, the WebRTC FEC requirements in
      RFC 8854.  It defines no new protocol elements.</t>
    </abstract>

    <note removeInRFC="true">
      <name>About This Document</name>
      <t>Discussion of this document is expected to take place on the
      AVTCORE Working Group mailing list (avt@ietf.org).  This is an
      individual submission and has not been adopted by any working
      group.</t>
    </note>
  </front>

  <middle>

    <section anchor="intro">
      <name>Introduction</name>
      <t>Packet loss on the path between an audio sender and receiver can be
      repaired in several ways: retransmission <xref target="RFC4588"/>,
      redundant encoding <xref target="RFC2198"/>, codec-internal
      redundancy, and separate parity-based FEC streams such as
      <xref target="RFC5109"/> and <xref target="RFC8627"/>.  For Opus
      <xref target="RFC6716"/>, the codec-internal mechanism is the
      Low-Bit-Rate Redundancy (LBRR) of the SILK layer, which RTP usage
      <xref target="RFC7587"/> refers to as "in-band FEC".</t>

      <t>In-band FEC and ULPFEC are complementary.  In-band FEC adds at
      most one packet of delay and can be decoded from a single received
      packet, but it can only repair the frame immediately preceding a
      received packet, it is not available in every Opus mode, and it
      yields a lower-fidelity reconstruction.  ULPFEC reconstructs lost RTP
      packets bit-exactly, independent of the codec and mode, and can be
      arranged to cover bursts, but it adds delay proportional to the size
      of the protected group, and its overhead does not shrink with the
      codec's own bitrate decisions.</t>

      <t>Neither <xref target="RFC7587"/> nor <xref target="RFC5109"/>
      discusses using the two together, and <xref target="RFC8854"/>
      (which targets WebRTC) recommends Opus in-band FEC for audio and does
      not recommend a separate FEC stream for audio because of its
      overhead.  That recommendation remains appropriate for typical
      interactive WebRTC calls.  There are, however, deployments where the
      assumptions behind it do not hold: music or other content coded in
      Opus modes without LBRR, links with frequent burst loss, one-way or
      latency-tolerant distribution, multicast without a feedback path, and
      systems that must recover RTP header extensions or contributing-source
      lists along with the payload.  This document describes how to combine
      the mechanisms well in those deployments.</t>

      <section anchor="scope">
        <name>Scope</name>
        <t>This document is informational.  It does not update
        <xref target="RFC5109"/>, <xref target="RFC7587"/>, or
        <xref target="RFC8854"/>, and it defines no new RTP payload
        formats, SDP attributes, or media type parameters.  Where this
        document uses requirement language, it describes good practice for
        implementations that choose to combine the two mechanisms; it does
        not impose requirements on implementations that do not.</t>
        <t>Flexible FEC <xref target="RFC8627"/> provides a superset of
        ULPFEC's capabilities and most of the guidance here applies to it
        equally.  This document concentrates on ULPFEC because it is widely
        implemented and because <xref target="RFC5109"/> is the format
        named in many existing deployments.  The Opus Deep Redundancy
        (DRED) extension under development in the MLCODEC Working Group
        <xref target="I-D.ietf-mlcodec-opus-dred"/> is discussed in
        <xref target="dred"/>.</t>
      </section>
    </section>

    <section anchor="conventions">
      <name>Conventions and Terminology</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>",
      "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>",
      "<bcp14>SHALL NOT</bcp14>", "<bcp14>SHOULD</bcp14>",
      "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>",
      "<bcp14>NOT RECOMMENDED</bcp14>", "<bcp14>MAY</bcp14>", and
      "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
      described in BCP&nbsp;14 <xref target="RFC2119"/>
      <xref target="RFC8174"/> when, and only when, they appear in all
      capitals, as shown here.</t>
      <dl newline="false" spacing="normal">
        <dt>In-band FEC:</dt>
        <dd>The Opus LBRR mechanism <xref target="RFC6716"/>, in which an
        Opus packet carries a lower-bitrate re-encoding of the audio of the
        previous packet, as signalled by the "useinbandfec" media type
        parameter <xref target="RFC7587"/>.</dd>
        <dt>ULPFEC:</dt>
        <dd>The RTP payload format for generic forward error correction
        <xref target="RFC5109"/>, including its uneven level protection
        (ULP) extension.</dd>
        <dt>Media packet:</dt>
        <dd>An RTP packet carrying an Opus payload.</dd>
        <dt>FEC packet:</dt>
        <dd>An RTP packet, or a RED block <xref target="RFC2198"/>,
        carrying ULPFEC data.</dd>
        <dt>Protection group:</dt>
        <dd>The set of media packets covered by one ULPFEC level of one FEC
        packet, as identified by its mask.  The group size is denoted
        k.</dd>
        <dt>Pre-repair loss:</dt>
        <dd>The fraction of media packets not received from the
        network.</dd>
        <dt>Residual (post-repair) loss:</dt>
        <dd>The fraction of media packets that could not be reconstructed
        by either mechanism and therefore required packet loss
        concealment.</dd>
      </dl>
    </section>

    <section anchor="background">
      <name>Background</name>

      <section anchor="bg-opus">
        <name>Opus In-Band FEC</name>
        <t>Opus operates in SILK-only, Hybrid, and CELT-only modes
        <xref target="RFC6716"/>.  LBRR frames are a SILK-layer feature, so
        in-band FEC is only available in SILK-only and Hybrid modes.  Audio
        coded in CELT-only mode, which encoders commonly select for music
        and for high bitrates, carries no in-band redundancy.</t>
        <t>When enabled, an Opus packet can carry an LBRR re-encoding of
        the SILK frames of the previous packet.  A decoder that has lost
        packet N but received packet N+1 can decode the LBRR data in packet
        N+1 instead of concealing the loss.  The decision to include LBRR
        data is made entirely by the encoder <xref target="RFC7587"/>; in
        the reference implementation it depends on the application enabling
        in-band FEC and on the expected packet loss rate configured by the
        application.  A receiver indicates that it can make use of in-band
        FEC with "useinbandfec=1" <xref target="RFC7587"/>; the default is
        0, and <xref target="RFC8854"/> requires WebRTC receivers that can
        use incoming FEC to signal it.</t>
        <t>Two properties matter for the combination:</t>
        <ul>
          <li>In-band FEC can only repair a loss whose following packet
          arrives.  Two consecutive losses leave the first one
          unrepairable by LBRR.  <xref target="RFC8854"/> notes this
          limitation and reports an overhead of roughly 20-30% when it is
          active.</li>
          <li>Because LBRR data is inside the Opus payload, it travels
          with the payload through any RTP element that forwards the
          payload unchanged, including encryption with SRTP
          <xref target="RFC3711"/> or end-to-end encryption with SFrame
          <xref target="RFC9605"/>.</li>
        </ul>
      </section>

      <section anchor="bg-ulpfec">
        <name>ULPFEC</name>
        <t>An ULPFEC packet carries a 10-octet FEC header and one or more
        level headers, each with a protection length and a 16- or 48-bit
        mask selecting the protected media packets relative to a base
        sequence number <xref target="RFC5109"/>.  The FEC data is the XOR
        of the protected packets' RTP header fields and of the octets
        following the fixed 12-octet RTP header, which include any CSRC
        list, header extension, and payload.  If exactly one packet of a
        protection group is missing, it can be reconstructed exactly,
        including its marker bit, timestamp, CSRCs, and header
        extensions.  RED-based redundancy <xref target="RFC2198"/> cannot
        recover these header elements <xref target="RFC8854"/>.</t>
        <t><xref target="RFC5109"/> allows FEC to be sent either as a
        separate stream with the same SSRC as the protected stream, in
        which case it recommends a separate RTP session, or as a secondary
        encoding inside RED.  The registered media type audio/ulpfec has a
        required "rate" parameter; matching the protected media's clock
        rate, 48000 for Opus <xref target="RFC7587"/>, is
        recommended.</t>
      </section>

      <section anchor="bg-compare">
        <name>Comparison</name>
        <table anchor="tab-compare">
          <name>Properties of the Two Mechanisms for Opus Audio</name>
          <thead>
            <tr><th>Property</th><th>Opus in-band FEC</th><th>ULPFEC</th></tr>
          </thead>
          <tbody>
            <tr><td>Losses repaired</td><td>Single loss followed by a received packet</td><td>One loss per protection group per level; bursts if interleaved</td></tr>
            <tr><td>Added receiver delay</td><td>One packet duration</td><td>Up to the time span of the protection group</td></tr>
            <tr><td>Fidelity of repair</td><td>Lower-bitrate approximation</td><td>Bit-exact packet, including header extensions</td></tr>
            <tr><td>Opus modes</td><td>SILK-only and Hybrid</td><td>All</td></tr>
            <tr><td>Overhead</td><td>Chosen per packet by the encoder</td><td>About 1/k of the largest protected packet, plus headers</td></tr>
            <tr><td>Survives payload-preserving forwarding</td><td>Yes</td><td>Only if sequence numbers and headers are preserved (<xref target="middleboxes"/>)</td></tr>
            <tr><td>Signalling</td><td>"useinbandfec" parameter</td><td>Separate payload type, and session or RED configuration</td></tr>
          </tbody>
        </table>
      </section>
    </section>

    <section anchor="when">
      <name>When the Combination Is Worthwhile</name>
      <t>For interactive, unicast calls with isolated losses, Opus in-band
      FEC alone (optionally supplemented with RED as recommended by
      <xref target="RFC8854"/>) is usually the better trade-off, and
      senders <bcp14>SHOULD NOT</bcp14> add ULPFEC for audio in that case.
      The combination is worth considering when one or more of the
      following holds:</t>
      <ol>
        <li><strong>Content without LBRR.</strong> The encoder is expected
        to use CELT-only mode for significant periods (for example, music
        or high-bitrate full-band audio), so in-band FEC provides no
        protection.  ULPFEC then protects those periods, and in-band FEC
        continues to protect speech periods at lower cost.</li>
        <li><strong>Burst loss.</strong> Measured losses often occur in runs
        of two or more packets (for example, on wireless or satellite
        links).  LBRR alone cannot repair the first loss of a run;
        ULPFEC with an interleaved mask can, and a packet recovered by
        ULPFEC can in turn supply LBRR data for its predecessor
        (<xref target="app-residual"/>).</li>
        <li><strong>Latency tolerance.</strong> The application's delay
        budget can absorb the span of a protection group, as in one-way
        distribution, broadcast contribution, or announcements.  Larger
        groups lower the overhead.</li>
        <li><strong>No feedback path.</strong> Multicast or unidirectional
        delivery rules out retransmission <xref target="RFC4588"/>.</li>
        <li><strong>Header recovery.</strong> The receiver depends on
        information carried in RTP header extensions or CSRC lists, such as
        audio level indications <xref target="RFC6464"/>, which in-band FEC
        and RED cannot restore.</li>
      </ol>
      <t>If none of these holds, the added overhead and delay of ULPFEC are
      unlikely to be justified for Opus audio.</t>
    </section>

    <section anchor="sender">
      <name>Sender Guidance</name>

      <section anchor="sender-enable">
        <name>Enabling and Adapting Each Mechanism</name>
        <t>As <xref target="RFC8854"/> recommends, FEC should only be
        activated when network conditions warrant it.  A sender combining
        the mechanisms <bcp14>SHOULD</bcp14> adapt them independently:</t>
        <ul>
          <li>In-band FEC is cheap to adapt because the encoder decides per
          packet.  The sender typically provides the encoder with an
          expected loss rate.  When ULPFEC is active, the loss that the
          Opus decoder experiences is the residual loss after ULPFEC
          recovery, not the network loss.  Configuring the encoder with the
          pre-repair loss rate will over-provision LBRR.  Where a
          post-repair loss estimate is available
          (<xref target="feedback"/>), the sender <bcp14>SHOULD</bcp14>
          base the encoder's expected loss rate on it.</li>
          <li>ULPFEC should be enabled only when the observed loss pattern
          matches one of the conditions in <xref target="when"/>, and
          disabled when loss subsides.  Its group size and mask are the
          main levers (<xref target="sender-params"/>).</li>
        </ul>
        <t>A sender <bcp14>SHOULD NOT</bcp14> send ULPFEC to a receiver
        that has not accepted the ULPFEC payload type in the offer/answer
        exchange <xref target="RFC3264"/>, and <bcp14>SHOULD NOT</bcp14>
        include in-band FEC data for a receiver that signalled
        "useinbandfec=0" unless it has other reasons to do so.  Any
        compliant Opus decoder ignores in-band FEC data it does not need
        <xref target="RFC7587"/>, so this is an efficiency concern, not an
        interoperability one.</t>
      </section>

      <section anchor="sender-params">
        <name>ULPFEC Parameters for Opus</name>
        <t>The following considerations apply when choosing ULPFEC
        parameters for an Opus stream:</t>
        <ul>
          <li><strong>Use a single, full-length level.</strong> ULP allows
          lower levels to protect only the first octets of each packet.
          An Opus packet is entropy-coded, and a partially recovered Opus
          packet is generally not decodable, so protecting only a prefix of
          the payload gives little benefit.  The protection length
          <bcp14>SHOULD</bcp14> cover the longest protected packet, and a
          single level is usually sufficient (see the "onelevelonly"
          parameter in <xref target="RFC5109"/>).</li>
          <li><strong>Size the group to the delay budget.</strong> A
          missing packet can only be reconstructed after the last packet of
          its group and the FEC packet have arrived.  With 20 ms packets
          and consecutive masks, a group of k=4 spans about 80 ms, and an
          interleaved arrangement that covers every second packet across
          eight packets spans about 160 ms.  For two-way conversation, the
          total one-way delay should stay within the guidance of
          <xref target="G.114"/>; a small k (2 to 4) with consecutive masks
          is typically the limit.  Latency-tolerant applications can use
          larger k and interleaving.</li>
          <li><strong>Interleave for bursts.</strong> If losses commonly
          come in pairs, masks that protect alternate packets (two FEC
          packets per eight media packets, each covering every second
          packet) let each FEC packet repair one loss of a pair at the same
          overhead as consecutive groups of four.</li>
          <li><strong>Account for variable packet size.</strong> Opus is
          usually used in variable-bitrate mode, and LBRR data increases
          the size of the packets that carry it.  An FEC packet must be as
          long as the longest packet it protects, so the actual overhead
          exceeds 1/k of the average media bitrate.  Grouping packets of
          similar size, or using smaller groups when sizes vary widely,
          reduces this effect.</li>
          <li><strong>Avoid protecting redundancy twice without
          reason.</strong> ULPFEC protects the whole payload, including
          any LBRR data it contains.  When ULPFEC is active and the loss
          pattern is mostly isolated losses, in-band FEC adds little and can
          be reduced; when the pattern is bursty, keeping both gives the
          largest benefit (<xref target="app-residual"/>).</li>
        </ul>
      </section>

      <section anchor="sender-budget">
        <name>Bitrate Budget</name>
        <t>The sender <bcp14>MUST</bcp14> keep the total of primary Opus
        bitrate, in-band FEC, ULPFEC, and packet headers within the rate
        allowed by its congestion controller (<xref target="cc"/>).  When
        FEC is enabled or increased, the primary Opus bitrate should be
        reduced to make room for it, rather than adding FEC on top of a
        rate that already fills the allowed budget.  The worked example in
        <xref target="app-overhead"/> shows that ULPFEC with k=4 adds about
        27% to the on-the-wire rate of a 32 kbit/s Opus stream with
        in-band FEC, under the stated assumptions.</t>
      </section>
    </section>

    <section anchor="receiver">
      <name>Receiver Guidance</name>

      <section anchor="receiver-order">
        <name>Recovery Order</name>
        <t>When media packet N is missing at its playout deadline, a
        receiver supporting both mechanisms <bcp14>SHOULD</bcp14> attempt
        recovery in the following order:</t>
        <ol>
          <li>ULPFEC: if an FEC packet covering N and all other packets of
          its protection group have arrived (or been recovered), reconstruct
          N exactly and decode it normally.</li>
          <li>In-band FEC: otherwise, if packet N+1 is available, whether
          received or reconstructed by ULPFEC, and contains LBRR data,
          decode the in-band FEC data from N+1 to produce audio for
          N.</li>
          <li>Concealment: otherwise, apply the Opus decoder's packet loss
          concealment.</li>
        </ol>
        <t>ULPFEC recovery comes first because it produces the original
        packet and restores its header information.  Receivers
        <bcp14>SHOULD</bcp14> run ULPFEC recovery iteratively: a packet
        recovered from one FEC packet can complete another protection group
        or provide the N+1 packet needed for in-band FEC.</t>
      </section>

      <section anchor="receiver-jb">
        <name>Jitter Buffer Interaction</name>
        <t>ULPFEC only helps if the jitter buffer holds missing packets'
        slots long enough for the FEC packet to arrive.  An adaptive jitter
        buffer that targets a delay shorter than the protection group's
        span will rarely benefit from ULPFEC and still pays its overhead.
        Receivers <bcp14>SHOULD</bcp14> take the signalled or observed
        protection span into account when choosing a target delay, or
        report to the application that ULPFEC is ineffective at the current
        delay so that the sender can be asked to reduce k.  In-band FEC
        needs only one packet duration of additional delay.</t>
        <t>A packet that is reconstructed by ULPFEC and later arrives late
        from the network is a duplicate.  Receivers <bcp14>MUST</bcp14>
        discard such duplicates and <bcp14>MUST NOT</bcp14> decode the
        same audio twice from LBRR data and from a recovered or late
        packet.</t>
      </section>

      <section anchor="receiver-stats">
        <name>Loss Accounting</name>
        <t>Receivers should keep separate counts of packets lost before
        repair, packets recovered by ULPFEC, losses covered by in-band FEC,
        and losses concealed.  Pre-repair counts are the input to congestion
        control (<xref target="cc"/>); post-repair counts are the input to
        FEC adaptation (<xref target="sender-enable"/>).  RTCP receiver
        reports <xref target="RFC3550"/> are conventionally computed from
        packets received from the network, before repair.</t>
      </section>
    </section>

    <section anchor="signalling">
      <name>Signalling</name>
      <t>The combination needs no new signalling.  Opus in-band FEC is
      indicated with "useinbandfec" <xref target="RFC7587"/>; ULPFEC is
      negotiated as its own payload type <xref target="RFC5109"/>.  Two
      configurations are possible.</t>

      <section anchor="sig-red">
        <name>ULPFEC Inside RED</name>
        <t>When media is multiplexed with BUNDLE <xref target="RFC9143"/>,
        a separate RTP session for FEC is not available.  ULPFEC can
        instead be carried as a secondary encoding inside RED
        <xref target="RFC2198"/>, as allowed by
        <xref target="RFC5109"/>.  The RED encapsulation then carries the
        Opus primary block in every packet and an ULPFEC block in the
        packets the sender chooses.  The following SDP fragment offers this
        configuration:</t>
        <sourcecode type="sdp" name="red-ulpfec-offer"><![CDATA[
m=audio 9 UDP/TLS/RTP/SAVPF 111 63 100
c=IN IP4 0.0.0.0
a=mid:a0
a=rtpmap:111 opus/48000/2
a=fmtp:111 useinbandfec=1
a=rtpmap:63 red/48000/2
a=fmtp:63 111/100
a=rtpmap:100 ulpfec/48000
]]></sourcecode>
        <t>In this configuration, implementers should be aware that RED
        adds a per-block header, and that peers which support RED for audio
        do not necessarily support ULPFEC as a RED secondary encoding for
        audio.  An answerer that does not support it removes payload type
        100 from its answer, and the sender then uses in-band FEC (and RED
        redundancy, if negotiated) alone.</t>
      </section>

      <section anchor="sig-separate">
        <name>ULPFEC as a Separate Session</name>
        <t>Outside WebRTC, ULPFEC can be sent in its own RTP session, as
        recommended by <xref target="RFC5109"/>, and associated with the
        media session using the FEC-FR grouping semantics of
        <xref target="RFC5956"/>.  The FEC stream uses the same SSRC as the
        media stream.  <xref target="RFC8854"/> advises against offering
        FEC-only "m=" lines in WebRTC; the example below is intended for
        other environments such as SIP-based or broadcast systems.</t>
        <sourcecode type="sdp" name="separate-session-offer"><![CDATA[
v=0
o=- 4858251974351650128 1 IN IP4 192.0.2.10
s=-
c=IN IP4 192.0.2.10
t=0 0
a=group:FEC-FR m1 m2
m=audio 49170 RTP/AVP 111
a=mid:m1
a=rtpmap:111 opus/48000/2
a=fmtp:111 useinbandfec=1;maxaveragebitrate=32000
m=audio 49172 RTP/AVP 100
a=mid:m2
a=rtpmap:100 ulpfec/48000
]]></sourcecode>
        <t>The "maxaveragebitrate" parameter limits the average bitrate
        of the Opus stream <xref target="RFC7587"/>.  It does not cover the
        separate FEC stream, so the sender must still account for ULPFEC
        in its overall budget (<xref target="sender-budget"/>).</t>
      </section>
    </section>

    <section anchor="middleboxes">
      <name>Middleboxes</name>
      <t>RTP topologies <xref target="RFC7667"/> affect the two mechanisms
      differently:</t>
      <ul>
        <li><strong>Selective forwarding units (SFUs).</strong> An SFU that
        forwards Opus payloads unchanged preserves in-band FEC.  ULPFEC,
        however, protects the RTP sequence number, timestamp, marker bit,
        and header extensions, and its base sequence number refers to the
        original numbering.  An SFU that rewrites sequence numbers or SSRCs,
        drops packets for a given receiver, or adds or removes header
        extensions <bcp14>MUST NOT</bcp14> forward the original ULPFEC
        packets unchanged, because receivers would reconstruct incorrect
        packets.  Such an SFU should terminate ULPFEC from the sender
        (using it to repair losses on the uplink) and, if useful, generate
        new ULPFEC per downstream receiver based on that receiver's loss
        conditions.</li>
        <li><strong>Mixers.</strong> A mixer that decodes, mixes, and
        re-encodes terminates both mechanisms.  It should apply recovery on
        each input as in <xref target="receiver-order"/> before mixing, and
        choose redundancy for each output independently.</li>
        <li><strong>End-to-end encryption.</strong> With SFrame
        <xref target="RFC9605"/>, the Opus payload, including LBRR data, is
        opaque to the SFU.  Because ULPFEC is an XOR over octets, an SFU can
        still generate and apply ULPFEC over the encrypted payloads on each
        hop without access to the media keys.</li>
      </ul>
    </section>

    <section anchor="cc">
      <name>Congestion Control Considerations</name>
      <t>FEC must not hide congestion.  <xref target="RFC9265"/> recommends
      that, from a congestion control standpoint, a packet recovered by FEC
      be treated as lost.  <xref target="RFC5109"/> requires that
      implementations not substantially increase total bandwidth as losses
      increase, and <xref target="RFC8854"/> notes that redundancy sent
      during congestion reduces the bandwidth available for the primary
      encoding and can make losses worse.  For the combination, this
      means:</t>
      <ul>
        <li>Congestion control <bcp14>MUST</bcp14> be driven by pre-repair
        loss and delay signals, not by residual loss after ULPFEC and
        in-band FEC.</li>
        <li>The combined rate of Opus (including LBRR), ULPFEC, and headers
        <bcp14>MUST</bcp14> stay within the allowed sending rate.  Under
        congestion, the sender should reduce the total rate first and then
        divide what remains between primary coding and redundancy;
        increasing redundancy in response to congestion-induced loss is
        counter-productive.</li>
        <li>Applications using RTP over UDP remain subject to the
        congestion control expectations of <xref target="RFC7587"/> and
        <xref target="RFC8085"/>, and to RTP circuit breakers
        <xref target="RFC8083"/>, which apply to the combined media and
        FEC traffic.</li>
      </ul>
      <t>Using <xref target="RFC9265"/>'s classification, both mechanisms
      as described here operate above the transport, within the rate given
      to the application by its congestion controller.</t>
    </section>

    <section anchor="feedback">
      <name>Feedback and Measurement</name>
      <t>Adapting the combination requires both pre-repair and post-repair
      loss information.  Standard RTCP receiver reports provide the former.
      The latter can be conveyed with the RTCP Extended Report blocks for
      post-repair loss run-length encoding <xref target="RFC5725"/> or for
      post-repair loss counts <xref target="RFC7509"/>.  A sender that
      receives these can tell whether ULPFEC is effective at the receiver's
      jitter buffer depth (<xref target="receiver-jb"/>) and can set the
      Opus encoder's expected loss rate from the residual loss
      (<xref target="sender-enable"/>).  Without post-repair feedback, the
      sender has to rely on models such as the one in
      <xref target="app-residual"/>, which can be substantially wrong for
      real loss patterns.</t>
    </section>

    <section anchor="dred">
      <name>Relationship to Opus Deep Redundancy (DRED)</name>
      <t>The MLCODEC Working Group is specifying a Deep Redundancy (DRED)
      extension for Opus <xref target="I-D.ietf-mlcodec-opus-dred"/>.
      DRED carries very low bitrate redundancy, covering up to a second or
      more of past audio, inside the Opus padding.  When both peers
      support it, DRED addresses much of the burst-loss case for which this
      document suggests ULPFEC, at lower overhead.  ULPFEC would remain
      relevant where bit-exact recovery, recovery of RTP header
      information, codec independence, or support for peers without DRED is
      needed.  Guidance on combining DRED with ULPFEC, and with in-band
      FEC, is left for a future revision once the DRED specification is
      stable.</t>
    </section>

    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>

    <section anchor="security">
      <name>Security Considerations</name>
      <t>Neither in-band FEC nor ULPFEC provides any security.  The
      security considerations of <xref target="RFC6716"/>,
      <xref target="RFC7587"/>, and <xref target="RFC5109"/> apply.  In
      particular:</t>
      <ul>
        <li>When SRTP <xref target="RFC3711"/> is used, FEC packets
        <bcp14>SHOULD</bcp14> receive the same confidentiality and
        integrity protection as the media packets.  An attacker able to
        inject or modify unauthenticated FEC packets can cause a receiver
        to reconstruct incorrect packets.  Receivers should apply sanity
        checks, such as length and timestamp plausibility, to recovered
        packets, as <xref target="RFC5109"/> advises.</li>
        <li>FEC recovery consumes receiver processing.  Large or numerous
        FEC packets, including ones that can never complete a group, can be
        used to increase receiver load; receivers should bound the
        processing and memory devoted to pending protection groups.</li>
        <li>Variable bitrate audio can leak information about the content
        of encrypted speech through packet sizes <xref target="RFC6562"/>.
        Whether the encoder includes LBRR data in a packet is itself
        signal-dependent and so affects packet size.  ULPFEC packet sizes
        follow the largest packet of each group.  Deployments concerned
        with this leakage should follow the guidance of
        <xref target="RFC6562"/>, for example by using constant bitrate
        coding, and should not assume that FEC traffic hides the
        pattern.</li>
      </ul>
    </section>
  </middle>

  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>

        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>

        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>

        <reference anchor="RFC2198" target="https://www.rfc-editor.org/info/rfc2198">
          <front>
            <title>RTP Payload for Redundant Audio Data</title>
            <author fullname="C. Perkins" initials="C." surname="Perkins"/>
            <author fullname="I. Kouvelas" initials="I." surname="Kouvelas"/>
            <author fullname="O. Hodson" initials="O." surname="Hodson"/>
            <author fullname="V. Hardman" initials="V." surname="Hardman"/>
            <author fullname="M. Handley" initials="M." surname="Handley"/>
            <author fullname="J.C. Bolot" initials="J.C." surname="Bolot"/>
            <author fullname="A. Vega-Garcia" initials="A." surname="Vega-Garcia"/>
            <author fullname="S. Fosse-Parisis" initials="S." surname="Fosse-Parisis"/>
            <date month="September" year="1997"/>
          </front>
          <seriesInfo name="RFC" value="2198"/>
          <seriesInfo name="DOI" value="10.17487/RFC2198"/>
        </reference>

        <reference anchor="RFC3550" target="https://www.rfc-editor.org/info/rfc3550">
          <front>
            <title>RTP: A Transport Protocol for Real-Time Applications</title>
            <author fullname="H. Schulzrinne" initials="H." surname="Schulzrinne"/>
            <author fullname="S. Casner" initials="S." surname="Casner"/>
            <author fullname="R. Frederick" initials="R." surname="Frederick"/>
            <author fullname="V. Jacobson" initials="V." surname="Jacobson"/>
            <date month="July" year="2003"/>
          </front>
          <seriesInfo name="STD" value="64"/>
          <seriesInfo name="RFC" value="3550"/>
          <seriesInfo name="DOI" value="10.17487/RFC3550"/>
        </reference>

        <reference anchor="RFC5109" target="https://www.rfc-editor.org/info/rfc5109">
          <front>
            <title>RTP Payload Format for Generic Forward Error Correction</title>
            <author fullname="A. Li" initials="A." role="editor" surname="Li"/>
            <date month="December" year="2007"/>
          </front>
          <seriesInfo name="RFC" value="5109"/>
          <seriesInfo name="DOI" value="10.17487/RFC5109"/>
        </reference>

        <reference anchor="RFC6716" target="https://www.rfc-editor.org/info/rfc6716">
          <front>
            <title>Definition of the Opus Audio Codec</title>
            <author fullname="JM. Valin" initials="JM." surname="Valin"/>
            <author fullname="K. Vos" initials="K." surname="Vos"/>
            <author fullname="T. Terriberry" initials="T." surname="Terriberry"/>
            <date month="September" year="2012"/>
          </front>
          <seriesInfo name="RFC" value="6716"/>
          <seriesInfo name="DOI" value="10.17487/RFC6716"/>
        </reference>

        <reference anchor="RFC7587" target="https://www.rfc-editor.org/info/rfc7587">
          <front>
            <title>RTP Payload Format for the Opus Speech and Audio Codec</title>
            <author fullname="J. Spittka" initials="J." surname="Spittka"/>
            <author fullname="K. Vos" initials="K." surname="Vos"/>
            <author fullname="JM. Valin" initials="JM." surname="Valin"/>
            <date month="June" year="2015"/>
          </front>
          <seriesInfo name="RFC" value="7587"/>
          <seriesInfo name="DOI" value="10.17487/RFC7587"/>
        </reference>
      </references>

      <references>
        <name>Informative References</name>

        <reference anchor="G.114">
          <front>
            <title>One-way transmission time</title>
            <author>
              <organization>ITU-T</organization>
            </author>
            <date month="May" year="2003"/>
          </front>
          <seriesInfo name="ITU-T Recommendation" value="G.114"/>
        </reference>

        <reference anchor="I-D.ietf-mlcodec-opus-dred" target="https://datatracker.ietf.org/doc/html/draft-ietf-mlcodec-opus-dred-07">
          <front>
            <title>Deep Audio Redundancy (DRED) Extension for the Opus Codec</title>
            <author fullname="Jean-Marc Valin" initials="J." surname="Valin"/>
            <author fullname="Jan Buethe" initials="J." surname="Buethe"/>
            <date day="4" month="August" year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-mlcodec-opus-dred-07"/>
          <annotation>Work in Progress.</annotation>
        </reference>

        <reference anchor="RFC3264" target="https://www.rfc-editor.org/info/rfc3264">
          <front>
            <title>An Offer/Answer Model with Session Description Protocol (SDP)</title>
            <author fullname="J. Rosenberg" initials="J." surname="Rosenberg"/>
            <author fullname="H. Schulzrinne" initials="H." surname="Schulzrinne"/>
            <date month="June" year="2002"/>
          </front>
          <seriesInfo name="RFC" value="3264"/>
          <seriesInfo name="DOI" value="10.17487/RFC3264"/>
        </reference>

        <reference anchor="RFC3711" target="https://www.rfc-editor.org/info/rfc3711">
          <front>
            <title>The Secure Real-time Transport Protocol (SRTP)</title>
            <author fullname="M. Baugher" initials="M." surname="Baugher"/>
            <author fullname="D. McGrew" initials="D." surname="McGrew"/>
            <author fullname="M. Naslund" initials="M." surname="Naslund"/>
            <author fullname="E. Carrara" initials="E." surname="Carrara"/>
            <author fullname="K. Norrman" initials="K." surname="Norrman"/>
            <date month="March" year="2004"/>
          </front>
          <seriesInfo name="RFC" value="3711"/>
          <seriesInfo name="DOI" value="10.17487/RFC3711"/>
        </reference>

        <reference anchor="RFC4588" target="https://www.rfc-editor.org/info/rfc4588">
          <front>
            <title>RTP Retransmission Payload Format</title>
            <author fullname="J. Rey" initials="J." surname="Rey"/>
            <author fullname="D. Leon" initials="D." surname="Leon"/>
            <author fullname="A. Miyazaki" initials="A." surname="Miyazaki"/>
            <author fullname="V. Varsa" initials="V." surname="Varsa"/>
            <author fullname="R. Hakenberg" initials="R." surname="Hakenberg"/>
            <date month="July" year="2006"/>
          </front>
          <seriesInfo name="RFC" value="4588"/>
          <seriesInfo name="DOI" value="10.17487/RFC4588"/>
        </reference>

        <reference anchor="RFC5725" target="https://www.rfc-editor.org/info/rfc5725">
          <front>
            <title>Post-Repair Loss RLE Report Block Type for RTP Control Protocol (RTCP) Extended Reports (XRs)</title>
            <author fullname="A. Begen" initials="A." surname="Begen"/>
            <author fullname="D. Hsu" initials="D." surname="Hsu"/>
            <author fullname="M. Lague" initials="M." surname="Lague"/>
            <date month="February" year="2010"/>
          </front>
          <seriesInfo name="RFC" value="5725"/>
          <seriesInfo name="DOI" value="10.17487/RFC5725"/>
        </reference>

        <reference anchor="RFC5956" target="https://www.rfc-editor.org/info/rfc5956">
          <front>
            <title>Forward Error Correction Grouping Semantics in the Session Description Protocol</title>
            <author fullname="A. Begen" initials="A." surname="Begen"/>
            <date month="September" year="2010"/>
          </front>
          <seriesInfo name="RFC" value="5956"/>
          <seriesInfo name="DOI" value="10.17487/RFC5956"/>
        </reference>

        <reference anchor="RFC6464" target="https://www.rfc-editor.org/info/rfc6464">
          <front>
            <title>A Real-time Transport Protocol (RTP) Header Extension for Client-to-Mixer Audio Level Indication</title>
            <author fullname="J. Lennox" initials="J." role="editor" surname="Lennox"/>
            <author fullname="E. Ivov" initials="E." surname="Ivov"/>
            <author fullname="E. Marocco" initials="E." surname="Marocco"/>
            <date month="December" year="2011"/>
          </front>
          <seriesInfo name="RFC" value="6464"/>
          <seriesInfo name="DOI" value="10.17487/RFC6464"/>
        </reference>

        <reference anchor="RFC6562" target="https://www.rfc-editor.org/info/rfc6562">
          <front>
            <title>Guidelines for the Use of Variable Bit Rate Audio with Secure RTP</title>
            <author fullname="C. Perkins" initials="C." surname="Perkins"/>
            <author fullname="JM. Valin" initials="JM." surname="Valin"/>
            <date month="March" year="2012"/>
          </front>
          <seriesInfo name="RFC" value="6562"/>
          <seriesInfo name="DOI" value="10.17487/RFC6562"/>
        </reference>

        <reference anchor="RFC7509" target="https://www.rfc-editor.org/info/rfc7509">
          <front>
            <title>RTP Control Protocol (RTCP) Extended Report (XR) for Post-Repair Loss Count Metrics</title>
            <author fullname="R. Huang" initials="R." surname="Huang"/>
            <author fullname="V. Singh" initials="V." surname="Singh"/>
            <date month="May" year="2015"/>
          </front>
          <seriesInfo name="RFC" value="7509"/>
          <seriesInfo name="DOI" value="10.17487/RFC7509"/>
        </reference>

        <reference anchor="RFC7667" target="https://www.rfc-editor.org/info/rfc7667">
          <front>
            <title>RTP Topologies</title>
            <author fullname="M. Westerlund" initials="M." surname="Westerlund"/>
            <author fullname="S. Wenger" initials="S." surname="Wenger"/>
            <date month="November" year="2015"/>
          </front>
          <seriesInfo name="RFC" value="7667"/>
          <seriesInfo name="DOI" value="10.17487/RFC7667"/>
        </reference>

        <reference anchor="RFC8083" target="https://www.rfc-editor.org/info/rfc8083">
          <front>
            <title>Multimedia Congestion Control: Circuit Breakers for Unicast RTP Sessions</title>
            <author fullname="C. Perkins" initials="C." surname="Perkins"/>
            <author fullname="V. Singh" initials="V." surname="Singh"/>
            <date month="March" year="2017"/>
          </front>
          <seriesInfo name="RFC" value="8083"/>
          <seriesInfo name="DOI" value="10.17487/RFC8083"/>
        </reference>

        <reference anchor="RFC8085" target="https://www.rfc-editor.org/info/rfc8085">
          <front>
            <title>UDP Usage Guidelines</title>
            <author fullname="L. Eggert" initials="L." surname="Eggert"/>
            <author fullname="G. Fairhurst" initials="G." surname="Fairhurst"/>
            <author fullname="G. Shepherd" initials="G." surname="Shepherd"/>
            <date month="March" year="2017"/>
          </front>
          <seriesInfo name="BCP" value="145"/>
          <seriesInfo name="RFC" value="8085"/>
          <seriesInfo name="DOI" value="10.17487/RFC8085"/>
        </reference>

        <reference anchor="RFC8627" target="https://www.rfc-editor.org/info/rfc8627">
          <front>
            <title>RTP Payload Format for Flexible Forward Error Correction (FEC)</title>
            <author fullname="M. Zanaty" initials="M." surname="Zanaty"/>
            <author fullname="V. Singh" initials="V." surname="Singh"/>
            <author fullname="A. Begen" initials="A." surname="Begen"/>
            <author fullname="G. Mandyam" initials="G." surname="Mandyam"/>
            <date month="July" year="2019"/>
          </front>
          <seriesInfo name="RFC" value="8627"/>
          <seriesInfo name="DOI" value="10.17487/RFC8627"/>
        </reference>

        <reference anchor="RFC8854" target="https://www.rfc-editor.org/info/rfc8854">
          <front>
            <title>WebRTC Forward Error Correction Requirements</title>
            <author fullname="J. Uberti" initials="J." surname="Uberti"/>
            <date month="January" year="2021"/>
          </front>
          <seriesInfo name="RFC" value="8854"/>
          <seriesInfo name="DOI" value="10.17487/RFC8854"/>
        </reference>

        <reference anchor="RFC9143" target="https://www.rfc-editor.org/info/rfc9143">
          <front>
            <title>Negotiating Media Multiplexing Using the Session Description Protocol (SDP)</title>
            <author fullname="C. Holmberg" initials="C." surname="Holmberg"/>
            <author fullname="H. Alvestrand" initials="H." surname="Alvestrand"/>
            <author fullname="C. Jennings" initials="C." surname="Jennings"/>
            <date month="February" year="2022"/>
          </front>
          <seriesInfo name="RFC" value="9143"/>
          <seriesInfo name="DOI" value="10.17487/RFC9143"/>
        </reference>

        <reference anchor="RFC9265" target="https://www.rfc-editor.org/info/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"/>
          </front>
          <seriesInfo name="RFC" value="9265"/>
          <seriesInfo name="DOI" value="10.17487/RFC9265"/>
        </reference>

        <reference anchor="RFC9605" target="https://www.rfc-editor.org/info/rfc9605">
          <front>
            <title>Secure Frame (SFrame): Lightweight Authenticated Encryption for Real-Time Media</title>
            <author fullname="E. Omara" initials="E." surname="Omara"/>
            <author fullname="J. Uberti" initials="J." surname="Uberti"/>
            <author fullname="S. G. Murillo" initials="S. G." surname="Murillo"/>
            <author fullname="R. Barnes" initials="R." role="editor" surname="Barnes"/>
            <author fullname="Y. Fablet" initials="Y." surname="Fablet"/>
            <date month="August" year="2024"/>
          </front>
          <seriesInfo name="RFC" value="9605"/>
          <seriesInfo name="DOI" value="10.17487/RFC9605"/>
        </reference>
      </references>
    </references>

    <section anchor="app-overhead">
      <name>Worked Overhead Example</name>
      <t>This example illustrates the bitrate cost of each mechanism for a
      single stream.  Assumptions: Opus at 32 kbit/s with 20 ms packets
      (80 octets of payload per packet, 50 packets per second); in-band FEC
      adding 25% to the payload when active (20 octets), the midpoint of the
      range reported in <xref target="RFC8854"/>; IPv4 and UDP headers (28
      octets), RTP fixed header (12 octets), and a 10-octet SRTP
      authentication tag; ULPFEC sent as a separate stream with one FEC
      packet per four media packets (k=4), one 4-octet level header, and a
      protection length equal to the 100-octet media payload.</t>
      <table anchor="tab-overhead">
        <name>Illustrative On-the-Wire Bitrates</name>
        <thead>
          <tr><th>Configuration</th><th>Packet size (octets)</th><th>Packets/s</th><th>Rate (kbit/s)</th></tr>
        </thead>
        <tbody>
          <tr><td>Opus only</td><td>130</td><td>50</td><td>52.0</td></tr>
          <tr><td>Opus with in-band FEC</td><td>150</td><td>50</td><td>60.0</td></tr>
          <tr><td>ULPFEC stream, k=4</td><td>164</td><td>12.5</td><td>16.4</td></tr>
          <tr><td>Opus with in-band FEC and ULPFEC, k=4</td><td>-</td><td>62.5</td><td>76.4</td></tr>
        </tbody>
      </table>
      <t>With k=2 the ULPFEC stream would cost 32.8 kbit/s, bringing the
      total to 92.8 kbit/s.  Real overhead depends on Opus packet-size
      variation (<xref target="sender-params"/>), on IPv6 (20 additional
      octets per packet), and on RED encapsulation if used.</t>
    </section>

    <section anchor="app-residual">
      <name>Illustrative Residual Loss</name>
      <t>The following table gives residual loss from a simple simulation,
      to show the qualitative behaviour of each mechanism.  It is not a
      performance claim.  Assumptions: 20 ms packets; in-band FEC present in
      every media packet and able to repair packet N whenever packet N+1 is
      available; ULPFEC with one FEC packet per four media packets, either
      consecutive (k=4) or interleaved (two FEC packets per eight media
      packets, each covering every second packet); FEC packets subject to
      the same loss process as media packets; losses generated by a
      two-state Gilbert model with the stated average loss and mean burst
      length, where a mean burst length of 1 means independent losses;
      400,000 media packets per run.  Receivers apply ULPFEC first and then
      in-band FEC, as in <xref target="receiver-order"/>.  Values are
      residual loss in percent.</t>
      <table anchor="tab-residual">
        <name>Simulated Residual Loss (%)</name>
        <thead>
          <tr><th>Mean burst</th><th>Network loss</th><th>None</th><th>In-band FEC</th><th>ULPFEC k=4</th><th>Both, k=4</th><th>ULPFEC interleaved</th><th>Both, interleaved</th></tr>
        </thead>
        <tbody>
          <tr><td>1</td><td>2%</td><td>1.99</td><td>0.04</td><td>0.15</td><td>0.03</td><td>0.15</td><td>0.00</td></tr>
          <tr><td>1</td><td>5%</td><td>4.97</td><td>0.24</td><td>0.92</td><td>0.18</td><td>0.93</td><td>0.01</td></tr>
          <tr><td>1</td><td>10%</td><td>9.98</td><td>0.99</td><td>3.39</td><td>0.77</td><td>3.43</td><td>0.12</td></tr>
          <tr><td>1</td><td>20%</td><td>20.04</td><td>4.02</td><td>11.81</td><td>3.35</td><td>11.90</td><td>1.38</td></tr>
          <tr><td>2</td><td>2%</td><td>1.96</td><td>0.97</td><td>1.35</td><td>0.78</td><td>0.81</td><td>0.33</td></tr>
          <tr><td>2</td><td>5%</td><td>5.02</td><td>2.49</td><td>3.53</td><td>2.03</td><td>2.27</td><td>0.89</td></tr>
          <tr><td>2</td><td>10%</td><td>9.92</td><td>4.93</td><td>7.22</td><td>4.07</td><td>5.16</td><td>1.99</td></tr>
          <tr><td>2</td><td>20%</td><td>19.91</td><td>9.92</td><td>15.33</td><td>8.37</td><td>12.96</td><td>5.08</td></tr>
        </tbody>
      </table>
      <t>Under these assumptions, in-band FEC alone is very effective
      against independent losses, and adding consecutive ULPFEC improves on
      it only modestly; interleaving helps even here, because two
      adjacent losses then fall into different protection groups.  With
      bursts, in-band FEC alone halves the loss at
      best, while interleaved ULPFEC combined with in-band FEC reduces it
      several-fold, because ULPFEC breaks up bursts and the packets it
      recovers then supply LBRR data for their predecessors.  The
      interleaved arrangement doubles the recovery delay
      (<xref target="sender-params"/>).  Real in-band FEC is not present in
      every packet, is absent in CELT-only mode, and repairs at lower
      fidelity, so measurements with real encoders and loss traces are
      needed before drawing quantitative conclusions.</t>
    </section>

    <section anchor="acks" numbered="false">
      <name>Acknowledgments</name>
      <t>This document builds on the analysis of FEC for WebRTC in
      <xref target="RFC8854"/> and on the FEC and congestion control
      guidance of <xref target="RFC9265"/>.</t>
    </section>
  </back>
</rfc>
