<?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-10" 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="September" day="04"/>

    <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 mod NUM_ACKED_BINS]
45:   sent_bin[i mod NUM_SENT_BINS] = sent_bin[curr_idx mod NUM_SENT_BINS]
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
within 1.5 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 <em>rate_app_limited</em> 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, implementations of SEARCH have been
publicly released for Linux, QUIC, and FreeBSD. For the different
versions, see:</t>

<t><eref target="https://search-ss.wpi.edu/">https://search-ss.wpi.edu/</eref></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 987?>

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

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

</section>


  </back>

<!-- ##markdown-source:
H4sIAEImm2oAA+V9e3PbSJLn//Up6jxxMWQ3SZPUWzPdsWpZbmvXr7Xk0ezN
TuhAEpQwJgEOAFrWdszGfY37evdJLn+ZWQ+AkNu7ERsbe+dw2BKAemXlO7Oy
hsOhqbN6lZ7aq4uzD+ev7HBoE/s2fbBXq4L+qZOytmeru6LM6vu1XRalvT5/
b5N8Yf/x4+W5NclsVqafT22VJuX83ppFMc+TNfW3KJNlPZzfb/O74Xz+cDeU
L4aTsVkkNX0wHU8Ph+OT4XjfmN/YqqY+b5NVkdOrutymxmSbkn+s6ul4fDKe
mqRMk1N7k854/Mu8Tss8re11meTVpihr83B3ajGW+fRw6t8PX2AmZp7UNMt6
YaqaulnT+4vrl8bMi0WWU7NtNUyqeZaZTXZq6c9v7DzJ6Wlqk7JMHm0vW9pk
tbKPadW3BIX7pLq392mZ0tzt0NbFXH6oaB5luqz0t8c1/2LxwSka04/uk1Me
ZpEuk+2qrugL914ayecm2db3RXlqLP8Z6v/WZjl98fcjew4IW/9YgP/3SWpv
ilxe+ndFSQv9Q5ZUSU3Qmfvnbg8/8yv/GIBKCWh747F9m80/pWVFXX5YDOxv
JuOx/2ye1Y+n9k1SrmZFWWzv7gf2zVl4WyxoPuPJ0cE0erbN65IafcyzOl0A
y+q0ssXSnq3TMpsn/st0nWSrU/uXJH0o8hEj09/JLEfzYt0Nkzcj+w/J/L4o
0qwFFZrjY7K2Z3WSZrvfMHRuinKeVoQ49n2xeqzT+X2ezQlYFVHJtk53QHbz
/nIHXgSc0ILg1YKUH6ITTofjk2+Hk20Dap1gbZ90aX/3sMlG6WLbDaeXI/u6
DaGXKeHS6+y/PsYsaSGjVfYtyHK+Sh43RbHaRZZPu+/+X0CSuS7q7+bVyGGI
yYuSkCf7nJ6CcymsbLmcTyeTk9ajg+n0sP3o8HjSenR0so8N/PDyHF2cyo9o
6n6kJvojPj0lhp8vwyys/Yfz19N9YXwqo55drjdl8ZkYNkuhSES9T0tum89T
2lh7k5XpKq0qkmT1Q1F+quwDyS+Vcc+4yyZf/c9gIv8RvLyLxtsdKpHbp/ry
L4a22dtPI4IzLatq9/hTmv8lWRPc5fWvTtJ+48oLkrEdy36dfiEUqBkmZUZQ
JUl9Nk8W6frRPr2f/zF0XhGNpRUwl9Dz+j4lteLiAi1XC9CgQ0Qi42KWrVLW
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
xYGjshlAo//Y1Rc//78oPKzt/aAAAA==

-->

</rfc>

