<?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="exp"
     docName="draft-przygienda-lsr-fast-flooding-rtx-indication-01"
     ipr="trust200902"
     submissionType="IETF"
     consensus="false"
     obsoletes=""
     updates="9681"
     xml:lang="en"
     tocInclude="true"
     tocDepth="4"
     symRefs="true"
     sortRefs="true"
     version="3">

  <front>
    <title abbrev="Fast Flooding RTX Indication">Retransmission Indication for IS-IS Fast Flooding</title>

    <author initials="T." surname="Przygienda" fullname="Tony Przygienda">
      <organization>HPE Juniper Networking</organization>
      <address>
        <email>antoni.przygienda@hpe.com</email>
      </address>
    </author>

    <author initials="G." surname="Van de Velde" fullname="Gunter Van de Velde">
      <organization>Nokia</organization>
      <address>
        <postal>
          <street>Copernicuslaan 50</street>
          <city>Antwerp</city>
          <code>2018</code>
          <country>Belgium</country>
        </postal>
        <email>gunter.van_de_velde@nokia.com</email>
      </address>
    </author>

    <date/>

    <area>Routing</area>
    <workgroup>lsr</workgroup>

    <keyword>IS-IS</keyword>
    <keyword>fast flooding</keyword>
    <keyword>retransmission</keyword>
    <keyword>congestion control</keyword>

    <abstract>
      <t>
        <xref target="RFC9681"/> defines a Flooding Parameters TLV. Among other
        things, it lets an IS-IS node advertise two values to a neighbor. The
        Receive Window (RWIN) bounds the number of unacknowledged Link State
        PDUs (LSPs) the neighbor may have outstanding. The LSPs-per-PSNP (LPP)
        threshold triggers immediate acknowledgment. Together they form a
        credit-based flow-control window and an acknowledgment cadence. These
        are the parts of <xref target="RFC9681"/> that are most important, most
        useful, and most likely to be implemented at scale. The sender-side
        congestion-control algorithms in that document are described only as
        optional, local choices. No single algorithm is mandatory.
      </t>
      <t>
        A credit-based window alone does not signal congestion. As long as
        acknowledgments keep freeing credit, a sender may keep refilling the
        window up to RWIN. It does so even while it is actively retransmitting
        LSPs on that adjacency. Without an explicit, normatively specified
        reaction to observed retransmission, fast flooding at scale can
        degenerate into sustained retransmission storms that serve only to keep
        the window full.
      </t>
      <t>
        This document specifies a local backoff. A node reduces the
        effective outstanding-LSP ceiling it uses against a neighbor's
        advertised RWIN by a meaningful fraction. The trigger is a count of
        LSP retransmissions generated toward that neighbor within a trailing
        time window exceeding a threshold. This backoff applies
        unconditionally. It does not depend on whether the condition is
        signaled to the neighbor, or understood by it.
      </t>
      <t>
        This document also defines a lightweight Retransmission (RTX)
        indication. It is a new flag in the existing Flags sub-TLV of the
        Flooding Parameters TLV. A node advertises it to a neighbor while it is
        retransmitting LSPs toward that neighbor. The flag reports only the
        advertising node's own retransmissions, that is, its own congestion. A
        node never sets it in reaction to a neighbor's flag. The flag lets the
        neighbor adjust its own advertised RWIN in turn. The adjacency then
        converges toward a stable operating point at the highest speed it can
        sustain. Neither side needs prior knowledge of the other's
        characteristics or of the link.
      </t>
      <t>
        This document further clarifies how concurrent versions of the same LSP
        fragment are counted against RWIN, LPP, and the retransmission
        threshold. <xref target="RFC9681"/> leaves that case undefined, and it
        arises routinely at fast flooding rates.
      </t>
    </abstract>
  </front>

  <middle>

    <section anchor="intro" numbered="true" toc="default">
      <name>Introduction</name>
      <t>
        <xref target="RFC9681"/> ("IS-IS Fast Flooding") introduces the Flooding
        Parameters TLV to let IS-IS neighbors negotiate faster and more efficient
        Link State PDU (LSP) flooding. Of the sub-TLVs it defines, two provide the
        practical basis for flow control that implementations are expected to
        deploy at scale:
      </t>
      <ul>
        <li>
          The Receive Window (RWIN) sub-TLV (<xref target="RFC9681" section="4.6"/>),
          which bounds the number of unacknowledged LSPs a sender may have
          outstanding toward a given neighbor (<xref target="RFC9681" section="6.2.1"/>).
        </li>
        <li>
          The LSPs-per-PSNP (LPP) sub-TLV (<xref target="RFC9681" section="4.3"/>),
          which sets the number of unacknowledged LSPs that triggers an immediate
          PSNP rather than waiting for the periodic PSNP timer
          (<xref target="RFC9681" section="5.1"/>).
        </li>
      </ul>
      <t>
        RWIN is, by design, a flow-control mechanism. It prevents a sender from
        overrunning a receiver's buffering capacity. It says nothing about
        whether the path or the receiver is currently congested. A sender that
        naively refills its outstanding-LSP count up to RWIN as soon as
        acknowledgments arrive keeps doing so under two conditions it cannot
        distinguish. Acknowledgments may be arriving so late that retransmission
        timers have already fired. Alternatively, the LSPs the sender transmits
        may be lost before they reach the receiver. Either way, sustained
        retransmissions are direct evidence of loss, or of a receiver falling
        behind. <xref target="RFC9681"/> nevertheless leaves the reaction to that
        evidence as an unspecified, optional, sender-local congestion-control
        algorithm (<xref target="RFC9681" section="6.2.2"/>).
      </t>
      <t>
        Experience indicates that a reaction left entirely optional will not be
        consistently implemented. The fast flooding rates
        enabled by <xref target="RFC9681"/> can then make things worse rather
        than better under loss or overload. Nodes keep sending at the full
        advertised window, and retransmission storms are sustained rather than
        damped.
      </t>
      <t>
        This document closes that gap without requiring a full
        congestion-window algorithm. It specifies that a node SHOULD locally
        reduce its effective sending ceiling relative to RWIN whenever it is
        retransmitting, independent of any signaling. It also defines a
        single-bit Retransmission (RTX) indication, carried in the existing
        Flags sub-TLV (<xref target="RFC9681" section="4.4"/>). A neighbor
        observing that indication can tune its own RWIN advertisement, and
        optionally the LPP derived from it, toward a stable value. That value
        sustains the highest speed the adjacency can support while minimizing
        retransmissions, which contribute nothing to goodput.
      </t>
      <t>
        This document applies to point-to-point adjacencies only. LAN
        interfaces are out of scope, as they already are for the flow and
        congestion control of <xref target="RFC9681"/> itself
        (<xref target="RFC9681" section="6.2.1.2"/>). See <xref target="lan"/>.
      </t>
    </section>

    <section anchor="reqlang" numbered="true" toc="default">
      <name>Requirements Language</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>
    </section>

    <section anchor="problem" numbered="true" toc="default">
      <name>Motivation</name>
      <t>
        Consider a point-to-point adjacency where the receiver has advertised
        RWIN=60 and LPP=15, as suggested in <xref target="RFC9681" section="6.2.4.1"/>.
        The sender transmits LSPs up to its outstanding-LSP ceiling. Absent any
        other information, it sets that ceiling to RWIN. Suppose the receiver
        becomes momentarily overloaded. Its PSNPs are delayed, the sender's
        retransmit timers fire as governed by minimumLSPTransmissionInterval
        <xref target="ISO10589"/>, and the sender retransmits. The credit-window
        bookkeeping treats retransmitted LSPs as outstanding LSPs like any
        other. The sender therefore has no built-in reason to reduce the number
        of LSPs it keeps outstanding. As soon as any acknowledgment arrives and
        frees credit, even a late one, the sender refills up to RWIN again.
      </t>
      <t>
        This is workable at the flooding rates for which <xref target="RFC9681"/>'s
        historical defaults were designed. It is, however, precisely the failure
        mode that fast flooding at larger scale must avoid. A receiver that
        falls behind by a small margin can be kept continuously on the edge of
        retransmission by a sender that never backs off. That sender in turn
        keeps generating the retransmissions that caused the problem in the
        first place.
      </t>
      <t>
        A minimal, normatively specified local backoff at the sender is
        sufficient to break this cycle. The sender reduces its outstanding-LSP ceiling by a
        meaningful fraction whenever its rate of LSP
        retransmissions toward that neighbor exceeds a threshold. It
        does so whether or not the condition is signaled. No separate
        congestion-control algorithm has to be built and tuned.
      </t>
      <t>
        Signaling the condition to the neighbor adds a second benefit. The
        advertised RWIN itself can then be tuned toward the correct steady-state
        value for the current link and peer. It need not stay fixed forever at a
        conservative, offline-computed default chosen without knowledge of
        either.
      </t>
      <t>
        A single closing step is not guaranteed to be enough. The mismatch
        between the ceiling the sender was using and what the receiver and path
        can actually sustain may be larger than the fraction reduced in one
        step. The sender then continues retransmitting even after backing off
        once.
      </t>
      <t>
        It is therefore highly desirable that the receiver, on seeing the RTX
        indication, actively squelch its own advertised RWIN rather than merely
        holding it steady. A lower advertised RWIN gives the sender a lower base
        to reduce against. The RTX flag persists for as long as retransmission
        continues, so this can repeat over successive rounds until a stable
        point is reached at which retransmission stops.
      </t>
      <t>
        Once retransmission has stopped, the window should be reopened again.
        The reopening is deliberately slower, and in smaller steps, than the
        closing was. The adjacency then settles into a stable operating point
        instead of oscillating between overload and underuse. See
        <xref target="hysteresis"/>.
      </t>
    </section>

    <section anchor="rtx-flag" numbered="true" toc="default">
      <name>The RTX Flag</name>
      <t>
        This document defines a new bit in the Flags sub-TLV of the Flooding
        Parameters TLV (<xref target="RFC9681" section="4.4"/>), called the RTX
        flag (bit TBD1, suggested value 1). Bit 0 is the existing O-flag
        defined in <xref target="RFC9681"/>.
      </t>
      <t>
        The RTX flag is a statement by the node that sets it about its own
        sending. It indicates that the node is currently retransmitting LSPs
        toward the neighbor it is advertised to. It carries no other meaning.
        It describes only the direction from the node setting the flag to the
        neighbor receiving it. It says nothing about the opposite direction of
        the same adjacency. It is not a general indication of node or link
        distress.
      </t>
      <t>
        Consequently, a node MUST NOT set the RTX flag it advertises merely
        because a neighbor has set the flag toward it. A node MUST NOT set the
        flag as a result of any adjustment it makes in reaction to a neighbor's
        flag either.
        A node sets the flag on the basis of its own retransmissions only.
      </t>
      <t>
        Reflecting a received flag back, directly or indirectly, would report a
        condition the node has not observed. It would also allow two nodes to
        drive each other's advertised values steadily downward even though only
        one of them, or neither, is actually retransmitting. For the same
        reason, the flag advertised by a node and any reduction that node has
        made to its own advertised RWIN or LPP are independent. Either may be
        present without the other.
      </t>
      <t>
        A node maintains, per adjacency, a count of the LSP retransmissions it
        has generated toward the neighbor within a trailing retransmission
        window. It sets the RTX flag on that
        adjacency when this count exceeds a retransmission
        threshold. It clears the flag once retransmissions have subsided.
        Clearing SHOULD require a more conservative condition than the one that
        set the flag. Otherwise the flag would alternate rapidly between set and
        clear while the count hovers near the threshold. Like other Flooding
        Parameters TLV state, the flag
        is advertised in IIHs and PSNPs (<xref target="RFC9681" section="4"/>),
        and, on adjacencies where <xref target="I-D.prz-lsr-ash-packets"/> is
        in use, in PASHs as well. It reflects the most recently advertised
        value until updated.
      </t>
      <t>
        Both the retransmission window and the retransmission threshold are
        local matters. They are not signaled to the neighbor. A node derives
        them from state it already holds for the adjacency. No per-interface
        tuning is needed to reach a working operating point. The retransmission
        interval in use on the adjacency is a suitable basis for the window. A
        window on the order of a few times that interval is a reasonable
        starting point, as is a threshold on the order of a small
        number of retransmissions, for example 3. Such values are short and low
        enough to react promptly to sustained loss. They are high enough that a
        single, isolated retransmission does not by itself set the flag or
        trigger the backoff of <xref target="sender"/>.
      </t>

      <t>
        A node SHOULD advertise promptly whenever the state it advertises
        becomes more conservative. Two cases arise. The first is the RTX flag
        transitioning from clear to set. The second is the node reducing an RWIN
        or LPP value it advertises. The cause of the reduction does not matter.
        It may be a neighbor's RTX flag (<xref target="receiver"/>). It may
        equally be the node's own backlog of owed acknowledgments
        (<xref target="backlog"/>). In either case the node SHOULD send an IIH
        carrying the updated Flags, Receive Window, and LSPs-per-PSNP sub-TLVs
        immediately, rather than waiting for its next regularly scheduled Hello.
        The sooner a neighbor learns of the condition, the sooner it can stop
        sustaining it by squelching its own advertised RWIN. Neither
        <xref target="ISO10589"/> nor <xref target="RFC9681"/> defines an IIH
        sent outside the periodic Hello schedule for this purpose. Doing so here
        is additional behavior recommended by this document. It does not replace
        the regularly scheduled IIHs.
      </t>
      <t>
        Such triggered IIHs MUST be dampened. A node MUST NOT send more than one
        triggered IIH on an interface within a dampening interval. The
        conditions that trigger them can flap rapidly. An undampened trigger
        would turn that flapping into a Hello storm, which is itself a load on
        the receiver the mechanism is trying to relieve. The dampening interval
        is a local matter. Suppression MUST NOT lose an advertised value. A
        node that suppresses a triggered IIH retains the pending change and
        sends it when the interval expires. The values sent then are the most
        recently computed ones, not the ones that were current when the trigger
        fired.
      </t>
      <t>
        No equivalent urgency applies in the opposite case. When the RTX flag
        clears, or when a node widens an RWIN or LPP value it had previously
        reduced, the updated value SHOULD simply be carried in the next
        regularly scheduled IIH, PSNP, or PASH. This asymmetry is intentional.
        It mirrors the deliberately slow reopening described in
        <xref target="hysteresis"/>. There is no benefit to rushing the good
        news, and doing so would only invite oscillation.
      </t>
      <t>
        The RTX flag is advertised for one purpose. It lets a neighbor tune its
        own RWIN advertisement, and optionally the LPP derived from it, toward a
        stable operating point, as described in <xref target="receiver"/>. It is
        not what triggers the sending node's own backoff. That backoff,
        described in <xref target="sender"/>, is local and unconditional. It
        applies whether or not the RTX flag is advertised or understood by the
        neighbor.
      </t>
    </section>

    <section anchor="lsp-counting" numbered="true" toc="default">
      <name>Counting LSPs Under Concurrent Versions</name>
      <t>
        <xref target="RFC9681"/> defines RWIN as bounding "the maximum number
        of unacknowledged LSPs" a sender may have outstanding
        (<xref target="RFC9681" section="4.6"/>). It defines LPP as a count of
        "received LSPs" that triggers an immediate PSNP
        (<xref target="RFC9681" section="4.3"/>). Neither definition says what
        counts as one LSP when the same LSP fragment exists in more than one
        version at the same time. This document clarifies that gap. The
        retransmission threshold defined in <xref target="rtx-flag"/> depends on
        the same counting being unambiguous.
      </t>
      <t>
        At the flooding rates this document and <xref target="RFC9681"/>
        target, it is normal for a node to regenerate an LSP fragment before an
        older version of that same fragment has been acknowledged by a given
        neighbor. Regenerating a fragment means issuing a new version of it with
        an incremented sequence number. It happens, for example, because the
        underlying topology or attributes changed again in rapid succession. The
        LSP ID identifying the fragment does not change when this happens. That
        ID comprises the System ID, Pseudonode ID, and LSP Number, and excludes
        the sequence number. The older, superseded version can then be shadowed
        out of the send queue, the receive queue, or both. It is never
        individually acknowledged or explicitly discarded on the wire.
      </t>
      <t>
        For the purposes of RWIN, LPP, and the retransmission threshold of
        <xref target="rtx-flag"/>, all concurrently in-flight or pending
        versions of the same LSP fragment MUST be counted as a single pending
        LSP. Versions of the same fragment are those sharing the same LSP ID.
        They MUST NOT be counted as one per version, or as one per sequence
        number observed. An acknowledgment of any version of the fragment
        resolves that one pending slot, as does the version being shadowed by a
        newer one. Seeing more than one version of the same fragment MUST NOT be
        treated as though multiple LSPs were outstanding, acknowledged, or
        retransmitted. Counting versions separately would inflate all three
        counters against fragments that happen to update quickly. The result
        would be spurious RWIN exhaustion, needless PSNPs, and false positives
        on the retransmission threshold. None of these reflect actual load on
        the adjacency or the receiver.
      </t>
    </section>

    <section anchor="procedures" numbered="true" toc="default">
      <name>Procedures</name>

      <section anchor="sender" numbered="true" toc="default">
        <name>Sender Behavior (Local Backoff)</name>
        <t>
          A node SHOULD reduce the effective outstanding-LSP ceiling it uses on
          an adjacency whenever the retransmission threshold defined in
          <xref target="rtx-flag"/> is exceeded on that adjacency. The
          condition is the node's own local trigger for setting the RTX flag
          there. The ceiling is reduced relative to the RWIN value currently
          advertised by the neighbor. The node does not continue refilling up to
          the full RWIN as acknowledgments arrive.
        </t>
        <t>
          This behavior is local and unconditional. It applies whether or not
          the node advertises the RTX flag, and whether or not the neighbor
          understands it. An adjacency to a peer that does not implement this
          document therefore still benefits from the backoff.
        </t>
        <t>
          The exact reduction is a local matter. It SHOULD NOT be
          less than 25% of the current ceiling. A step that size remains large
          enough to meaningfully change sending behavior. It is also large
          enough to convert sustained retransmission into a self-damping
          condition. None of the bookkeeping of a full congestion window
          (<xref target="RFC9681" section="6.2.2"/>) is required.
        </t>
        <t>
          A single closing step is not guaranteed to stop retransmission by
          itself. The neighbor may also reduce its advertised RWIN in response
          to the RTX indication (<xref target="receiver"/>). The sender then
          reduces its ceiling again, relative to that newly reduced value, the
          next time its retransmission count exceeds the threshold. This repeats
          for as long as the condition persists. See <xref target="hysteresis"/>
          for how this repeated, mutual reduction is expected to converge, and
          for how the ceiling is subsequently reopened.
        </t>
      </section>

      <section anchor="receiver" numbered="true" toc="default">
        <name>Receiver Behavior (RWIN Convergence)</name>
        <t>
          A node observing that a neighbor has set the RTX flag toward it
          SHOULD treat this as feedback. The feedback says that the RWIN value
          the node currently advertises to that neighbor, and the LPP value if
          one is used, exceeds what the neighbor and the path between them can
          sustain. The node SHOULD therefore actively squelch the RWIN it
          advertises (see <xref target="RFC9681" section="4.6"/>).
          Merely leaving the advertisement unchanged, and waiting for the
          sender's own backoff to be sufficient, is not enough. The node SHOULD
          advertise the reduced value immediately, as described in
          <xref target="rtx-flag"/>, rather than waiting for its next
          regularly scheduled IIH.
        </t>
        <t>
          RWIN SHOULD be the only value squeezed directly. Where a node also
          advertises LPP (<xref target="RFC9681" section="4.3"/>), the LPP it
          advertises SHOULD be derived from the RWIN resulting from each
          squeezing step. The two are halves of one promise. RWIN tells the
          sender how many LSPs it may hold outstanding. LPP tells it how
          quickly those will be acknowledged. Deriving one from the other keeps
          that promise consistent at every intermediate step. How it is derived
          is a local matter and is not specified here.
        </t>
        <t>
          Squeezing the two independently is NOT RECOMMENDED. Each would then
          carry its own rounding and its own trajectory, and the pair can drift
          apart in either direction. Both outcomes are harmful. An LPP left too
          high relative to a squeezed RWIN can never be reached, because the
          window no longer admits that many unacknowledged LSPs. The immediate
          acknowledgment it is supposed to trigger then never fires.
          Acknowledgment falls back to the periodic PSNP timer, which is the
          slow path, at exactly the moment the neighbor most needs the fast
          one. The squeeze therefore sustains the retransmissions it was meant
          to stop. An LPP driven too low relative to RWIN has the opposite
          effect. It produces a PSNP for a very small number of LSPs, and that
          acknowledgment traffic competes with the flooding it exists to
          support. A node SHOULD keep enough margin between the two that a full
          window always admits more than one acknowledgment trigger.
        </t>
        <t>
          The RTX flag remains set for as long as the neighbor keeps
          retransmitting, so a single reduction is not guaranteed to be enough.
          If the flag is still set at the receiver's next opportunity to
          re-advertise the Flooding Parameters TLV, the receiver SHOULD reduce
          its advertised RWIN further. It SHOULD repeat this on each subsequent
          round for as long as the flag remains set. Combined with the sender's
          own reduction (<xref target="sender"/>), this mutual, repeated
          squeezing converges to a stable operating point at which
          retransmission ceases. Neither node needs prior knowledge of the
          other's characteristics or of the link.
        </t>
      </section>

      <section anchor="backlog" numbered="true" toc="default">
        <name>Receiver-Local Backlog as a Congestion Signal</name>
        <t>
          The RTX flag gives a receiver evidence of overload only once the
          sender has already retransmitted. A receiver has earlier and more
          direct evidence available locally. That evidence is the backlog of
          acknowledgments it owes but has not yet sent. RWIN is a statement
          about what the receiver is able to absorb, process and acknowledge.
          It is not a statement about what keeps the sender's transmit path
          busy. A receiver whose backlog of owed acknowledgments grows
          persistently is, by construction, failing to honor the LPP it
          advertises. That failure is the proximate cause of the
          retransmissions that will follow.
        </t>
        <t>
          This backlog is therefore a valid input to the same hysteresis as
          the RTX flag. A receiver SHOULD watch for a persistent excess of
          acknowledgments owed over what it has advertised it will acknowledge
          promptly. Such an excess indicates that the RWIN the receiver
          advertises exceeds what it can sustain. The receiver SHOULD then
          reduce that advertised RWIN as described in <xref target="receiver"/>,
          without waiting for the neighbor to set the RTX flag.
        </t>
        <t>
          The two signals are complementary. The RTX flag is observed by the
          sender and confirms that retransmission has already occurred. The
          backlog is observed by the receiver, is available earlier, and is
          available even when the neighbor does not implement this
          specification.
        </t>
        <t>
          A receiver SHOULD NOT bound its advertised RWIN from below by a
          value derived from its own transmission timers. One such value is the
          ratio of the receiver's own retransmission interval to its own
          minimum LSP transmission spacing. That ratio counts how many LSPs
          baseline pacing would send within one retransmission interval. It
          expresses how large a window would be needed to keep the node's own
          transmit path busy. It
          is unrelated to how much the node can receive and process. The bound
          also grows without limit as the retransmission interval grows. If an
          adjacency uses a long retransmission interval and a short transmission
          spacing, the window size held up by such a bound may grow unbounded.
          The advertised window cannot be reduced at all in that case, and the
          mechanisms of this document are inert precisely on the interfaces
          carrying the most load.
        </t>
        <t>
          This signal is only meaningful where the emission of
          acknowledgments is not itself deferred behind other use of PSNP
          capacity. Such other use includes requests for LSPs the node is
          missing, and entries generated by a database reconciliation mechanism
          such as <xref target="I-D.prz-lsr-ash-packets"/>. A deferred
          acknowledgment directly causes a retransmission. Deferred
          reconciliation generally does not. A receiver that shares PSNP
          capacity in this way SHOULD NOT allow that other use to delay the
          acknowledgments whose backlog this signal measures.
        </t>
      </section>

      <section anchor="hysteresis" numbered="true" toc="default">
        <name>Convergence and Hysteresis</name>
        <t>
          The mechanisms of <xref target="sender"/> and <xref target="receiver"/>
          are deliberately asymmetric. Closing the window, on either side, is
          meant to be fast and proportionally significant. Reopening it is meant
          to be slow and incremental. Once the RTX flag has cleared, a receiver
          MAY probe for a higher sustainable RWIN, and a sender MAY
          correspondingly raise its effective ceiling toward the newly
          advertised RWIN. The step used to reopen SHOULD NOT exceed half of the
          step most recently used to close. Both sides SHOULD proceed in small
          steps over successive rounds, rather than jumping back to the prior
          value immediately. An immediate, full restoration would likely
          reproduce the original overload. The RTX flag would then be set again
          on the very next round, and the adjacency would oscillate between
          overload and underuse instead of settling.
        </t>
        <t>
          This fast-close/slow-open hysteresis is what allows the repeated,
          mutual squeezing described in <xref target="sender"/> and
          <xref target="receiver"/> to actually converge. The adjacency then
          holds at a stable point close to the highest speed it can sustain.
          Without the hysteresis it would merely oscillate between a too-fast
          state that retransmits and a too-slow state that immediately reopens
          back into retransmission.
        </t>
        <t>
          Reopening MUST be bounded. A node MUST impose an upper bound on the
          RWIN it advertises. It MUST NOT let successive reopening steps carry
          the advertised value past that bound. The bound reflects what the node
          can actually acknowledge. It is not what the node is willing to
          buffer, and the two are not the same. An advertised window larger than
          what the node can drain within the sender's retransmission deadline
          causes the very retransmissions this document seeks to suppress. It
          does so even on a lossless link. Without such a bound, the slow
          reopening of this section runs away. The adjacency then oscillates
          between a window the receiver cannot service and the squeeze that
          follows, rather than settling. How the bound is derived is a local
          matter, and is outside the scope of this document. It is not signaled
          to the neighbor.
        </t>
        <t>
          The steps of the slow reopening are ordinarily carried on regularly
          scheduled IIHs rather than triggered immediately, per
          <xref target="rtx-flag"/>. A node's Hello interval may be
          long. Relying solely on that periodic cadence could then make
          reopening impractically slow, and with it the recovery of full
          flooding speed, even after the condition that caused the squeeze is
          long gone. In that case, a node SHOULD instead pace the reopening
          steps using a separate timer dedicated to this purpose, decoupled from
          the Hello interval. The rate of reopening can then be chosen
          independently of how infrequently Hellos are otherwise exchanged. This
          timer only paces the sending of the already-slow, incremental widening
          steps of this section. It does not apply to the fast-close case, which
          remains governed by <xref target="rtx-flag"/>.
        </t>
      </section>

      <section anchor="stall-fallback" numbered="true" toc="default">
        <name>Fallback on Persistent Non-Acknowledgment</name>
        <t>
          The mechanisms of <xref target="sender"/> through
          <xref target="hysteresis"/> assume that acknowledgments eventually
          arrive. They may be delayed, infrequent, or reduced by an ongoing
          squeeze, but they arrive. Those mechanisms do not by themselves
          address a neighbor that stops acknowledging entirely. Such a neighbor
          may have failed, become unreachable, or otherwise stopped processing
          received LSPs at all. Toward such a neighbor, repeatedly reducing the
          effective sending ceiling per <xref target="sender"/> only ever
          narrows the window further. It provides no path back to useful
          progress. Flooding toward that interface then risks stalling at a
          small residual rate, or effectively not at all, instead of falling
          back to the unconditional guarantees that IS-IS flooding has always
          provided.
        </t>
        <t>
          To bound this risk, a sender SHOULD track, per adjacency, how long it
          has been since the last acknowledgment covering any LSP was received
          from that neighbor. The measure may be time or a number of
          retransmission intervals. Suppose this exceeds a small
          multiple of the retransmission interval in use, for example three to
          five, with no acknowledgment at all seen in the interim. The sender
          SHOULD then abandon the negotiated fast-flooding parameters for that
          adjacency. It SHOULD revert to the conservative, default
          flooding behavior of <xref target="RFC9681" section="3"/>, that is,
          the historical, pre-fast-flooding defaults. It stays there until an
          acknowledgment is again received from that neighbor. Once an
          acknowledgment is observed, the sender MAY resume applying the
          mechanisms of <xref target="sender"/> through
          <xref target="hysteresis"/>. It restarts from a conservative starting
          point, not from whatever ceiling was in effect immediately before the
          fallback.
        </t>
        <t>
          This fallback is a safety valve. It does not replace the RTX flag and
          RWIN-squeeze mechanisms described elsewhere in this document. It is
          intended to activate only when there is no evidence whatsoever that
          the neighbor is processing LSPs. Its sole purpose is to guarantee that
          a persistently non-acknowledging neighbor cannot stall the
          fast-flooding feedback loop indefinitely at some low but nonzero rate.
          The adjacency instead reverts to behavior at least as conservative as
          legacy IS-IS flooding.
        </t>
      </section>

      <section anchor="lan" numbered="true" toc="default">
        <name>LAN Interfaces Are Out of Scope</name>
        <t>
          This document applies to point-to-point adjacencies only. LAN
          interfaces are out of scope. No mechanism defined here is specified
          for use on a LAN interface, and none of its normative requirements
          apply there.
        </t>
        <t>
          This follows <xref target="RFC9681"/> itself.
          <xref target="RFC9681" section="6.2.1.2"/> states explicitly that
          "flow and congestion control on a LAN interface is out of scope" for
          that document. The mechanisms defined here are precisely a form of
          flow and congestion control. Extending them to LAN interfaces would
          first require closing that gap in <xref target="RFC9681"/>.
        </t>
        <t>
          The obstacle is not merely editorial.
          <xref target="RFC9681" section="4.7"/> has a transmitter reconcile
          differing advertisements from several neighbors on the same LAN by
          taking the most conservative value for each parameter. The
          retransmission counting and the RTX flag defined in
          <xref target="rtx-flag"/> are, by construction, per-neighbor. A
          single sending ceiling on a shared medium cannot express per-neighbor
          feedback. How the two compose when more than two systems share a LAN
          is undefined, and this document does not define it.
        </t>
        <t>
          One consequence of how <xref target="RFC9681"/> itself already
          specifies the Flooding Parameters TLV is worth stating, as it shows
          the scale of what a LAN treatment would have to address. Per
          <xref target="RFC9681" section="4"/>, "for a parameter that has never
          been advertised, an IS uses its local default value". Per
          <xref target="RFC9681" section="4.7"/>, a transmitter on a LAN uses
          the most conservative value across all neighbors for each parameter.
          Now suppose that not every attached system on the LAN advertises the
          LPP (<xref target="RFC9681" section="4.3"/>) and RWIN
          (<xref target="RFC9681" section="4.6"/>) sub-TLVs. At least one
          neighbor is then, by definition, operating on unadvertised local
          defaults for that parameter. The conservative-value rule binds the
          transmitter to those defaults toward the entire LAN. Fast flooding on
          a shared LAN segment is therefore effectively an all-or-nothing
          proposition. If even a single neighbor does not participate, the
          segment as a whole falls back to ordinary, non-fast-flooding
          thresholds, and no partial speedup is achieved.
        </t>
        <t>
          A complete design for fast-flooding congestion control on LAN
          interfaces remains future work, as it does for
          <xref target="RFC9681"/> itself.
        </t>
      </section>

    </section>

    <section anchor="interaction" numbered="true" toc="default">
      <name>Interaction with RFC 9681</name>
      <t>
        This document does not change the encoding, semantics, or use of the
        RWIN or LPP sub-TLVs defined in <xref target="RFC9681"/>. It only adds
        a bit to the existing Flags sub-TLV, and defines recommended behavior
        that references those existing sub-TLVs. Nodes that do not implement
        this document continue to interoperate exactly as described in
        <xref target="RFC9681"/>. Such a node simply leaves the RTX flag unset,
        and ignores the flag if it is received from a neighbor that does
        implement this document.
      </t>
      <t>
        This document intentionally does not modify or replace the
        sender-side congestion control algorithms of
        <xref target="RFC9681" section="6.2.2"/> or
        <xref target="RFC9681" section="6.3"/>. An implementation that already
        implements one of those algorithms MAY treat the RTX flag purely as an
        additional congestion signal within that algorithm. It MAY do so in
        place of the sender-local backoff of <xref target="sender"/>, or in
        addition to it.
      </t>
    </section>

    <section anchor="iana" numbered="true" toc="default">
      <name>IANA Considerations</name>
      <t>
        IANA is requested to allocate the following bit in the "IS-IS Bit
        Values for Flooding Parameters Flags Sub-TLV" registry
        (<xref target="RFC9681" section="7.3"/>):
      </t>
      <table anchor="tab-iana">
        <name>RTX Flag Bit Allocation</name>
        <thead>
          <tr><th>Bit</th><th>Description</th><th>Reference</th></tr>
        </thead>
        <tbody>
          <tr><td>TBD1 (suggested: 1)</td><td>Retransmission (RTX) flag</td><td>This document</td></tr>
        </tbody>
      </table>
    </section>

    <section anchor="security" numbered="true" toc="default">
      <name>Security Considerations</name>
      <t>
        This document reuses the Flooding Parameters TLV and its
        authentication properties defined in <xref target="RFC9681"/>; the
        security considerations of that document
        (<xref target="RFC9681" section="8"/>) apply unchanged.
      </t>
      <t>
        A false or forged RTX indication has consequences similar to those of a
        forged RWIN or LPP value, discussed in
        <xref target="RFC9681" section="8"/>. An attacker able to inject a
        spoofed indication on an adjacency could induce a neighbor to
        needlessly reduce its RWIN, slowing convergence. An attacker able to
        suppress a legitimate indication could prevent a peer from backing off.
        Both attacks require the same link-layer access already assumed by
        <xref target="RFC9681" section="8"/>. The impact is bounded to the
        affected adjacency, and it is self-correcting once the RTX flag state is
        next advertised truthfully.
      </t>
    </section>

    <section anchor="ack" numbered="true" toc="default">
      <name>Acknowledgements</name>
      <t>
        TBD.
      </t>
    </section>

  </middle>

  <back>
    <references>
      <name>Normative References</name>
      <reference anchor="RFC9681" target="https://www.rfc-editor.org/info/rfc9681">
        <front>
          <title>IS-IS Fast Flooding</title>
          <author initials="B." surname="Decraene" fullname="Bruno Decraene"/>
          <author initials="L." surname="Ginsberg" fullname="Les Ginsberg"/>
          <author initials="T." surname="Li" fullname="Tony Li"/>
          <author initials="G." surname="Solignac" fullname="Guillaume Solignac"/>
          <author initials="M." surname="Karasek" fullname="Marek Karasek"/>
          <author initials="G." surname="Van de Velde" fullname="Gunter Van de Velde"/>
          <author initials="T." surname="Przygienda" fullname="Tony Przygienda"/>
          <date month="November" year="2024"/>
        </front>
        <seriesInfo name="RFC" value="9681"/>
        <seriesInfo name="DOI" value="10.17487/RFC9681"/>
      </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 initials="S." surname="Bradner" fullname="S. 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 initials="B." surname="Leiba" fullname="B. 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="ISO10589" target="https://www.iso.org/standard/30932.html">
        <front>
          <title>Information technology - Telecommunications and information exchange between systems - Intermediate system to Intermediate system intra-domain routeing information exchange protocol for use in conjunction with the protocol for providing the connectionless-mode network service (ISO 8473)</title>
          <author><organization>ISO/IEC</organization></author>
          <date year="2002"/>
        </front>
        <seriesInfo name="ISO/IEC" value="10589:2002"/>
      </reference>
      <reference anchor="I-D.prz-lsr-ash-packets" target="https://datatracker.ietf.org/doc/html/draft-prz-lsr-ash-packets-07">
        <front>
          <title>IS-IS Aggregated SNP Hash Packets</title>
          <author initials="T." surname="Przygienda" fullname="Tony Przygienda"/>
          <author initials="T." surname="Li" fullname="Tony Li"/>
          <author initials="J." surname="Halpern" fullname="Joel Halpern"/>
          <date month="October" year="2026"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-prz-lsr-ash-packets-07"/>
      </reference>
    </references>
  </back>

</rfc>
