<?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-04" 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="January" day="21"/>

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

    <abstract>


<?line 158?>

<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 180?>

<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 necessary 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, opon 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 <em>now</em> 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 <em>cwnd</em> 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
(<em>now</em>) 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.  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, with line 32 handling
the special case of skipped bins after the initial connection.  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.0 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 = 2    

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) mod 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

    // If too many bins skipped, reset search.
28: if (passed_bins > MISSED_BIN_LIMIT) then
29:    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] = (curr_idex == -1) ? 0 : 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
]]></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 of send
or receiving packets or end hosts without data to send.  In such
cases, the sender won&#39;t get confirmtion of the expected doubling of
the delivered bytes each round-trip time 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 to see the congestion signaling
(lack of doubling) is no longer clean and so the SEARCH variables are
rese.  By default, SEARCH does this if more than 2 bins are missed,
representing not receiving ACKs for a full round-trip time.</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="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="2024"/>
  </front>
  <seriesInfo name="Computer Networks vol. 55, no. 9, pp. 2092-2110, DOI 10.1016/j.comnet.2011.01.014" value=""/>
</reference>


    </references>


<?line 809?>

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

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

</section>


  </back>

<!-- ##markdown-source:
H4sIAJ7Ej2cAA+19+3MbR5Lm7/VX1MlxYcAGIAIEKYk70g5FURJ3SElLUubs
ORy8BlAg2mx0Y/pBCqPw/u2bX2ZVdXUD0HgmYm/iLk5hS2Q/6pGVjy8fVd3v
91UZl4k50lenx5cn73W/ryP9wTzqqySjv8ooL/VxcpflcblY6nmW6+uTTzpK
Z/rfP5+daBVNJrl5ONKFifLpQqtZNk2jJbU3y6N52Z8uqvSuP50+3vXlif7e
WM2ikh4Y7Y0O+nvD/mio1He6KKnN2yjJUrpV5pVRKl7l/GNRjvb2XuyNVJSb
6EjfmAn3f5aWJk9Nqa/zKC1WWV6qx7sjjb7U/eORv99/g5GoaVTSKMuZKkpq
Zkn3T6/fKjXNZnFKr1VFPyqmcaxW8ZGmP9/paZTSVaOjPI/WuhPPdZQkem2K
riYqLKJioRcmNzR23ddlNpUfChpHbuaF/W295F80HjjCy/Sje+SIu5mZeVQl
ZUFPuPvykjyuoqpcZPmR0vynb//VOk7piX8b6BNQWPvLQvx/i4y+yVK56e9l
OU30pzgqopKoM/XX3Ro+8C1/GYQyRLT9vT39IZ7em7ygJi9nPf3dcG/PPzaN
y/WRvojyZJLlWXW36OmL4/puNqPx7A2fHYyCa1Va5vTS5zQuzQxcVppCZ3N9
vDR5PI38k2YZxcmR/jUyj1k6YGb6o4xyMM2W22lyMdB/iqaLLDNxiyo0xnW0
1MdlZOLNZ5g6N1k+NQUxjv6UJevSTBdpPCViFSQlVWk2SHbz6WyDXkSc+g2i
V4tSvoutdDrce/H76aTbhFpGmNu9ndofH1fxwMyq7XR6O9DnbQq9NcRL5/H/
/Rwzp4kMkvj3MMtJEq1XWZZsMsv95r3/F5hkaif1x2kxcByi0iwn5okfzBE0
l6WVzufT0XD4onXpYDQ6bF86fD5sXXr2YowFvHx7giaO5Ee86n6kV+yPePSI
FH46r0eh9cmfTkZjUXzWRj05W67y7IEUtlifwEa9NovoISbFHKf6Js5NYoqC
7Fj5mOX3hX4k62Ut3BNusKlVacBNtjgmtsizlNpqccXxckLLLvf+Iab4Jyir
/w6bsU2XtBu0ykTvakvvov7rgf5kaFpFu8XXJv01WtKqyO2/OUi9Qez/HmEv
SNBMAfYlHv2UZ1NjgCpYCsuFIahxemrxCHF3lkaJvlovV1kRV0tNJD/PpnQJ
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

-->

</rfc>

