<?xml version="1.0" encoding="US-ASCII"?>
<!-- This template is for creating an Internet Draft using xml2rfc,
     which is available here: http://xml.resource.org. -->
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!-- One method to get references from the online citation libraries.
     There has to be one entity for each item to be referenced. 
     An alternate method (rfc include) is described in the references. -->
<!ENTITY RFC2119 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC2629 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2629.xml">
<!ENTITY RFC3552 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.3552.xml">
<!ENTITY I-D.narten-iana-considerations-rfc2434bis SYSTEM "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.narten-iana-considerations-rfc2434bis.xml">
]>
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<!-- used by XSLT processors -->
<!-- For a complete list and description of processing instructions (PIs), 
     please see http://xml.resource.org/authoring/README.html. -->
<!-- Below are generally applicable Processing Instructions (PIs) that most I-Ds might want to use.
     (Here they are set differently than their defaults in xml2rfc v1.32) -->
<?rfc strict="yes" ?>
<!-- give errors regarding ID-nits and DTD validation -->
<!-- control the table of contents (ToC) -->
<?rfc toc="yes"?>
<!-- generate a ToC -->
<?rfc tocdepth="4"?>
<!-- the number of levels of subsections in ToC. default: 3 -->
<!-- control references -->
<?rfc symrefs="yes"?>
<!-- use symbolic references tags, i.e, [RFC2119] instead of [1] -->
<?rfc sortrefs="yes" ?>
<!-- sort the reference entries alphabetically -->
<!-- control vertical white space 
     (using these PIs as follows is recommended by the RFC Editor) -->
<?rfc compact="no"?>
<!-- do not start each main section on a new page -->
<?rfc subcompact="no" ?>
<!-- keep one blank line between list items -->
<!-- end of list of popular I-D processing instructions -->
<rfc category="info" docName="draft-gomez-tcpm-delack-suppr-reqs-01"
     ipr="trust200902">
  <!-- category values: std, bcp, info, exp, and historic
     ipr values: full3667, noModification3667, noDerivatives3667
     you can add the attributes updates="NNNN" and obsoletes="NNNN" 
     they will automatically be output with "(if approved)" -->

  <!-- ***** FRONT MATTER ***** -->

  <front>
    <!-- The abbreviated title is used in the page header - it is only necessary if the 
         full title is longer than 39 characters -->

    <title abbrev="Sender control of Delayed ACKs">
    Sender Control of Delayed Acknowledgments in TCP: Problem Statement, Requirements and Analysis of Potential Solutions
    </title>
 
    <!-- add 'role="editor"' below for the editors if appropriate -->

    <!-- Another author who claims to be an editor -->
 
    <author fullname="Carles Gomez" initials="C.G" surname="Gomez">
      <organization>UPC</organization>

      <address>
        <postal>
          <street>C/Esteve Terradas, 7</street>

          <city>Castelldefels</city>

          <region/>

          <code>08860</code>

          <country>Spain</country>
        </postal>

        <phone/>

        <facsimile/>

        <email>carlesgo@entel.upc.edu</email>

        <uri/>
      </address>
    </author>

    <author fullname="Jon Crowcroft" initials="J.C" surname="Crowcroft">
      <organization>University of Cambridge</organization>

      <address>
        <postal>
          <street>JJ Thomson Avenue</street>

          <city>Cambridge</city>

          <region>CB3 0FD</region>

          <code/>

          <country>United Kingdom</country>
        </postal>

        <phone/>

        <facsimile/>

        <email>jon.crowcroft@cl.cam.ac.uk</email>

        <uri/>
      </address>
    </author>

 
    <!-- uri and facsimile elements may also be added -->

    <date month="March" year="2020"/>

    <!-- If the month and year are both specified and are the current ones, xml2rfc will fill 
         in the current day for you. If only the current year is specified, xml2rfc will fill 
	 in the current day and month for you. If the year is not the current one, it is 
	 necessary to specify at least a month (xml2rfc assumes day="1" if not specified for the 
	 purpose of calculating the expiry date).  With drafts it is normally sufficient to 
	 specify just the year. -->

    <!-- Meta-data Declarations -->

    <area>TSV</area>

    <workgroup>TCPM Working Group</workgroup>

    <!-- WG name at the upperleft corner of the doc,
         IETF is fine for individual submissions.  
	 If this element is not present, the default is "Network Working Group",
         which is used by the RFC Editor as a nod to the history of the IETF. -->

    <!---->

    <abstract>
      <t> TCP Delayed Acknowledgments (ACKs) allow reducing protocol overhead in
   many scenarios.  However, in some cases, Delayed ACKs may
   significantly degrade network and device performance in terms of link
   utilization, latency, memory usage and/or energy consumption.  This
   document presents the problem statement regarding sender control of Delayed ACKs
   in TCP.  The document discusses the scenarios and use cases in
   which sender control of Delayed ACKs offers advantages.  Then, requirements
   for a potential solution are derived.  Finally, a number of potential
   solutions are discussed, based on the requirements, and also
   considering pros and cons in each case.
      </t>
    </abstract>
  </front>

  <middle>
    <section title="Introduction">

      <t>Delayed Acknowledgments (ACKs) were specified for TCP with the aim to reduce protocol overhead <xref target="RFC1122"/>.  With Delayed ACKs, a TCP delays sending
         an ACK by up to 500 ms (often 200 ms, with lower values in recent implementations such as ~50 ms also reported), and typically sends an ACK for at least every second segment received in a stream of full-sized segments.  This allows combining several segments into a single one (e.g. the application layer response to an application layer data message, and
         the corresponding ACK), and it also saves up to one of every two ACKs under many traffic patterns (e.g. bulk transfers).  The "SHOULD"
         requirement level for implementing Delayed ACKs in RFC 1122, along with its expected benefits, has led to a widespread deployment of
         this mechanism.
      </t>

      <t>However, there exist traffic patterns and scenarios for which Delayed ACKs can actually be detrimental to performance.  When a segment
         carrying a message of a size up to one Maximum Segment Size (MSS) is transferred, if the message does not elicit an application-layer
         response, and a second data segment is not transferred earlier than the Delayed ACK timeout, the ACK is unnecessarily delayed, with a
         number of negative consequences. Furthermore, there may be reasons to allow a sender communicate the ACK ratio to be used in a TCP 
         connection, and thus dynamically override (or restore) use of Delayed ACKs at the receiver.
      </t>

      <t>This document presents the problem statement regarding sender control of Delayed ACKs.  The document discusses the scenarios and use cases in
         which sender control of Delayed ACKs offers advantages.  Then, requirements for a potential solution are derived. Finally, a number of potential 
         solutions are discussed, based on the requirements, and also considering pros and cons in each case.
      </t>      

    </section>
 
      <section title="Conventions used in this document">
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL","SHALL NOT",
        "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
        document are to be interpreted as described in <xref
        target="RFC2119"/>.</t>
      </section>


  <section title="Problem statement: issues due to Delayed ACKs">
 
      <t>This section provides scenarios and use cases where performance issues arise due to Delayed ACKs.  
      </t>
  
    <section title="Slow start">

      <t>During slow start, the congestion window (cwnd) increases by up to Sender Maximum Segment Size (SMSS) upon receipt of an ACK covering new data
         <xref target="RFC5681"/>. However, use of Delayed ACKs reduces the amount of ACKs received by the sender, thus reducing the rate of cwnd growth,
         increasing transfer time and reducing throughput, when compared with sending an ACK for each incoming data segment. Note that, while Appropriate
         Byte Counting (ABC) <xref target="RFC3465"/> might be used to address this problem, it remains as an experimental mechanism, not fully included in RFC 5681, which specifies standard TCP congestion control.
         Furthermore, Delayed ACKs preclude using sender behaviors intended to quickly and non-intrusively probe for available capacity during slow start. 
         One example of such behaviors is chirping, where a sender follows a predetermined pattern to send data segments (e.g. decreasing intersegment time 
         gaps) and measures the gaps between ACKs <xref target="I-D.kuehlewind-tcpm-accurate-ecn"/> (see Appendix B.4 of revision -03 of the referenced 
         document).
      </t>

    </section>

    <section title="High bit rate environments and short data segments">

      <t>When the Nagle algorithm is used, in some cases the sender may be prevented from sending more data while awaiting a delayed ACK.  In
         some high bit rate environment (e.g.  Gigabit Ethernet) use cases, such a delay may be very large, and link utilitzation may be    
         dramatically reduced, since the Delayed ACK timeout may be several orders of magnitude greater than the Round Trip Time (RTT) <xref target="RFC8490"/>. 
      </t>

    </section>

    <section title="IoT scenarios">

      <t>Delayed ACKs are also detrimental in Internet of Things (IoT) scenarios, where TCP is being increasingly used 
   <xref target="I-D.ietf-lwig-tcp-constrained-node-networks"/>.  Many IoT devices, such as sensors, transfer small messages (e.g. containing sensor
   readings) rather infrequently, therefore if the receiver uses Delayed ACKs, the ACK will often be unnecessarily delayed.  The sender cannot
   release the memory resources associated to a transferred data segment until the ACK is received and processed.  This may be a problem for
   many IoT devices, which are typically memory-constrained, and may even lead to subsequent packet drops if their scarce memory resources
   are blocked while awaiting an ACK.  Moreover, if the IoT device uses a radio interface for communication, in some scenarios Delayed ACKs
   will lead to increased energy consumption (e.g. with the radio interface of the device staying in receive mode while awaiting the
   ACK).  Since many IoT devices run on small batteries, the device lifetime may significantly decrease.  Furthermore, the delay
   suffered by the ACK may interact negatively with layer two mechanisms, especially in wireless network technologies where devices
   remain in low-power states for long intervals <xref target="RFC8352"/>, potentially leading to a further exacerbated delay (by even one or more orders of
   magnitude).
      </t>    

    </section>

  

    <section title="Beyond classic ACK transmission behavior">

      <t>In some scenarios, it may be desirable to enable ACK transmission behaviors beyond the classic ones.
      </t>

      <t> 
         For example, it may be beneficial to apply congestion control to ACKs <xref target="RFC5690"/>. Reducing the amount of ACKs on a 
         congested reverse path may allow alleviating congestion on that path, with minimal impact on a relatively independent forward path.  
      </t>

      <t>
         On the other hand, in some scenarios, the rate at which ACKs arrive at the sender limits the achievable performance of data transfer.
         This happens due to forward and reverse path asymmetric capacity (with the latter being significantly limited, e.g. in terms of bandwidth)
         <xref target="RFC3449"/>.  In some environments, the issue is mitigated by using middleboxes that perform ACK thinning, i.e., deleting a subset of the ACKs.
         Examples of technologies where deployments have been reported to do ACK thinning include satellite links, DOCSIS cable networks, mobile cellular
         networks, among others. 
      </t>
     
    </section>

    </section>

    <section title="Requirements for sender control of Delayed ACKs">

      <t>This section provides the requirements for a potential solution to enable sender control of Delayed ACKs. 
      </t>

      <section title="Sender-triggered mechanism">

      <t>An assumption is that the sender knows when Delayed ACKs operation should be overriden. For example, the sender may know in advance 
         the pattern of the traffic it will generate, or it may know whether an application-layer response will be sent by the receiving endpoint 
         upon reception of a given message. Therefore, control of Delayed ACKs has to be sender-triggered.       
      </t>    
      </section>

      <section title="Per-segment granularity">

      <t>One approach that cannot be recommended as a general solution for
         controlling Delayed ACKs is (permanently) disabling Delayed ACKs at
         the receiving TCP.  In fact, the latter may interact with a wide variety of devices and many of those may still benefit from the advantages of
         Delayed ACKs.
      </t>

      <t>
         Another approach would be determining suppression of Delayed-ACKs per connection. However, within the same connection, a sender may
         offer a mixed traffic pattern comprising single data segments that will lead to unnecessarily delayed ACKs, with other data segments
         upon which Delayed ACKs will act as intended.  Therefore, the solution has to be provided at a per-segment granularity.
      </t>
      </section>

  
      <section title="Header/Message overhead">

      <t> Since the presented problem is about low performance in various scenarios, another requirement for the solution is to minimize incurring
          overhead in terms of header size increase or additional packets sent.  For example, in IoT scenarios, every additional communicated byte 
          consumes scarce resources (e.g. energy, bandwidth and computational resources).
      </t>

      <t> Another benefit of keeping a low header/message overhead is alleviating the processing workload of a receiving TCP.
      </t> 

      </section>
	  
      <section title="Support for enabling generic ACK ratios">
      <t> For many of the scenarios and use cases described in Section 2, an ACK ratio of 1 (i.e. a receiver sending one ACK per incoming data segment)
          would solve the mentioned issues. However, the ability of enforcing a generic ACK ratio (including values different from 1 and 2) allows to 
          enable a wider range of ACK behaviors, which may support congestion control for ACKs, sender behaviors not based on ACK-clocking, etc.
      </t>
     
      <t> The desired generic ACK ratio is intended to be in force for the current data segment, and for subsequent data segments (at least, during a time
          interval of a duration that may depend on several factors). 
      </t>

      <t> The mechanism used to indicate the desired receiver Delayed ACK behavior might exploit soft state (i.e. using explicit information carried by
          data segments) or connection state (which needs to be stored by the receiver).
      </t>


      </section>
 
      <section title="Middlebox traversal">
      <t> Deployment of new functionality for TCP faces the risk of packets being discarded by existing middleboxes upon detection of unexpected or 
          discouraged formats, header field values or even traffic patterns. 
      </t>

      <t> A solution for sender control of Delayed ACKs should offer relatively good middlebox traversal (to the extent possible).  
      </t>

      </section>

      <section title="Safe return to normal Delayed ACKs operation">
      <t> A solution for sender control of Delayed ACKs must ensure that normal Delayed ACKs operation is in force by default, and also once
          temporary action on Delayed ACKs needs to end.
      </t>
      </section>
      
      <section title="Impact on existing TCP functionality">
      <t> A solution for sender control of Delayed ACKs should not reduce the space of existing TCP functionality.
      </t>
      </section>

      <section title="Impact on future TCP development">
      <t> A solution for sender control of Delayed ACKs should not pose significant risk of preventing future TCP development. If an available resource
          (e.g. a reserved bit of the TCP header, a new TCP option, etc.) is used by a solution, careful analysis must be carried out regarding the 
          risks and benefits of using such resource.
      </t>
      </section>

      <section title="Avoidance of 'hacks' ">
      <t> Sender control of Delayed ACKs might be achieved by using workarounds, such as implementation techniques that may produce the desired effect. 
          However, such approaches may be suboptimal regarding implementation cleanliness, and may entail other performance issues (see section 5.6).      
      </t>
      </section>

      <section title="Who is in control?">
      <t> The receiver might not always be able to honour the ACK behavior desired by the sender. Therefore, the semantics of sender control of 
          Delayed ACKs have to be of a hint, not a command.      
      </t>

      <t>If the receiver is actually not able to apply the ACK behavior desired by the sender, then the former has a range of options with regard
         to communicating so to the latter, from remaining silent, to providing explicit feedback to the sender. Each option has associated trade-offs. 
         For example, remaining silent might degrade performance if a sender relies on a receiver that uses the ACK behavior intended by the sender.
      </t>

      </section>

    </section>
	 
    <section title="Potential solutions for sender control of Delayed ACKs">

	  <t>
             This section enumerates and discusses potential solutions that might be considered to enable sender control of Delayed ACKs. 
             The list of solutions is not necessarily comprehensive. This section intends to illustrate the trade-offs that arise when considering 
             potential solutions for sender control of Delayed ACKs. (Note: the analysis needs to be completed for many of the solutions below.)
          </t>
	
      <section title="AckCC">

        <t>In Acknowledgment Congestion Control (AckCC) <xref target="RFC5690"/>, the sender tells the receiver the ACK ratio R to use, where the receiver sends 
           one ACK per R data packets received.  AckCC defines a 2-byte "TCP ACK Congestion Control Permitted Option" for negotiating use of AckCC, 
           whereas it defines a 3-byte "ACK ratio TCP option" to communicate the ACK Ratio value from the sender to the receiver.
        </t>
        <t>Middlebox traversal of a new TCP option is often regarded as 'bad' (to be confirmed).
        </t>

      </section>

      <section title="TLP">

        <t>Tail Loss Probe (TLP) <xref target="I-D.ietf-tcpm-rack"/> is intended to avoid RTO-expiration-based retransmission when tail loss occurs by inducing additional
           ACKs at the receiver.  This is achieved by sending a probe segment after a probe time-out (PTO) when data have been sent but not confirmed. 
           Of course, this means sending a whole new packet to trigger ACKs, which adds significant overhead.
        </t>  
        <t>This approach might offer good middlebox traversal (to be confirmed).
        </t>

      </section>

      <section title="TCP ACK Pull (AKP) flag">

        <t>One solution that has been proposed for sender control of Delayed ACKs is called 'TCP ACK Pull' <xref target="I-D.gomez-tcpm-ack-pull"/>.
        </t>
        
        <t>TCP ACK Pull defines the AKP flag as bit number 6 of the 13th byte of the TCP header. When a TCP sender needs a data segment to be 
           acknowledged by the receiving TCP without additional delay, the sender sets the AKP flag of the data segment TCP header. Upon reception
           of a segment with the AKP flag set, a conforming receiving TCP behaves accordingly by sending the corresponding ACK without additional delay. 
        </t>        

        <t>
           This solution would entail zero header or message overhead. However, it would consume a TCP header bit, leaving only two available TCP header
           reserved bits. A question is thus whether one TCP header bit should be dedicated to this purpose or not.
        </t>

        <t>
           Middlebox traversal characteristics of bit 6 of the TCP header need to be assessed.
        </t>  

      </section>

     <section title="A new 'ACK Pull' TCP option">

        <t>Another approach relies on defining a new option-kind-only TCP option with the same semantics as the AKP flag, which might be called 
           'ACK Pull Option' or 'AKP Option'. 
        </t>
        
        <t>This solution would consume an available TCP Option Kind number. However, most of the 256 numbers in the TCP Option Kind number space 
           are currently available. Therefore, consuming one such number does not appear to significantly limit future TCP development. 
        </t>        

        <t>The header overhead of the AKP Option is one byte.
        </t>

        <t>
           Middlebox traversal of a new TCP option is often regarded as 'bad' (to be confirmed). 
        </t>  

      </section>

      <section title="Reuse of existing TCP header fields">

        <t>Another approach that might be used to enable sender control of Delayed ACKs is based on reusing existing TCP header fields.  For
           example, use of the Urgent pointer has been suggested (e.g. by reserving 3 of its 16 bits to encode an ACK ratio exponent that may
           be communicated by the sender to the receiver), when URG=0.  A problem with this approach is that the semantics of the reused TCP
           header field may become overloaded.  Therefore, in some cases either the original intended use of the reused TCP header field may become
           limited, or if it prevails, then sender control of Delayed ACKs might not always be available for use.
        </t>

        <t>
           Middlebox traversal characteristics of this approach might be relatively good (to be confirmed). 
        </t>  

      </section>

      <section title="'Hacks'">

        <t>One approach that allows eliciting an immediate ACK after sending a data segment is sending a subsequent segment carrying a previously
           acknowledged data byte. However, in addition to the inefficiency of sending a byte that has previously been sent, this approach may require
           the transmission of a new packet (even carrying a single byte of data payload) just for that purpose, which represents significant overhead. 
           Furthermore, sending a previously sent byte is not a clean solution from an implementation perspective. 
        </t>

        <t>Another workaround intended to trigger an immediate ACK from the receiving TCP, which is used in the Contiki operating system 
           (a popular operating system for constrained devices in IoT scenarios) is splitting the data to be sent into two segments of smaller size.  
           A standard compliant TCP receiver will acknowledge the second MSS of data. However, this 'split hack' may not always work since a TCP receiver
           is required to acknowledge every second full-sized segment, but not two consecutive small segments.  Furthermore, the overhead of sending two 
           IP packets instead of one is another downside of the 'split hack'.
        </t>  

      </section>
      
    </section>
  
    <section title="Summary">
    
        <t>The next table summarizes whether the different solutions presented in Section 4 are able to satisfy the requirements stated in Section 4.
        </t>

        <t> 
        <figure title="Summary of potential solutions for sender control of Delayed ACKs."
                anchor="fig_summary">
        <artwork><![CDATA[    
  
                +-------+-------+-------+-------+-------+------+------+  
                |  Per- | Over- |Generic|Middle-|Impact |Impact|Hack  |
                |segment| head  |ACK rat|box tr.|current|future|Avoid.|
   +------------+-------+-------+-------+-------+-------+------+------+
   |    ACKcc   |  Yes  |  Low  |  Yes  |  Bad? |  No   |  Low | Yes  |
   +------------+-------+-------+-------+-------+-------+------+------+
   |     TLP    |   No  | High  |   No  |  Good |  No   |  No  | Yes  |     
   +------------+-------+-------+-------+-------+-------+------+------+
   |  AKP flag  |  Yes  |   No  |  Yes  |   ?   |  No   |Med/Hi| Yes  |
   +------------+-------+-------+-------+-------+-------+------+------+ 
   | AKP option |  Yes  |  Low  |  Yes  |  Bad? |  No   |  Low | Yes  | 
   +------------+-------+-------+-------+-------+-------+------+------+
   |Reuse fields|  Yes  |   No  |  Yes  | Good? |  Yes  |   ?  | Yes  |
   +------------+-------+-------+-------+-------+-------+------+------+
   |   Hacks    |   ?   |Med/Hig|   No  | Good? |  No   |  No  |  No  |
   +------------+-------+-------+-------+-------+-------+------+------+

   Note: all considered potential solutions satisfy the following requirements: 
         i) sender control of Delayed ACKs, and ii) safe return to normal
         Delayed ACKs operation. A receiver may be unable to always honour 
         the ACK behavior desired by the sender regardless of the specific 
         potential solution considered.
                                                   
        ]]></artwork></figure>
        </t>         

    </section>

    <section anchor="Security" title="Security Considerations">

      <t>TBD</t>
    
    </section>

    <!-- This PI places the pagebreak correctly (before the section title) in the text output. -->

    <!-- Possibly a 'Contributors' section ... -->
    
    <section anchor="ACKs" title="Acknowledgments">

      <t>Bob Briscoe, Jonathan Morton, Richard Scheffenegger, Michael Tuexen and Jana Iyengar provided useful input for this document.
      </t>

      <t> Stuart Cheshire, Ted Lemon, Michael Scharf, and Christoph Paasch
   participated in a discussion that was seminal to the TCP ACK Pull 
   proposal, which eventually led to this document.
      </t>    

      <t>Carles Gomez has been funded in part by the Spanish Government (Ministerio de Ciencia, Innovacion y Universidades) through 
        Secretaria d'Universitats i Recerca del Departament d'Empresa i Coneixement de la Generalitat de Catalunya 2017 SGR 376.
      </t>

    </section>

   </middle>

  <!--  *****BACK MATTER ***** -->

  <back>
    <!-- References split into informative and normative -->

    <!-- There are 2 ways to insert reference entries from the citation libraries:
     1. define an ENTITY at the top, and use "ampersand character"RFC2629; here (as shown)
     2. simply use a PI "less than character"?rfc include="reference.RFC.2119.xml"?> here
        (for I-Ds: include="reference.I-D.narten-iana-considerations-rfc2434bis.xml")

     Both are cited textually in the same manner: by using xref elements.
     If you use the PI option, xml2rfc will, by default, try to find included files in the same
     directory as the including file. You can also define the XML_LIBRARY environment variable
     with a value containing a set of directories to search.  These can be either in the local
     filing system or remote ones accessed by http (http://domain/dir/... ).-->


    <references title="Normative References">

      <?rfc include='reference.RFC.1122.xml'?>

      <?rfc include='reference.RFC.2119.xml'?>

      <?rfc include='reference.RFC.3449.xml'?>

      <?rfc include='reference.RFC.3465.xml'?>

      <?rfc include='reference.RFC.5681.xml'?>

      <?rfc include='reference.RFC.5690.xml'?>

    </references>

    <references title="Informative References">
      <!-- Here we use entities that we defined at the beginning. -->

      <?rfc include='reference.RFC.8352.xml'?>

      <?rfc include='reference.RFC.8490.xml'?>
   
      <?rfc include='reference.I-D.kuehlewind-tcpm-accurate-ecn'?>

      <?rfc include='reference.I-D.gomez-tcpm-ack-pull'?>

      <?rfc include='reference.I-D.ietf-lwig-tcp-constrained-node-networks'?>

      <?rfc include='reference.I-D.ietf-tcpm-rack'?>

      <!--?rfc include="http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml"?-->
      
    </references>

    <!-- -->
  </back>
</rfc>