<?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="exp" docName="draft-gomez-tcpm-ack-rate-request-04"
     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="TCP ACK Rate Request Option">
    TCP ACK Rate Request Option
    </title>

 
    <!-- add 'role="editor"' below for the editors if appropriate -->

    <!-- Another author who claims to be an editor -->
 
    <author fullname="Carles Gomez" initials="C." 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." 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="2022"/>

    <!-- 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>APP</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) is a widely deployed mechanism that allows 
          reducing protocol overhead in many scenarios. However, Delayed ACKs may also 
          contribute to suboptimal performance. When a relatively large congestion window (cwnd)
          can be used, less frequent ACKs may be desirable. On the other hand, in relatively 
          small cwnd scenarios, eliciting an immediate ACK may avoid unnecessary delays that 
          may be incurred by the Delayed ACKs mechanism. This document specifies the TCP ACK 
          Rate Request (TARR) option. This option allows a sender to request the ACK rate to
          be used by a receiver, and it also allows to request immediate ACKs from a receiver.
      </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 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 scenarios where Delayed ACKs contribute to suboptimal performance.
         We next roughly classify such scenarios into two main categories, in terms of the 
         congestion window (cwnd) size and the Maximum Segment Size (MSS) that would be used
         therein: i) "large" cwnd scenarios (i.e. cwnd >> MSS), and ii) "small" cwnd scenarios
         (e.g. cwnd up to ~MSS). 
      </t>
 
      <t>In "large" cwnd scenarios, increasing the number of data segments after which a 
         receiver transmits an ACK beyond the typical one (i.e. 2 when Delayed ACKs are used)
         may provide significant benefits. One example is mitigating performance limitations
         due to asymmetric path capacity (e.g. when the reverse path is significantly limited 
         in comparison to the forward path) <xref target="RFC3449"/>. Another advantage is reducing the 
         computational cost both at the sender and the receiver, and reducing network packet
         load, due to the lower number of ACKs involved.          
      </t>

      <t>In many "small" cwnd scenarios, a sender may want to request the receiver to 
         acknowledge a data segment immediately (i.e. without the additional delay incurred by
         the Delayed ACKs mechanism). In high bit rate environments (e.g. data centers), a 
         flow's fare share of the available Bandwidth Delay Product (BDP) may be in the order
         of one MSS, or even less. For an accordingly set cwnd value (e.g. cwnd up to MSS),
         Delayed ACKs would incur a delay that is several orders of magnitude greater than the
         RTT, severely degrading performance. Note that the Nagle algorithm may produce the 
         same effect for some traffic patterns in the same type of environments <xref target="RFC8490"/>.
         In addition, when transactional data exchanges are performed over TCP, or when the 
         cwnd size has been reduced, eliciting an immediate ACK from the receiver may avoid 
         idle times and allow timely continuation of data transmission and/or cwnd growth, 
         contributing to maintaining low latency. 
      </t>

      <t>Further "small" cwnd scenarios can be found in Internet of Things (IoT) environments.
         Many IoT devices exhibit significant memory constraints, such as only enough RAM for
         a send buffer size of 1 MSS. In that case, if the data segment does not elicit an 
         application-layer response, the Delayed ACKs mechanism unnecessarily contributes a 
         delay equal to the Delayed ACK timer to ACK transmission.  The sender cannot transmit
         a new data segment until the ACK corresponding to the previous data segment is received
         and processed.
      </t>

      <t>With the aim to provide a tool for performance improvement in both "large" and "small"
         cwnd scenarios, this document specifies the TCP ACK Rate request (TARR) option. 
         This option allows a sender to request the ACK rate to be used by a receiver, 
         and it also allows to request immediate ACKs from a receiver.</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="TCP ACK Rate Request Functionality">
   
      <t>A TCP endpoint announces that it supports the TARR option by including the TARR
         option format (with the appropriate Length value, see Section 4) in packets that have the SYN bit set. 
      </t>

      <t>Upon reception of a SYN segment carrying the TARR option, a TARR-
   option-capable endpoint MUST include the TARR option in the SYN-ACK segment sent in response.
      </t>

      <t>The next two subsections define the sender and receiver behaviors for devices
         that support the TARR option, respectively.
      </t>

       <section title="Sender behavior">

        <t>A TCP sender MUST NOT include the TARR option in TCP segments to be
           sent if the TCP receiver does not support the TARR option.
        </t>

      	<t>A TCP sender MAY request a TARR-option-capable receiver to modify the ACK rate of the  
           latter to one ACK every R data segments received from the 
           sender. This request is performed by the sender by including the TARR 
           option in the TCP header of a segment. The TARR option carries 
           the R value requested by the sender (see section 4).  
      	</t>

      	<t>When a TCP sender needs a data segment to be acknowledged immediately 
           by a TARR-option-capable receiving TCP, the sender includes the TARR option in 
           the TCP header of the data segment, with a value of R equal to 1. 
        </t>

        <t>A TCP segment carrying retransmitted data is not required to include 
           a TARR option.
        </t>

       </section>

       <section title="Receiver behavior">

      	<t>   A receiving TCP conforming to this specification MUST process a TARR 
              option present in a received segment.
      	</t>

      	<t>A TARR-option-capable receiving TCP SHOULD modify its ACK rate to one ACK every R received data segments
   from the sender. If a TARR-option-capable TCP receives a segment carrying the TARR option with R=1,
           the receiving TCP SHOULD send an ACK immediately.
        </t> 

        <t> 
   If packet reordering occurs, a TARR-option-capable receiver should send a
   duplicate ACK immediately when an out-of-order segment arrives <xref target="RFC5681"/>. After sending a duplicate ACK, the receiver MAY send the next non-duplicate ACK after R data segments received.
   Note also that the receiver might be unable to send ACKs at the requested rate (e.g., due to lack of resources); on the other hand, the receiver 
   might opt not to fulfill a request for security reasons (e.g., to avoid or mitigate an attack by which a large number of senders request disabling 
   delayed ACKs simultaneously and send a large number of data segments to the receiver).
        </t>
  
        <t>The request to modify the ACK rate of the receiver holds until the next segment carrying a TARR option is received.
        </t>
   
      	
       </section>

  </section>


  <section title="Option Format">
      <t> The TARR option presents two different formats that can be identified by the corresponding format length. 
          For packets that have the SYN bit set, the TARR option has the format shown in Fig. 1.
         
      </t>

      <t>
        <figure title="TCP ACK Rate Request option format for packets that have the SYN bit set."
                anchor="fig_TARR_format_SYN">
        <artwork><![CDATA[    
                                                  
    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Kind      |     Length    |              ExID             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

        ]]></artwork></figure>

      </t>
      
      <t>    Kind: The Kind field value is TBD.
      </t>

      <t>    Length: The Length field value is 4 bytes.
      </t>

      <t>    ExID: The experiment ID field size is 2 bytes, and its value is 0x00AC.
      </t>

    <t>For packets that do not have the SYN bit set, the TARR option has the format and content shown in Fig. 2.
    </t>  

      <t>
        <figure title="TCP ACK Rate Request option format."
                anchor="fig_TARR_format">
        <artwork><![CDATA[    
                                                  
   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |     Kind      |     Length    |              ExID             |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |      R      |V|
  +-+-+-+-+-+-+-+-+

        ]]></artwork></figure>

      </t>

      <t>    Kind: The Kind field value is TBD.
      </t>

      <t>    Length: The Length field value is 5 bytes.
      </t>

      <t>    ExID: The experiment ID field size is 2 bytes, and its value is 0x00AC.
      </t>


      <t>    R: The size of this field is 7 bits.  The field carries the ACK rate requested by the 
   sender. The minimum value of R is 1.
      </t>

      <t>    Note: there are currently two options being considered regarding the semantics of the R field:
      </t>

      <t>   OPTION 1: the R field corresponds to the binary encoding of the requested ACK rate. The maximum value of R is 127.  A receiver MUST ignore an R field with all bits set to zero. 
            (TO-DO: if OPTION 1 is selected, see how to handle all bits of R being equal to zero.)
      </t>
 
      <t>   OPTION 2: the R field is composed of two subfields: the 5 leftmost bits represent a mantissa (m) and the 2 rightmost 
            bits represent an exponent (e). The value of the requested ACK rate is obtained as R = (m+1)*2^(2*e). The maximum value of R is 2048.
      </t>

      <t>   ReserVed (V): The size of this field is 1 bit.  This bit is reserved for future use.
      </t>
   
  </section>

  <section title="Changing the ACK rate during the lifetime of a TCP connection">

      <t>   In some scenarios, setting the ACK rate once for the whole lifetime of 
   a TCP connection may be suitable. However, there are also cases where it may be desirable to modify the ACK rate during the lifetime of a connection.
      </t> 

      <t>   The ACK rate to be used may depend on the cwnd value used by the sender, which can change over the lifetime of a connection. cwnd will start
            at a low value and grow rapidly during the slow-start phase, then settle into a reasonably consistent range for the congestion-avoidance phase
            - assuming the underlying bandwidth-delay product (BDP) remains constant.  Phenomena such as routing updates, link capacity changes or path load
            changes may modify the underlying BDP significantly; the cwnd should be expected to change accordingly, prompting the need for ACK rate updates.
      </t> 

      <t>
            TARR can also be used to suppress Delayed ACKs in order to allow measuring the RTT of each packet in specific intervals (e.g., during flow start-up),
            and allow a different ACK rate afterwards. 
      </t>

      <t>
            A Linux receiver has a heuristic to detect slow start and suppress Delayed ACKs just for that period.  However, some slow start variants
            (e.g., HyStart, HyStart++, etc.) may alter the ending of slow start, thus confusing the heuristics of the receiver. To avoid slow start sender
            behavior ossification, an explicit signal such as TARR may be useful.
      </t>

      <t>  Another reason to modify the ACK rate might be reducing the ACK load.  The sender may notice that the ACKs it receives cover more 
           segments than the ACK rate requested, indicating that ACK decimation is occurring en route. The sender may then decide to reduce the ACK
           frequency to reduce receiver workload and network load up to the ACK decimation point.
      </t> 

      <t>  Future TCP specifications may also permit Congestion Experienced (CE) marks to appear on pure ACKs <xref target="I-D.ietf-tcpm-generalized-ecn"/>.  
           This might involve more frequent ACK rate updates (e.g., once an RTT), as the sender probes around an operating point.
      </t>

  </section>   



  <section title="IANA Considerations">  
    <t>This document specifies a new TCP option (TCP ACK Rate Request) that 
       uses the shared experimental options format <xref target="RFC6994"/>, with ExID in 
       network-standard byte order.  
    </t>

    <t>The authors plan to request the allocation of ExID value 0x00AC for 
       the TCP option specified in this document.
    </t>
 
  </section>

    <section anchor="Security" title="Security Considerations">

      <t>The TARR option opens the door to new security threats. This section discusses such new threats, and suggests mitigation techniques.
      </t>
    
      <t>An attacker might be able to impersonate a legitimate sender, and
   forge an apparently valid packet intended for the receiver. In such case, the attacker may mount a variety of harmful actions. By using TARR, the attacker may intentionally communicate a bad R value to the latter with the aim
   to damage communication or device performance. For example, in a small cwnd scenario, using a too high R value may lead to exacerbated RTT increase and throughput decrease. In other scenarios, a too low R value 
         may contribute to depleting the energy of a battery-operated receiver at a faster rate or may lead to increased network packet load.
      </t>

      <t>While Transport Layer Security (TLS) <xref target="RFC8446"/> is strongly recommended for securing TCP-based communication, TLS does not protect TCP headers,
         and thus cannot protect the TARR option fields carried by a segment. One approach to address the problem is using network-layer protection, such
         as Internet Protocol Security (IPsec) <xref target="RFC4301"/>. Another solution is using the TCP Authentication Option    
   (TCP-AO), which provides TCP segment integrity and protection against replay attacks <xref target="RFC5925"/>.
      </t>

      <t>   While it is relatively hard for an off-path attacker to attack an unprotected TCP session, it is RECOMMENDED for a TARR receiver to use
            the guidance and attack mitigation given in <xref target="RFC5961"/>. The TARR option MUST be ignored on a packet that is deemed invalid.
      </t>

      <t>   A TARR receiver might opt not to fulfill a request to avoid or mitigate an attack by which a large number of senders request disabling delayed ACKs 
            simultaneously and send a large number of data segments to the receiver (see Section 3.2).
      </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, Neal Cardwell,
   Michael Tuexen, Yuchung Cheng, Matt Mathis, Jana Iyengar, Gorry
   Fairhurst, Stuart Cheshire, Yoshifumi Nishida, Michael Scharf, Ian Swett, and Martin Duke provided useful comments and input for this document.
   Jana Iyengar suggested including a field to allow a sender communicate its tolerance 
   to reordering. Jonathan Morton and Bob Briscoe provided the main input for Section 5.
      </t>     

      <t>Carles Gomez has been funded in part by the Spanish Government 
         through project PID2019-106808RA-I00, and by Secretaria
         d'Universitats i Recerca del Departament d'Empresa i Coneixement de
         la Generalitat de Catalunya 2017 through grant 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.5681.xml'?>

      <?rfc include='reference.RFC.5925.xml'?>

      <?rfc include='reference.RFC.5961.xml'?>

      <?rfc include='reference.RFC.6994.xml'?>
 
    </references>

    <references title="Informative References">
      <!-- Here we use entities that we defined at the beginning. -->

      <?rfc include='reference.I-D.ietf-tcpm-generalized-ecn'?>

      <?rfc include='reference.RFC.3449.xml'?>

      <?rfc include='reference.RFC.4301.xml'?>

      <?rfc include='reference.RFC.8446.xml'?>

      <?rfc include='reference.RFC.8490.xml'?>
   
    </references>

    <!-- -->
  </back>
</rfc>