<?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-08" 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="2026" month="March" day="15"/>

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

    <abstract>


<?line 157?>

<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 sent bytes, 
smoothed to account for link latency variation and normalized
to accommodate link capacities, and initiates exits slow start if the 
delivered bytes are lower than expected. We implemented SEARCH in 
Linux, FreeBSD, and QUIC and evaluated it over WiFi, 4G/LTE, and low 
earth orbit (LEO) and geosynchronous (GEO) satellite links.  Analysis 
of the results show that SEARCH reliably exits from slow start after 
the congestion point is reached but before inducing packet loss.</t>



    </abstract>



  </front>

  <middle>


<?line 179?>

<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
monitors the acknowledged delivered bytes in an RTT and compares them
to the bytes sent during the previous RTT. A large difference between
the data sent earlier and the data currently delivered indicates that
the network has reached the congestion point and that the slow start
phase should exit. We call our approach the Slow start Exit At Right
CHokepoint (SEARCH) algorithm. SEARCH is based on the observation that
during slow start the congestion window typically increases by one
maximum segment size (MSS) for each acknowledgment (ACK) received,
causing the sender&#39;s transmission rate to grow rapidly. As long as the
path is not capacity-limited, increases in sent data result in
proportional increases in delivered data. However, once the network
surpasses the congestion point, additional sent data no longer produces
proportional forward progress, and delivered bytes begin to lag behind
previously sent data. SEARCH detects this divergence and transitions to 
a Drain phase that converges the congestion window toward the path capacity 
before exiting slow start. To accommodate links with a wide range of 
capacities, SEARCH normalizes the difference between delivered bytes and 
previously sent bytes relative to the sent-byte baseline. Since link 
latencies can vary over time independently of data rates (especially for 
wireless links), SEARCH smooths the measured sent and delivered 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> aggregates of bytes measured over small time windows used to 
 track transmission history. SEARCH maintains separate bins for 
 acknowledged delivered bytes (acked bins) and for sent bytes 
 (sent bins).</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 between delivered bytes and the 
 previously sent bytes used as the expected progress baseline.</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 considers the congestion
 point to be reached and transitions to the Drain phase.</t>

<t><em>Drain phase:</em> the SEARCH phase entered after the congestion point is 
 detected, where the congestion window converges toward a target 
 congestion window derived from delivered bytes.</t>

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

<t>The concept that during the slow start phase, the amount of data 
successfully delivered should increase rapidly until the congestion 
point is reached is core to the SEARCH algorithm. In SEARCH, the sender 
compares the delivered bytes with the data sent one RTT earlier. When 
the delivered bytes closely match the previously sent bytes, the link 
is not yet capacity-limited, whereas when the delivered bytes fall 
significantly below the previously sent bytes, the link capacity has 
been reached and SEARCH transitions to a Drain phase, during which the 
congestion window converges toward a target congestion window representing 
an estimate of the congestion window corresponding to the path capacity. 
The Drain phase reduces excess in-flight data accumulated during slow start 
and allows the sender to converge toward the path capacity before exiting 
slow start.</t>

<t>One challenge in monitoring sent and 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 with sent bytes
during an earlier RTT. A temporary decrease in latency can make the
delivered bytes appear lower relative to previously sent bytes, falsely
suggesting that the congestion point has been reached when it has not.</t>

<t>To counteract link latency variability, SEARCH tracks sent and 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 sent and 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-3, upon initialization of a TCP connetion, the SEARCH
window (W) is set based on the initial round trip time (init_rtt), and
the sent and delivery histories are cleared.</t>

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

<t>Line 5 checks whether SEARCH is currently in the Drain phase. If SEARCH 
is not in the Drain phase, line 6 computes the number of bytes
delivered in the current SEARCH window, using history to tally the 
delivered bytes from the current time (now) to now minus W. Line 7 
computes the number of bytes sent for the previous rtt i.e,. from 
now minus an rtt to now minus an rtt minus W.</t>

<t>Line 8 computes the difference between the  previous sent bytes and
the current delivered bytes. Line 9 normalizes this difference since
it is the relative deviation between delivered and expected sent bytes
that indicates the congestion point has been reached. Line 10 compares
this normalized difference (norm_diff) to the SEARCH threshold
(THRESH), and if this threshold has been surpassed, line 11 estimates 
the target congestion window (target_cwnd) and line 12 transitions SEARCH 
to the Drain phase.
If SEARCH is already in the Drain phase, line 14 adjusts the congestion 
window toward target_cwnd. Lines 15-18 check whether the congestion window 
has reached target_cwnd; if so, SEARCH sets ssthresh to cwnd and exits 
slow start.</t>

<t>SEARCH ALGORITHM OVERVIEW</t>

<figure><artwork><![CDATA[
upon TCP connection:

1:  W = 3.5 * init_rtt  // SEARCH window size
2:  hist_sent[] = {}   // Array holding sent history
3:  hist_delv[] = {}  // Array holding delivery history  

on ACK arrived (sequence_num, rtt):

    // Update history.
4:  update_hist(hist_delv, hist_sent, sequence_num)

    // If not in Drain phase, evaluate the SEARCH signal
5:  if (not in_drain_phase) then
      // Compute delivered and sent windows.
6:    curr_delv = compute_delv(hist_delv, now - W, now)
7:    prev_sent = compute_sent(hist_sent, now - W - rtt, now - rtt)

      // Compute delivered progree to expected sent baseline
8:    diff = prev_sent - curr_delv
9:    norm_diff = diff / prev_sent
10:   if (norm_diff >= THRESH) then
11:     target_cwnd = estimate_capacity()
12:        enter_drain_phase()
13:   end if

    // If in Drain phase, converge toward target_cwnd
14: else  
15:   update_cwnd_toward(target_cwnd)
16:   if (cwnd <= target_cwnd) then
17:     ssthresh = cwnd
18:     exit_slow_start()
19:   end if
20: 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 sent and delivery history information from the TCP ACKs is binned,
aggregating sent and 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 sent window for the previous round-trip time).
In addition, the total memory footprint used by the bins is managed
via bit shifting, decreasing the byte values stored when they get too 
large.</t>

<t>The parameters in CAPS (lines 1-9) 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 10-17) are set once, upon
establishment of a TCP connection.</t>

<t>The variable *now* on lines 19 and 42 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 18) are obtained upon arrival of an acknowledgement from the
receiver.</t>

<t>The variable *cwnd* on lines 36, 37 and 88 is the current congestion
window.</t>

<t>Lines 1-9 set the predefined parameters for the SEARCH algorithm.  The
window size (WINDOW_SIZE) is 3.5 times the initial RTT.The
delivered bytes and sent bytes over a window are approximated using 10 
(W) bins, with an additional 15 (EXTRA_BINS) bins used to mentain sent
history so that sent data from approximately one RTT earlier can
be compared to the current delivered data. The bin duration (BIN_DURATION)
is the window size divided by the number of bins.  The threshold (THRESH)
is set to 0.26, and is the upper bound of the permissible difference between
the previously sent bytes and the current delivered bytes (normalized) above
which detect congestion point.
The maxium value for each (MAX_BIN_VALUE) can be less than largest TCP
sequence number. The parameter DRAIN_ACKEDSEG_THRESH controls how many 
acknowledged segments must be observed before the congestion window is 
incremented during the Drain phase.</t>

<t>Lines 10-17 do one-time initialization of search variables when a TCP
connection is established.  By setting the bin 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 19 and, if the bin boundary is passed, the
bin statistics are updated in the call to update_bins() on line 20.</t>

<t>In update_bins() (lines 42-69), 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 42 computes how many bins have been passed.</t>

<t>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 43-46.  Line 47 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 48 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 49-67, 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 lines 49 and 50 the
sequence number is first scaled by the scale factor (initially set to
0). On line 51, the larger of the two scaled values is used to 
determine whether either value exceeds the maximum value a bin can hold
(MAX_BIN_VALUE, set to the largest u16 by default). If the maximum 
scaled value is too large, then lines 52-57 shift (scale) the value 
until it fits. In lines 58-63, all previously stored delivered and sent
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
factor (scale_factor) is updated in line 64. Lastly, in lines 65 and 66,
the current delivered and sent values are shifted by the same additional
amount, and on lines 68 and 69 the most recent bin values are stored.</t>

<t>Once the bins are updated, lines 21-23 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 sent bins
there.</t>

<t>If there are enough bins to run SEARCH, lines 24-26 compute the current
delivered bytes and the sent bytes from one RTT earlier. The delivered 
bytes over the window is computed in the function compute_delv() and
the sent bytes over the window is computed in the function compute_sent(). 
For sent bytes, shifting by an RTT may land between bin boundaries, so 
the computation is interpolated by the fraction on either side, computed 
on line 25.</t>

<t>Lines 70-72 compute the delivered bytes over the delivered bins by
taking the difference between the cumulative delivered values at the
two bin boundaries and returning this difference. Lines 73-77 compute
the sent bytes over the sent bins. Since shifting the sent window by
approximately one RTT may land between bin boundaries, first by taking
the &quot;upper&quot; sent window (which is 0, if fraction is 0), then
adding the &quot;lower&quot; sent window, and finally returning this sum.</t>

<t>Once computed, the difference between the previously sent bytes 
(prev_sent) and the current delivered bytes (curr_delv) is normalized
(line 27) and then compared to the threshold (THRESH) in line 28. If this
difference exceeds THRESH, SEARCH detects that the congestion point
has been reached. SEARCH then estimates a target congestion window
(target_cwnd) and enters the Drain phase in line 29 and 30.</t>

<t>During the Drain phase (lines 34-41), the congestion window gradually
converges toward the target congestion window using the function
update_cwnd_toward(). In this function (lines 83-88), the current
in-flight data is first measured (line 83). The number of segments
acknowledged by the current ACK is accumulated in drain_ackedseg
(line 84). Once a sufficient number of segments have been acknowledged
(controlled by DRAIN_ACKEDSEG_THRESH), the variable adds determines
how many congestion window increments are permitted (line 85), and the
remaining acknowledged segments are retained for future updates
(line 86). A new congestion window value is then computed based on the
current in-flight data and the allowed increments (line 87). Finally,
the congestion window is updated to the larger of this value or the
target congestion window (line 88), ensuring that the congestion window
does not fall below the estimated capacity.</t>

<t>Once the congestion window reaches the target value, slow start exits 
by setting ssthresh to cwnd and resetting the SEARCH state using 
reset_search() (lines 36-40). The reset_search() function (lines 89-94) 
resets the SEARCH state  variables. 
The current bin index (curr_idx) and scaling factor  (scale_factor) are 
cleared, the bin boundary (bin_end) is reset, and the Drain phase state 
variables (target_cwnd, in_drain, and drain_ackedseg) are reinitialized. 
This ensures that SEARCH restarts its measurements using fresh history 
when the algorithm is reset.</t>

<t>SEARCH 3.2 ALGORITHM</t>

<figure><artwork><![CDATA[
Parameters:
1: WINDOW_SIZE = INITIAL_RTT x 3.5
2: W = 10
3: EXTRA_BINS = 15
4: NUM_ACKED_BINS = W + 1
5: NUM_SENT_BINS = W + EXTRA_BINS
6: BIN_DURATION = WINDOW_SIZE / W
7: THRESH = 0.26
8: MAX_BIN_VALUE = 0xFFFF  // 16-bit
9: DRAIN_ACKEDSEG_THRESH = 3

Initialization():
10: acked_bin[NUM_ACKED_BINS] = {}
11: sent_bin[NUM_SENT_BINS] = {}
12: curr_idx = -1
13: bin_end = 0
14: scale_factor = 0
15: in_drain = false
16: target_cwnd = 0
17: drain_ackedseg = 0

ACK_arrived(sequence_num, rtt):
    // If not in Drain phase, run SEARCH detection.
18: if (in_drain == false) then
      // Check if passed bin boundary.
19:   if (*now* > bin_end) then
20:     update_bins()

        // Check if enough data for SEARCH.
21:     prev_idx = curr_idx - (rtt / BIN_DURATION)
22:     if (prev_idx > W) and
23:        (curr_idx - prev_idx) < EXTRA_BINS then

          // Run SEARCH check.
24:       curr_delv = compute_delv(curr_idx - W, curr_idx)
25:       frac = (rtt mod BIN_DURATION) / BIN_DURATION
26:       prev_sent = compute_sent(prev_idx - W, prev_idx, frac)
27:       norm_diff = (prev_sent - curr_delv) / prev_sent
28:       if (norm_diff >= THRESH) then
29:         target_cwnd = estimate_target_cwnd()
30:         in_drain = true
31:       end if
32:     end if // Enough data for SEARCH.
33:   end if // Passed bin boundary.

    // If in Drain phase, converge toward target_cwnd.
34: else
35:   update_cwnd_toward(target_cwnd)
36:   if (cwnd <= target_cwnd) then
37:     ssthresh = cwnd
38:     exit_slow_start()
39:     reset_search()
40:   end if
41: 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():
42: passed_bins = (*now* - bin_end) / BIN_DURATION + 1

  // For remaining skipped, propagate prev bin value.
43: for i = curr_idx+1 to (curr_idx + passed_bins - 1)
44:   acked_bin[i mod NUM_ACKED_BINS] = acked_bin[curr_idx]
45:   sent_bin[i mod NUM_SENT_BINS] = sent_bin[curr_idx]
46: end for

47: curr_idx += passed_bins
48: bin_end += passed_bins x BIN_DURATION

    // Scale bins (shift) if too large.
49: acked_value = delivered_bytes >> scale_factor
50: sent_value = sent_bytes >> scale_factor
51: max_value = max(acked_value, sent_value)

52: if (max_value > MAX_BIN_VALUE) then
53:   shift_amount = 0
54:   while (max_value > MAX_BIN_VALUE)
55:     shift_amount += 1
56:     max_value >>= 1
57:   end while
58:   for i = 0 to NUM_ACKED_BINS
59:     acked_bin[i] >>= shift_amount
60:   end for
61:   for i = 0 to NUM_SENT_BINS
62:     sent_bin[i] >>= shift_amount
63:   end for
64:   scale_factor += shift_amount
65:   acked_value >>= shift_amount
66:   sent_value >>= shift_amount
67: end if

68: acked_bin[curr_idx mod NUM_ACKED_BINS] = acked_value
69: sent_bin[curr_idx mod NUM_SENT_BINS] = sent_value

// Compute delivered bytes over bins, interpolating a fraction of each
// bin on the ends (default is 0).
compute_delv(idx1, idx2):
70: delv = acked_bin[idx2 mod NUM_ACKED_BINS] -
71:        acked_bin[idx1 mod NUM_ACKED_BINS]
72: return delv

compute_sent(idx1, idx2, frac = 0):
73: sent = (sent_bin[idx2+1 mod NUM_SENT_BINS] -
74:         sent_bin[idx1+1 mod NUM_SENT_BINS]) x frac
75: sent += (sent_bin[idx2 mod NUM_SENT_BINS] -
76:          sent_bin[idx1 mod NUM_SENT_BINS]) x (1-frac)
77: return sent

estimate_target_cwnd():
78: rtt_bins = ceil(INITIAL_RTT / BIN_DURATION)
79: cong_idx = curr_idx - rtt_bins
80: target_cwnd = compute_delv(cong_idx, curr_idx) << scale_factor
81: target_cwnd = max(target_cwnd, INIT_CWND)
82: return target_cwnd

update_cwnd_toward(target_cwnd):
83: inflight = bytes_in_flight()
84: drain_ackedseg += bytes_this_ack / MSS
85: adds = drain_ackedseg / DRAIN_ACKEDSEG_THRESH
86: drain_ackedseg = drain_ackedseg mod DRAIN_ACKEDSEG_THRESH
87: new_cwnd = inflight + adds x MSS
88: cwnd = max(new_cwnd, target_cwnd)

// Reset SEARCH parameters.
reset_search():
89: curr_idx = -1
90: scale_factor = 0
91: bin_end = 0
92: target_cwnd = 0
93: in_drain = false
94: drain_ackedseg = 0
]]></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 sent during a previous RTT window
is great enough for SEARCH to detect that the congestion point has 
been reached and to transition to the Drain 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 sent bytes (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 sent bytes
(prev_sent), 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.26 threshold value chosen does this and can be detected
with 1 RTTs of reaching capacity.</t>

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

<t>Dividing the sent and delivered byte histories into bins reduces the
server&#39;s memory load by aggregating data into manageable segments
instead of tracking each packet. SEARCH maintains separate bins for
acknowledged (delivered) bytes and sent bytes. The delivered bins
cover the most recent window of size W, while the sent bins include
additional bins so that the sent window from approximately one RTT
earlier can be reconstructed for comparison with the current delivered
window. However, more bins provide more fidelity to the actual sent and
delivered byte totals and allow SEARCH to make decisions (i.e.,
compute if it has reached the congestion point) 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 detect the congestion point in a timely fashion.</t>

<t>Using a window size of 3.5x the initial RTT and a threshold of 0.26,
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="drain-phase-parameter-drainackedsegthresh"><name>Drain Phase Parameter (DRAIN_ACKEDSEG_THRESH)</name>

<t>During the Drain phase, SEARCH gradually converges the congestion
window toward the estimated capacity. Rather than adjusting the
congestion window abruptly, SEARCH increases the window in controlled
increments based on the number of acknowledged segments.</t>

<t>The parameter DRAIN_ACKEDSEG_THRESH determines how many acknowledged
segments must be observed before an increment to the congestion window
is applied. This mechanism prevents abrupt congestion window changes
while allowing the sender to smoothly converge toward the estimated
capacity. A default value of 3 provides a balance between responsiveness
and stability.</t>

</section>
<section anchor="handling-missed-bins-optional"><name>Handling Missed Bins (Optional)</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 may not observe 
the expected growth of delivered bytes relative to previously sent 
bytes, even though this lack of growth is probably not due to congestion 
on the forward link. As a result, the byte data stored in the bins that 
is used as the congestion signal may no longer accurately reflect the 
network state.</t>

<t>An implementation MAY choose to reset the SEARCH state if more than
about some RTTs worth of bins are missed. One possible implementation
is shown below. In this approach, if the number of skipped bins exceeds
a limit derived from the RTT and bin duration, the SEARCH variables are
reset using reset_search().</t>

<figure><artwork><![CDATA[
MISSED_BIN_LIMIT = alpha x (INITIAL_RTT / BIN_DURATION)
if (passed_bins > MISSED_BIN_LIMIT) then
    reset_search()
end if
]]></artwork></figure>

<t>E.g, a value for alpha is 2, representing approximately two RTTs
worth of bins; implementations may tune this value depending
on their environment.</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 sent 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 8), 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 58-63, but in practice, there is typically only one shift or at
most two.</t>

</section>
<section anchor="estimating-sent-bytes-from-delivered-bytes-optional"><name>Estimating Sent Bytes from Delivered Bytes (Optional)</name>

<t>Implementations MAY approximate the expected sent bytes based on the
observation that during the slow start phase, the delivered bytes
approximately double each RTT until the congestion point is reached.
In this case, the expected sent bytes can be estimated by doubling the
delivered bytes measured approximately one RTT earlier. Implementations 
that can efficiently maintain a sent-bytes history SHOULD instead use the 
sent bytes from an earlier RTT. This approach remains applicable even when 
slow start does not strictly follow a doubling pattern (e.g., due to pacing, 
ACK thinning, or stack-specific slow-start behaviors). Implementations that 
cannot efficiently maintain a sent-bytes history MAY use the delivered-byte 
approximation, which reduces per-flow state but relies on the doubling 
assumption.</t>

<t>In term of using the delivered-byte approximation, if the sending rate 
for a TCP flow is limited by the application and not by the congestion 
window, then the delivery rate may not reflect the actual available 
network capacity during slow start.  In such cases, the delivered bytes 
may not grow proportionally relative to previously sent bytes, even though 
the path may not yet be congested. As a result, implementations that rely 
on the delivered-byte approximation MAY use is_app_limited() as a query to 
the TCP stack and reset SEARCH state when the flow becomes application-limited.</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"/>.</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="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 1000?>

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

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

</section>


  </back>

<!-- ##markdown-source:
H4sIAHLEtWkAA+V9e3MbyZHn//Up6uS4MDADQAD4pi2dORQ14lqvJSnTPq+D
1wAKZFtAN9zdEAVP2LFf477efZLLX2a9utHgyI7Y2Ng7xsSI7O56ZeU7s7L6
/b6q0mphTvX1xdnV+Rvd7+tEvzeP+nqR0/+qpKj02eI+L9LqYanneaFvzj/q
JJvpf/10ea5VMpkU5supLk1STB+0muXTLFlSf7MimVf96cM6u+9Pp4/3ffmi
PzxWs6SiD8bD8WF/uNcfHSj1C11W1OddssgzelUVa6NUuir417IaD4cnw7FK
CpOc6lsz4fEvs8oUman0TZFk5SovKvV4f6oxlvr8eOrf919hJmqaVDTLaqbK
irpZ0vuLm9dKTfNZmlGzddlPymmaqlV6qunnF3qaZPTU6KQoko3upHOdLBZ6
Y8quJig8JOWDfjCFobnrvq7yqfxS0jwKMy/tX5sl/6HxwSka06/uk1MeZmbm
yXpRlfSFey+N5HOVrKuHvDhVmn/69l+t04y++JeBPgeEtX8swP+XxOjbPJOX
/l1e0EJ/lyZlUhF0pv6528Mv/Mo/BqAMAW1vONTv0+lnU5TU5dWsp38xGg79
Z9O02pzqd0mxmORFvr5/6Ol3Z+FtPqP5DEdHB+Po2TqrCmr0KUsrMwOWVabU
+VyfLU2RThP/pVkm6eJU/zkxj3k2YGT6jcxyMM2X7TB5N9C/TaYPeW7SBlRo
jptkqc+qxKTb3zB0bvNiakpCHP0xX2wqM33I0ikBqyQqWVdmC2S3Hy+34EXA
CS0IXg1I+SFa4XQ4PPl2OOkmoJYJ1vbZLu03j6t0YGbrdji9Hui3TQi9NoRL
b9P/+hgzp4UMFum3IMv5Itms8nyxjSyft9/9v4AkU7uo30zLgcMQleUFIU/6
xZyCc1lY6WI+HY9GJ41HB+PxYfPR4fGo8ejoZB8bePX6HF2cyq9o6n6lJvZX
fHpKDD+bh1lo/dvzt+N9YXxWRj27XK6K/AsxbJZCkYj6aApum00Nbay+TQuz
MGVJkqx6zIvPpX4k+WVl3DPuss5X/zOYyH8EL2+j8WaHlsj1rr78i76u9/bD
gOBMyyqbPf5gsj8nS4K7vP7ZSepvXHlOMrZl2W/NV0KBimFSpARVktRn02Rm
lhu9ez//Y+i8JBozJTCX0PPmwZBacXGBlosZaNAhIpFxPkkXhjWXdyTv06WZ
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

-->

</rfc>

