<?xml version='1.0' encoding='UTF-8'?>
<rfc version="3" docName="draft-li-inference-transmission-optimization-00" category="std" consensus="true" submissionType="IETF" ipr="trust200902" tocInclude="true" tocDepth="3" sortRefs="true" symRefs="true" xml:lang="en">

  <front>
    <title abbrev="RDCC for Inference Incast">Receiver-Driven Credit Control (RDCC) for Many-to-One Traffic in Distributed Inference Networks</title>
    <seriesInfo name="Internet-Draft" value="draft-li-inference-transmission-optimization-00"/>

    <author fullname="Zhiqiang Li" initials="Z." surname="Li">
      <organization>China Mobile</organization>
      <address>
        <postal><city>Beijing</city><code>100053</code>
        <country>China</country></postal>
        <email>lizhiqiangyjy@chinamobile.com</email>
      </address>
    </author>
    <author fullname="Zongpeng Du" initials="Z." surname="Du">
      <organization>China Mobile</organization>
      <address>
        <postal><city>Beijing</city><code>100053</code>
        <country>China</country></postal>
        <email>duzongpeng@chinamobile.com</email>
      </address>
    </author>
    <author fullname="Junjie Wang" initials="J." surname="Wang">
      <organization>Centec</organization>
      <address>
        <postal><city>Shanghai</city><code>201203</code>
        <country>China</country></postal>
        <email>wangjj@centec.com</email>
      </address>
    </author>
    <author fullname="Wei Cheng" initials="W." surname="Cheng">
      <organization>Centec</organization>
      <address>
        <postal><city>Shanghai</city><code>201203</code>
        <country>China</country></postal>
        <email>chengw@centec.com</email>
      </address>
    </author>
    <author fullname="Ying Zhao" initials="Y." surname="Zhao">
      <organization>Centec</organization>
      <address>
        <postal><city>Shanghai</city><code>200000</code>
        <country>China</country></postal>
        <email>zhaoying@centec.com</email>
      </address>
    </author>
    <author fullname="Chunhao Zhao" initials="C." surname="Zhao">
      <organization>SAIA</organization>
      <address>
        <postal><city>Shanghai</city><code>200125</code>
        <country>China</country></postal>
        <email>chunhao.zhao@sh-aia.com</email>
      </address>
    </author>
    <author fullname="Xun Sun" initials="X." surname="Sun">
      <organization>Inesa</organization>
      <address>
        <postal><city>Shanghai</city><code>200030</code>
        <country>China</country></postal>
        <email>sunxun@inesa.com</email>
      </address>
    </author>

    <date year="2026" month="November" day="2"/>
    <area>Web and Internet Transport</area>
    <keyword>incast</keyword>
    <keyword>receiver-driven</keyword>
    <keyword>credit</keyword>
    <keyword>congestion control</keyword>
    <keyword>all-to-all</keyword>
    <keyword>distributed inference</keyword>
    <keyword>limited domain</keyword>

    <abstract>
      <t>Expert-parallel and disaggregated (prefill/decode) inference
      deployments generate many-to-one ("incast") traffic in which many
      senders transmit to one receiver at the same time.  Mitigations based
      on priority queues, enlarged switch buffers, and disabled Explicit
      Congestion Notification (ECN) marking stop scaling when the
      bandwidth-delay product of the network grows.  This document
      specifies Receiver-Driven Credit Control (RDCC), a UDP-based
      signaling protocol with which a receiver bounds the volume of data
      that all senders may have in flight toward it.  RDCC defines a
      receiver credit budget, a bounded unscheduled first window for short
      messages, cumulative per-message and class-weighted credit grants,
      sender backlog indications with suggested credit rates, and optional
      congestion reports from on-path nodes.  RDCC operates within a
      limited domain, complements the congestion control of the data
      transport, and does not change the format of data packets.</t>
    </abstract>
  </front>

  <middle>

    <section anchor="intro">
      <name>Introduction</name>

      <section anchor="problem">
        <name>Problem Statement</name>
        <t>In Mixture-of-Experts (MoE) inference with Expert Parallelism
        (EP), the dispatch and combine phases of every layer perform an
        all-to-all exchange among the expert-hosting accelerators.  In
        prefill/decode disaggregated serving, the key-value (KV) cache
        produced by prefill instances is moved to decode instances.  Both
        patterns frequently make several senders target the same receiver
        within a few microseconds.  For example, when four accelerators on
        each of two servers send to one accelerator on a third server, eight
        flows converge on one receiver port (an 8-to-1 incast).  Collective
        library optimizations that aggregate traffic inside a server reduce
        the fan-in but do not remove it <xref target="I-D.li-tsvwg-inference-transport"/>.</t>

        <t>Deployed mitigations fall into three groups: (1) placing
        all-to-all traffic into a dedicated high-priority queue; (2)
        reserving more buffer and a larger bandwidth share for that queue in
        network interface cards (NICs) and switches; and (3) disabling ECN
        marking on that queue so that rate-based congestion control such as
        DCQCN <xref target="DCQCN"/> does not react to micro-bursts.  The
        buffer needed by (2) grows with the bandwidth-delay product (BDP).
        Across long-distance or multi-tier fabrics the required buffer
        exceeds what switches provide, and (3) then converts congestion
        into loss or, with Priority-based Flow Control (PFC)
        <xref target="IEEE802.1Qbb"/>, into head-of-line blocking that
        spreads beyond the congested port.  A large standing buffer also
        adds queueing delay to every message, which directly lengthens the
        time per output token of the inference service.</t>

        <t>The receiver is the only point that observes all of the demand
        converging on its access link.  A receiver-driven scheme lets that
        receiver admit data at the rate its link and buffers can absorb,
        before the data enters the network.  Receiver-driven transports have
        been explored in research systems such as NDP <xref target="NDP"/>
        and Homa <xref target="HOMA"/>, and in industry specifications
        <xref target="UEC"/>, but no IETF protocol provides an interoperable
        way for independently implemented senders, receivers, and network
        nodes to exchange credit and congestion information for this
        traffic.</t>
      </section>

      <section anchor="overview">
        <name>Protocol Overview</name>
        <t>RDCC separates admission from transmission.  Data continues to be
        carried by an existing message transport, for example RDMA over
        Converged Ethernet version 2 (RoCEv2) or a UDP-based message
        transport.  RDCC adds a control channel, carried in UDP, over which
        the receiver tells each sender how many octets of each message it
        may transmit and at what rate.  The main elements are:</t>
        <ul>
          <li>a receiver credit budget G that bounds the octets granted but
          not yet received across all senders (<xref target="budget"/>);</li>
          <li>a bounded unscheduled first window that lets messages no
          larger than the Unscheduled Limit U start without a round trip,
          spread by a random start delay (<xref target="unscheduled"/>);</li>
          <li>cumulative, idempotent credit grants per message or per
          sender pool, with an explicit lifetime
          (<xref target="grants"/>);</li>
          <li>class-weighted division of pool credit and the associated
          Differentiated Services marking (<xref target="classes"/>);</li>
          <li>sender backlog indications and suggested credit rates, which
          let a sender that receives credit from many receivers steer the
          receivers toward its own bottleneck rate
          (<xref target="sender-status"/>); and</li>
          <li>optional congestion reports from on-path nodes whose queue
          exceeds a threshold (<xref target="crn"/>).</li>
        </ul>
      </section>

      <section anchor="scope">
        <name>Scope and Applicability</name>
        <t>RDCC is designed for limited domains <xref target="RFC8799"/>
        such as an inference data center or a set of data centers under a
        single administration, connected by a network whose configuration
        (Differentiated Services Code Points, ECN, queue thresholds) is
        known to the operator.  RDCC <bcp14>MUST NOT</bcp14> be used across the general
        Internet.</t>
        <t>RDCC does not replace the congestion control of the data
        transport.  A sender transmits no faster than the smaller of the
        rate allowed by its transport congestion control and the rate
        granted by RDCC (<xref target="cc"/>).  RDCC does not define data
        packet formats, does not require changes to switch forwarding
        hardware, and does not depend on PFC.  Queue configuration, credit
        allocation algorithms beyond the invariants of this document, and
        the means by which applications divide traffic into messages are
        local matters.</t>
      </section>

      <section anchor="related">
        <name>Relationship to Other Work</name>
        <t><xref target="I-D.li-tsvwg-inference-transport"/> describes
        transport considerations for distributed inference networks and
        defines no protocol elements; RDCC is one protocol that addresses
        the incast consideration identified there.
        <xref target="I-D.hu-rtgwg-cbfc-rsvp"/> reserves credit hop by hop
        with RSVP for RDMA across a wide-area network; RDCC is end-to-end,
        signals per message, and needs no per-flow state in routers.  The
        Dynamic Link Exchange Protocol credit extensions
        <xref target="I-D.ietf-manet-dlep-credit-flow-control"/> govern a
        single radio link between a router and a modem.
        <xref target="I-D.tayyebi-fcl-dcop-gtl"/> allocates transmission
        authority from a global ledger for training fabrics, whereas RDCC
        keeps authority at each receiver.  Fast network event notification
        for AI fabrics is being studied in
        <xref target="I-D.sang-fann-fast-network-event-notification"/>; the
        on-path report of <xref target="crn"/> could be carried by such a
        mechanism once one is specified.</t>
      </section>
    </section>

    <section anchor="conventions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>",
      "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
      NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>",
      "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
      "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document
      are to be interpreted as described in BCP 14
      <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only
      when, they appear in all capitals, as shown here.</t>
      <dl newline="false" spacing="normal">
        <dt>Message:</dt>
        <dd>An application data unit of known length that the sender hands
        to the data transport as one unit, identified within an association
        by a 64-bit Message ID.</dd>
        <dt>Sender, Receiver:</dt>
        <dd>The endpoints that transmit and receive messages.  A host can be
        both.</dd>
        <dt>Association:</dt>
        <dd>The RDCC state shared by one sender and one receiver, identified
        by an Association ID chosen by the receiver.</dd>
        <dt>Credit:</dt>
        <dd>Permission, issued by a receiver, to transmit a number of
        octets.  Credit is expressed as a cumulative octet offset.</dd>
        <dt>Credit Budget (G):</dt>
        <dd>The maximum number of octets that a receiver has granted, across
        all associations, and not yet received or reclaimed.</dd>
        <dt>Unscheduled Limit (U):</dt>
        <dd>The number of octets of a message that a sender may transmit
        before receiving credit for it.</dd>
        <dt>Start Jitter Limit (J):</dt>
        <dd>The upper bound of the random delay that a sender applies before
        an unscheduled transmission.</dd>
        <dt>Backlog Threshold (N_cu):</dt>
        <dd>The amount of granted but untransmitted credit above which a
        sender reports its own congestion.</dd>
        <dt>Queue Threshold (B_th):</dt>
        <dd>The queue occupancy above which a Congestion Reporting Node
        emits reports.</dd>
        <dt>Congestion Reporting Node (CRN):</dt>
        <dd>An on-path switch or router that implements
        <xref target="crn"/>.</dd>
        <dt>Traffic Class:</dt>
        <dd>One of eight sender-local priority classes (0..7) that share the
        credit of a pool grant according to weights.</dd>
      </dl>
      <t>All multi-octet fields are transmitted in network byte order.
      Rates are expressed in megabits per second (Mbit/s) and durations in
      microseconds unless stated otherwise.</t>
    </section>

    <section anchor="architecture">
      <name>Architecture</name>
      <t><xref target="fig-arch"/> shows the roles.  Control messages travel
      in UDP between sender and receiver.  A CRN observes data packets in
      its queues and, when a queue exceeds B_th, sends a report either
      toward the receiver (for credit-scheduled traffic) or toward the
      sender (for unscheduled traffic).</t>
      <figure anchor="fig-arch">
        <name>RDCC Roles and Signaling Paths</name>
        <artwork type="ascii-art">
 +----------+
 | Sender 1 |---+   data (existing transport)
 +----------+   |     +-------+         +----------+
                +----&gt;|       |--------&gt;|          |
 +----------+         |  CRN  |         | Receiver |
 | Sender 2 |--------&gt;|       |--------&gt;|          |
 +----------+         +-------+         +----------+

 RDCC control messages (UDP, RDCC port):
   Sender   -&gt; Receiver : ASSOC_REQUEST, CREDIT_REQUEST,
                          SENDER_STATUS, CREDIT_RETURN, CANCEL
   Receiver -&gt; Sender   : ASSOC_ACCEPT, CREDIT_GRANT, MSG_DONE,
                          CANCEL, ERROR
   CRN      -&gt; Receiver : CONGESTION_REPORT (scheduled traffic)
   CRN      -&gt; Sender   : CONGESTION_REPORT (unscheduled traffic)
</artwork>
      </figure>
      <t>A receiver keeps, for each association, the cumulative credit it
      has granted for each message and the number of octets it has
      received.  A sender keeps, for each message, the cumulative credit it
      holds and the number of octets it has transmitted.  Every grant
      restates a cumulative offset, and stale or duplicated control
      messages are discarded by sequence number
      (<xref target="common-header"/>), so loss, duplication, or
      reordering of control messages never causes a sender to exceed the
      credit that the receiver intended to issue.</t>
      <t>The receiver relates arriving data to messages through a transport
      binding (<xref target="binding"/>): each CREDIT_REQUEST names the
      transport-level identity of the message, so that the receiver can
      count the octets received for it from the information its transport
      already provides, without any change to data packets.</t>
    </section>

    <section anchor="operation">
      <name>Protocol Operation</name>

      <section anchor="association">
        <name>Association Establishment</name>
        <t>Before sending messages under RDCC, a sender sends ASSOC_REQUEST
        to the receiver's RDCC port, carrying a 64-bit random Sender Nonce,
        its capabilities, and its line rate.  The receiver answers with
        ASSOC_ACCEPT, which echoes the nonce and assigns a non-zero
        Association ID and the receiver's current Epoch.  ASSOC_ACCEPT also
        carries the operating parameters of the association: U, J, N_cu,
        the default Grant Lifetime, and the Credit Unit.  A receiver that
        cannot admit a new association answers with ERROR (reason
        ASSOC_REFUSED).</t>
        <t>The sender retransmits ASSOC_REQUEST with exponential backoff,
        starting at 1 ms and doubling, for at most eight attempts; if none is
        answered, the sender concludes that the receiver does not support
        RDCC and sends without it.  A receiver <bcp14>MUST</bcp14> treat a retransmitted
        ASSOC_REQUEST with the same nonce as idempotent and return the same
        Association ID.  The Sender Nonce <bcp14>MUST</bcp14> be generated by a
        cryptographically secure random number generator; it binds the
        response to the request and prevents off-path injection of
        ASSOC_ACCEPT.  The receiver sends all messages of the association to
        the address and port from which the accepted ASSOC_REQUEST came.</t>
        <t>A receiver changes the parameters of an existing association by
        sending ASSOC_ACCEPT with the Parameter Update flag.  The sender
        acknowledges it by sending ASSOC_REQUEST with the same Sender Nonce
        and the Update Acknowledgment flag; the receiver retransmits the
        update with exponential backoff until it is acknowledged.  Until
        then, the sender may still act on the old parameters, so the receiver
        accounts for it with the larger of the old and new U.</t>
        <t>The Epoch identifies an incarnation of the receiver's RDCC state.
        A receiver that loses its state (for example, after a restart) <bcp14>MUST</bcp14>
        use a different Epoch.  A sender accepts a new Epoch only from an
        ASSOC_ACCEPT that echoes its current Sender Nonce.  A sender that
        receives ERROR (UNKNOWN_ASSOCIATION) carrying its Association ID
        <bcp14>MUST</bcp14> discard all credit held for that association, re-establish
        it, and request credit again for its pending messages.  Messages
        from CRNs carry no Epoch and do not affect associations.</t>
        <t>Associations are kept alive by data and control traffic.  A
        receiver <bcp14>MAY</bcp14> remove an association that has carried no traffic for
        a locally configured idle time, which <bcp14>SHOULD</bcp14> be at least 10 seconds;
        it reclaims all credit of that association when doing so.</t>
      </section>

      <section anchor="mode">
        <name>Transmission Mode Selection</name>
        <t>For each new message the sender selects one of two modes:</t>
        <dl newline="false">
          <dt>Unscheduled mode:</dt>
          <dd>If the message length is less than or equal to U, the sender
          <bcp14>MAY</bcp14> transmit the whole message without waiting for credit, subject
          to <xref target="unscheduled"/>.</dd>
          <dt>Scheduled mode:</dt>
          <dd>Otherwise, the sender <bcp14>MUST</bcp14> send CREDIT_REQUEST and <bcp14>MUST NOT</bcp14>
          transmit any octet of the message until it holds credit for that
          octet.</dd>
        </dl>
        <t>A sender <bcp14>MAY</bcp14> use scheduled mode for any message.  U is advertised
        per association, so the receiver alone decides how much
        unscheduled data each sender may inject.  A receiver that advertises
        U = 0 disables unscheduled mode for that association.</t>
      </section>

      <section anchor="unscheduled">
        <name>Unscheduled Transmission</name>
        <t>A sender using unscheduled mode:</t>
        <ol>
          <li><bcp14>MUST</bcp14> delay the first transmission by a random duration drawn
          uniformly from [0, J] microseconds, so that senders reacting to the
          same application event do not start simultaneously;</li>
          <li><bcp14>MUST</bcp14> send a CREDIT_REQUEST for the message no later than the
          first data packet, with the Unscheduled Sent field set to the
          message length, so that the receiver can account for the
          octets;</li>
          <li><bcp14>MUST NOT</bcp14> have more than one unscheduled message outstanding on
          an association; an unscheduled message stops being outstanding
          when the sender receives MSG_DONE or a CREDIT_GRANT for it;</li>
          <li><bcp14>MUST</bcp14> mark the data packets with the Differentiated Services
          Code Point (DSCP) <xref target="RFC2474"/> that the domain
          configures for unscheduled RDCC traffic, if one is configured;
          and</li>
          <li><bcp14>MUST</bcp14> stop unscheduled transmission and convert the remainder of
          the message to scheduled mode upon receiving a CONGESTION_REPORT
          addressed to it, or a link-layer pause indication if the local
          interface supports PFC.</li>
        </ol>
        <t>The receiver accounts each unscheduled message against a portion
        G_u of its budget (<xref target="budget"/>).  The receiver <bcp14>MUST</bcp14>
        choose U for each association so that the sum of U over all
        associations with a non-zero U does not exceed G_u; because each
        association can have only one unscheduled message outstanding, this
        bounds all unscheduled data in flight.  A sender that converts an
        unscheduled message to scheduled mode sends a new CREDIT_REQUEST
        whose Unscheduled Sent field states the octets actually transmitted.
        The receiver releases the unscheduled reservation of a message when
        the announced octets have arrived, or when J plus the default Grant
        Lifetime plus 2 * D_max (<xref target="budget"/>) has elapsed after
        it received the CREDIT_REQUEST.</t>
      </section>

      <section anchor="grants">
        <name>Credit Requests and Grants</name>
        <t>CREDIT_REQUEST announces a message: its Message ID, total length,
        the number of octets already sent in unscheduled mode, its Traffic
        Class and weight, a Service Hint, its transport binding, and an
        optional deadline.  Message IDs <bcp14>MUST</bcp14> increase with each new message
        of an association and <bcp14>MUST NOT</bcp14> be reused within it.  The
        sender retransmits CREDIT_REQUEST if it holds no credit for the
        message after a request timeout, initially twice the smoothed
        round-trip time and at least 100 microseconds, doubling on each
        retransmission up to 100 ms.</t>
        <t>CREDIT_GRANT carries a Grant Limit, the cumulative octet offset
        (exclusive) up to which the sender may transmit, a Pacing Rate, and
        a Lifetime.  The following rules apply:</t>
        <ol>
          <li>A grant with a Grant Limit that is not larger than the limit
          the sender already holds for that message only refreshes the
          Lifetime and Pacing Rate; it never reduces credit.</li>
          <li>The sender <bcp14>MUST NOT</bcp14> transmit an octet at offset o of a message
          unless o is smaller than the Grant Limit held for that message, or
          the octet is part of the unscheduled window permitted by
          <xref target="unscheduled"/>.</li>
          <li>The sender <bcp14>MUST NOT</bcp14> transmit under a grant after the Lifetime
          of that grant has elapsed, measured from its reception.  It sends
          a new CREDIT_REQUEST to obtain fresh credit.</li>
          <li>The sender <bcp14>MUST NOT</bcp14> transmit the message faster than the
          Pacing Rate, averaged over any interval equal to the transmission
          time of ten Credit Units at that rate.  Receivers <bcp14>MUST</bcp14> issue a
          non-zero Pacing Rate.</li>
          <li>The receiver <bcp14>MUST NOT</bcp14> grant beyond the message length.  It sets
          the FINAL flag in the grant that reaches the message length.</li>
        </ol>
        <t>A grant with Message ID zero and the POOL flag set is a pool
        grant: it covers all scheduled messages of the association, and the
        Grant Limit counts octets across those messages.  Pool grants allow
        a sender to divide credit among its messages according to
        <xref target="classes"/> without a round trip per message.  A
        receiver <bcp14>MUST NOT</bcp14> use pool grants with a sender that did not
        advertise the POOL capability.</t>
        <t>When the receiver has received all octets of a message it sends
        MSG_DONE.  The sender <bcp14>MAY</bcp14> abandon a message by sending CANCEL; the
        receiver then reclaims the outstanding credit of the message after
        the reclamation delay of <xref target="budget"/>.  A sender that
        will not use credit it holds <bcp14>SHOULD</bcp14> return it with CREDIT_RETURN,
        which states the offset beyond which the sender will not
        transmit.</t>
      </section>

      <section anchor="budget">
        <name>Receiver Credit Budget</name>
        <t>For each association a, let Granted(a) be the sum, over the
        scheduled messages of a, of the Grant Limit issued minus the octets
        received, and let Unsched(a) be the unscheduled octets announced but
        not yet received.  A receiver <bcp14>MUST</bcp14> maintain:</t>
        <artwork>
   sum over a of ( Granted(a) + Unsched(a) )  &lt;=  G
</artwork>
        <t>G is divided into a scheduled part G_s and an unscheduled part
        G_u, with G = G_s + G_u.  To keep the receiver's link busy, G
        <bcp14>SHOULD</bcp14> be at least the BDP of the receiver's access link, computed
        from the link capacity and the base round-trip time of the domain,
        and G <bcp14>MUST NOT</bcp14> exceed the buffer the receiver can commit to arriving
        data.  The values of G, G_s, and G_u are configured or derived
        locally.</t>
        <t>Credit is released when data arrives, when MSG_DONE is sent, or
        when credit is reclaimed.  Let D_max be the maximum one-way delay of
        the domain.  A sender measures the Lifetime from the reception of the
        grant, which can be up to D_max after the receiver sent it, and an
        octet transmitted just before expiry can take another D_max to
        arrive.  The receiver therefore reclaims the credit of an expired
        grant no earlier than Lifetime + 2 * D_max after it sent the grant,
        and the credit of a cancelled message no earlier than 2 * D_max
        after it sent or received the CANCEL.</t>
      </section>

      <section anchor="allocation">
        <name>Credit Allocation</name>
        <t>The receiver decides which messages receive credit and at what
        rate.  The choice of algorithm is local, provided that the
        invariant of <xref target="budget"/> holds and the following
        requirements are met:</t>
        <ol>
          <li>The sum of the Pacing Rates the receiver issues <bcp14>MUST NOT</bcp14> exceed
          the capacity of its access link.</li>
          <li>The receiver <bcp14>MUST</bcp14> reduce the rate it grants to a sender when it
          observes congestion on the path from that sender: ECN
          Congestion Experienced (CE) marks <xref target="RFC3168"/> on data
          from that sender, a CONGESTION_REPORT naming a flow from that
          sender, or a round-trip time above the configured target.</li>
          <li>When the most recent SENDER_STATUS from a sender carries a
          non-zero Suggested Rate, the Pacing Rate granted to that sender
          <bcp14>MUST NOT</bcp14> exceed it.  The receiver grants the smaller of the
          Suggested Rate and the rate that its remaining budget allows.</li>
          <li>The receiver <bcp14>MUST NOT</bcp14> grant credit to an association whose
          Epoch or Association ID it does not recognize.</li>
        </ol>
        <t>An additive-increase multiplicative-decrease (AIMD) controller is
        <bcp14>RECOMMENDED</bcp14> as the default.  Every update interval T_upd (by default
        the base round-trip time) the receiver adjusts the rate r_i of each
        active sender i:</t>
        <artwork>
   if congestion signal s_i &gt; 0 in the last interval:
       r_i = max(R_min, r_i * (1 - beta * s_i))
   else:
       r_i = min(R_max_i, r_i + alpha)
</artwork>
        <t>where s_i in [0, 1] is the largest of the CE fraction, the
        normalized Congestion Degree (<xref target="crn"/>), and the
        normalized excess delay; beta defaults to 0.5; alpha defaults to one
        percent of the access link capacity; R_min is one Credit Unit per
        update interval; and R_max_i is the smaller of the sender's line
        rate and its Suggested Rate.  Rate-based controllers in the style
        of BBR <xref target="I-D.ietf-ccwg-bbr"/> <bcp14>MAY</bcp14> be used instead.</t>
        <t>Credit that becomes available is distributed among waiting
        messages by Traffic Class first (lower class number first) and by
        weight within a class.  A receiver <bcp14>SHOULD</bcp14> give precedence to
        messages with an earlier deadline when deadlines are present.</t>
      </section>

      <section anchor="classes">
        <name>Traffic Classes and Pool Credit</name>
        <t>A sender often carries several flows to the same receiver, such
        as dispatch traffic, KV cache transfers, and background
        replication.  With pool grants, the sender divides pool credit among
        its scheduled messages as follows: classes are served in strict
        priority order from 0 to 7, and within a class credit is divided in
        proportion to the weights carried in CREDIT_REQUEST, using a
        work-conserving weighted round-robin.  The sender <bcp14>MUST</bcp14> mark the data
        packets of each class with the DSCP that the domain configures for
        that class; the mapping from Traffic Class to DSCP is a domain-wide
        configuration that <bcp14>SHOULD</bcp14> follow <xref target="RFC4594"/>.</t>
        <t>A receiver that uses per-message grants applies the same
        precedence when choosing which messages to serve.</t>
      </section>

      <section anchor="sender-status">
        <name>Sender Backlog Indication and Suggested Rates</name>
        <t>A sender that receives credit from many receivers can become the
        bottleneck itself: its own link or NIC cannot use all the credit it
        holds.  Credit held idle at such a sender is wasted capacity at the
        receivers that issued it.</t>
        <t>A sender's Backlog Threshold is the smallest N_cu advertised by
        its receivers, or a smaller locally configured value.  When the
        total credit the sender holds and has not yet used, summed over all
        its associations, exceeds its Backlog Threshold, the sender <bcp14>MUST</bcp14>
        send SENDER_STATUS on each association that holds such credit.
        SENDER_STATUS carries the Unused Credit on that association, a
        Congestion Level from 0 (none) to 255 (saturated), and a Suggested
        Rate.  The sender <bcp14>SHOULD</bcp14> compute the Suggested Rate for receiver j
        as its own available transmission rate multiplied by the share it
        wishes receiver j to obtain, where the shares are derived from the
        Service Hints of the pending messages (for example, larger shares
        for latency-sensitive messages) and sum to at most one.  The sender
        repeats SENDER_STATUS once per smoothed round-trip time while the
        condition persists, and sends one final SENDER_STATUS with
        Congestion Level zero when it ends.  A receiver ignores a Suggested
        Rate from a SENDER_STATUS received more than four default Grant
        Lifetimes ago, so a lost final SENDER_STATUS cannot cap a sender
        indefinitely.</t>
        <t>Receivers apply the third rule of <xref target="allocation"/>.
        Because every receiver of a congested sender learns its intended
        share directly, the receivers converge to the sender's allocation
        within one round trip instead of discovering it through loss or
        delay.</t>
      </section>

      <section anchor="crn">
        <name>On-Path Congestion Reporting</name>
        <t>Support for this section is <bcp14>OPTIONAL</bcp14> for network nodes.
        Receivers and senders <bcp14>MUST</bcp14> be able to process CONGESTION_REPORT.</t>
        <t>A CRN monitors the occupancy Q of each egress queue that carries
        RDCC traffic.  While Q exceeds B_th, the CRN <bcp14>MAY</bcp14> generate
        CONGESTION_REPORT for packets dequeued from that queue, subject to a
        rate limit of at most one report per flow per configured report
        interval (<bcp14>RECOMMENDED</bcp14>: 50 microseconds) and an aggregate limit per
        port.  The report identifies the data flow by its addresses,
        protocol, and ports and carries:</t>
        <ul>
          <li>the Congestion Degree, computed as
          min(255, floor(255 * (Q - B_th) / (Q_max - B_th))), where Q_max is
          the queue capacity;</li>
          <li>the queue occupancy and threshold, in octets; and</li>
          <li>optionally, a Suggested Rate equal to the queue's service rate
          divided by the number of flows the CRN observes in the queue.</li>
        </ul>
        <t>The CRN classifies the packet by its DSCP.  For scheduled
        traffic it sends the report to the destination address of the data
        packet (the receiver), so that the receiver adjusts its grants.  For
        unscheduled traffic it sends the report to the source address (the
        sender), so that the sender stops its unscheduled transmission
        (<xref target="unscheduled"/>).  Reports are sent to the RDCC UDP
        port with the Association ID and Epoch fields set to zero.</t>
        <t>Where in-situ OAM <xref target="RFC9197"/> is deployed in the
        domain, a receiver <bcp14>MAY</bcp14> derive the same congestion information from
        the queue depth data field, and where ECN is enabled, from CE marks.
        These signals and CONGESTION_REPORT are equivalent inputs to
        <xref target="allocation"/>.</t>
        <t>A CONGESTION_REPORT can only cause a receiver to reduce the rate
        it grants, or a sender to stop unscheduled transmission.  An
        endpoint <bcp14>MUST NOT</bcp14> increase any rate or credit in response to a
        CONGESTION_REPORT.  An endpoint <bcp14>MUST</bcp14> ignore reports whose source
        address is not within the set of CRN addresses configured for the
        domain.</t>
      </section>

      <section anchor="binding">
        <name>Transport Bindings</name>
        <t>The Binding Kind and Binding Value of CREDIT_REQUEST identify the
        message at the data transport.  This document defines:</t>
        <dl newline="false">
          <dt>Binding Kind 1, RoCEv2:</dt>
          <dd>An RDMA interface cannot pause in the middle of an RDMA message,
          so a sender that honors partial grants divides an RDCC message into
          several RDMA messages and posts each one only when it holds credit
          for all of its octets.  The Binding Value carries, in bits 63 to
          40, the destination queue pair number; in bits 39 to 16, the message
          sequence number that the responder will assign to the first of these
          RDMA messages <xref target="IBTA-ROCEV2"/>; and in bits 15 to 0, the
          number of RDMA messages.  Because messages on a queue pair are
          processed in order, the sender knows these numbers when it posts the
          messages.  The receiver <bcp14>MUST</bcp14> be able to count the payload octets
          received on the queue pair, for example with per-queue-pair receive
          counters of its RDMA interface, since RDMA WRITE operations produce
          no completion at the responder.</dd>
          <dt>Binding Kind 2, Opaque:</dt>
          <dd>The Binding Value is a 64-bit message identifier that the data
          transport carries in its own headers, with a meaning agreed by
          configuration.</dd>
        </dl>
        <t>A receiver that does not support the Binding Kind of a request
        answers with ERROR (UNSUPPORTED_BINDING) for that message.</t>
      </section>

      <section anchor="failures">
        <name>Error Handling and Recovery</name>
        <ul>
          <li>A receiver that receives a CREDIT_REQUEST for an unknown
          association replies with ERROR (UNKNOWN_ASSOCIATION); the sender
          re-establishes the association and re-requests credit for its
          pending messages.</li>
          <li>Data received for a message beyond its Grant Limit and outside
          its unscheduled window indicates a misbehaving sender.  The
          receiver <bcp14>MAY</bcp14> discard such data, <bcp14>MUST NOT</bcp14> grant further credit to
          the association for that message, and <bcp14>SHOULD</bcp14> log the event.</li>
          <li>If a receiver is about to run out of budget for an extended
          period, it <bcp14>MAY</bcp14> send ERROR (BUDGET_EXHAUSTED) to senders with
          pending requests so that they can choose other destinations;
          senders keep their requests outstanding.</li>
          <li>Messages carrying an unknown Version <bcp14>MUST</bcp14> be discarded.
          Messages with an unknown Type <bcp14>MUST</bcp14> be discarded; if the message
          belongs to an established association, the receiver <bcp14>MAY</bcp14> reply with
          ERROR (UNSUPPORTED_TYPE) to the address bound to that association,
          and it <bcp14>MUST NOT</bcp14> reply otherwise.</li>
          <li>A message whose Length field is smaller than the size defined
          for its Type, or larger than the UDP payload, <bcp14>MUST</bcp14> be
          discarded.</li>
        </ul>
      </section>
    </section>

    <section anchor="formats">
      <name>Message Formats</name>
      <t>RDCC messages are carried in UDP <xref target="RFC768"/> to or from
      the RDCC port (<xref target="port-config"/>).  One UDP datagram
      carries exactly one RDCC message.  Senders <bcp14>MUST</bcp14> set the UDP
      checksum.</t>

      <section anchor="port-config">
        <name>Port Configuration</name>
        <t>The RDCC port is a UDP port configured by the operator of the
        limited domain; this document does not request a port assignment
        from the "Service Name and Transport Protocol Port Number Registry"
        <xref target="RFC6335"/>.  All senders, receivers, and CRNs of a
        domain <bcp14>MUST</bcp14> be configured with the same RDCC port, because CRNs send
        reports to endpoints without prior signaling.  Operators <bcp14>SHOULD</bcp14>
        choose the port from the Dynamic Ports range (49152-65535) and <bcp14>MUST</bcp14>
        ensure that no other service of the domain uses it.  Implementations
        <bcp14>MUST NOT</bcp14> assume a default port value.</t>
      </section>

      <section anchor="common-header">
        <name>Common Header</name>
        <figure anchor="fig-hdr">
          <name>RDCC Common Header</name>
          <artwork type="ascii-art">
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version|  Rsv  |     Type      |            Length             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Association ID                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|             Epoch             |             Flags             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sequence Number                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</artwork>
        </figure>
        <dl newline="false">
          <dt>Version (4 bits):</dt><dd>1.</dd>
          <dt>Rsv (4 bits):</dt><dd>Set to zero on transmission and ignored
          on receipt.</dd>
          <dt>Type (8 bits):</dt><dd>Message type
          (<xref target="tbl-types"/>).</dd>
          <dt>Length (16 bits):</dt><dd>Length of the message in octets,
          including this header.</dd>
          <dt>Association ID (32 bits):</dt><dd>Assigned by the receiver in
          ASSOC_ACCEPT; zero in ASSOC_REQUEST and in messages from CRNs.</dd>
          <dt>Epoch (16 bits):</dt><dd>The receiver's incarnation
          (<xref target="association"/>); zero in ASSOC_REQUEST and in
          messages from CRNs.</dd>
          <dt>Flags (16 bits):</dt><dd>Type-specific flags.  Undefined flags
          are set to zero and ignored on receipt.</dd>
          <dt>Sequence Number (32 bits):</dt><dd>Incremented by one for each
          message the originator sends on the association (or, for a CRN,
          per reporting port), including retransmissions.  An endpoint <bcp14>MUST</bcp14>
          discard a message of an association whose Sequence Number is not
          newer, in serial number arithmetic <xref target="RFC1982"/>, than
          the newest one it has already processed from the same originator
          on that association.  ASSOC_REQUEST, ASSOC_ACCEPT that echoes the
          sender's current nonce, ERROR with reason UNKNOWN_ASSOCIATION, and
          messages from CRNs are exempt, because a receiver that has lost its
          state also restarts its sequence numbers; a sender that accepts a new
          Epoch resets the newest processed Sequence Number of the
          association.</dd>
        </dl>
        <table anchor="tbl-types">
          <name>RDCC Message Types</name>
          <thead>
            <tr><th>Type</th><th>Name</th><th>Direction</th><th>Length</th></tr>
          </thead>
          <tbody>
            <tr><td>0x01</td><td>ASSOC_REQUEST</td><td>S to R</td><td>48</td></tr>
            <tr><td>0x02</td><td>ASSOC_ACCEPT</td><td>R to S</td><td>48</td></tr>
            <tr><td>0x03</td><td>CREDIT_REQUEST</td><td>S to R</td><td>56</td></tr>
            <tr><td>0x04</td><td>CREDIT_GRANT</td><td>R to S</td><td>40</td></tr>
            <tr><td>0x05</td><td>SENDER_STATUS</td><td>S to R</td><td>32</td></tr>
            <tr><td>0x06</td><td>CONGESTION_REPORT</td><td>CRN to R or S</td><td>48 or 72</td></tr>
            <tr><td>0x07</td><td>MSG_DONE</td><td>R to S</td><td>32</td></tr>
            <tr><td>0x08</td><td>CANCEL</td><td>S to R or R to S</td><td>28</td></tr>
            <tr><td>0x09</td><td>CREDIT_RETURN</td><td>S to R</td><td>32</td></tr>
            <tr><td>0x0A</td><td>ERROR</td><td>any</td><td>28</td></tr>
          </tbody>
        </table>
      </section>

      <section anchor="fmt-assoc">
        <name>ASSOC_REQUEST and ASSOC_ACCEPT</name>
        <figure anchor="fig-assoc">
          <name>ASSOC_REQUEST (Type 0x01) and ASSOC_ACCEPT (Type 0x02) Body</name>
          <artwork type="ascii-art">
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Sender Nonce (64 bits)                     |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Capabilities                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                 Line Rate / Unscheduled Limit U               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Reserved / Start Jitter J                  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                 Reserved / Backlog Threshold N_cu             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                   Reserved / Grant Lifetime                   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     Reserved / Credit Unit                    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</artwork>
        </figure>
        <t>In ASSOC_REQUEST, the fields after Capabilities carry the sender's
        Line Rate (Mbit/s) followed by four reserved words set to zero.  The
        reserved words make ASSOC_REQUEST as large as ASSOC_ACCEPT, so the
        exchange cannot be used for amplification.  In ASSOC_ACCEPT, the
        fields carry U (octets), J (microseconds), N_cu (octets), the
        default Grant Lifetime (microseconds), and the Credit Unit (octets,
        typically the path MTU payload).  Capability bits: 0x00000001 POOL
        (pool grants supported), 0x00000002 STATUS (SENDER_STATUS
        supported), 0x00000004 CRN (on-path reports are processed).  Flag
        0x0001 in ASSOC_ACCEPT is Parameter Update: the message updates the
        parameters of an existing association.  Flag 0x0002 in ASSOC_REQUEST
        is Update Acknowledgment (<xref target="association"/>).</t>
      </section>

      <section anchor="fmt-request">
        <name>CREDIT_REQUEST</name>
        <figure anchor="fig-request">
          <name>CREDIT_REQUEST (Type 0x03) Body</name>
          <artwork type="ascii-art">
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Message ID (64 bits)                     |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Message Length (64 bits)                   |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                   Unscheduled Sent (64 bits)                  |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Class     |    Weight     | Service Hint  | Binding Kind  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           Deadline                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Binding Value (64 bits)                    |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</artwork>
        </figure>
        <t>Message ID is chosen by the sender as described in
        <xref target="grants"/>; zero is reserved.  Binding Kind and Binding
        Value are defined in <xref target="binding"/>.  Class is 0..7; values above 7 <bcp14>MUST</bcp14> be treated as
        7.  Weight is 1..255; zero <bcp14>MUST</bcp14> be treated as 1.  Service Hint
        values are registered in <xref target="iana"/>: 0 none, 1
        latency-sensitive, 2 throughput-oriented.  Deadline is the number of
        microseconds, relative to transmission of the request, by which the
        sender would like the message delivered; zero means none.</t>
      </section>

      <section anchor="fmt-grant">
        <name>CREDIT_GRANT</name>
        <figure anchor="fig-grant">
          <name>CREDIT_GRANT (Type 0x04) Body</name>
          <artwork type="ascii-art">
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Message ID (64 bits)                     |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     Grant Limit (64 bits)                     |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Pacing Rate                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           Lifetime                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</artwork>
        </figure>
        <t>Flags: 0x0001 POOL (Message ID is zero and the grant covers the
        association's pool), 0x0002 FINAL (Grant Limit equals the message
        length).  Pacing Rate <bcp14>MUST NOT</bcp14> be zero; a sender that receives a grant
        with Pacing Rate zero <bcp14>MUST</bcp14> ignore it.  Lifetime zero means the
        default Grant Lifetime of the association.</t>
      </section>

      <section anchor="fmt-status">
        <name>SENDER_STATUS</name>
        <figure anchor="fig-status">
          <name>SENDER_STATUS (Type 0x05) Body</name>
          <artwork type="ascii-art">
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Unused Credit (64 bits)                    |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Congestion Lvl | Service Hint  |           Reserved            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Suggested Rate                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</artwork>
        </figure>
        <t>Suggested Rate zero means that the sender makes no suggestion.
        The Service Hint states the dominant hint of the sender's pending
        messages toward this receiver.</t>
      </section>

      <section anchor="fmt-report">
        <name>CONGESTION_REPORT</name>
        <figure anchor="fig-report">
          <name>CONGESTION_REPORT (Type 0x06) Body</name>
          <artwork type="ascii-art">
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Reporter ID                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Queue Depth                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Queue Threshold                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Cong. Degree |   Direction   |      AF       |   Protocol    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|        Source Port            |       Destination Port        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Suggested Rate                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Source Address (4 or 16 octets, per AF) ...          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|        Destination Address (4 or 16 octets, per AF) ...       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</artwork>
        </figure>
        <t>Reporter ID is a domain-unique identifier of the CRN.  Queue Depth
        and Queue Threshold are in octets.  Direction is 1 when the report is
        sent to the receiver and 2 when it is sent to the sender.  AF is 4
        for IPv4 (total length 48) or 6 for IPv6 (total length 72).  Protocol,
        ports, and addresses are those of the data packet that triggered the
        report; for RoCEv2 the ports are the UDP ports of that packet.</t>
      </section>

      <section anchor="fmt-other">
        <name>MSG_DONE, CANCEL, CREDIT_RETURN, and ERROR</name>
        <t>MSG_DONE (0x07) carries Message ID (64 bits) and Octets Received
        (64 bits).  CANCEL (0x08) carries Message ID (64 bits) and a Reason
        (16 bits) followed by 16 reserved bits.  CREDIT_RETURN (0x09)
        carries Message ID (64 bits) and New Limit (64 bits), the offset
        beyond which the sender will not transmit; New Limit <bcp14>MUST NOT</bcp14> be
        smaller than the octets already transmitted.  ERROR (0x0A) carries a
        Reason (16 bits), 16 reserved bits, and a Message ID (64 bits),
        which is zero when the error concerns the whole association.  Reason
        codes are listed in <xref target="tbl-reasons"/>; CANCEL uses the
        same codes.</t>
        <table anchor="tbl-reasons">
          <name>RDCC Reason Codes</name>
          <thead><tr><th>Code</th><th>Name</th></tr></thead>
          <tbody>
            <tr><td>0x0000</td><td>NO_ERROR</td></tr>
            <tr><td>0x0001</td><td>ASSOC_REFUSED</td></tr>
            <tr><td>0x0002</td><td>UNKNOWN_ASSOCIATION</td></tr>
            <tr><td>0x0003</td><td>BUDGET_EXHAUSTED</td></tr>
            <tr><td>0x0004</td><td>UNSUPPORTED_TYPE</td></tr>
            <tr><td>0x0005</td><td>MESSAGE_TOO_LARGE</td></tr>
            <tr><td>0x0006</td><td>APPLICATION_ABORT</td></tr>
            <tr><td>0x0007</td><td>UNSUPPORTED_BINDING</td></tr>
          </tbody>
        </table>
      </section>
    </section>

    <section anchor="state">
      <name>Sender Message State Machine</name>
      <t>Each message at the sender is in one of the states NEW, UNSCHED,
      WAITING, SCHEDULED, DRAINED, DONE, or ABORTED.
      <xref target="tbl-state"/> defines the transitions.  The receiver
      keeps the mirror state implicitly through its accounting.</t>
      <table anchor="tbl-state">
        <name>Sender Message State Transitions</name>
        <thead>
          <tr><th>State</th><th>Event</th><th>Action</th><th>Next State</th></tr>
        </thead>
        <tbody>
          <tr><td>NEW</td><td>length &lt;= U and no unscheduled message outstanding</td>
              <td>start random delay; send CREDIT_REQUEST with Unscheduled Sent = length</td><td>UNSCHED</td></tr>
          <tr><td>NEW</td><td>otherwise</td><td>send CREDIT_REQUEST</td><td>WAITING</td></tr>
          <tr><td>UNSCHED</td><td>all octets transmitted</td><td>none</td><td>DRAINED</td></tr>
          <tr><td>UNSCHED</td><td>CONGESTION_REPORT or link pause</td>
              <td>stop; request credit for the remainder</td><td>WAITING</td></tr>
          <tr><td>WAITING</td><td>CREDIT_GRANT above transmitted offset</td><td>none</td><td>SCHEDULED</td></tr>
          <tr><td>WAITING</td><td>request timeout</td><td>retransmit CREDIT_REQUEST</td><td>WAITING</td></tr>
          <tr><td>SCHEDULED</td><td>Grant Limit reached before message end</td><td>none</td><td>WAITING</td></tr>
          <tr><td>SCHEDULED</td><td>Lifetime elapsed</td><td>send CREDIT_REQUEST</td><td>WAITING</td></tr>
          <tr><td>SCHEDULED</td><td>all octets transmitted</td><td>none</td><td>DRAINED</td></tr>
          <tr><td>DRAINED</td><td>MSG_DONE</td><td>release state</td><td>DONE</td></tr>
          <tr><td>DRAINED</td><td>request timeout</td><td>retransmit CREDIT_REQUEST</td><td>DRAINED</td></tr>
          <tr><td>any but DONE or ABORTED</td><td>CANCEL for the message; ERROR for the message with reason MESSAGE_TOO_LARGE, APPLICATION_ABORT, or UNSUPPORTED_BINDING; or ERROR with reason ASSOC_REFUSED</td>
              <td>release state</td><td>ABORTED</td></tr>
          <tr><td>WAITING</td><td>ERROR BUDGET_EXHAUSTED</td>
              <td>keep the request outstanding</td><td>WAITING</td></tr>
          <tr><td>any but DONE or ABORTED</td><td>ERROR UNKNOWN_ASSOCIATION, or new Epoch in ASSOC_ACCEPT</td>
              <td>drop credit; re-establish; send CREDIT_REQUEST</td><td>WAITING</td></tr>
        </tbody>
      </table>
      <t>In WAITING the sender holds no usable credit and retransmits
      CREDIT_REQUEST as described in <xref target="grants"/>.  In DRAINED all
      octets have been transmitted and the sender waits for MSG_DONE; a
      receiver that receives CREDIT_REQUEST for a completed message answers
      with MSG_DONE again.  If the data transport retransmits octets
      already transmitted, those octets remain within the existing Grant
      Limit, because the receiver has not counted them as received.</t>
    </section>

    <section anchor="cc">
      <name>Congestion Control Considerations</name>
      <t>RDCC is a receiver-driven admission mechanism and is used together
      with the congestion control of the data transport, as required for UDP
      applications by <xref target="RFC8085"/>.  The rate at which a sender
      transmits is bounded by both.  RDCC complies with the principles of
      <xref target="RFC9743"/> as follows:</t>
      <ul>
        <li>The data a receiver admits is bounded by G at every instant, and
        the rate it admits is bounded by its access link capacity, so RDCC
        never causes more traffic than the receiver can absorb.</li>
        <li>Unscheduled data is bounded per association by U, limited to one
        message, randomized by J, and accounted within G_u.  Unscheduled
        data stops on any congestion report.</li>
        <li>RDCC reacts to ECN, delay, and on-path reports by reducing rates
        multiplicatively.</li>
        <li>As a circuit breaker, a receiver that observes a loss rate of
        unscheduled data above a configured threshold (<bcp14>RECOMMENDED</bcp14>: one
        percent over one second) <bcp14>MUST</bcp14> set U to zero for all associations
        until the loss rate falls below one tenth of the threshold.</li>
      </ul>
      <t>Because RDCC does not disable ECN or rely on PFC, the network
      retains its ordinary congestion feedback.  Operators that previously
      disabled ECN marking for all-to-all traffic can re-enable it once
      receivers bound their incast through RDCC.</t>
    </section>

    <section anchor="ops">
      <name>Operational Considerations</name>
      <t>Parameter guidance (all values are configurable):</t>
      <table anchor="tbl-params">
        <name>Default Parameters</name>
        <thead>
          <tr><th>Parameter</th><th>Guidance</th></tr>
        </thead>
        <tbody>
          <tr><td>G</td><td>1 to 2 times the access link BDP</td></tr>
          <tr><td>G_u</td><td>at most G/4</td></tr>
          <tr><td>U</td><td>G_u divided by expected concurrent senders; at most one BDP</td></tr>
          <tr><td>J</td><td>1 to 2 times the base RTT</td></tr>
          <tr><td>N_cu</td><td>2 times the sender's own BDP</td></tr>
          <tr><td>Grant Lifetime</td><td>4 times the base RTT, at least 100 microseconds</td></tr>
          <tr><td>B_th</td><td>the ECN marking threshold of the queue, if ECN is used</td></tr>
          <tr><td>Credit Unit</td><td>path MTU payload size</td></tr>
        </tbody>
      </table>
      <t>Implementations <bcp14>SHOULD</bcp14> expose counters for: credit granted,
      reclaimed, and returned; unscheduled octets; reports received by
      type; and invariant violations.  Deployment can be incremental:
      receivers that do not implement RDCC simply never answer
      ASSOC_REQUEST, and the sender then uses its transport without RDCC
      after its association attempts time out.  CRNs are optional;
      without them, receivers rely on ECN and delay.</t>
      <t>RDCC control messages <bcp14>SHOULD</bcp14> be marked with a DSCP that receives
      at least the priority of the data they control, so that grants are
      not delayed behind the data they schedule.</t>
    </section>

    <section anchor="security">
      <name>Security Considerations</name>
      <t>The security considerations of <xref target="RFC8085"/> apply.
      This section follows the guidance of <xref target="RFC3552"/>.</t>
      <t>Off-path attackers.  An attacker that can inject UDP datagrams could
      forge grants (to induce senders to overload a receiver), forge
      MSG_DONE or CANCEL (to disrupt messages), or forge reports (to reduce
      rates).  RDCC limits the impact of blind injection with the random
      64-bit Sender Nonce, the 32-bit Association ID, the Epoch, and
      sequence-number checks.  These are not cryptographic protections.
      Deployments <bcp14>MUST</bcp14> therefore do at least one of the following: protect
      RDCC traffic with IPsec ESP <xref target="RFC4303"/> between
      endpoints, or ensure, through ingress filtering at the boundary of
      the limited domain, that datagrams addressed to the RDCC port cannot
      enter the domain from outside.</t>
      <t>On-path and compromised nodes.  A compromised CRN can only reduce
      rates or stop unscheduled transmission, because endpoints never
      increase credit or rate in response to a report
      (<xref target="crn"/>).  The effect is bounded to a denial of
      service that the same node could cause by dropping packets.</t>
      <t>Misbehaving senders.  A sender that transmits beyond its credit
      gains nothing: the receiver detects the excess, discards it, and stops
      granting (<xref target="failures"/>).  A sender that hoards credit
      without sending reduces the receiver's available budget only until
      the Grant Lifetime expires.  Receivers <bcp14>SHOULD</bcp14> cap the credit and the
      number of pending messages per association.</t>
      <t>Resource exhaustion.  Receivers keep per-association and
      per-message state.  Receivers <bcp14>MUST</bcp14> bound the number of associations
      and of pending messages, and <bcp14>SHOULD</bcp14> refuse new associations rather
      than evicting active ones.</t>
      <t>Reflection.  ASSOC_REQUEST is padded to the size of ASSOC_ACCEPT, and
      receivers send all other messages only to the address bound when the
      association was accepted, so an attacker cannot direct grants to a
      third party.  CRNs send reports to the addresses found in data
      packets they forward; within a limited domain with ingress filtering
      these addresses cannot be spoofed from outside, and the per-flow and
      per-port rate limits of <xref target="crn"/> bound the residual
      reflection risk from inside the domain.</t>
      <t>Information exposure.  Grants and reports reveal traffic volumes
      between hosts.  Within a limited domain this information is available
      to the operator through other means; where it is sensitive, ESP
      provides confidentiality.</t>
    </section>

    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document requests no port number; the RDCC port is configured
      per limited domain (<xref target="port-config"/>).</t>
      <section anchor="iana-registries">
        <name>RDCC Registries</name>
        <t>IANA is requested to create a new registry group named
        "Receiver-Driven Credit Control (RDCC) Parameters" containing the
        following registries.  Each registration records the value, the
        name, and a reference.  Unless stated otherwise, the policy is
        Specification Required <xref target="RFC8126"/> for the lower three
        quarters of the value space, and the upper quarter is reserved for
        Private Use.  The designated experts should check that a new value
        is fully specified, does not duplicate an existing one, and does not
        weaken the congestion control properties of
        <xref target="cc"/>.</t>
        <ul>
          <li>"RDCC Message Types" (8 bits), initial contents from
          <xref target="tbl-types"/>; 0x00 is Reserved.</li>
          <li>"RDCC Reason Codes" (16 bits), initial contents from
          <xref target="tbl-reasons"/>.</li>
          <li>"RDCC Service Hints" (8 bits): 0 None, 1 Latency-Sensitive, 2
          Throughput-Oriented.</li>
          <li>"RDCC Binding Kinds" (8 bits): 0 Reserved, 1 RoCEv2, 2
          Opaque.</li>
          <li>"RDCC Capability Bits": one entry per bit of the 32-bit
          Capabilities field; initial contents 0x00000001 POOL, 0x00000002
          STATUS, 0x00000004 CRN.  All bits are assigned by Specification
          Required.</li>
          <li>"RDCC Message Flags": one entry per bit of the 16-bit Flags
          field and message type; initial contents ASSOC_ACCEPT 0x0001
          Parameter Update, ASSOC_REQUEST 0x0002 Update Acknowledgment,
          CREDIT_GRANT 0x0001 POOL and 0x0002 FINAL.  All bits are assigned
          by Specification Required.</li>
        </ul>
      </section>
    </section>

  </middle>

  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC768" target="https://www.rfc-editor.org/info/rfc768">
  <front>
    <title>User Datagram Protocol</title>
    <author fullname="J. Postel" initials="J." surname="Postel"/>
    <date month="August" year="1980"/>
  </front>
  <seriesInfo name="STD" value="6"/>
  <seriesInfo name="RFC" value="768"/>
  <seriesInfo name="DOI" value="10.17487/RFC768"/>
</reference>
        <reference anchor="RFC1982" target="https://www.rfc-editor.org/info/rfc1982">
  <front>
    <title>Serial Number Arithmetic</title>
    <author fullname="R. Elz" initials="R." surname="Elz"/>
    <author fullname="R. Bush" initials="R." surname="Bush"/>
    <date month="August" year="1996"/>
    </front>
  <seriesInfo name="RFC" value="1982"/>
  <seriesInfo name="DOI" value="10.17487/RFC1982"/>
</reference>
        <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="RFC2474" target="https://www.rfc-editor.org/info/rfc2474">
  <front>
    <title>Definition of the Differentiated Services Field (DS Field) in the IPv4 and IPv6 Headers</title>
    <author fullname="K. Nichols" initials="K." surname="Nichols"/>
    <author fullname="S. Blake" initials="S." surname="Blake"/>
    <author fullname="F. Baker" initials="F." surname="Baker"/>
    <author fullname="D. Black" initials="D." surname="Black"/>
    <date month="December" year="1998"/>
    </front>
  <seriesInfo name="RFC" value="2474"/>
  <seriesInfo name="DOI" value="10.17487/RFC2474"/>
</reference>
        <reference anchor="RFC3168" target="https://www.rfc-editor.org/info/rfc3168">
  <front>
    <title>The Addition of Explicit Congestion Notification (ECN) to IP</title>
    <author fullname="K. Ramakrishnan" initials="K." surname="Ramakrishnan"/>
    <author fullname="S. Floyd" initials="S." surname="Floyd"/>
    <author fullname="D. Black" initials="D." surname="Black"/>
    <date month="September" year="2001"/>
    </front>
  <seriesInfo name="RFC" value="3168"/>
  <seriesInfo name="DOI" value="10.17487/RFC3168"/>
</reference>
        <reference anchor="RFC4303" target="https://www.rfc-editor.org/info/rfc4303">
  <front>
    <title>IP Encapsulating Security Payload (ESP)</title>
    <author fullname="S. Kent" initials="S." surname="Kent"/>
    <date month="December" year="2005"/>
    </front>
  <seriesInfo name="RFC" value="4303"/>
  <seriesInfo name="DOI" value="10.17487/RFC4303"/>
</reference>
        <reference anchor="RFC6335" target="https://www.rfc-editor.org/info/rfc6335">
  <front>
    <title>Internet Assigned Numbers Authority (IANA) Procedures for the Management of the Service Name and Transport Protocol Port Number Registry</title>
    <author fullname="M. Cotton" initials="M." surname="Cotton"/>
    <author fullname="L. Eggert" initials="L." surname="Eggert"/>
    <author fullname="J. Touch" initials="J." surname="Touch"/>
    <author fullname="M. Westerlund" initials="M." surname="Westerlund"/>
    <author fullname="S. Cheshire" initials="S." surname="Cheshire"/>
    <date month="August" year="2011"/>
    </front>
  <seriesInfo name="BCP" value="165"/>
  <seriesInfo name="RFC" value="6335"/>
  <seriesInfo name="DOI" value="10.17487/RFC6335"/>
</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="RFC8126" target="https://www.rfc-editor.org/info/rfc8126">
  <front>
    <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
    <author fullname="M. Cotton" initials="M." surname="Cotton"/>
    <author fullname="B. Leiba" initials="B." surname="Leiba"/>
    <author fullname="T. Narten" initials="T." surname="Narten"/>
    <date month="June" year="2017"/>
    </front>
  <seriesInfo name="BCP" value="26"/>
  <seriesInfo name="RFC" value="8126"/>
  <seriesInfo name="DOI" value="10.17487/RFC8126"/>
</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>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="RFC3552" target="https://www.rfc-editor.org/info/rfc3552">
  <front>
    <title>Guidelines for Writing RFC Text on Security Considerations</title>
    <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
    <author fullname="B. Korver" initials="B." surname="Korver"/>
    <date month="July" year="2003"/>
    </front>
  <seriesInfo name="BCP" value="72"/>
  <seriesInfo name="RFC" value="3552"/>
  <seriesInfo name="DOI" value="10.17487/RFC3552"/>
</reference>
        <reference anchor="RFC4594" target="https://www.rfc-editor.org/info/rfc4594">
  <front>
    <title>Configuration Guidelines for DiffServ Service Classes</title>
    <author fullname="J. Babiarz" initials="J." surname="Babiarz"/>
    <author fullname="K. Chan" initials="K." surname="Chan"/>
    <author fullname="F. Baker" initials="F." surname="Baker"/>
    <date month="August" year="2006"/>
    </front>
  <seriesInfo name="RFC" value="4594"/>
  <seriesInfo name="DOI" value="10.17487/RFC4594"/>
</reference>
        <reference anchor="RFC8799" target="https://www.rfc-editor.org/info/rfc8799">
  <front>
    <title>Limited Domains and Internet Protocols</title>
    <author fullname="B. Carpenter" initials="B." surname="Carpenter"/>
    <author fullname="B. Liu" initials="B." surname="Liu"/>
    <date month="July" year="2020"/>
    </front>
  <seriesInfo name="RFC" value="8799"/>
  <seriesInfo name="DOI" value="10.17487/RFC8799"/>
</reference>
        <reference anchor="RFC9197" target="https://www.rfc-editor.org/info/rfc9197">
  <front>
    <title>Data Fields for In Situ Operations, Administration, and Maintenance (IOAM)</title>
    <author fullname="F. Brockners" initials="F." role="editor" surname="Brockners"/>
    <author fullname="S. Bhandari" initials="S." role="editor" surname="Bhandari"/>
    <author fullname="T. Mizrahi" initials="T." role="editor" surname="Mizrahi"/>
    <date month="May" year="2022"/>
    </front>
  <seriesInfo name="RFC" value="9197"/>
  <seriesInfo name="DOI" value="10.17487/RFC9197"/>
</reference>
        <reference anchor="RFC9743" target="https://www.rfc-editor.org/info/rfc9743">
  <front>
    <title>Specifying New Congestion Control Algorithms</title>
    <author fullname="M. Duke" initials="M." role="editor" surname="Duke"/>
    <author fullname="G. Fairhurst" initials="G." role="editor" surname="Fairhurst"/>
    <date month="March" year="2025"/>
    </front>
  <seriesInfo name="BCP" value="133"/>
  <seriesInfo name="RFC" value="9743"/>
  <seriesInfo name="DOI" value="10.17487/RFC9743"/>
</reference>
        <reference anchor="I-D.li-tsvwg-inference-transport" target="https://datatracker.ietf.org/doc/html/draft-li-tsvwg-inference-transport-00">
  <front>
    <title>Transport Considerations for Large-Scale Distributed Inference Networks</title>
    <author fullname="Zhiqiang Li" initials="Z." surname="Li">
      <organization>China Mobile</organization>
    </author>
    <author fullname="Zongpeng Du" initials="Z." surname="Du">
      <organization>China Mobile</organization>
    </author>
    <author fullname="Junjie Wang" initials="J." surname="Wang">
      <organization>Centec</organization>
    </author>
    <author fullname="Wei Cheng" initials="W." surname="Cheng">
      <organization>Centec</organization>
    </author>
    <author fullname="Guoying Zhang" initials="G." surname="Zhang">
      <organization>Centec</organization>
    </author>
    <author fullname="Xun Sun" initials="X." surname="Sun">
      <organization>Inesa</organization>
    </author>
    <author fullname="Chunhao Zhao" initials="C." surname="Zhao">
      <organization>SAIA</organization>
    </author>
    <date day="4" month="July" year="2026"/>
    </front>
  <seriesInfo name="Internet-Draft" value="draft-li-tsvwg-inference-transport-00"/>
</reference>
        <reference anchor="I-D.hu-rtgwg-cbfc-rsvp" target="https://datatracker.ietf.org/doc/html/draft-hu-rtgwg-cbfc-rsvp-01">
  <front>
    <title>Credit-based Flow Control Based on RSVP for RDMA transmission in WAN</title>
    <author fullname="Jiayuan Hu" initials="J." surname="Hu">
      <organization>China Telecom</organization>
    </author>
    <author fullname="Zehua Hu" initials="Z." surname="Hu">
      <organization>China Telecom</organization>
    </author>
    <author fullname="Tanxin Pi" initials="T." surname="Pi">
      <organization>China Telecom</organization>
    </author>
    <author fullname="Yongqing Zhu" initials="Y." surname="Zhu">
      <organization>China Telecom</organization>
    </author>
    <date day="23" month="September" year="2025"/>
    </front>
  <seriesInfo name="Internet-Draft" value="draft-hu-rtgwg-cbfc-rsvp-01"/>
</reference>
        <reference anchor="I-D.ietf-manet-dlep-credit-flow-control" target="https://datatracker.ietf.org/doc/html/draft-ietf-manet-dlep-credit-flow-control-19">
  <front>
    <title>Dynamic Link Exchange Protocol (DLEP) Credit-Based Flow Control Messages and Data Items</title>
    <author fullname="Bow-Nan Cheng" initials="B." surname="Cheng">
      <organization>MIT Lincoln Laboratory</organization>
    </author>
    <author fullname="David Wiggins" initials="D." surname="Wiggins"/>
    <author fullname="Stan Ratliff" initials="S." surname="Ratliff"/>
    <author fullname="Lou Berger" initials="L." surname="Berger">
      <organization>LabN Consulting, L.L.C.</organization>
    </author>
    <author fullname="Eric Kinzie" initials="E." surname="Kinzie">
      <organization>LabN Consulting, L.L.C.</organization>
    </author>
    <date day="25" month="March" year="2025"/>
    </front>
  <seriesInfo name="Internet-Draft" value="draft-ietf-manet-dlep-credit-flow-control-19"/>
</reference>
        <reference anchor="I-D.tayyebi-fcl-dcop-gtl" target="https://datatracker.ietf.org/doc/html/draft-tayyebi-fcl-dcop-gtl-00">
  <front>
    <title>A Fabric Coordination Layer (FCL) for High-Scale AI Training: Distributed Credit-Orbit Pacing (DCOP) and Global Token Ledger (GTL)</title>
    <author fullname="Mohammad TayyebiRahani" initials="M." surname="TayyebiRahani">
      <organization>ViYouna</organization>
    </author>
    <date day="29" month="May" year="2026"/>
    </front>
  <seriesInfo name="Internet-Draft" value="draft-tayyebi-fcl-dcop-gtl-00"/>
</reference>
        <reference anchor="I-D.sang-fann-fast-network-event-notification" target="https://datatracker.ietf.org/doc/html/draft-sang-fann-fast-network-event-notification-01">
  <front>
    <title>Problem Statement and Requirements for Fast Network Event Notification in Distributed AI Training and Inference</title>
    <author fullname="Liu Sang" initials="L." surname="Sang">
      <organization>China Academy of Information and Communications Technology</organization>
    </author>
    <author fullname="Xuesong Geng" initials="X." surname="Geng">
      <organization>Huawei Technologies</organization>
    </author>
    <author fullname="Huan Deng" initials="H." surname="Deng">
      <organization>China Telecom</organization>
    </author>
    <date day="3" month="July" year="2026"/>
    </front>
  <seriesInfo name="Internet-Draft" value="draft-sang-fann-fast-network-event-notification-01"/>
</reference>
        <reference anchor="I-D.ietf-ccwg-bbr" target="https://datatracker.ietf.org/doc/html/draft-ietf-ccwg-bbr-06">
  <front>
    <title>BBR Congestion Control</title>
    <author fullname="Neal Cardwell" initials="N." surname="Cardwell">
      <organization>Google</organization>
    </author>
    <author fullname="Ian Swett" initials="I." surname="Swett">
      <organization>Google</organization>
    </author>
    <author fullname="Joseph Beshay" initials="J." surname="Beshay">
      <organization>Meta</organization>
    </author>
    <date day="6" month="July" year="2026"/>
    </front>
  <seriesInfo name="Internet-Draft" value="draft-ietf-ccwg-bbr-06"/>
</reference>
        <reference anchor="IEEE802.1Qbb" target="https://standards.ieee.org/ieee/802.1Qbb/4361/">
          <front>
            <title>IEEE Standard for Local and Metropolitan Area Networks--Media Access Control (MAC) Bridges and Virtual Bridged Local Area Networks--Amendment 17: Priority-based Flow Control</title>
            <author><organization>IEEE</organization></author>
            <date year="2011" month="September"/>
          </front>
          <seriesInfo name="IEEE Std" value="802.1Qbb-2011"/>
        </reference>
        <reference anchor="DCQCN" target="https://doi.org/10.1145/2829988.2787484">
          <front>
            <title>Congestion Control for Large-Scale RDMA Deployments</title>
            <author initials="Y." surname="Zhu" fullname="Yibo Zhu"/>
            <author initials="H." surname="Eran" fullname="Haggai Eran"/>
            <author initials="D." surname="Firestone" fullname="Daniel Firestone"/>
            <author initials="C." surname="Guo" fullname="Chuanxiong Guo"/>
            <author initials="M." surname="Lipshteyn" fullname="Marina Lipshteyn"/>
            <author initials="Y." surname="Liron" fullname="Yehonatan Liron"/>
            <author initials="J." surname="Padhye" fullname="Jitendra Padhye"/>
            <author initials="S." surname="Raindel" fullname="Shachar Raindel"/>
            <author initials="M. H." surname="Yahia" fullname="Mohamad Haj Yahia"/>
            <author initials="M." surname="Zhang" fullname="Ming Zhang"/>
            <date year="2015" month="August"/>
          </front>
          <refcontent>Proceedings of ACM SIGCOMM 2015, pp. 523-536</refcontent>
        </reference>
        <reference anchor="NDP" target="https://doi.org/10.1145/3098822.3098825">
          <front>
            <title>Re-architecting Datacenter Networks and Stacks for Low Latency and High Performance</title>
            <author initials="M." surname="Handley" fullname="Mark Handley"/>
            <author initials="C." surname="Raiciu" fullname="Costin Raiciu"/>
            <author initials="A." surname="Agache" fullname="Alexandru Agache"/>
            <author initials="A." surname="Voinescu" fullname="Andrei Voinescu"/>
            <author initials="A. W." surname="Moore" fullname="Andrew W. Moore"/>
            <author initials="G." surname="Antichi" fullname="Gianni Antichi"/>
            <author initials="M." surname="Wojcik" fullname="Marcin Wojcik"/>
            <date year="2017" month="August"/>
          </front>
          <refcontent>Proceedings of ACM SIGCOMM 2017, pp. 29-42</refcontent>
        </reference>
        <reference anchor="HOMA" target="https://doi.org/10.1145/3230543.3230564">
          <front>
            <title>Homa: A Receiver-Driven Low-Latency Transport Protocol Using Network Priorities</title>
            <author initials="B." surname="Montazeri" fullname="Behnam Montazeri"/>
            <author initials="Y." surname="Li" fullname="Yilong Li"/>
            <author initials="M." surname="Alizadeh" fullname="Mohammad Alizadeh"/>
            <author initials="J." surname="Ousterhout" fullname="John Ousterhout"/>
            <date year="2018" month="August"/>
          </front>
          <refcontent>Proceedings of ACM SIGCOMM 2018, pp. 221-235</refcontent>
        </reference>
        <reference anchor="IBTA-ROCEV2" target="https://www.infinibandta.org/">
          <front>
            <title>Supplement to InfiniBand Architecture Specification Volume 1 Release 1.2.1, Annex A17: RoCEv2</title>
            <author><organization>InfiniBand Trade Association</organization></author>
            <date year="2014" month="September"/>
          </front>
        </reference>
        <reference anchor="UEC" target="https://ultraethernet.org/">
          <front>
            <title>Ultra Ethernet Specification Version 1.0</title>
            <author><organization>Ultra Ethernet Consortium</organization></author>
            <date year="2025" month="June"/>
          </front>
        </reference>
      </references>
    </references>

    <section anchor="example" numbered="true">
      <name>Example Exchange and Encodings</name>
      <t>A sender with a 4 MiB KV cache transfer and a 2 KiB dispatch message
      toward the same receiver, with U = 16 KiB, proceeds as follows:</t>
      <artwork type="ascii-art">
 Sender                                             Receiver
   | ASSOC_REQUEST(nonce)                                |
   |----------------------------------------------------&gt;|
   |               ASSOC_ACCEPT(assoc, U, J, N_cu, ...)  |
   |&lt;----------------------------------------------------|
   | (random delay in [0, J])                            |
   | CREDIT_REQUEST(id=0x100, len=2048, unsched=2048)    |
   | data 0..2047 (unscheduled DSCP)                     |
   |----------------------------------------------------&gt;|
   | CREDIT_REQUEST(id=0x101, len=4 MiB, class 2)        |
   |----------------------------------------------------&gt;|
   |                                   MSG_DONE(0x100)   |
   |          CREDIT_GRANT(0x101, limit=256 KiB, 100G)   |
   |&lt;----------------------------------------------------|
   | data 0..262143 of 0x101, paced                      |
   |----------------------------------------------------&gt;|
   |          CREDIT_GRANT(0x101, limit=512 KiB, 60G)    |
   |&lt;----------------------------------------------------|
   |                   ...                               |
   |    CREDIT_GRANT(0x101, limit=4 MiB, FINAL)          |
   |&lt;----------------------------------------------------|
   |                                   MSG_DONE(0x101)   |
   |&lt;----------------------------------------------------|
</artwork>
      <t>The CREDIT_REQUEST for message 0x101 (Association ID 0x5A17C0DE,
      Epoch 3, Sequence Number 7, Class 2, Weight 4, Service Hint 1,
      RoCEv2 binding with destination queue pair 0x000123, first message
      sequence number 5, and 16 RDMA messages of 256 KiB each) is encoded
      as:</t>
      <artwork>
10 03 00 38 5a 17 c0 de 00 03 00 00 00 00 00 07
00 00 00 00 00 00 01 01 00 00 00 00 00 40 00 00
00 00 00 00 00 00 00 00 02 04 01 01 00 00 00 00
00 01 23 00 00 05 00 10
</artwork>
      <t>The first CREDIT_GRANT (Sequence Number 42, Grant Limit 262144,
      Pacing Rate 100000 Mbit/s, Lifetime 2000 microseconds) is encoded
      as:</t>
      <artwork>
10 04 00 28 5a 17 c0 de 00 03 00 00 00 00 00 2a
00 00 00 00 00 00 01 01 00 00 00 00 00 04 00 00
00 01 86 a0 00 00 07 d0
</artwork>
    </section>

    <section anchor="acknowledgments" numbered="false">
      <name>Acknowledgments</name>
      <t>The authors thank the participants of the distributed inference
      networking discussions for their review of the problem
      statement.</t>
    </section>
  </back>
</rfc>