<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.1 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-mathis-ccwg-safecc-00" category="exp" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.18.2 -->
  <front>
    <title abbrev="Safe CC">Safe Congestion Control</title>
    <seriesInfo name="Internet-Draft" value="draft-mathis-ccwg-safecc-00"/>
    <author fullname="Matt Mathis">
      <organization abbrev="Freelance">Freelance, Measurement Lab</organization>
      <address>
        <email>ietf@mattmathis.net</email>
        <uri>https://mattmathis.net/</uri>
      </address>
    </author>
    <date/>
    <area>AREA</area>
    <workgroup>Congestion Control Working Group</workgroup>
    <keyword>congestion control</keyword>
    <abstract>
      <?line 40?>

<t>We present criteria for evaluating Congestion Control Algorithms (CCAs) for behaviors that have the potential to cause harm to Internet applications or users.</t>
      <t>Although our primary focus is the safety of transport layer congestion control, many of these criteria should be applied to all protocol layers: entire stacks, libraries and applications themselves.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-mathis-ccwg-safecc/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        CCWG Working Group mailing list (<eref target="mailto:ccwg@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/ccwg/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/ccwg/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/mattmathis/safeCC/"/>.</t>
    </note>
  </front>
  <middle>
    <?line 46?>

<section anchor="preamble">
      <name>Preamble</name>
      <t>This document is written in extra terse jargon.   In the final version many single sentences are likely to expand into full paragraphs.</t>
      <t>Some of the content here is likely to be moved to other documents, such as rfc3055bis.</t>
      <t>Editorial comments to authors are enclosed in [square brackets] or tagged with @@@@.</t>
      <t>Unformatted references appear below of many sections.</t>
      <t>[Remove this section before publication]</t>
    </section>
    <section anchor="intro">
      <name>Introduction</name>
      <t>We present criteria for evaluating Congestion Control Algorithms (CCA) for behaviors that have the potential to cause harm to Internet applications or users.</t>
      <t>Ideally we would cast these criteria as requirements; however such an effort is doomed to fail because many of the criteria have technical exceptions that are unavoidable in ways that are unimportant.</t>
      <t>[Introduce non-material] For an example of this issue see <xref target="noCollapse"/></t>
      <t>As an interim position: all implementations SHOULD comply with all criteria, and MUST document all exceptions and evaluate the risks associated with the exceptions. Under what circumstances and how severely they fail to comply, and what is the extent of the harm that non-compliance might cause?</t>
      <t>To prove the criteria proposed in this note they should be used to evaluate current and legacy CCAs: we expect to find alignment between known  CCA pathologies and failed criteria.  Any discrepancies may suggest additional criteria or sharpen our understanding of how to decide if a failed criteria is material or not.</t>
      <t>Indeed, Reno[rfc5681] and Cubic[Cubic] are known to fail several the criteria presented here, and as a consequence exhibit pathologies including bufferbloat[bufferbloat], starvation [starvation] and poor scaling[Scaling].</t>
      <t>All of these criteria will eventually be cast as conformance metrics or scores, to facilitate comparisons between algorithms. At this time we avoid being precise about the the scoring methodology to prevent implementers from overly optimizing artificial benchmarks. For example the bound on queue occupancy might be measured in bytes, packets or (predicted) sojourn time. We invite implementers to make their own choices, document and justify them.</t>
    </section>
    <section anchor="definitions">
      <name>Conventions and Definitions</name>
      <t>{::boilerplate bock14-tagged}<?line -2?>
      </t>
      <dl>
        <dt><strong>Exhaustion</strong></dt>
        <dd>
          <t>a network overloaded to the extent that the average delivery rate is below one segment per flow per RTT.</t>
        </dd>
        <dt><strong>Material</strong></dt>
        <dd>
          <t>failing a criteria in a manner that is likely to cause pathological behaviors under some conditions.</t>
        </dd>
        <dt><strong>Non-Material</strong></dt>
        <dd>
          <t>technically failing some criteria, but unimportant, insignificant or otherwise unlikely to cause pathological behaviors.</t>
        </dd>
        <dt><strong>Under adverse conditions</strong></dt>
        <dd>
          <t>refers to any increase in any congestion signals (loss, delay, marks or reduced queue space or capacity, etc) from any initial state.   For example introducing 1 Mb/s cross traffic to an otherwise ideal 10 Gb/s link is an adverse condition that should not trigger any of the misbehavior's described below.</t>
        </dd>
      </dl>
    </section>
    <section anchor="criteria">
      <name>Criteria</name>
      <t>The criteria are listed below in order of declining severity.  Items at the top of the list have the potential to cause large scale internet disruptions if they are widely deployed.  Items at the bottom of the list can cause unexpected or poor performance to the user.</t>
      <section anchor="noCollapse">
        <name>Free from congestion collapse</name>
        <t>Adverse conditions do not cause increasing overhead and specifically do not cause duplicate data at the receiver.</t>
        <t>Test: for a fixed work load, the overhead must be constant, independent of the network congestion across the entire operating range of the application or network.</t>
        <t>If there is packet loss, the retransmits must exactly match the losses.</t>
        <t>Example of an application that can cause congestion collapse: an automatic download engine that responds to transient network errors or persistent congestion by restarting downloads from the beginning.  For example git-clone can not be restarted mid transfer, such that failures caused by extreme overload or transient outages require removing and re-cloning the repository.</t>
        <t>Non-material example of congestion collapse: A download engine that properly restarts from where it left off still needs to repeat the connection establishment, ssl negotiation and possibly other signaling, thus increases the total overhead by a few bytes.   If the payload is not tiny, this is generally non-material.  If the payload is tiny and the relative overhead might be large, and might be prone to congestion collapse.</t>
        <t>Metric: worst case increase in overhead.</t>
      </section>
      <section anchor="noRegeneration">
        <name>Free from regenerative congestion</name>
        <t>Adverse conditions must not cause additional presented load.  Any congestion indication should cause transmissions to be later than they would have been without the congestion.</t>
        <t>This criteria is well understood at the transport layer: all congestion signals must cause the sender to reduce its average sending rate, delaying future transmissions.</t>
        <t>This criteria is not well understood by application designers.  Many applications open multiple transport connections and use aggressive retry strategies with insufficiently adaptive timers (see <xref target="selfScaling"/>).  This flawed strategy is generally an attempt to maintain constant performance without reacting adverse network conditions.</t>
        <t>Some (past?) streaming video application are known to request additional video chunks on alternate connections without regard to the delivery status of chunks already in progress.  Such a strategy often yields better performance when the application is a minority of the traffic, but might cause massive regenerative congestion and eventual collapse in a large scale deployment.</t>
        <t>Metric: worst case increase in presented load, with an elastic bottleneck that presents controlled congestion signals.</t>
      </section>
      <section anchor="boundLosses">
        <name>Bound steady state losses</name>
        <t>Steady state bulk transport should not cause more than 2% loss [study needed] over any unchanging network.  Even with advanced delay and ECN based algorithms, packet loss must be the ultimate congestion indication.  It has to be assumed that the bottleneck might have a shared queue, and that excessive loss harms other applications.</t>
        <t>Any transport with some form of selective acknowledgments can easily operate at a much higher loss rate.   The real problem is the harm that transport might cause to all single packet transactions, including initial DNS queries and connection establishment for nearly all protocols and services.   Single packet transactions generally can only use an RTO timer for recovery, often without any preceding RTT measurement, thus they typically take several orders of magnitude more time than any selective acknowledgment based recovery built into a transport protocol.</t>
        <t>The question at hand is really how much harm should we permit transport to inflict on all other protocols?</t>
        <t>For example, are we ok with happy eyeballs [RFC 8305] getting the wrong answer 2% of the time, because the IPv6 connection establishment failed on the first request??</t>
        <t>@@@@ Open question: does this also set a floor on non-congestion packet loss?</t>
        <t>@@@@ I consider 2% to be a bit excessive: 1% or 0.1% would be better, however that may be unrealistically low.   Reno and Cubic can both easily cause much higher loss rates.</t>
        <t>@@@@ We need some studies to justify the appropriate value for the final document.</t>
        <t>Metric: worst case loss rate.</t>
      </section>
      <section anchor="boundSlowstart">
        <name>Bound slowstart duration and loss</name>
        <t>Slowstart into a droptail queue should not cause more than one RTT of loss nor cause more than 50% loss for that RTT.</t>
        <t>Provisional window or rate reductions should start promptly when losses or disorder is first detected, even before the loss recovery can decide if the missing segments are due to reordering or loss.</t>
        <t>Metrics: worst case duration of slowstart overshoot and expected losses.</t>
      </section>
      <section anchor="linkChanges">
        <name>Bound losses on link changes</name>
        <t>Changes in link properties (RTT, bandwidth or queue size) or cross traffic should not cause losses that are larger than the change in maximum flight size supported by the link.</t>
        <t>Specifically, during loss recovery the transport is not permitted to send more data than the receiver reported as having been delivered over the same interval.  This is the strict Conservative property from Proportional Rate reduction.</t>
        <t>Metric: worst case excess losses.</t>
      </section>
      <section anchor="stateCaching">
        <name>No unnecessary slowstarts</name>
        <t>All application stacks must use connection caching, Congestion Control state caching or some other mechanism such that application workloads are prevented from causing persistent or repeated overlapping slowstarts to the same destination.</t>
        <t>Metric: worst case statics on unnecessary slowstarts.</t>
        <ul spacing="normal">
          <li>
            <t>[RFC9040] TCP Control Block Interdependence</t>
          </li>
          <li>
            <t>draft-kuhn-tsvwg-careful-resume-00 Careful convergence of congestion control from retained state with QUIC</t>
          </li>
        </ul>
      </section>
      <section anchor="noStarvation">
        <name>Freedom from starvation</name>
        <t>Flows below some resource threshold (data rate, window size, ConEx marks, etc) will successfully explore increasing resources, as long as there is either idle capacity or other flows above some (different) resource threshold.   Both thresholds are expected to depend on the path properties and other sources of noise.</t>
        <t>@@@@ A lot more work is needed here.</t>
        <t>Metric: thresholds for a canonical set of paths.</t>
      </section>
      <section anchor="boundQueue">
        <name>Bound standing queue</name>
        <t>In the absence of losses or ECN, bulk flow should not cause steady state standing queues larger than k*minRTT*maxBW, for some predefined k, specific to the CCA.   K must be smaller than 2 (maximum RTT would be 3*minRTT)</t>
        <t>Note that this criteria implies that ECN based CCAs must also have some mechanism to limit data in-flight, and that all CCAs must address the minimum RTT estimator problem described in <xref target="minRTT"/>.</t>
        <t>Metric: k, specific to the CCA.</t>
      </section>
      <section anchor="boundFrequency">
        <name>Bound control frequency</name>
        <t>Control frequency scales with 1/rtt and is independent of data rate.  This property is referred to as "scalable" in other sources.</t>
        <t>@@@@ Consider recasting as control period, bound by k*RTT</t>
        <t>@@@@ Note that CCAs that fail to meet this criteria (e.g. Reno and CUBIC) are at an intrinsic disadvantage relative to CCAs that do.</t>
        <t>Metric: maximum ratio of control period to RTT.</t>
        <ul spacing="normal">
          <li>
            <t>[RFC9330] Low Latency, Low Loss, and Scalable Throughput (L4S) Internet Service: Architecture</t>
          </li>
          <li>
            <t>Robert Morris Scalable TCP Congestion Control</t>
          </li>
        </ul>
      </section>
      <section anchor="queueHeadroom">
        <name>Maintain queue headroom</name>
        <t>Individual flows do not persistently maintain full queues even if the queues are smaller than minRTT*maxBW.</t>
        <t>When there is a full queue, Congestion Control should reduce its window enough to create some small headroom to prevent locking out new flows.</t>
        <t>@@@@ Ideally this criteria would also be applied to flow aggregates, however significant additional research is needed.</t>
        <t>Metric: Maximum number of flows for such that the CCA can maintain some headroom.</t>
      </section>
      <section anchor="monotonic">
        <name>Monotonic response</name>
        <t>The CCA should have monotonic response to all congestion signals that it responds to (loss, marks, delay, etc) otherwise it will have multiple stable operating points for the same network conditions.  It would be likely to exhibit stable pathologies such as latecomer (dis)advantage.</t>
        <t>Metric: TBD.</t>
      </section>
      <section anchor="probeSize">
        <name>Balanced probe size</name>
        <t>Balance the worst case queue backlog against the need to trigger mode shifting in links that use queue backlog as a trigger.</t>
        <t>Self clock transport preserves ACK modulation from one RTT to the next.  Many half duplex link layers implicitly use bursts preserved by transport self clock as part of optimizing their channel allocation algorithms.    Batching or decimating ACKs on the return path can cause relatively large bursts of packets to traverse the entire forward path from the sender to the receiver, potentially causing jitter to other flows sharing the same queues.</t>
        <t>Pacing can interact poorly with link layers that rely on queue backlogs to trigger transmissions or scheduling mode changes.  These types of link scheduling algorithms are pervasive in wireless and other shared media where channel arbitration is relatively expensive.  Indeed, the initial design of BBR's bandwidth probe phase was inspired by the need to trigger mode changes in many wireless networks.</t>
        <t>@@@@ More work needed here.</t>
        <t>Metric: TBD.</t>
      </section>
      <section anchor="selfScaling">
        <name>Self scaling</name>
        <t>All protocol layers must be self scaling.</t>
        <t>If the network is too slow, the application must also slow down to avoid "stacking" requests.</t>
        <t>Specifically all application timers that cancel or restart lower layers transactions must not trigger overlapping transactions and must use an RTO style retry algorithm based on observed transaction times, including exponential backoff on repeated failures.  Alternatively an application might refuse to run after excessive failures.</t>
        <t>This criteria must be applied recursively all the way up the protocol stack for all applications that might be unattended (e.g. cron jobs and IOT devices).</t>
        <t>Metric: TBD.</t>
      </section>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <t>This document provides evaluation criteria for Congestion Control and other implementations or algorithms that might be deployed on the internet.   It has no direct security considerations of its own.</t>
      <t>Over the long haul it is expected to increase the overall robustness of the Internet by helping to eliminate certain pathological behaviors that have the potential cause the Internet to be fragile under some conditions.</t>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <?line 248?>

<section anchor="minRTT">
      <name>Estimating the minimum RTT</name>
      <t>It has been shown that all distributed algorithms to measure minimum RTTs in packet switched mesh networks are subject to failures caused by the inability to distinguish between true minimum path delays and delays that have been inflated by standing queues caused by other flows.</t>
      <t>This failure mechanism was shown in a formal proof [noPower] and has been
demonstrated in connection with Vegas TCP [vegas][VegasFailure].</t>
      <t>BBR [BBR] uses a distributed algorithm designed to protect the network from one of the more easily observed failure cases, where multiple long running flows "stack" standing queues on queues created by prior flows.
BBR attempts to explicitly synchronize minimum RTT measurements by having all flows reduce their sending rates for approximately 1 RTT every 10 seconds.   The measurements are synchronized by the measurements themselves.  When a flow observes a new minimum RTT sample, it sets a 10 second timer to schedule its next measurement.  If flows are indeed causing "stacked" queues, they are likely to get a new minimum RTT from some other flow's measurement, which will cause synchronized measurements on the next cycle.</t>
      <t>It is not known if the minimum RTT algorithm used in BBR is sufficient to protect the Internet from all failure cases.  We suspect that the BBR algorithm does not fully mitigate the problem as outlined in the proof [noPower].  However given the transactional nature of modern Internet workloads each flow has frequent idle, which helps other flows observe accurate minimum RTTs.</t>
      <t>It is also not known to what extend a naive minimum RTT algorithm (e.g. without any attempt to synchronize minimum RTT measurements) is exposed to pervasive minRTT failures. [VegasFailure] provides some insights.  If minRTT estimators fail to detect pervasive standing queues, the criteria in <xref target="boundQueue"/> can not be implemented.</t>
      <ul spacing="normal">
        <li>
          <t>L.S. Brakmo, S. O'Malley, and L.L. Peterson. "TCP Vegas: New techniques for congestion
detection and avoidance", Computer Communication Review, Vol. 24, No. 4, pp. 24-35, Oct.
1994.</t>
        </li>
        <li>
          <t>L.S. Brakmo and L.L. Peterson. "TCP Vegas: end to end congestion avoidance on a global
internet", IEEE Journal on Selected Areas in Communications, Vol. 13, No. 8, pp. 1465-80,
Oct. 1995.</t>
        </li>
        <li>
          <t>J. Ahn, P. Danzig, Z. Liu, and L. Yan, "Evaluation of TCP Vegas: emulation and experiment",
Computer Communication Review, Vol. 25, No. 4, pp. 185-95, Oct. 1995. [@@@@ Wrong paper?]</t>
        </li>
        <li>
          <t>[VegasFailure]: https://www.cs.princeton.edu/research/techreps/TR-616-00</t>
        </li>
        <li>
          <t>https://www.cs.princeton.edu/research/techreps/TR-628-00</t>
        </li>
        <li>
          <t>[noPower] J. Jaffe, "Flow Control Power is Nondecentralizable," in IEEE Transactions on Communications, vol. 29, no. 9, pp. 1301-1306, September 1981, doi: 10.1109/TCOM.1981.1095152.</t>
        </li>
      </ul>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledgments.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
L9/ePGI3m/wPc/ivTGVDAAA=

-->

</rfc>
