<?xml version="1.0" encoding="us-ascii"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.13 (Ruby 2.6.10) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

<!ENTITY RFC2119 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC5226 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5226.xml">
<!ENTITY RFC5681 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5681.xml">
<!ENTITY RFC7942 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7942.xml">
<!ENTITY SELF "[RFCXXXX]">
]>


<rfc ipr="trust200902" docName="draft-chung-ccwg-search-07" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="search">SEARCH -- a New Slow Start Algorithm for TCP and QUIC</title>

    <author initials="J." surname="Chung" fullname="Jae Won Chung">
      <organization abbrev="viasat">Viasat Inc</organization>
      <address>
        <postal>
          <street>300 Nickerson Rd,</street>
          <city>Marlborough, MA</city>
          <code>1002</code>
          <country>United States of America</country>
        </postal>
        <email>jaewon.chung@viasat.com</email>
      </address>
    </author>
    <author initials="M." surname="Kachooei" fullname="Maryam Ataei Kachooei">
      <organization abbrev="WPI">Worcester Polytechnic Institute</organization>
      <address>
        <postal>
          <street>100 Institute Rd</street>
          <city>Worcester, MA</city>
          <code>01609</code>
          <country>United States of America</country>
        </postal>
        <email>mataeikachooei@wpi.edu</email>
      </address>
    </author>
    <author initials="F." surname="Li" fullname="Feng Li">
      <organization abbrev="viasat">Viasat Inc</organization>
      <address>
        <postal>
          <street>300 Nickerson Rd,</street>
          <city>Marlborough, MA</city>
          <code>1002</code>
          <country>United States of America</country>
        </postal>
        <email>feng.li@viasat.com</email>
      </address>
    </author>
    <author initials="M." surname="Claypool" fullname="Mark Claypool">
      <organization abbrev="WPI">Worcester Polytechnic Institute</organization>
      <address>
        <postal>
          <street>100 Institute Rd</street>
          <city>Worcester, MA</city>
          <code>01609</code>
          <country>United States of America</country>
        </postal>
        <email>claypool@cs.wpi.edu</email>
      </address>
    </author>

    <date year="2025" month="September" day="12"/>

    <area>Web and Internet Transport</area>
    <workgroup>ccwg</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 188?>

<t>TCP slow start is designed to ramp up to the network congestion point
quickly, doubling the congestion window each round-trip time until the
congestion point is reached, whereupon TCP exits the slow start phase.
Unfortunately, the default Linux TCP slow start implementation -- TCP
Cubic with HyStart <xref target="HYSTART"/> -- can cause premature exit from slow
start, especially over wireless links, degrading link utilization.
However, without HyStart, TCP exits slow start too late, causing
unnecessary packet loss.  To improve TCP slow start performance, this
document proposes using the Slow start Exit At Right CHokepoint
(SEARCH) algorithm <xref target="KCL24"/> where the TCP sender determines the
congestion point based on acknowledged deliveries -- specifically, the
sender computes the delivered bytes compared to the expected delivered
bytes, smoothed to account for link latency variation and normalized
to accommodate link capacities, and exits slow start if the delivered
bytes are lower than expected.  We implemented SEARCH as a Linux
kernel v5.16 module and evaluated it over WiFi, 4G/LTE, and low earth
orbit (LEO) and geosynchronous (GEO) satellite links.  Analysis of the
results show that the SEARCH reliably exits from slow start after the
congestion point is reached but before inducing packet loss.</t>



    </abstract>



  </front>

  <middle>


<?line 210?>

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

<t>The TCP slow start mechanism starts sending data rates cautiously yet
rapidly increases towards the congestion point, approximately doubling
the congestion window (cwnd) each round-trip time (RTT).
Unfortunately, default implementations of TCP slow start, such as TCP
Cubic with HyStart <xref target="HYSTART"/> in Linux, often result in a premature
exit from the slow start phase, or, if HyStart is disabled, excessive
packet loss upon overshooting the congestion point.  Exiting slow
start too early curtails TCP&#39;s ability to capitalize on unused link
capacity, a setback that is particularly pronounced in high
bandwidth-delay product (BDP) networks (e.g., GEO satellites) where
the time to grow the congestion window to the congestion point is
substantial.  Conversely, exiting slow start too late overshoots the
link&#39;s capacity, inducing unnecessary congestion and packet loss,
particularly problematic for links with large (bloated) bottleneck
queues.</t>

<t>To determine the slow start exit point, we propose that the TCP sender
monitor the acknowledged delivered bytes in an RTT and compare that to
what is expected based on the bytes acknowledged as delivered during
the previous RTT.  Large differences between delivered bytes and
expected delivered bytes is then the indicator that slow start has
reached the network congestion point and the slow start phase should
exit.  We call our approach the Slow start Exit At Right CHokepoint
(SEARCH) algorithm.  SEARCH is based on the principle that during slow
start, the congestion window expands by one maximum segment size (MSS)
for each acknowledgment (ACK) received, prompting the transmission of
two segments and effectively doubling the sending rate each RTT.
However, when the network surpasses the congestion point, the delivery
rate does not double as expected, signaling that the slow start phase
should exit.  Specifically, the current delivered bytes should be
twice the delivered bytes one RTT ago.  To accommodate links with a
wide range in capacities, SEARCH normalizes the difference based on
the current delivery rate and since link latencies can vary over time
independently of data rates (especially for wireless links), SEARCH
smooths the measured delivery rates over several RTTs.</t>

<t>This document describes the current version of the SEARCH algorithm,
version 3. Active work on the SEARCH algorithm is continuing.</t>

<t>This document is organized as follows: Section 2 provides terminology
and definitions relevant used throughout this document; Section 3
describes the SEARCH algorithm in detail; Section 4 provides
justification for algorithm settings; Section 5  describes the
implementation status; Section 6 describes security considerations;
Section 7 notes that there are no IANA considerations; Section 8
closes with acknowledgments; and Section 9 provides references.</t>

</section>
<section anchor="terminology-and-defitions"><name>Terminology and Defitions</name>

<t>The key words &quot;MUST&quot;, &quot;MUST NOT&quot;, &quot;REQUIRED&quot;, &quot;SHALL&quot;, &quot;SHALL NOT&quot;,
&quot;SHOULD&quot;, &quot;SHOULD NOT&quot;, &quot;RECOMMENDED&quot;, &quot;MAY&quot;, and &quot;OPTIONAL&quot; in this
document are to be interpreted as described in RFC 2119, BCP 14
<xref target="RFC2119"/> and indicate requirement levels for compliant CoAP
implementations.</t>

<t>In this document, the term &quot;byte&quot; is used in its now customary sense
as a synonym for &quot;octet&quot;.</t>

<t><em>ACK:</em> a TCP acknowledgement.</t>

<t><em>bins:</em> the aggregate (total) of acknowledged delivery bytes over a
 small time window.</t>

<t><em>congestion window (cwnd):</em> A TCP state variable that limits the
 amount of data a TCP can send. At any given time, a TCP flow MUST NOT
 send data with a sequence number higher than the sum of the highest
 acknowledged sequence number and the minimum of the cwnd and receiver
 window.</t>

<t><em>norm:</em> the normalized difference in current delivered bytes and
 previously delivered bytes.</t>

<t><em>round-trip time (RTT):</em> the round-trip time for a segment sent until
 the acknowledgement is received.</t>

<t><em>THRESH:</em> the norm value above which SEARCH will consider the
 congestion point to be reached and the slow start phase exits.</t>

</section>
<section anchor="search-algorithm"><name>SEARCH Algorithm</name>

<t>The concept that during the slow start phase, the delivered bytes
should double each RTT until the congestion point is reached is core
to the SEARCH algorithm. In SEARCH, when the bytes delivered one RTT
prior is half the bytes delivered currently, the bitrate is not yet at
capacity, whereas when the bytes delivered prior are more than half
the bytes delivered currently, the link capacity has been reached and
TCP exits slow start.</t>

<t>One challenge in monitoring delivered data across multiple RTTs is
latency variability for some links. Variable latency in the absence of
congestion - common in some wireless links - can cause RTTs to differ
over time even when the network is not yet at the congestion point.
This variability complicates comparing delivered bytes one RTT prior
to those delivered currently in that a lowered latency can make it
seem like the total bytes delivered currently is too low compared to
the total delivered one RTT ago, making it seem like the link is at
the congestion point when it is not.</t>

<t>To counteract link latency variability, SEARCH tracks delivered data
over several RTTs in a sliding window providing a more stable basis
for comparison.  Since tracking individual segment delivery times is
prohibitive in terms of memory use, the data within the sliding window
is aggregated over bins representing small, fixed time periods. The
window then slides over bin-by-bin, rather than sliding every
acknowledgement (ACK), reducing both the computational load (since
SEARCH only triggers at the bin boundary) and the memory requirements
(since delivered byte totals are kept for a bin-sized time interval
instead of for each segment).</t>

<section anchor="algorithm-overivew"><name>Algorithm Overivew</name>

<t>An overview of the SEARCH algorithm (that runs on the TCP server only)
is provided below.</t>

<t>In lines 1-2, upon initialization of a TCP connetion, the SEARCH
window (W) is set based on the initial round trip time (init_rtt), and
the delivery history (hist) is cleared.</t>

<t>The main part of the SEARCH algorithm runs in lines 3-10 when an
ACK is received.  Line 3 does bookkeeping, updating the delivery
history (hist) based on the current time and the TCP ACK sequency
number (sequence_num).</t>

<t>Line 4 computes the number of bytes delivered in the current SEARCH
window, using hist to tally the delivered bytes from the current time
(now) to now minus W.  Line 5 does the same computation, but for the
delivered bytes for the previous rtt - i.e,. from now minus
an rtt to now minus an rtt minus W.</t>

<t>Line 6 computes the difference between the current delivered bytes and
the previous delivered bytes, doubling the latter value since under
normal slow start congestion window growth the delivered bytes will
approximately double each round-trip time.  Line 7 normalizes this
difference since it is the relative delivered bytes that matter -
i.e., it is the delivered bytes no longer doubling - independently of
the actual byte amounts - that indicates the chokepoint has been
reaced.  Line 8 compares this normalized difference (norm_diff) to the
SEARCH threshold (THRESH), and if this threshold has been surpassed
then slow start exits.</t>

<t>SEARCH ALGORITHM OVERVIEW</t>

<figure><artwork><![CDATA[
upon TCP connection:
1:  W = 3.5 * init_rtt  // SEARCH window size
2:  hist[] = {}  // Array holding delivery history

on ACK arrived (sequence_num, rtt):

    // Update delivery history.
3:  update_hist(hist, sequence_num)

    // Compute current and previous RTT deliveries.
4:  curr_delv = compute_delv(hist, now - W, now)
5:  prev_delv = compute_delv(hist, now - W - rtt, now - rtt)

    // Check if rate has not doubled.
6:  diff = curr_delv - 2 * prev_delv
7:  norm_diff = diff / (2 * prev_delv)
8:  if (norm_diff >= THRESH) then
9:     exit_slow_start()
10: end if
]]></artwork></figure>

</section>
<section anchor="the-complete-algorithm"><name>The Complete Algorithm</name>

<t>The complete SEARCH algorithm (that runs on the TCP server only) is
shown below.</t>

<t>The core of the algorithm overview presented above is preserved in the
complete algorithm below.  But in order to made the code practical,
the delivery history information from the TCP ACKs is binned,
aggregating delivered byte information over a small time period.
Maintaining the bins is done via a circular array, with checks to make
sure the array has enough data for the SEARCH computations (i.e., bins
over time period W for the current delivery window, and bins over time
period W for the delivery window for the previous round-trip time).
In addition, the total memory footprint used by the bins is managed
via bit shifting, decreasing the delivered byte values stored when
they get too large.</t>

<t>The parameters in CAPS (lines 1-7) are constants, with the INITIAL_RTT
(on line 1) obtained via the first round-trip time measured in the TCP
connection.</t>

<t>The variables in Initialization (lines 9-12) are set once, upon
establishment of a TCP connection.</t>

<t>The variable *now* on lines 13 and 27 is the current system time when
the code is called.</t>

<t>The variable sequence_num and rtt in the ACK_arrived() function (above
line 13) are obtained upon arrival of an acknowledgement from the
receiver.</t>

<t>The variable *cwnd* on lines 54 and 55 is the current congestion
window.</t>

<t>Lines 1-8 set the predefined parameters for the SEARCH algorithm.  The
window size (WINDOW_SIZE) is 3.5 times the initial RTT.  The delivered
bytes over a window is approximated using 10 (W) bins, with an
additional 15 additional bins (EXTRA_BINS) bins (for a total of 25
(NUM_BINS)) to allow comparison of the current delivered bytes to the
previously delivered bytes one RTT earlier.  The bin duration
(BIN_DURATION) is the window size divided by the number of bins.  The
threshold (THRESH) is set to 0.35, and is the upper bound of the
permissible difference between the previously delivered bytes and the
current delivered bytes (normalized) above which slow start exits.
The maxium value for each (MAX_BIN_VALUE) can be less than largest TCP
sequence number.</t>

<t>Lines 9-12 do one-time initialization of search variables when a TCP
connection is established.  By setting the bound boundary (bin_end) to
0 intially, that means the first ack that arrives is placed in the
first bin.</t>

<t>Once a TCP flow starts, SEARCH only acts when acknowledgements (ACKs)
are received and even then, only for the first ACK that arrives after
the end of the latest bin boundary (stored in the variable bin_end).
This check happens on line 13 and, if the bin boundary is passed, the
bin statistics are updated in the call to update_bins() on line 14.</t>

<t>In update_bins() (lines 27-48), in most TCP connections, the time
(*now*) will be in the successive bin, but in some cases (such as an
RTT spike or a TCP connection without data to send), more than one bin
boundary may have been passed.  Line 27 computes how many bins have
been passed.</t>

<t>On line 28, if more than one RTT of bins has been missed (see the
&quot;Missed Bins&quot; section for an explanation), then the SEARCH parameters
are reset via <spanx style="verb">reset_search()</spanx>.  The <spanx style="verb">reset_search()</spanx> function (lines
56-62) re-initializes the bin index (curr_index), the scale factor
(scale_factor) and the bin end time (bin_end).  On line 59, if there
has been a whole SEARCH window (W) of bins missed, the bin duration
(BIN_DURATION) is reset, too, based on the current RTT (lines 60 and
61).</t>

<t>Otherwise, if more than one bin has been passed, any such &quot;skipped&quot;
bins are updated with the most recently updated bin.  These skipped
bins are updated via the loop in lines 31-33.  Line 34 updates the
current bin index (curr_idx) based on the number of bins that have
been passed (again, typically this will be 1) and line 35 updates the
next bin boundary (bin_end) based on the number of passed bins
(passed_bins) and the bin duration (BIN_DURATION)</t>

<t>In lines 36-47, the memory used by each bin can be reduece (e.g., a
u16) to be less than the memory used for a TCP sequence number (e.g.,
a u32).  To handle this, when updating the bin value, on line 36 the
sequence number is first scaled by the scale factor (initially set to
0).  If the scaled value is larger than the maximum value the bin can
hold (MAX_BIN_VALUE, set to the largest u16 by default), then lines
39-42 shift (scale) the value (bin_value) until it fits.  In lines
43-45, all the previous bin values that had only been scaled by the
previous scale factor are re-scaled by the additional amount
(shift_amount) and the total scaling (scale_factor) updated in line
46.</t>

<t>Lastly, on line 48, the latest bin is updated to the most recent
scaled bin value - i.e., the latest ACKed TCP sequence number
(sequence_num), scaled/shifted by shift_amount.</t>

<t>Once the bins are updated, lines 15-17 check if enough bins have been
filled to run SEARCH.  This requires more than W (10) bins, but also
enough to shift back by an RTT to compute a window (10) of bins there.</t>

<t>If there are enough bins to run SEARCH, lines 18 and 20 compute the
current and previously delivered bytes over a window (W) of bins.
This delivered bytes over the window is computed in the function
compute_delv().  For previously delivered bytes, shifting by an RTT
may land between bin boundaries, so the computation is interpolated by
the fraction on either side, computed on line 18.</t>

<t>Lines 49-51 compute the delivered bytes over the bins, first by taking
the &quot;upper&quot; delivered window (which is 0, if fraction is 0), then
adding the &quot;lower&quot; delivered window, and finally returning this sum.</t>

<t>Once computed, the difference between expected delivered bytes (2 x
prev_delv) and the current delivered bytes (curr_delv) is normalized
(line 21) and then compared to the threshold (THRESH) in line 21.  If
this difference is larger than THRESH, slow start exits, which is
handled by the function exit_slow_start().</t>

<t>The exit_slow_start() function is on lines 52-55.  When exiting slow
start at the chokepoint, SEARCH is delayed in its prediction by almost
exactly two RTTs.  SEARCH can compute exactly how many extra bytes
have been added to the congestion window (cwnd) beyond this point.
The cwnd is reduced by this amount, before setting ssthresh to the
cwnd (line 55).  This exits slow start.</t>

<t>SEARCH 3.1 ALGORITHM</t>

<figure><artwork><![CDATA[
Parameters:
1: WINDOW_SIZE = INITIAL_RTT x 3.5  
2: W = 10  
3: EXTRA_BINS = 15
4: NUM_BINS = W + EXTRA_BINS  
5: BIN_DURATION = WINDOW_SIZE / W  
6: THRESH = 0.35
7: MAX_BIN_VALUE = 0xFFFF  // 16-bit
8: MISSED_BIN_LIMIT = alpha x (INITIAL_RTT / BIN_DURATION)

Initialization():
9: bin[NUM_BINS] = {}
10: curr_idx = -1 
11: bin_end = 0
12: scale_factor = 0

ACK_arrived(sequence_num, rtt):
    // Check if passed bin boundary.
13: if (*now* > bin_end) then  
14:   update_bins()

      // Check if enough data for SEARCH.
15:   prev_idx = curr_idx - (rtt / BIN_DURATION)
16:   if (prev_idx > W) and
17:      (curr_idx - prev_idx) < EXTRA_BINS then  

        // Run SEARCH check.
18:     curr_delv = compute_delv(curr_idx - W, curr_idx)
19:     frac = (rtt mod BIN_DURATION) / BIN_DURATION
20:     prev_delv = compute_delv(prev_idx - W, prev_idx, frac)
21:     norm_diff = (2 x prev_delv - curr_delv) / (2 x prev_delv)
22:     if (norm_diff >= THRESH) then
23:       exit_slow_start()
24:     end if

25:   end if // Enough data for SEARCH.

26: end if // Each ACK.

// Update bin statistics.
// Handle cases where more than one bin boundary passed.
// Scale bins (shift) if larger than max bin size.
update_bins():
27: passed_bins = (*now* - bin_end) / BIN_DURATION + 1

    // Missed too many bins, or app limit rate --> reset SEARCH
28: if (passed_bins > MISSED_BIN_LIMIT || is_app_limited()) then
29:   return reset_search()
30: end if

    // For remaining skipped, propagate prev bin value.
31: for i = curr_idx+1 to (curr_idx + passed_bins)
32:   bin[i mod NUM_BINS] = bin[curr_idx]
33: end for 
34: curr_idx += passed_bins
35: bin_end += passed_bins x BIN_DURATION

    // Scale bins (shift) if too large.
36: bin_value = sequence_num >> scale_factor
37: if (bin_value > MAX_BIN_VALUE) then
38:   shift_amount = 0
39:   while (bin_value > MAX_BIN_VALUE)
40:     shift_amount += 1
41:     bin_value >>= 1
42:   end while
43:   for i = 0 to NUM_BINS
44:     bin[i] >>= shift_amount
45:   end for
46:   scale_factor += shift_amount
47: end if

48: bin[curr_idx mod NUM_BINS] = bin_value

// Compute delivered bytes over bins, interpolating a fraction of each
// bin on the ends (default is 0).
compute_delv(idx1, idx2, frac = 0):
49: delv = (bin[idx2+1 mod NUM_BINS] - bin[idx1+1 mod NUM_BINS]) x frac
50: delv += (bin[idx2 mod NUM_BINS] - bin[idx1 mod NUM_BINS]) x (1-frac)
51: return delv

// Exit slow start by setting cwnd and ssthresh.
exit_slow_start():
52: cong_idx = curr_idx - 2 x INITIAL_RTT / BIN_DURATION
53: overshoot = compute_delv(cong_idx, curr_idx)
54: cwnd -= overshoot
55: ssthresh = cwnd

// Reset SEARCH parameters.
reset_search():
56: curr_idx = -1
57: scale_factor = 0
58: bin_end = *now*
59: if passed_bins > W then
60:   WINDOW_SIZE = rtt x 3.5  
61:   BIN_DURATION = WINDOW_SIZE / W  
62: end
]]></artwork></figure>

</section>
</section>
<section anchor="search-parameters"><name>SEARCH Parameters</name>

<section anchor="window-size-windowsize"><name>Window Size (WINDOW_SIZE)</name>

<t>The SEARCH window smooths over RTT fluctuations in a connection that
are unrelated to congestion. The window size must be large enough to
encapsulate meaningful link variation, yet small in order to allow
SEARCH to respond near when slow start reaches link capacity. In order
to determine an appropriate window size, we analyzed RTT variation
over time for GEO, LEO, and 4G LTE links for TCP during slow start.
See <xref target="KCL24"/> for details.</t>

<t>The SEARCH window size should be large enough to capture the observed
periodic oscillations in the RTT values. In order to determine the
oscillation period, we use a Fast Fourier Transform (FFT) to convert
measured RTT values from the time domain to the frequency domain.  For
GEO satellites, the primary peak is at 0.5 Hz, meaning there is a
large, periodic cycle that occurs about every 2 seconds. Given the
minimum RTT for a GEO connection of about 600 ms, this means the cycle
occurs about every 3.33 RTTs.  Thus, a window size of about 3.5 times
the minimum RTT should smooth out the latency variation for this type
of link.</t>

<t>While the RTT periodicity for the LEO link is not as pronounced as in
the GEO link, the FFT still has a dominant peak at 10 Hz, so a period
of about 0.1 seconds. With LEO&#39;s minimum RTT of about 30 ms, the
period is also about 3.33 RTTs. Thus, a window size of about 3.5 times
the minimum RTT should smooth out the latency variation for this type
of link, too.</t>

<t>Similarly to the LEO link, the LTE network does not have a strong RTT
periodicity. It has a dominant peak at 6 Hz, with a period of about
0.17 seconds. With the minimum RTT of the LTE network about 60 ms,
this means a window size of about 2.8 times the minimum RTT is
needed. A SEARCH default of 3.5 times the minimum RTT exceeds this, so
should smooth out the variance for this type of link as well.</t>

</section>
<section anchor="threshold-thresh"><name>Threshold (THRESH)</name>

<t>The threshold determines when the difference between the bytes
delivered currently and the bytes delivered during the previous RTT is
great enough to exit the slow start phase. A small threshold is
desirable to exit slow start close to the `at capacity&#39; point, but the
threshold must be large enough not to trigger an exit from slow start
prematurely due to noise in the measurements.</t>

<t>During slow start, the congestion window doubles each RTT. In ideal
conditions and with an initial cwnd of 1, this results in a sequence
of delivered bytes that follows a doubling pattern (1, 2, 4, 8, 16,
...). Once the link capacity is reached, the delivered bytes each RTT
cannot increase despite cwnd growth.</t>

<t>For example, consider a window that is 4x the size of the RTT. After 5
RTTs, the current delivered window comprises 2, 4, 8, 16, while the
previous delivered window is 1, 2, 4, 8. The current delivered bytes
is 30, exactly double the bytes delivered in the previous
window. Thus, SEARCH would compute the normalized difference as zero.</t>

<t>Once the cwnd ramps up to meet full link capacity, the delivered bytes
plateau.  Continuing the example, if the link capacity is reached when
cwnd is 16, the delivered bytes growth would be 1, 2, 4, 8, 16,
16. The current delivered window is 4+8+16+16 = 44, while the
previously delivered window is 2+4+8+16 = 30. Here, the normalized
difference between 2x the previously delivered window and the current
window is about (60-44)/60 = 0.27. After 5 more RTTs, the previous
delivered and current delivered bytes would both be 16 + 16 + 16 + 16
= 64 and the normalized difference would be (128 - 64) / 64 = 0.5.</t>

<t>Thus, the norm values typically range from 0 (before the congestion
point) to 0.5 (well after the congestion point) with values between 0
and 0.5 when the congestion point has been reached but not surpassed
by the full window.</t>

<t>To generalize this relationship, the theoretical underpinnings of this
behavior can be quantified by integrating the area under the
congestion window curve for a closed-form equation for both the
current delivered bytes (curr_delv) and the previously delivered bytes
(prev_delv), the normalized difference can be computed based on the
RTT round relative to the &quot;at capacity&quot; round. While SEARCH seeks to
detect the &quot;at capacity&quot; point as soon as possible after reaching it,
it must also avoid premature exit in the case of noise on the
link. The 0.35 threshold value chosen does this and can be detected
with 2 RTTs of reaching capacity.</t>

</section>
<section anchor="number-of-bins-numbins"><name>Number of Bins (NUM_BINS)</name>

<t>Dividing the delivered byte window into bins reduces the server&#39;s
memory load by aggregating data into manageable segments instead of
tracking each packet. This approach simplifies data handling and
minimizes the frequency of window updates, enhancing server
efficiency. However, more bins provide more fidelity to actual
delivered byte totals and allow SEARCH to make decisions (i.e.,
compute if it should exit slow start) more often, but require more
memory for each flow. The sensitivity analysis conducted here aims to
identify the impact of the number of bins used by SEARCH and the
ability to exit slow start in a timely fashion.</t>

<t>Using a window size of 3.5x the initial RTT and a threshold of 0.35,
we varied the number of bins from 5 to 40 and observe the impact on
SEARCH&#39;s performance over GEO, LEO and 4G LTE downloads.  For all
three links, a bin size of provides nearly identical performance as
SEARCH running with more bins, while 10 minimizes early exits while
having an at chokepoint percentage that is close to the maximum.</t>

</section>
<section anchor="missed-bins-missedbinlimit"><name>Missed Bins (MISSED_BIN_LIMIT)</name>

<t>For most TCP connections, each bin covers about 1/2 an RTT of time.
Thus, most bins have multiple ACKs that arrive before the bin boundary
passes.  However, in some cases, when an ACK arrives it may be after
more than one bin boundary in time.  This could be because of
intermittent network congestion, delayed end host scheduling, or end
hosts without data to send.  In such cases, the sender won&#39;t get
confirmation of the expected doubling of the delivered bytes each RTT
even though this lack of doubling is probably not due to congestion on
the forward link.  So, in this case, SEARCH does not exit slow start.
However, the delivered byte data in the bins that is used as the
congestion signal (i.e., the lack of doubling) is no longer clean and
so the SEARCH variables are reset (in <spanx style="verb">reset_search()</spanx>).  By default,
SEARCH does this if more than about two RTTs of bins are missed (Line 8
sets the MISSED_BIN_LIMIT), representing not receiving ACKs for a full
round-trip time multiplied by an alpha factor - the current
recommendation is for an alpha of 2, but this can be tuned as needed.</t>

</section>
<section anchor="maxbinvalue"><name>MAX_BIN_VALUE</name>

<t>Based on our analysis (see <xref target="KCC25"/> for details), storing the
incoming values in a u32 is not needed - since SEARCH compares
previously delivered bytes to currently delivered bytes, the
<em>relative</em> amounts are all SEARCH really needs.  This means fewer
bytes - u16 or even u8 - can be used for each bin without sacrificing
SEARCH accuracy.  In fact, the approach presented -- bit-shifting on
demand, only when values get too large - is tunable to different
environments by adjusting the MAX_BIN_VALUE constant (line 7), doing
so based on the memory needs and possibly the link capacity of the
server.  TCP servers that handle only a few connections but are on a
high-capacity link may choose to use large bins - u32 or even larger
if the kernel uses larger values for TCP - since per-flow memory
overhead is not an issue but fidelity to the acked bytes could
be. Conversely, TCP servers on resource-constrained devices may use
small bins - u8 or even smaller - if the per-memory overhead is
critical and the network capacity is not large.</t>

<t>When bit-shifting is required - i.e., the incoming value is too large
to fit into the bin - there is some CPU overhead in the shift itself
and in the shift for each previously-stored bin.  There could be
multiple shifts required (i.e., the shifting is done in a loop in
lines 39-42, but in practice, there is typically only one shift or at
most two.</t>

</section>
<section anchor="app-limited-isapplimited"><name>App Limited (<spanx style="verb">is_app_limited()</spanx>)</name>

<t>If the sending rate for TCP flow is limited by the application and not
by the congestion window, then the delivery rate will not double each
RTT during slow start.  SEARCH (and any congestion-point detection
algorithm) will not be able to tell when the chokepoint has been
reached.  Line 28 detects if the flow is application-limited via
<spanx style="verb">is_app_limited()</spanx> that is intended to be a query to the TCP stack.
When it is, SEARCH resets its parameters.</t>

</section>
</section>
<section anchor="deployment-and-performance-evaluations"><name>Deployment and Performance Evaluations</name>

<t>Evaluation of hundreds of downloads of SEARCH across GEO, LEO, and 4G
LTE network links compared to TCP with HyStart and TCP without HyStart
shows SEARCH almost always exits after capacity has been reached but
before packet loss has occurred. This results in capacity limits being
reached quickly while avoiding inefficiencies caused by lost packets.</t>

<t>Evaluation of a SEARCH implementation in an open source QUIC library
(QUICly) over an emulated GEO satellite link validates the
implementation, illustrating how SEARCH detects the chokepoint and
exits slow start before packet loss occurs. Evaluation over a
commercial GEO satellite link shows SEARCH can provide a median
improvement of up to 3 seconds (14%) compared to the baseline by
limiting cwnd growth when capacity is reached and delaying any packet
loss due to congestion.</t>

<t>Details can be found at <xref target="KCL24"/> and <xref target="CKC24"/>.</t>

</section>
<section anchor="implementation-status"><name>Implementation Status</name>

<t>This section records the status of known implementations of the
algorithm defined by this specification at the time of posting of this
Internet-Draft, and is based on a proposal described in <xref target="RFC7942"></xref>. The
description of implementations in this section is intended to assist
the IETF in its decision processes in progressing drafts to
RFCs. Please note that the listing of any individual implementation
here does not imply endorsement by the IETF. Furthermore, no effort
has been spent to verify the information presented here that was
supplied by IETF contributors. This is not intended as, and must not
be construed to be, a catalog of available implementations or their
features. Readers are advised to note that other implementations may
exist.</t>

<t>According to <xref target="RFC7942"></xref>, &quot;this will allow reviewers and working groups
to assign due consideration to documents that have the benefit of
running code, which may serve as evidence of valuable experimentation
and feedback that have made the implemented protocols more mature. It
is up to the individual working groups to use this information as they
see fit&quot;.</t>

<t>As of the time of writing, the following implementations of SEARCH
have been publicly released:</t>

<t>Linux TCP</t>

<t>Source code URL:</t>

<t><eref target="https://github.com/Project-Faster/tcp_ss_search.git">https://github.com/Project-Faster/tcp_ss_search.git</eref></t>

<t>Source: WPI
Maturity: production
License: GPL?
Contact: claypool@cs.wpi.edu
Last updated: May 2024</t>

<t>QUIC</t>

<t>Source code URLs:</t>

<t><eref target="https://github.com/Project-Faster/quicly/tree/generic-slowstart">https://github.com/Project-Faster/quicly/tree/generic-slowstart</eref>
<eref target="https://github.com/AmberCronin/quicly">https://github.com/AmberCronin/quicly</eref>
<eref target="https://github.com/AmberCronin/qperf">https://github.com/AmberCronin/qperf</eref></t>

<t>Source: WPI
Maturity: production
License: BSD-style
Contact: claypool@cs.wpi.edu
Last updated: May 2024</t>

</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<t>This proposal makes no changes to the underlying security of transport
protocols or congestion control algorithms. SEARCH shares the same
security considerations as the existing standard congestion control
algorithm <xref target="RFC5681"></xref>.</t>

</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<t>This document has no IANA actions. Here we are using that phrase,
suggested by <xref target="RFC5226"></xref>, because SEARCH does not modify or extend the
wire format of any network protocol, nor does it add new dependencies
on assigned numbers. SEARCH involves only a change to the slow start
part of the congestion control algorithm of a transport sender, and
does not involve changes in the network, the receiver, or any network
protocol.</t>

<t>Note to RFC Editor: this section may be removed on publication as an RFC.</t>

</section>
<section anchor="acknowledgements"><name>Acknowledgements</name>

<t>Much of the content of this draft is the result of discussions with
the Congestion Control Research Group (CCRG) at WPI
<eref target="https://web.cs.wpi.edu/~claypool/ccrg">https://web.cs.wpi.edu/~claypool/ccrg</eref>. In addition, feedback and
discussions of early versions of SEARCH with the technical group at
Viasat has been invaluable.</t>

</section>
<section anchor="references"><name>References</name>

</section>


  </middle>

  <back>


    <references title='Normative References' anchor="sec-normative-references">

&RFC2119;
&RFC5226;
&RFC5681;
&RFC7942;


    </references>

    <references title='Informative References' anchor="sec-informative-references">

<reference anchor="CKC24" target="https://web.cs.wpi.edu/~claypool/papers/quic-search-lanman-24/paper.pdf">
  <front>
    <title>Improving QUIC Slow Start Behavior in Wireless Networks with SEARCH</title>
    <author initials="A." surname="Cronin" fullname="Amber Cronin">
      <organization>Worcester Polytechnic Institute</organization>
    </author>
    <author initials="M." surname="Kachooei" fullname="Maryam Ataei Kachooei">
      <organization>Worcester Polytechnic Institute</organization>
    </author>
    <author initials="J." surname="Chung" fullname="Jae Won Chung">
      <organization>Viasat Inc</organization>
    </author>
    <author initials="F." surname="Li" fullname="Feng Li">
      <organization>Viasat Inc</organization>
    </author>
    <author initials="B." surname="Peters" fullname="Benjamin Peters">
      <organization>Viasat Inc</organization>
    </author>
    <author initials="M." surname="Claypool" fullname="Mark Claypool">
      <organization>Worcester Polytechnic Institute</organization>
    </author>
    <date year="2024"/>
  </front>
  <seriesInfo name="Proceedings of the IEEE International Symposium on Local and Metropolitan Area Networks (LANMAN), Boston, MA, USA" value=""/>
</reference>
<reference anchor="KCL24" >
  <front>
    <title>Improving TCP Slow Start Performance in Wireless Networks with SEARCH</title>
    <author initials="M." surname="Kachooei" fullname="Maryam Ataei Kachooei">
      <organization>Worcester Polytechnic Institute</organization>
    </author>
    <author initials="J." surname="Chung" fullname="Jae Won Chung">
      <organization>Viasat Inc</organization>
    </author>
    <author initials="F." surname="Li" fullname="Feng Li">
      <organization>Viasat Inc</organization>
    </author>
    <author initials="B." surname="Peters" fullname="Benjamin Peters">
      <organization>Viasat Inc</organization>
    </author>
    <author initials="J." surname="Chung" fullname="Josh Chung">
      <organization>Lexington Christian Academy</organization>
    </author>
    <author initials="M." surname="Claypool" fullname="Mark Claypool">
      <organization>Worcester Polytechnic Institute</organization>
    </author>
    <date year="2024"/>
  </front>
  <seriesInfo name="The IEEE World of Wireless, Mobile and Multimedia Networks conference (WoWMoM), Perth, Australia" value=""/>
</reference>
<reference anchor="KCC25" >
  <front>
    <title>Reducing Per-flow Memory Use in TCP SEARCH</title>
    <author initials="M." surname="Kachooei" fullname="Maryam Ataei Kachooei">
      <organization>Worcester Polytechnic Institute</organization>
    </author>
    <author initials="J." surname="Chung" fullname="Jae Won Chung">
      <organization>Viasat Inc</organization>
    </author>
    <author initials="A." surname="Cronin" fullname="Andrew Cronin">
      <organization>Akamai</organization>
    </author>
    <author initials="F." surname="Li" fullname="Feng Li">
      <organization>Viasat Inc</organization>
    </author>
    <author initials="B." surname="Peters" fullname="Benjamin Peters">
      <organization>Viasat Inc</organization>
    </author>
    <author initials="M." surname="Claypool" fullname="Mark Claypool">
      <organization>Worcester Polytechnic Institute</organization>
    </author>
    <date year="2025"/>
  </front>
  <seriesInfo name="The IEEE World of Wireless, Mobile and Multimedia Networks conference (WoWMoM), Fort Worth, TX, USA" value=""/>
</reference>
<reference anchor="HYSTART" target="https://doi.org/10.1016/j.comnet.2011.01.014">
  <front>
    <title>Taming the Elephants: New TCP Slow Start</title>
    <author initials="S." surname="Ha" fullname="Sangtae Ha">
      <organization></organization>
    </author>
    <author initials="I." surname="Rhee" fullname="Injong Rhee">
      <organization></organization>
    </author>
    <date year="2008"/>
  </front>
  <seriesInfo name="Computer Networks vol. 55, no. 9, pp. 2092-2110, DOI 10.1016/j.comnet.2011.01.014" value=""/>
</reference>


    </references>


<?line 900?>

<section anchor="compat"><name>Historical Note</name>

<!--  LocalWords:  SEARCH: a New Slow Start Algorithm for TCP and QUIC 
-->
<!--  LocalWords:  
-->

</section>


  </back>

<!-- ##markdown-source:
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
f7jYCCw5u2TU+8tNbfH1/wSjyeYYc4sAAA==

-->

</rfc>

