<?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-05" 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.  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) / 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] = 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 808?>

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

-->

</rfc>

