<?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-09" 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="17"/>

    <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 sending
rate surpasses the network 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 draining 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 4. 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-definitions"><name>Terminology and Definitions</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 
 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
based on an estimate of the congestion window at the paths&#39; available
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 sent
and 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-overview"><name>Algorithm Overview</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 connection, the SEARCH
window (W) is set based on the initial round trip time (init_rtt), and
the sent and delivery histories are cleared (hist_sent[] and
hist_devl[], respectively)</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 sequence
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 the delivered byte
history to tally the delivered bytes from the now (the current time) to
the 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.</t>

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

      // Compare sent to delivered, normalized
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
and sent bytes over a window are approximated using 10 (W) bins, with
an additional 15 (EXTRA_BINS) bins used to maintain 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)
defaults 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 maximum value
for each bin (MAX_BIN_VALUE) that must be less than largest TCP
sequence number. The DRAIN_RATE 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.  With a bin boundary (bin_end) of 0
initially, 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 reduced (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 in a similar fashion, but since
shifting the sent window by approximately one RTT may land between bin
boundaries, first the &quot;upper&quot; sent window is computed (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) in estimate_target_cwnd() and enters the drain
phase in line 29 and 30.</t>

<t>In estimate_target_cwnd() (lines 78-82), line 78 computes the number
of bins crossed for the past RTT (rtt_bins), and line 79 sets the
corresponding index (cong_idx). Line 80 computes the target congestion
window (target_cwnd) based on the delivered bytes over the last RTT
(the current bin index, curr_idx, minus cong_idx). Line 81 makes sure
this window is not smaller than the initial congestion window
(INIT_CWND). Line 82 returns this value.</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_acks (line
84). Once a sufficient number of segments have been acknowledged
(controlled by DRAIN_RATE), the variable determines how many
congestion window increments are permitted (adds, 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_acks) are reinitialized.  This
ensures that SEARCH restarts its measurements using fresh history when
the algorithm is reset.</t>

<t>SEARCH 4.0 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_RATE = 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_acks = 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_acks += bytes_this_ack / MSS
85: adds = drain_acks / DRAIN_RATE
86: drain_acks = drain_acks mod DRAIN_RATE
87: new_cwnd = inflight + adds * 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_acks = 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-drainrate"><name>Drain Phase Parameter (DRAIN_RATE)</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_RATE 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="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="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="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 1014?>

<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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
U1/8/P8C4KlssU2iAAA=

-->

</rfc>

