summaryrefslogtreecommitdiff
path: root/doc/rfc/rfc5348.txt
diff options
context:
space:
mode:
Diffstat (limited to 'doc/rfc/rfc5348.txt')
-rw-r--r--doc/rfc/rfc5348.txt3251
1 files changed, 3251 insertions, 0 deletions
diff --git a/doc/rfc/rfc5348.txt b/doc/rfc/rfc5348.txt
new file mode 100644
index 0000000..78a1f99
--- /dev/null
+++ b/doc/rfc/rfc5348.txt
@@ -0,0 +1,3251 @@
+
+
+
+
+
+
+Network Working Group S. Floyd
+Request for Comments: 5348 ICIR
+Obsoletes: 3448 M. Handley
+Updates: 4342 University College London
+ J. Padhye
+ Microsoft
+ J. Widmer
+ DoCoMo
+ September 2008
+
+
+ TCP Friendly Rate Control (TFRC): Protocol Specification
+
+Status of This Memo
+
+ This document specifies an Internet standards track protocol for the
+ Internet community, and requests discussion and suggestions for
+ improvements. Please refer to the current edition of the "Internet
+ Official Protocol Standards" (STD 1) for the standardization state
+ and status of this protocol. Distribution of this memo is unlimited.
+
+Abstract
+
+ This document specifies TCP Friendly Rate Control (TFRC). TFRC is a
+ congestion control mechanism for unicast flows operating in a best-
+ effort Internet environment. It is reasonably fair when competing
+ for bandwidth with TCP flows, but has a much lower variation of
+ throughput over time compared with TCP, making it more suitable for
+ applications such as streaming media where a relatively smooth
+ sending rate is of importance.
+
+ This document obsoletes RFC 3448 and updates RFC 4342.
+
+Table of Contents
+
+1. Introduction ....................................................3
+2. Conventions .....................................................4
+3. Protocol Mechanism ..............................................4
+ 3.1. TCP Throughput Equation ....................................5
+ 3.2. Packet Contents ............................................7
+ 3.2.1. Data Packets ........................................7
+ 3.2.2. Feedback Packets ....................................8
+4. Data Sender Protocol ............................................8
+ 4.1. Measuring the Segment Size .................................9
+ 4.2. Sender Initialization .....................................10
+ 4.3. Sender Behavior When a Feedback Packet Is Received ........10
+ 4.4. Expiration of Nofeedback Timer ............................15
+ 4.5. Reducing Oscillations .....................................17
+
+
+
+Floyd, et al. Standards Track [Page 1]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ 4.6. Scheduling of Packet Transmissions ........................18
+5. Calculation of the Loss Event Rate (p) .........................19
+ 5.1. Detection of Lost or Marked Packets .......................19
+ 5.2. Translation from Loss History to Loss Events ..............20
+ 5.3. The Size of a Loss Interval ...............................22
+ 5.4. Average Loss Interval .....................................22
+ 5.5. History Discounting .......................................24
+6. Data Receiver Protocol .........................................26
+ 6.1. Receiver Behavior When a Data Packet Is Received ..........27
+ 6.2. Expiration of Feedback Timer ..............................27
+ 6.3. Receiver Initialization ...................................28
+ 6.3.1. Initializing the Loss History after the
+ First Loss Event ...................................29
+7. Sender-Based Variants ..........................................30
+8. Implementation Issues ..........................................31
+ 8.1. Computing the Throughput Equation .........................31
+ 8.2. Sender Behavior When a Feedback Packet Is Received ........32
+ 8.2.1. Determining If an Interval Was a
+ Data-Limited Interval ..............................32
+ 8.2.2. Maintaining X_recv_set .............................34
+ 8.3. Sending Packets before Their Nominal Send Time ............34
+ 8.4. Calculation of the Average Loss Interval ..................36
+ 8.5. The Optional History Discounting Mechanism ................36
+9. Changes from RFC 3448 ..........................................36
+ 9.1. Overview of Changes .......................................36
+ 9.2. Changes in Each Section ...................................37
+10. Security Considerations .......................................39
+ 10.1. Security Considerations for TFRC in DCCP .................40
+11. Acknowledgments ...............................................40
+Appendix A. Terminology ...........................................41
+Appendix B. The Initial Value of the Nofeedback Timer .............43
+Appendix C. Response to Idle or Data-Limited Periods ..............44
+ C.1. Long Idle or Data-Limited Periods ........................45
+ C.2. Short Idle or Data-Limited Periods .......................48
+ C.3. Moderate Idle or Data-Limited Periods ....................49
+ C.4. Losses During Data-Limited Periods .......................50
+ C.5. Other Patterns ...........................................53
+ C.6. Evaluating TFRC's Response to Idle Periods ...............53
+References ........................................................54
+ Normative References ...........................................54
+ Informative References .........................................54
+
+
+
+
+
+
+
+
+
+
+Floyd, et al. Standards Track [Page 2]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+1. Introduction
+
+ This document specifies TCP Friendly Rate Control (TFRC). TFRC is a
+ congestion control mechanism designed for unicast flows operating in
+ an Internet environment and competing with TCP traffic [FHPW00].
+ Instead of specifying a complete protocol, this document simply
+ specifies a congestion control mechanism that could be used in a
+ transport protocol such as DCCP (Datagram Congestion Control
+ Protocol) [RFC4340], in an application incorporating end-to-end
+ congestion control at the application level, or in the context of
+ endpoint congestion management [BRS99]. This document does not
+ discuss packet formats or reliability. Implementation-related issues
+ are discussed only briefly, in Section 8.
+
+ TFRC is designed to be reasonably fair when competing for bandwidth
+ with TCP flows, where we call a flow "reasonably fair" if its sending
+ rate is generally within a factor of two of the sending rate of a TCP
+ flow under the same conditions. However, TFRC has a much lower
+ variation of throughput over time compared with TCP, which makes it
+ more suitable for applications such as telephony or streaming media
+ where a relatively smooth sending rate is of importance.
+
+ The penalty of having smoother throughput than TCP while competing
+ fairly for bandwidth is that TFRC responds slower than TCP to changes
+ in available bandwidth. Thus, TFRC should only be used when the
+ application has a requirement for smooth throughput, in particular,
+ avoiding TCP's halving of the sending rate in response to a single
+ packet drop. For applications that simply need to transfer as much
+ data as possible in as short a time as possible, we recommend using
+ TCP, or if reliability is not required, using an Additive-Increase,
+ Multiplicative-Decrease (AIMD) congestion control scheme with similar
+ parameters to those used by TCP.
+
+ TFRC is designed for best performance with applications that use a
+ fixed segment size, and vary their sending rate in packets per second
+ in response to congestion. TFRC can also be used, perhaps with less
+ optimal performance, with applications that do not have a fixed
+ segment size, but where the segment size varies according to the
+ needs of the application (e.g., video applications).
+
+ Some applications (e.g., some audio applications) require a fixed
+ interval of time between packets and vary their segment size instead
+ of their packet rate in response to congestion. The congestion
+ control mechanism in this document is not designed for those
+ applications; TFRC-SP (Small-Packet TFRC) is a variant of TFRC for
+ applications that have a fixed sending rate in packets per second but
+ either use small packets or vary their packet size in response to
+ congestion. TFRC-SP is specified in a separate document [RFC4828].
+
+
+
+Floyd, et al. Standards Track [Page 3]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ This document specifies TFRC as a receiver-based mechanism, with the
+ calculation of the congestion control information (i.e., the loss
+ event rate) in the data receiver rather in the data sender. This is
+ well-suited to an application where the sender is a large server
+ handling many concurrent connections, and the receiver has more
+ memory and CPU cycles available for computation. In addition, a
+ receiver-based mechanism is more suitable as a building block for
+ multicast congestion control. However, it is also possible to
+ implement TFRC in sender-based variants, as allowed in DCCP's
+ Congestion Control ID 3 (CCID 3) [RFC4342].
+
+ This document obsoletes RFC 3448. In the transport protocol DCCP
+ (Datagram Congestion Control Protocol) [RFC4340], the Congestion
+ Control ID Profiles CCID-3 [RFC4342] and CCID-4 [CCID-4] both specify
+ the use of TFRC from RFC 3448. CCID-3 and CCID-4 implementations
+ SHOULD use this document instead of RFC 3448 for the specification of
+ TFRC.
+
+ The normative specification of TFRC is in Sections 3-6. Section 7
+ discusses sender-based variants, Section 8 discusses implementation
+ issues, and Section 9 gives a non-normative overview of differences
+ with RFC 3448.
+
+2. Conventions
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+ Appendix A gives a list of technical terms used in this document.
+
+3. Protocol Mechanism
+
+ For its congestion control mechanism, TFRC directly uses a throughput
+ equation for the allowed sending rate as a function of the loss event
+ rate and round-trip time. In order to compete fairly with TCP, TFRC
+ uses the TCP throughput equation, which roughly describes TCP's
+ sending rate as a function of the loss event rate, round-trip time,
+ and segment size. We define a loss event as one or more lost or
+ marked packets from a window of data, where a marked packet refers to
+ a congestion indication from Explicit Congestion Notification (ECN)
+ [RFC3168].
+
+ Generally speaking, TFRC's congestion control mechanism works as
+ follows:
+
+ o The receiver measures the loss event rate and feeds this
+ information back to the sender.
+
+
+
+Floyd, et al. Standards Track [Page 4]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ o The sender also uses these feedback messages to measure the
+ round-trip time (RTT).
+
+ o The loss event rate and RTT are then fed into TFRC's throughput
+ equation, and the resulting sending rate is limited to at most
+ twice the receive rate to give the allowed transmit rate X.
+
+ o The sender then adjusts its transmit rate to match the allowed
+ transmit rate X.
+
+ The dynamics of TFRC are sensitive to how the measurements are
+ performed and applied. We recommend specific mechanisms below to
+ perform and apply these measurements. Other mechanisms are possible,
+ but it is important to understand how the interactions between
+ mechanisms affect the dynamics of TFRC.
+
+3.1. TCP Throughput Equation
+
+ Any realistic equation giving TCP throughput as a function of loss
+ event rate and RTT should be suitable for use in TFRC. However, we
+ note that the TCP throughput equation used must reflect TCP's
+ retransmit timeout behavior, as this dominates TCP throughput at
+ higher loss rates. We also note that the assumptions implicit in the
+ throughput equation about the loss event rate parameter have to be a
+ reasonable match to how the loss rate or loss event rate is actually
+ measured. While this match is not perfect for the throughput
+ equation and loss rate measurement mechanisms given below, in
+ practice the assumptions turn out to be close enough.
+
+ The throughput equation currently REQUIRED for TFRC is a slightly
+ simplified version of the throughput equation for Reno TCP from
+ [PFTK98]. Ideally, we would prefer a throughput equation based on
+ selective acknowledgment (SACK) TCP, but no one has yet derived the
+ throughput equation for SACK TCP, and simulations and experiments
+ suggest that the differences between the two equations would be
+ relatively minor [FF99] (Appendix B).
+
+ The throughput equation for X_Bps, TCP's average sending rate in
+ bytes per second, is:
+
+ s
+ X_Bps = ----------------------------------------------------------
+ R*sqrt(2*b*p/3) + (t_RTO * (3*sqrt(3*b*p/8)*p*(1+32*p^2)))
+
+ Where:
+
+ X_Bps is TCP's average transmit rate in bytes per second. (X_Bps
+ is the same as X_calc in RFC 3448.)
+
+
+
+Floyd, et al. Standards Track [Page 5]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ s is the segment size in bytes (excluding IP and transport
+ protocol headers).
+
+ R is the round-trip time in seconds.
+
+ p is the loss event rate, between 0 and 1.0, of the number of loss
+ events as a fraction of the number of packets transmitted.
+
+ t_RTO is the TCP retransmission timeout value in seconds.
+
+ b is the maximum number of packets acknowledged by a single TCP
+ acknowledgement.
+
+ Setting the TCP retransmission timeout value t_RTO:
+ Implementations SHOULD set t_RTO = 4*R. Implementations MAY choose
+ to implement a more accurate calculation of t_RTO. Implementations
+ MAY also set t_RTO to max(4*R, one second), to match the recommended
+ minimum of one second on the RTO [RFC2988].
+
+ Setting the parameter b for delayed acknowledgements:
+ Some current TCP connections use delayed acknowledgements, sending an
+ acknowledgement for every two data packets received. However, TCP is
+ also allowed to send an acknowledgement for every data packet. For
+ the revised TCP congestion control mechanisms, [RFC2581bis] currently
+ specifies that the delayed acknowledgement algorithm should be used
+ with TCP. However, [RFC2581bis] recommends increasing the congestion
+ window during congestion avoidance by one segment per RTT even in the
+ face of delayed acknowledgements, consistent with a TCP throughput
+ equation with b = 1. On an experimental basis, [RFC2581bis] allows
+ for increases of the congestion window during slow-start that are
+ also consistent with a TCP throughput equation with b = 1. Thus, the
+ use of b = 1 is consistent with [RFC2581bis]. The use of b = 1 is
+ RECOMMENDED.
+
+ With t_RTO=4*R and b=1, the throughput equation for X_Bps, the TCP
+ sending rate in bytes per second, can be simplified as:
+
+ s
+ X_Bps = -----------------------------------------------
+ R * (sqrt(2*p/3) + 12*sqrt(3*p/8)*p*(1+32*p^2))
+
+ In the future, updates to this document could specify different TCP
+ equations to be substituted for this equation. The requirement is
+ that the throughput equation be a reasonable approximation of the
+ sending rate of TCP for conformant TCP congestion control.
+
+
+
+
+
+
+Floyd, et al. Standards Track [Page 6]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ The throughput equation can also be expressed in terms of X_pps, the
+ sending rate in packets per second, with
+
+ X_pps = X_Bps / s .
+
+ The parameters s (segment size), p (loss event rate), and R (RTT)
+ need to be measured or calculated by a TFRC implementation. The
+ measurement of s is specified in Section 4.1, the measurement of R is
+ specified in Section 4.3, and the measurement of p is specified in
+ Section 5. In the rest of this document, data rates are measured in
+ bytes per second unless otherwise specified.
+
+3.2. Packet Contents
+
+ Before specifying the sender and receiver functionality, we describe
+ the contents of the data packets sent by the sender and feedback
+ packets sent by the receiver. As TFRC will be used along with a
+ transport protocol, we do not specify packet formats, as these depend
+ on the details of the transport protocol used.
+
+3.2.1. Data Packets
+
+ Each data packet sent by the data sender contains the following
+ information:
+
+ o A sequence number. This number MUST be incremented by one for
+ each data packet transmitted. The field must be sufficiently
+ large that it does not wrap causing two different packets with
+ the same sequence number to be in the receiver's recent packet
+ history at the same time.
+
+ o A timestamp indicating when the packet is sent. We denote by
+ ts_i the timestamp of the packet with sequence number i. The
+ resolution of the timestamp SHOULD typically be measured in
+ milliseconds.
+
+ This timestamp is used by the receiver to determine which losses
+ belong to the same loss event. The timestamp is also echoed by
+ the receiver to enable the sender to estimate the round-trip
+ time, for senders that do not save timestamps of transmitted data
+ packets.
+
+ We note that, as an alternative to a timestamp incremented in
+ milliseconds, a "timestamp" that increments every quarter of a
+ round-trip time MAY be used for determining when losses belong to
+ the same loss event, in the context of a protocol where this is
+ understood by both sender and receiver and where the sender saves
+ the timestamps of transmitted data packets.
+
+
+
+Floyd, et al. Standards Track [Page 7]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ o The sender's current estimate of the round-trip time. The
+ estimate reported in packet i is denoted by R_i. The round-trip
+ time estimate is used by the receiver, along with the timestamp,
+ to determine when multiple losses belong to the same loss event.
+ The round-trip time estimate is also used by the receiver to
+ determine the interval to use for calculating the receive rate
+ and to determine when to send feedback packets.
+
+ If the sender sends a coarse-grained "timestamp" that increments
+ every quarter of a round-trip time, as discussed above, then the
+ sender is not required to send its current estimate of the round
+ trip time.
+
+3.2.2. Feedback Packets
+
+ Each feedback packet sent by the data receiver contains the following
+ information:
+
+ o The timestamp of the last data packet received. We denote this by
+ t_recvdata. If the last packet received at the receiver has
+ sequence number i, then t_recvdata = ts_i. This timestamp is
+ used by the sender to estimate the round-trip time, and is only
+ needed if the sender does not save the timestamps of transmitted
+ data packets.
+
+ o The amount of time elapsed between the receipt of the last data
+ packet at the receiver and the generation of this feedback
+ report. We denote this by t_delay.
+
+ o The rate at which the receiver estimates that data was received
+ in the previous round-trip time. We denote this by X_recv.
+
+ o The receiver's current estimate of the loss event rate p.
+
+4. Data Sender Protocol
+
+ The data sender sends a stream of data packets to the data receiver
+ at a controlled rate. When a feedback packet is received from the
+ data receiver, the data sender changes its sending rate based on the
+ information contained in the feedback report. If the sender does not
+ receive a feedback report for four round-trip times, then the sender
+ cuts its sending rate in half. This is achieved by means of a timer
+ called the nofeedback timer.
+
+
+
+
+
+
+
+
+Floyd, et al. Standards Track [Page 8]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ We specify the sender-side protocol in the following steps:
+
+ o Measurement of the mean segment size being sent.
+
+ o Sender initialization.
+
+ o The sender behavior when a feedback packet is received.
+
+ o The sender behavior when the nofeedback timer expires.
+
+ o Oscillation prevention (optional).
+
+ o Scheduling of packet transmission and allowed burstiness.
+
+4.1. Measuring the Segment Size
+
+ The TFRC sender uses the segment size, s, in the throughput equation,
+ in the setting of the maximum receive rate, the setting of the
+ minimum and initial sending rates, and the setting of the nofeedback
+ timer. The TFRC receiver MAY use the average segment size, s, in
+ initializing the loss history after the first loss event. As
+ specified in Section 6.3.1, if the TFRC receiver does not know the
+ segment size, s, used by the sender, the TFRC receiver MAY instead
+ use the arrival rate in packets per second in initializing the loss
+ history.
+
+ The segment size is normally known to an application. This may not
+ be so in two cases:
+
+ 1) The segment size naturally varies depending on the data. In this
+ case, although the segment size varies, that variation is not
+ coupled to the transmit rate. The TFRC sender can either compute
+ the average segment size or use the maximum segment size for the
+ segment size, s.
+
+ 2) The application needs to change the segment size rather than the
+ number of segments per second to perform congestion control.
+ This would normally be the case with packet audio applications
+ where a fixed interval of time needs to be represented by each
+ packet. Such applications need to have a completely different
+ way of measuring parameters.
+
+ For the first class of applications where the segment size varies
+ depending on the data, the sender SHOULD estimate the segment size,
+ s, as the average segment size over the last four loss intervals.
+ The sender MAY estimate the average segment size over longer time
+ intervals, if so desired.
+
+
+
+
+Floyd, et al. Standards Track [Page 9]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ The second class of applications are discussed separately in a
+ separate document on TFRC-SP [RFC4828]. For the remainder of this
+ section we assume the sender can estimate the segment size and that
+ congestion control is performed by adjusting the number of packets
+ sent per second.
+
+4.2. Sender Initialization
+
+ The initial values for X (the allowed sending rate in bytes per
+ second) and tld (the Time Last Doubled during slow-start, in seconds)
+ are undefined until they are set as described below. If the sender
+ is ready to send data when it does not yet have a round-trip sample,
+ the value of X is set to s bytes per second, for segment size s, the
+ nofeedback timer is set to expire after two seconds, and tld is set
+ to 0 (or to -1, either one is okay). Upon receiving the first
+ round-trip time measurement (e.g., after the first feedback packet or
+ the SYN exchange from the connection setup, or from a previous
+ connection [RFC2140]), tld is set to the current time, and the
+ allowed transmit rate, X, is set to the initial_rate, specified as
+ W_init/R, for W_init based on [RFC3390]:
+
+ initial_rate = W_init/R; W_init = min(4*MSS, max(2*MSS, 4380)).
+
+ In computing W_init, instead of using Maximum Segment Size (MSS), the
+ TFRC sender SHOULD use the maximum segment size to be used for the
+ initial round-trip time of data, if that is known by the TFRC sender
+ when X is initialized.
+
+ For responding to the initial feedback packet, this replaces step (4)
+ of Section 4.3 below.
+
+ Appendix B explains why the initial value of TFRC's nofeedback timer
+ is set to two seconds, instead of the recommended initial value of
+ three seconds for TCP's retransmit timer from [RFC2988].
+
+4.3. Sender Behavior When a Feedback Packet Is Received
+
+ The sender knows its current allowed sending rate, X, and maintains
+ an estimate of the current round-trip time R. The sender also
+ maintains X_recv_set as a small set of recent X_recv values
+ (typically only two values).
+
+ Initialization: X_recv_set is first initialized to contain a single
+ item, with value Infinity. (As an implementation-specific issue,
+ X_recv_set MAY be initialized to a large number instead of to
+ Infinity, e.g., to the largest integer that is easily representable.)
+
+
+
+
+
+Floyd, et al. Standards Track [Page 10]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ When a feedback packet is received by the sender at time t_now, the
+ current time in seconds, the following actions MUST be performed.
+
+ 1) Calculate a new round-trip sample:
+
+ R_sample = (t_now - t_recvdata) - t_delay.
+
+ As described in Section 3.2.2, t_delay gives the elapsed time at the
+ receiver.
+
+ 2) Update the round-trip time estimate:
+
+ If no feedback has been received before {
+ R = R_sample;
+ } Else {
+ R = q*R + (1-q)*R_sample;
+ }
+
+ TFRC is not sensitive to the precise value for the filter constant q,
+ but a default value of 0.9 is RECOMMENDED.
+
+ 3) Update the timeout interval:
+
+ RTO = max(4*R, 2*s/X)
+
+ 4) Update the allowed sending rate as follows. This procedure uses
+ the variables t_mbi and recv_limit:
+
+ t_mbi: the maximum backoff interval of 64 seconds.
+ recv_limit: the limit on the sending rate computed from
+ X_recv_set.
+
+ This procedure also uses the procedures Maximize X_recv_set() and
+ Update X_recv_set(), which are defined below.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Floyd, et al. Standards Track [Page 11]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ The procedure for updating the allowed sending rate:
+
+ If (the entire interval covered by the feedback packet
+ was a data-limited interval) {
+ If (the feedback packet reports a new loss event or an
+ increase in the loss event rate p) {
+ Halve entries in X_recv_set;
+ X_recv = 0.85 * X_recv;
+ Maximize X_recv_set();
+ recv_limit = max (X_recv_set);
+ } Else {
+ Maximize X_recv_set();
+ recv_limit = 2 * max (X_recv_set);
+ }
+ } Else { // typical behavior
+ Update X_recv_set();
+ recv_limit = 2 * max (X_recv_set);
+ }
+ If (p > 0) { // congestion avoidance phase
+ Calculate X_Bps using the TCP throughput equation.
+ X = max(min(X_Bps, recv_limit), s/t_mbi);
+ } Else if (t_now - tld >= R) {
+ // initial slow-start
+ X = max(min(2*X, recv_limit), initial_rate);
+ tld = t_now;
+ }
+
+ 5) If oscillation reduction is used, calculate the instantaneous
+ transmit rate, X_inst, following Section 4.5.
+
+ 6) Reset the nofeedback timer to expire after RTO seconds.
+
+ The procedure for maximizing X_recv_set keeps a single value, the
+ largest value from X_recv_set and the new X_recv.
+
+ Maximize X_recv_set():
+ Add X_recv to X_recv_set;
+ Delete initial value Infinity from X_recv_set,
+ if it is still a member.
+ Set the timestamp of the largest item to the current time;
+ Delete all other items.
+
+
+
+
+
+
+
+
+
+
+Floyd, et al. Standards Track [Page 12]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ The procedure for updating X_recv_set keeps a set of X_recv values
+ with timestamps from the two most recent round-trip times.
+
+ Update X_recv_set():
+ Add X_recv to X_recv_set;
+ Delete from X_recv_set values older than
+ two round-trip times.
+
+ Definition of a data-limited interval:
+ We define a sender as data-limited any time it is not sending as much
+ as it is allowed to send. We define an interval as a 'data-limited
+ interval' if the sender was data-limited over the *entire* interval;
+ Section 8.2.1 discusses implementation issues for a sender in
+ determining if an interval was a data-limited interval. The term
+ 'data-limited interval' is used in the first "if" condition in step
+ (4), which prevents a sender from having to reduce its sending rate
+ as a result of a feedback packet reporting the receive rate from a
+ data-limited period.
+
+ As an example, consider a sender that is sending at its full allowed
+ rate, except that it is sending packets in pairs, rather than sending
+ each packet as soon as it can. Such a sender is considered data-
+ limited part of the time, because it is not always sending packets as
+ soon as it can. However, consider an interval that covers this
+ sender's transmission of at least two data packets; such an interval
+ does not meet the definition of a data-limited interval because the
+ sender was not data-limited *over the entire interval*.
+
+ If the feedback packet reports a receive rate X_recv of zero (i.e.,
+ the first feedback packet), the sender does not consider that the
+ entire interval covered by the feedback packet was a data-limited
+ interval.
+
+ X_recv_set and the first feedback packet:
+ Because X_recv_set is initialized with a single item, with value
+ Infinity, recv_limit is set to Infinity for the first two round-trip
+ times of the connection. As a result, the sending rate is not
+ limited by the receive rate during that period. This avoids the
+ problem of the sending rate being limited by the value of X_recv from
+ the first feedback packet.
+
+ The interval covered by a feedback packet:
+ How does the sender determine the period covered by a feedback
+ packet? This is discussed in more detail in Section 8.2. In
+ general, the receiver will be sending a feedback packet once per
+ round-trip time; so typically, the sender will be able to determine
+ exactly the period covered by the current feedback packet from the
+ previous feedback packet. However, in cases when the previous
+
+
+
+Floyd, et al. Standards Track [Page 13]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ feedback packet was lost, or when the receiver sends a feedback
+ packet early because it detected a lost or ECN-marked packet, the
+ sender will have to estimate the interval covered by the feedback
+ packet. As specified in Section 6.2, each feedback packet sent by
+ the receiver covers a round-trip time, for the round-trip time
+ estimate R_m maintained by the receiver R_m seconds before the
+ feedback packet was sent.
+
+ The response to a loss during a data-limited interval:
+ In TFRC, after the initial slow-start, the sender always updates the
+ calculated transmit rate, X_Bps, after a feedback packet is received,
+ and the allowed sending rate, X, is always limited by X_Bps.
+ However, during a data-limited interval, when the actual sending rate
+ is usually below X_Bps, the sending rate is still limited by
+ recv_limit, derived from X_recv_set. If the sender is data-limited,
+ possibly with a varying sending rate from one round-trip time to the
+ next, and is experiencing losses, then we decrease the entry in
+ X_recv_set in order to reduce the allowed sending rate.
+
+ The sender can detect a loss event during a data-limited period
+ either from explicit feedback from the receiver, or from a reported
+ increase in the loss event rate. When the sender receives a feedback
+ packet reporting such a loss event in a data-limited interval, the
+ sender limits the allowed increases in the sending rate during the
+ data-limited interval.
+
+ The initial slow-start phase:
+ Note that when p=0, the sender has not yet learned of any loss
+ events, and the sender is in the initial slow-start phase. In this
+ initial slow-start phase, the sender can approximately double the
+ sending rate each round-trip time until a loss occurs. The
+ initial_rate term in step (4) gives a minimum allowed sending rate
+ during slow-start of the initial allowed sending rate.
+
+ We note that if the sender is data-limited during slow-start, or if
+ the connection is limited by the path bandwidth, then the sender is
+ not necessarily able to double its sending rate each round-trip time;
+ the sender's sending rate is limited to at most twice the past
+ receive rate, or at most initial_rate, whichever is larger. This is
+ similar to TCP's behavior, where the sending rate is limited by the
+ rate of incoming acknowledgement packets as well as by the congestion
+ window. Thus, in TCP's slow-start, for the most aggressive case of
+ the TCP receiver acknowledging every data packet, the TCP sender's
+ sending rate is limited to at most twice the rate of these incoming
+ acknowledgment packets.
+
+
+
+
+
+
+Floyd, et al. Standards Track [Page 14]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ The minimum allowed sending rate:
+ The term s/t_mbi ensures that when p > 0, the sender is allowed to
+ send at least one packet every 64 seconds.
+
+4.4. Expiration of Nofeedback Timer
+
+ This section specifies the sender's response to a nofeedback timer.
+ The nofeedback timer could expire because of an idle period or
+ because of data or feedback packets dropped in the network.
+
+ This section uses the variable recover_rate. If the TFRC sender has
+ been idle ever since the nofeedback timer was set, the allowed
+ sending rate is not reduced below the recover_rate. For this
+ document, the recover_rate is set to the initial_rate (specified in
+ Section 4.2). Future updates to this specification may explore other
+ possible values for the recover_rate.
+
+ If the nofeedback timer expires, the sender MUST perform the
+ following actions:
+
+ 1) Cut the allowed sending rate in half.
+
+ If the nofeedback timer expires when the sender has had at least
+ one RTT measurement, the allowed sending rate is reduced by
+ modifying X_recv_set as described in the pseudocode below
+ (including item (2)). In the general case, the sending rate is
+ limited to at most twice X_recv. Modifying X_recv_set limits the
+ sending rate, but still allows the sender to slow-start, doubling
+ its sending rate each RTT, if feedback messages resume reporting
+ no losses.
+
+ If the sender has been idle since this nofeedback timer was set
+ and X_recv is less than the recover_rate, then the allowed sending
+ rate is not halved, and X_recv_set is not changed. This ensures
+ that the allowed sending rate is not reduced to less than half the
+ recover_rate as a result of an idle period.
+
+ In the general case, the allowed sending rate is halved in
+ response to the expiration of the nofeedback timer. The details,
+ in the pseudocode below, depend on whether the sender is in slow-
+ start, is in congestion avoidance limited by X_recv, or is in
+ congestion avoidance limited by the throughput equation.
+
+
+
+
+
+
+
+
+
+Floyd, et al. Standards Track [Page 15]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ X_recv = max (X_recv_set);
+ If (sender does not have an RTT sample,
+ has not received any feedback from receiver,
+ and has not been idle ever since the nofeedback timer
+ was set) {
+ // We do not have X_Bps or recover_rate yet.
+ // Halve the allowed sending rate.
+ X = max(X/2, s/t_mbi);
+ } Else if (((p>0 && X_recv < recover_rate) or
+ (p==0 && X < 2 * recover_rate)), and
+ sender has been idle ever
+ since nofeedback timer was set) {
+ // Don't halve the allowed sending rate.
+ Do nothing;
+ } Else if (p==0) {
+ // We do not have X_Bps yet.
+ // Halve the allowed sending rate.
+ X = max(X/2, s/t_mbi);
+ } Else if (X_Bps > 2*X_recv)) {
+ // 2*X_recv was already limiting the sending rate.
+ // Halve the allowed sending rate.
+ Update_Limits(X_recv;)
+ } Else {
+ // The sending rate was limited by X_Bps, not by X_recv.
+ // Halve the allowed sending rate.
+ Update_Limits(X_Bps/2);
+ }
+
+ The term s/t_mbi limits the backoff to one packet every 64
+ seconds.
+
+ The procedure Update_Limits() uses the variable timer_limit for
+ the limit on the sending rate computed from the expiration of the
+ nofeedback timer, as follows:
+
+ Update_Limits(timer_limit):
+ If (timer_limit < s/t_mbi)
+ timer_limit = s/t_mbi;
+ Replace X_recv_set contents with the single item
+ timer_limit/2;
+ Recalculate X as in step (4) of Section 4.3;
+
+ 2) Restart the nofeedback timer to expire after max(4*R, 2*s/X)
+ seconds.
+
+ If the sender has been data-limited but not idle since the nofeedback
+ timer was set, it is possible that the nofeedback timer expired
+ because data or feedback packets were dropped in the network. In
+
+
+
+Floyd, et al. Standards Track [Page 16]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ this case, the nofeedback timer is the backup mechanism for the
+ sender to detect these losses, similar to the retransmit timer in
+ TCP.
+
+ Note that when the sender stops sending data for a period of time,
+ the receiver will stop sending feedback. When the sender's
+ nofeedback timer expires, the sender could use the procedure above to
+ limit the sending rate. If the sender subsequently starts to send
+ again, X_recv_set will be used to limit the transmit rate, and slow-
+ start behavior will occur until the transmit rate reaches X_Bps.
+
+ The TFRC sender's reduction of the allowed sending rate after the
+ nofeedback timer expires is similar to TCP's reduction of the
+ congestion window, cwnd, after each RTO seconds of an idle period,
+ for TCP with Congestion Window Validation [RFC2861].
+
+4.5. Reducing Oscillations
+
+ To reduce oscillations in queueing delay and sending rate in
+ environments with a low degree of statistical multiplexing at the
+ congested link, it is RECOMMENDED that the sender reduce the transmit
+ rate as the queueing delay (and hence RTT) increases. To do this,
+ the sender maintains R_sqmean, a long-term estimate of the square
+ root of the RTT, and modifies its sending rate depending on how the
+ square root of R_sample, the most recent sample of the RTT, differs
+ from the long-term estimate. The long-term estimate R_sqmean is set
+ as follows:
+
+ If no feedback has been received before {
+ R_sqmean = sqrt(R_sample);
+ } Else {
+ R_sqmean = q2*R_sqmean + (1-q2)*sqrt(R_sample);
+ }
+
+ Thus, R_sqmean gives the exponentially weighted moving average of the
+ square root of the RTT samples. The constant q2 should be set
+ similarly to q, the constant used in the round-trip time estimate R.
+ A value of 0.9 as the default for q2 is RECOMMENDED.
+
+ When sqrt(R_sample) is greater than R_sqmean, then the current
+ round-trip time is greater than the long-term average, implying that
+ queueing delay is probably increasing. In this case, the transmit
+ rate is decreased to minimize oscillations in queueing delay.
+
+ The sender obtains the base allowed transmit rate, X, as described in
+ step (4) of Section 4.3 above. It then calculates a modified
+ instantaneous transmit rate X_inst, as follows:
+
+
+
+
+Floyd, et al. Standards Track [Page 17]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ X_inst = X * R_sqmean / sqrt(R_sample);
+ If (X_inst < s/t_mbi)
+ X_inst = s/t_mbi;
+
+ Because we are using square roots, there is generally only a moderate
+ difference between the instantaneous transmit rate X_inst and the
+ allowed transmit rate X. For example, in a somewhat extreme case
+ when the current RTT sample R_sample is twice as large as the long-
+ term average, then sqrt(R_sample) will be roughly 1.44 times
+ R_sqmean, and the allowed transmit rate will be reduced by a factor
+ of roughly 0.7.
+
+ We note that this modification for reducing oscillatory behavior is
+ not always needed, especially if the degree of statistical
+ multiplexing in the network is high. We also note that the
+ modification for reducing oscillatory behavior could cause problems
+ for connections where the round-trip time is not strongly correlated
+ with the queueing delay (e.g., in some wireless links, over paths
+ with frequent routing changes, etc.). However, this modification
+ SHOULD be implemented because it makes TFRC behave better in some
+ environments with a low level of statistical multiplexing. The
+ performance of this modification is illustrated in Section 3.1.3 of
+ [FHPW00]. If it is not implemented, implementations SHOULD use a
+ very low value of the weight q for the average round-trip time.
+
+4.6. Scheduling of Packet Transmissions
+
+ As TFRC is rate-based, and as operating systems typically cannot
+ schedule events precisely, it is necessary to be opportunistic about
+ sending data packets so that the correct average rate is maintained
+ despite the coarse-grain or irregular scheduling of the operating
+ system. To help maintain the correct average sending rate, the TFRC
+ sender MAY send some packets before their nominal send time.
+
+ In addition, the scheduling of packet transmissions controls the
+ allowed burstiness of senders after an idle or data-limited period.
+ The TFRC sender MAY accumulate sending 'credits' for past unused send
+ times; this allows the TFRC sender to send a burst of data after an
+ idle or data-limited period. To compare with TCP, TCP may send up to
+ a round-trip time's worth of packets in a single burst, but never
+ more. As examples, packet bursts can be sent by TCP when an ACK
+ arrives acknowledging a window of data, or when a data-limited sender
+ suddenly has a window of data to send after a delay of nearly a
+ round-trip time.
+
+
+
+
+
+
+
+Floyd, et al. Standards Track [Page 18]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ To limit burstiness, a TFRC implementation MUST prevent bursts of
+ arbitrary size. This limit MUST be less than or equal to one round-
+ trip time's worth of packets. A TFRC implementation MAY limit bursts
+ to less than a round-trip time's worth of packets. In addition, a
+ TFRC implementation MAY use rate-based pacing to smooth bursts.
+
+ As an implementation-specific example, a sending loop could calculate
+ the correct inter-packet interval, t_ipi, as follows:
+
+ t_ipi = s/X_inst;
+
+ Let t_now be the current time and i be a natural number, i = 0, 1,
+ ..., with t_i the nominal send time for the i-th packet. Then, the
+ nominal send time t_(i+1) would derive recursively as:
+
+ t_0 = t_now,
+ t_(i+1) = t_i + t_ipi.
+
+ For TFRC senders allowed to accumulate sending credits for unused
+ send time over the last T seconds, the sender would be allowed to use
+ unused nominal send times t_j for t_j < now - T, for T set to the
+ round-trip time.
+
+5. Calculation of the Loss Event Rate (p)
+
+ Obtaining an accurate and stable measurement of the loss event rate
+ is of primary importance for TFRC. Loss rate measurement is
+ performed at the receiver, based on the detection of lost or marked
+ packets from the sequence numbers of arriving packets. We describe
+ this process before describing the rest of the receiver protocol. If
+ the receiver has not yet detected a lost or marked packet, then the
+ receiver does not calculate the loss event rate, but reports a loss
+ event rate of zero.
+
+5.1. Detection of Lost or Marked Packets
+
+ TFRC assumes that all packets contain a sequence number that is
+ incremented by one for each packet that is sent. For the purposes of
+ this specification, it is REQUIRED that if a lost packet is
+ retransmitted, the retransmission is given a new sequence number that
+ is the latest in the transmission sequence, and not the same sequence
+ number as the packet that was lost. If a transport protocol has the
+ requirement that it must retransmit with the original sequence
+ number, then the transport protocol designer must figure out how to
+ distinguish delayed from retransmitted packets and how to detect lost
+ retransmissions.
+
+
+
+
+
+Floyd, et al. Standards Track [Page 19]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ The receiver maintains a data structure that keeps track of which
+ packets have arrived and which are missing. For the purposes of this
+ specification, we assume that the data structure consists of a list
+ of packets that have arrived along with the receiver timestamp when
+ each packet was received. In practice, this data structure will
+ normally be stored in a more compact representation, but this is
+ implementation-specific.
+
+ The loss of a packet is detected by the arrival of at least NDUPACK
+ packets with a higher sequence number than the lost packet, for
+ NDUPACK set to 3. The requirement for NDUPACK subsequent packets is
+ the same as with TCP, and is to make TFRC more robust in the presence
+ of reordering. In contrast to TCP, if a packet arrives late (after
+ NDUPACK subsequent packets arrived) in TFRC, the late packet can fill
+ the hole in TFRC's reception record, and the receiver can recalculate
+ the loss event rate. Future versions of TFRC might make the
+ requirement for NDUPACK subsequent packets adaptive based on
+ experienced packet reordering, but such a mechanism is not part of
+ the current specification.
+
+ For an ECN-capable connection, a marked packet is detected as a
+ congestion event as soon as it arrives, without having to wait for
+ the arrival of subsequent packets.
+
+ If an ECN-marked packet is preceded by a possibly-lost packet, then
+ the first detected congestion event begins with the lost packet. For
+ example, if the receiver receives a data packet with sequence number
+ n-1, followed by an unmarked data packet with sequence number n+1,
+ and a marked data packet with sequence number n+2, then the receiver
+ detects a congestion event when it receives the marked packet n+2.
+ The first congestion event detected begins with the lost packet n.
+ The guidelines in Section 5.2 below are used to determine whether the
+ lost and marked packets belong to the same loss event or to separate
+ loss events.
+
+5.2. Translation from Loss History to Loss Events
+
+ TFRC requires that the loss fraction be robust to several consecutive
+ packets lost or marked in the same loss event. This is similar to
+ TCP, which (typically) only performs one halving of the congestion
+ window during any single RTT. Thus, the receiver needs to map the
+ packet loss history into a loss event record, where a loss event is
+ one or more packets lost or marked in an RTT. To perform this
+ mapping, the receiver needs to know the RTT to use, and this is
+ supplied periodically by the sender, typically as control information
+
+
+
+
+
+
+Floyd, et al. Standards Track [Page 20]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ piggy-backed onto a data packet. TFRC is not sensitive to how the
+ RTT measurement sent to the receiver is made, but it is RECOMMENDED
+ to use the sender's calculated RTT, R, (see Section 4.3) for this
+ purpose.
+
+ To determine whether a lost or marked packet should start a new loss
+ event or be counted as part of an existing loss event, we need to
+ compare the sequence numbers and timestamps of the packets that
+ arrived at the receiver. For a marked packet, S_new, its reception
+ time, T_new, can be noted directly. For a lost packet, we can
+ interpolate to infer the nominal "arrival time". Assume:
+
+ S_loss is the sequence number of a lost packet.
+
+ S_before is the sequence number of the last packet to arrive,
+ before any packet arrivals with a sequence number above S_loss,
+ with a sequence number below S_loss.
+
+ S_after is the sequence number of the first packet to arrive after
+ S_before with a sequence number above S_loss.
+
+ S_max is the largest sequence number.
+
+ Therefore, S_before < S_loss < S_after <= S_max.
+
+ T_loss is the nominal estimated arrival time for the lost packet.
+
+ T_before is the reception time of S_before.
+
+ T_after is the reception time of S_after.
+
+ Note that T_before < T_after.
+
+ For a lost packet, S_loss, we can interpolate its nominal "arrival
+ time" at the receiver from the arrival times of S_before and S_after.
+ Thus:
+
+ T_loss = T_before + ( (T_after - T_before)
+ * (S_loss - S_before)/(S_after - S_before) );
+
+ To address sequence number wrapping, let S_MAX = 2^b, where b is the
+ bit-length of sequence numbers in a given implementation. In this
+ case, we can interpolate the arrival time T_loss as follows:
+
+
+
+
+
+
+
+
+Floyd, et al. Standards Track [Page 21]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ T_loss = T_before + (T_after - T_before)
+ * Dist(S_loss, S_before)/Dist(S_after, S_before)
+
+ where
+
+ Dist(S_A, S_B) = (S_A + S_MAX - S_B) % S_MAX
+
+ If the lost packet S_old was determined to have started the previous
+ loss event, and we have just determined that S_new has been lost,
+ then we interpolate the nominal arrival times of S_old and S_new,
+ called T_old and T_new, respectively.
+
+ If T_old + R >= T_new, then S_new is part of the existing loss event.
+ Otherwise, S_new is the first packet in a new loss event.
+
+5.3. The Size of a Loss Interval
+
+ After the detection of the first loss event, the receiver divides the
+ sequence space into loss intervals. If a loss interval, A, is
+ determined to have started with packet sequence number S_A and the
+ next loss interval, B, started with packet sequence number S_B, then
+ the number of packets in loss interval A is given by (S_B - S_A).
+ Thus, loss interval A contains all of the packets transmitted by the
+ sender starting with the first packet transmitted in loss interval A
+ and ending with but not including the first packet transmitted in
+ loss interval B.
+
+ The current loss interval I_0 is defined as the loss interval
+ containing the most recent loss event. If that loss event started
+ with packet sequence number S_A, and S_C is the highest received
+ sequence number so far, then the size of I_0 is S_C - S_A + 1. As an
+ example, if the current loss interval consists of a single ECN-
+ marked packet, then S_A == S_C, and the size of the loss interval is
+ one.
+
+5.4. Average Loss Interval
+
+ To calculate the loss event rate, p, we first calculate the average
+ loss interval. This is done using a filter that weights the n most
+ recent loss event intervals in such a way that the measured loss
+ event rate changes smoothly. If the receiver has not yet seen a lost
+ or marked packet, then the receiver does not calculate the average
+ loss interval.
+
+
+
+
+
+
+
+
+Floyd, et al. Standards Track [Page 22]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ Weights w_0 to w_(n-1) are calculated as:
+
+ If (i < n/2) {
+ w_i = 1;
+ } Else {
+ w_i = 2 * (n-i)/(n+2);
+ }
+
+ Thus, if n=8, the values of w_0 to w_7 are:
+
+ 1.0, 1.0, 1.0, 1.0, 0.8, 0.6, 0.4, 0.2
+
+ The value n for the number of loss intervals used in calculating the
+ loss event rate determines TFRC's speed in responding to changes in
+ the level of congestion. It is RECOMMENDED to set the value n to 8.
+ TFRC SHOULD NOT use values of n greater than 8 for traffic that might
+ compete in the global Internet with TCP. At the very least, safe
+ operation with values of n greater than 8 would require a slight
+ change to TFRC's mechanisms to include a more severe response to two
+ or more round-trip times with heavy packet loss.
+
+ When calculating the average loss interval, we need to decide whether
+ to include the current loss interval. We only include the current
+ loss interval if it is sufficiently large to increase the average
+ loss interval.
+
+ Let the most recent loss intervals be I_0 to I_k, where I_0 is the
+ current loss interval. If there have been at least n loss intervals,
+ then k is set to n; otherwise, k is the maximum number of loss
+ intervals seen so far. We calculate the average loss interval I_mean
+ as follows:
+
+ I_tot0 = 0;
+ I_tot1 = 0;
+ W_tot = 0;
+ for (i = 0 to k-1) {
+ I_tot0 = I_tot0 + (I_i * w_i);
+ W_tot = W_tot + w_i;
+ }
+ for (i = 1 to k) {
+ I_tot1 = I_tot1 + (I_i * w_(i-1));
+ }
+ I_tot = max(I_tot0, I_tot1);
+ I_mean = I_tot/W_tot;
+
+ The loss event rate, p is simply:
+
+ p = 1 / I_mean;
+
+
+
+Floyd, et al. Standards Track [Page 23]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+5.5. History Discounting
+
+ As described in Section 5.4, when there have been at least n loss
+ intervals, the most recent loss interval is only assigned 1/(0.75*n)
+ of the total weight in calculating the average loss interval,
+ regardless of the size of the most recent loss interval. This
+ section describes an OPTIONAL history discounting mechanism,
+ discussed further in [FHPW00a] and [W00], that allows the TFRC
+ receiver to adjust the weights, concentrating more of the relative
+ weight on the most recent loss interval, when the most recent loss
+ interval is more than twice as large as the computed average loss
+ interval.
+
+ To carry out history discounting, we associate a discount factor,
+ DF_i, with each loss interval, L_i, for i > 0, where each discount
+ factor is a floating point number. The discount array maintains the
+ cumulative history of discounting for each loss interval. At the
+ beginning, the values of DF_i in the discount array are initialized
+ to 1:
+
+ for (i = 0 to n) {
+ DF_i = 1;
+ }
+
+ History discounting also uses a general discount factor, DF, also a
+ floating point number, that is also initialized to 1. First, we show
+ how the discount factors are used in calculating the average loss
+ interval, and then we describe, later in this section, how the
+ discount factors are modified over time.
+
+ As described in Section 5.4, the average loss interval is calculated
+ using the n previous loss intervals I_1, ..., I_n and the current
+ loss interval I_0. The computation of the average loss interval
+ using the discount factors is a simple modification of the procedure
+ in Section 5.4, as follows:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Floyd, et al. Standards Track [Page 24]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ I_tot0 = I_0 * w_0;
+ I_tot1 = 0;
+ W_tot0 = w_0;
+ W_tot1 = 0;
+ for (i = 1 to n-1) {
+ I_tot0 = I_tot0 + (I_i * w_i * DF_i * DF);
+ W_tot0 = W_tot0 + w_i * DF_i * DF;
+ }
+ for (i = 1 to n) {
+ I_tot1 = I_tot1 + (I_i * w_(i-1) * DF_i);
+ W_tot1 = W_tot1 + w_(i-1) * DF_i;
+ }
+ p = min(W_tot0/I_tot0, W_tot1/I_tot1);
+
+ The general discounting factor, DF, is updated on every packet
+ arrival as follows. First, the receiver computes the weighted
+ average I_mean of the loss intervals I_1, ..., I_n:
+
+ I_tot = 0;
+ W_tot = 0;
+ for (i = 1 to n) {
+ W_tot = W_tot + w_(i-1) * DF_i;
+ I_tot = I_tot + (I_i * w_(i-1) * DF_i);
+ }
+ I_mean = I_tot / W_tot;
+
+ This weighted average I_mean is compared to I_0, the size of current
+ loss interval. If I_0 is greater than twice I_mean, then the new
+ loss interval is considerably larger than the old ones, and the
+ general discount factor, DF, is updated to decrease the relative
+ weight on the older intervals, as follows:
+
+ if (I_0 > 2 * I_mean) {
+ DF = 2 * I_mean/I_0;
+ if (DF < THRESHOLD) {
+ DF = THRESHOLD;
+ }
+ } else {
+ DF = 1;
+ }
+
+ A nonzero value for THRESHOLD ensures that older loss intervals from
+ an earlier time of high congestion are not discounted entirely. We
+ recommend a THRESHOLD of 0.25. Note that with each new packet
+ arrival, I_0 will increase further, and the discount factor DF will
+ be updated.
+
+
+
+
+
+Floyd, et al. Standards Track [Page 25]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ When a new loss event occurs, the current interval shifts from I_0 to
+ I_1, loss interval I_i shifts to interval I_(i+1), and the loss
+ interval I_n is forgotten. The previous discount factor DF has to be
+ incorporated into the discount array. Because DF_i carries the
+ discount factor associated with loss interval I_i, the DF_i array has
+ to be shifted as well. This is done as follows:
+
+ for (i = 1 to n) {
+ DF_i = DF * DF_i;
+ }
+ for (i = n-1 to 0 step -1) {
+ DF_(i+1) = DF_i;
+ }
+ I_0 = 1;
+ DF_0 = 1;
+ DF = 1;
+
+ This completes the description of the optional history discounting
+ mechanism. We emphasize that this is an OPTIONAL mechanism whose
+ sole purpose is to allow TFRC to respond somewhat more quickly to the
+ sudden absence of congestion, as represented by a long current loss
+ interval.
+
+6. Data Receiver Protocol
+
+ The receiver periodically sends feedback messages to the sender.
+ Feedback packets SHOULD normally be sent at least once per RTT,
+ unless the sender is sending at a rate of less than one packet per
+ RTT, in which case a feedback packet SHOULD be sent for every data
+ packet received. A feedback packet SHOULD also be sent whenever a
+ new loss event is detected without waiting for the end of an RTT, and
+ whenever an out-of-order data packet is received that removes a loss
+ event from the history.
+
+ If the sender is transmitting at a high rate (many packets per RTT),
+ there may be some advantages to sending periodic feedback messages
+ more than once per RTT as this allows faster response to changing RTT
+ measurements and more resilience to feedback packet loss.
+
+ If the receiver was sending k feedback packets per RTT, for k>1, step
+ (4) of Section 6.2 would be modified to set the feedback timer to
+ expire after R_m/k seconds. However, each feedback packet would
+ still report the receiver rate over the last RTT, not over a fraction
+ of an RTT. In this document, we do not specify the modifications
+ that might be required for a receiver sending more than one feedback
+ packet per RTT. We note that there is little gain from sending a
+ large number of feedback messages per RTT.
+
+
+
+
+Floyd, et al. Standards Track [Page 26]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+6.1. Receiver Behavior When a Data Packet Is Received
+
+ When a data packet is received, the receiver performs the following
+ steps:
+
+ 1) Add the packet to the packet history.
+
+ 2) Check if done: If the new packet results in the detection of a
+ new loss event, or if no feedback packet was sent when the
+ feedback timer last expired, go to step 3. Otherwise, no action
+ need be performed (unless the optimization in the next paragraph
+ is used), so exit the procedure.
+
+ An OPTIONAL optimization might check to see if the arrival of the
+ packet caused a hole in the packet history to be filled, and
+ consequently, two loss intervals were merged into one. If this
+ is the case, the receiver might also send feedback immediately.
+ The effects of such an optimization are normally expected to be
+ small.
+
+ 3) Calculate p: Let the previous value of p be p_prev. Calculate
+ the new value of p as described in Section 5.
+
+ 4) Expire feedback timer: If p > p_prev, cause the feedback timer to
+ expire and perform the actions described in Section 6.2.
+
+ If p <= p_prev and no feedback packet was sent when the feedback
+ timer last expired, cause the feedback timer to expire and
+ perform the actions described in Section 6.2. If p <= p_prev and
+ a feedback packet was sent when the feedback timer last expired,
+ no action need be performed.
+
+6.2. Expiration of Feedback Timer
+
+ When the feedback timer at the receiver expires, the action to be
+ taken depends on whether data packets have been received since the
+ last feedback was sent.
+
+ For the m-th expiration of the feedback timer, let the maximum
+ sequence number of a packet at the receiver, so far, be S_m and the
+ value of the RTT measurement included in packet S_m be R_m. As
+ described in Section 3.2.1, R_m is the sender's most recent estimate
+ of the round-trip time, as reported in data packets. If data packets
+ have been received since the previous feedback was sent, the receiver
+ performs the following steps:
+
+ 1) Calculate the average loss event rate using the algorithm
+ described in Section 5.
+
+
+
+Floyd, et al. Standards Track [Page 27]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ 2) Calculate the measured receive rate, X_recv, based on the packets
+ received within the previous R_(m-1) seconds. This is performed
+ whether the feedback timer expired at its normal time or expired
+ early due to a new lost or marked packet (i.e., step (3) in
+ Section 6.1).
+
+ In the typical case, when the receiver is sending only one
+ feedback packet per round-trip time and the feedback timer did
+ not expire early due to a new lost packet, then the time interval
+ since the feedback timer last expired would be R_(m-1) seconds.
+
+ We note that when the feedback timer expires early due to a new
+ lost or marked packet, the time interval since the feedback timer
+ last expired is likely to be smaller than R_(m-1) seconds.
+
+ For ease of implementation, if the time interval since the
+ feedback timer last expired is not R_(m-1) seconds, the receive
+ rate MAY be calculated over a longer time interval, the time
+ interval going back to the most recent feedback timer expiration
+ that was at least R_(m-1) seconds ago.
+
+ 3) Prepare and send a feedback packet containing the information
+ described in Section 3.2.2.
+
+ 4) Restart the feedback timer to expire after R_m seconds.
+
+ Note that rule 2) above gives a minimum value for the measured
+ receive rate X_recv of one packet per round-trip time. If the sender
+ is limited to a sending rate of less than one packet per round-trip
+ time, this will be due to the loss event rate, not from a limit
+ imposed by the measured receive rate at the receiver.
+
+ If no data packets have been received since the last feedback was
+ sent, then no feedback packet is sent, and the feedback timer is
+ restarted to expire after R_m seconds.
+
+6.3. Receiver Initialization
+
+ The receiver is initialized by the first data packet that arrives at
+ the receiver. Let the sequence number of this packet be i.
+
+ When the first packet is received:
+
+ o Set p = 0.
+
+ o Set X_recv = 0.
+
+ o Prepare and send a feedback packet.
+
+
+
+Floyd, et al. Standards Track [Page 28]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ o Set the feedback timer to expire after R_i seconds.
+
+ If the first data packet does not contain an estimate R_i of the
+ round-trip time, then the receiver sends a feedback packet for every
+ arriving data packet until a data packet arrives containing an
+ estimate of the round-trip time.
+
+ If the sender is using a coarse-grained timestamp that increments
+ every quarter of a round-trip time, then a feedback timer is not
+ needed, and the following procedure from RFC 4342 is used to
+ determine when to send feedback messages.
+
+ o Whenever the receiver sends a feedback message, the receiver sets
+ a local variable last_counter to the greatest received value of
+ the window counter since the last feedback message was sent, if
+ any data packets have been received since the last feedback
+ message was sent.
+
+ o If the receiver receives a data packet with a window counter
+ value greater than or equal to last_counter + 4, then the
+ receiver sends a new feedback packet. ("Greater" and "greatest"
+ are measured in circular window counter space.)
+
+6.3.1. Initializing the Loss History after the First Loss Event
+
+ This section describes the procedure that MUST be used for
+ initializing the loss history after the first loss event.
+
+ The number of packets until the first loss cannot be used to compute
+ the allowed sending rate directly, as the sending rate changes
+ rapidly during this time. TFRC assumes that the correct data rate
+ after the first loss is half of the maximum sending rate before the
+ loss occurred. TFRC approximates this target rate, X_target, by the
+ maximum value of X_recv so far. (For slow-start, for a particular
+ round-trip time, the sender's sending rate is generally twice the
+ receiver's receive rate for data sent over the previous round-trip
+ time.)
+
+ After the first loss, instead of initializing the first loss interval
+ to the number of packets sent until the first loss, the TFRC receiver
+ calculates the loss interval that would be required to produce the
+ data rate X_target, and uses this synthetic loss interval to seed the
+ loss history mechanism.
+
+ TFRC does this by finding some value, p, for which the throughput
+ equation in Section 3.1 gives a sending rate within 5% of X_target,
+ given the round-trip time R, and the first loss interval is then set
+ to 1/p. If the receiver knows the segment size, s, used by the
+
+
+
+Floyd, et al. Standards Track [Page 29]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ sender, then the receiver MAY use the throughput equation for X;
+ otherwise, the receiver MAY measure the receive rate in packets per
+ second instead of bytes per second for this purpose, and use the
+ throughput equation for X_pps. (The 5% tolerance is introduced
+ simply because the throughput equation is difficult to invert, and we
+ want to reduce the costs of calculating p numerically.)
+
+ Special care is needed for initializing the first loss interval when
+ the first data packet is lost or marked. When the first data packet
+ is lost in TCP, the TCP sender retransmits the packet after the
+ retransmit timer expires. If TCP's first data packet is ECN-marked,
+ the TCP sender resets the retransmit timer, and sends a new data
+ packet only when the retransmit timer expires [RFC3168] (Section
+ 6.1.2). For TFRC, if the first data packet is lost or ECN-marked,
+ then the first loss interval consists of the null interval with no
+ data packets. In this case, the loss interval length for this (null)
+ loss interval SHOULD be set to give a similar sending rate to that of
+ TCP, as specified in the paragraph below.
+
+ When the first TFRC loss interval is null, meaning that the first
+ data packet is lost or ECN-marked, in order to follow the behavior of
+ TCP, TFRC wants the allowed sending rate to be 1 packet every two
+ round-trip times, or equivalently, 0.5 packets per RTT. Thus, the
+ TFRC receiver calculates the loss interval that would be required to
+ produce the target rate X_target of 0.5/R packets per second, for the
+ round-trip time R, and uses this synthetic loss interval for the
+ first loss interval. The TFRC receiver uses 0.5/R packets per second
+ as the minimum value for X_target when initializing the first loss
+ interval.
+
+ We note that even though the TFRC receiver reports a synthetic loss
+ interval after the first loss event, the TFRC receiver still reports
+ the measured receive rate X_recv, as specified in Section 6.2 above.
+
+7. Sender-Based Variants
+
+ In a sender-based variant of TFRC, the receiver uses reliable
+ delivery to send information about packet losses to the sender, and
+ the sender computes the packet loss rate and the acceptable transmit
+ rate.
+
+ The main advantage of a sender-based variant of TFRC is that the
+ sender does not have to trust the receiver's calculation of the
+ packet loss rate. However, with the requirement of reliable delivery
+ of loss information from the receiver to the sender, a sender-based
+ TFRC would have much tighter constraints on the transport protocol in
+ which it is embedded.
+
+
+
+
+Floyd, et al. Standards Track [Page 30]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ In contrast, the receiver-based variant of TFRC specified in this
+ document is robust to the loss of feedback packets, and therefore
+ does not require the reliable delivery of feedback packets. It is
+ also better suited for applications where it is desirable to offload
+ work from the server to the client as much as possible.
+
+ RFC 4340 and RFC 4342 together specify DCCP's CCID 3, which can be
+ used as a sender-based variant of TFRC. In CCID 3, each feedback
+ packet from the receiver contains a Loss Intervals option, reporting
+ the lengths of the most recent loss intervals. Feedback packets may
+ also include the Ack Vector option, allowing the sender to determine
+ exactly which packets were dropped or marked and to check the
+ information reported in the Loss Intervals options. The Ack Vector
+ option can also include ECN Nonce Echoes, allowing the sender to
+ verify the receiver's report of having received an unmarked data
+ packet. The Ack Vector option allows the sender to see for itself
+ which data packets were lost or ECN-marked, to determine loss
+ intervals, and to calculate the loss event rate. Section 9 of RFC
+ 4342 discusses issues in the sender verifying information reported by
+ the receiver.
+
+8. Implementation Issues
+
+ This document has specified the TFRC congestion control mechanism,
+ for use by applications and transport protocols. This section
+ mentions briefly some of the implementation issues.
+
+8.1. Computing the Throughput Equation
+
+ For t_RTO = 4*R and b = 1, the throughput equation in Section 3.1 can
+ be expressed as follows:
+
+ s
+ X_Bps = --------
+ R * f(p)
+
+ for
+
+ f(p) = sqrt(2*p/3) + (12*sqrt(3*p/8) * p * (1+32*p^2)).
+
+ A table lookup could be used for the function f(p).
+
+ Many of the multiplications (e.g., q and 1-q for the round-trip time
+ average, a factor of 4 for the timeout interval) are or could be by
+ powers of two, and therefore could be implemented as simple shift
+ operations.
+
+
+
+
+
+Floyd, et al. Standards Track [Page 31]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+8.2. Sender Behavior When a Feedback Packet Is Received
+
+ This section discusses implementation issues for sender behavior when
+ a feedback packet is received, from Section 4.3.
+
+8.2.1. Determining If an Interval Was a Data-Limited Interval
+
+ When a feedback packet is received, the sender has to determine if
+ the entire interval covered by that feedback packet was a data-
+ limited period. This section discusses one possible implementation
+ for the sender to determine if the interval covered by a feedback
+ packet was a data-limited period.
+
+ If the feedback packets all report the timestamp of the last data
+ packet received, then let t_new be the timestamp reported by this
+ feedback packet. Because all feedback packets cover an interval of
+ at least a round-trip time, it is sufficient for the sender to
+ determine if there was any time in the period (t_old, t_new] when the
+ sender was not data-limited, for R the sender's estimate of the
+ round-trip time, and for t_old set to t_new - R. (This procedure
+ estimates the interval covered by the feedback packet, rather than
+ computing it exactly. This seems fine to us.)
+
+ The pseudocode for determining if the sender was data-limited over
+ the entire interval covered in a feedback packet is given below. The
+ variables NotLimited1 and NotLimited2 both represent times when the
+ sender was *not* data-limited.
+
+ Initialization:
+ NotLimited1 = NotLimited2 = t_new = t_next = 0;
+ t_now = current time;
+
+ After sending a segment:
+ If (sender has sent all it is allowed to send) {
+ // Sender is not data-limited at this instant.
+ If NotLimited1 <= t_new
+ // Goal: NotLimited1 > t_new.
+ NotLimited1 = t_now;
+ Else if (NotLimited2 <= t_next)
+ // Goal: NotLimited2 > t_next.
+ NotLimited2 = t_now;
+ }
+
+
+
+
+
+
+
+
+
+Floyd, et al. Standards Track [Page 32]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ When a feedback packet is received, is this interval data-limited:
+ t_new = timestamp reported in feedback packet.
+ t_old = t_new - R. // local variable
+ t_next = t_now;
+ If ((t_old < NotLimited1 <= t_new) or
+ (t_old < NotLimited2 <= t_new))
+ This was not a data-limited interval;
+ Else
+ This was a data-limited interval.
+ If (NotLimited1 <= t_new && NotLimited2 > t_new)
+ NotLimited1 = NotLimited2;
+
+ Transmission times refer to transmission of a segment or segments to
+ the layer below.
+
+ Between feedback packets, (t_old, t_new] gives the transmission time
+ interval estimated to be covered by the most recent feedback packet,
+ and t_next gives a time at least a round-trip time greater than
+ t_new. The next feedback packet can be expected to cover roughly the
+ interval (t_new, t_next] (unless the receiver sends the feedback
+ packet early because it is reporting a new loss event). The goal is
+ for NotLimited1 to save a non-data-limited time in (t_new, t_next],
+ if there was one, and for NotLimited2 to save a non-data-limited time
+ after t_next.
+
+ When a feedback packet was received, if either NotLimited1 or
+ NotLimited2 is in the time interval covered by the feedback packet,
+ then the interval is not a data-limited interval; the sender was not
+ data-limited at least once during that time interval. If neither
+ NotLimited1 nor NotLimited2 is in the time interval covered by a
+ feedback packet, then the sender is assumed to have been data-limited
+ over that time interval.
+
+ We note that this procedure is a heuristic, and in some cases the
+ sender might not determine correctly if the sender was data-limited
+ over the entire interval covered by the feedback packet. This
+ heuristic does not address the possible complications of reordering.
+
+ That seems acceptable to us. In order to improve its accuracy in
+ identifying if the entire interval covered by a feedback packet was a
+ data-limited interval, the sender could save more NotLimited times.
+
+ In some implementations of TFRC, the sender sends coarse-grained
+ timestamps that increment every quarter of a round-trip time, and the
+ feedback packet reports the greatest valid sequence number received
+ so far instead of reporting the timestamp of the last packet
+ received. In this case, the sender can maintain per-packet state to
+
+
+
+
+Floyd, et al. Standards Track [Page 33]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ determine t_new (the time that the acknowledged packet was sent), or
+ the sender can estimate t_new from its estimate of the round-trip
+ time and the elapsed time t_delay reported by the feedback packet.
+
+8.2.2. Maintaining X_recv_set
+
+ To reduce the complexity of maintaining X_recv_set, it is sufficient
+ to limit X_recv_set to at most N=3 elements. In this case, the
+ procedure Update X_recv_set() would be modified as follows:
+
+ Update X_recv_set():
+ Add X_recv to X_recv_set;
+ Delete from X_recv_set values older than
+ two round-trip times.
+ Keep only the most recent N values.
+
+ Maintaining at most *two* elements in X_recv_set would be sufficient
+ for the sender to save an old value of X_recv from before a data-
+ limited period, and to allow the sender not to be limited by the
+ first feedback packet after an idle period (reporting a receive rate
+ of one packet per round-trip time). However, it is *possible* that
+ maintaining at most two elements in X_recv_set would not give quite
+ as good performance as maintaining at most three elements.
+ Maintaining three elements in X_recv_set would allow X_recv_set to
+ contain X_recv values from two successive feedback packets, plus a
+ more recent X_recv value from a loss event.
+
+8.3. Sending Packets before Their Nominal Send Time
+
+ This section discusses one possible scheduling mechanism for a sender
+ in an operating system with a coarse-grained timing granularity (from
+ Section 4.6).
+
+ Let t_gran be the scheduling timer granularity of the operating
+ system. Let t_ipi be the inter-packet interval, as specified in
+ Section 4.6. If the operating system has a coarse timer granularity
+ or otherwise cannot support short t_ipi intervals, then either the
+ TFRC sender will be restricted to a sending rate of at most 1 packet
+ every t_gran seconds, or the TFRC sender must be allowed to send
+ short bursts of packets. In addition to allowing the sender to
+ accumulate sending credits for past unused send times, it can be
+ useful to allow the sender to send a packet before its scheduled send
+ time, as described in the section below.
+
+ A parameter, t_delta, may be used to allow a packet to be sent before
+ its nominal send time. Consider an application that becomes idle and
+ requests re-scheduling for time t_i = t_(i-1) + t_ipi, for t_(i-1)
+ the send time for the previous packet. When the application is
+
+
+
+Floyd, et al. Standards Track [Page 34]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ rescheduled, it checks the current time, t_now. If
+ (t_now > t_i - t_delta), then packet i is sent. When the nominal
+ send time, t_i, of the next packet is calculated, it may already be
+ the case that t_now > t_i - t_delta. In such a case, the packet
+ would be sent immediately.
+
+ In order to send at most one packet before its nominal send time, and
+ never to send a packet more than a round-trip time before its nominal
+ send time, the parameter t_delta would be set as follows:
+
+ t_delta = min(t_ipi, t_gran, rtt)/2;
+
+ (The scheduling granularity t_gran is 10 ms on some older Unix
+ systems.)
+
+ As an example, consider a TFRC flow with an allowed sending rate X of
+ 10 packets per round-trip time (PPR), a round-trip time of 100 ms, a
+ system with a scheduling granularity t_gran of 10 ms, and the ability
+ to accumulate unused sending credits for a round-trip time. In this
+ case, t_ipi is 1 ms. The TFRC sender would be allowed to send
+ packets 0.5 ms before their nominal sending time, and would be
+ allowed to save unused sending credits for 100 ms. The scheduling
+ granularity of 10 ms would not significantly affect the performance
+ of the connection.
+
+ As a different example, consider a TFRC flow with a scheduling
+ granularity greater than the round-trip time, for example, with a
+ round-trip time of 0.1 ms and a system with a scheduling granularity
+ of 1 ms, and with the ability to accumulate unused sending credits
+ for a round-trip time. The TFRC sender would be allowed to save
+ unused sending credits for 0.1 ms. If the scheduling granularity
+ *did not* affect the sender's response to an incoming feedback
+ packet, then the TFRC sender would be able to send an RTT of data (as
+ determined by the allowed sending rate) each RTT, in response to
+ incoming feedback packets. In this case, the coarse scheduling
+ granularity would not significantly reduce the sending rate, but the
+ sending rate would be bursty, with a round-trip time of data sent in
+ response to each feedback packet.
+
+ However, performance would be different, in this case, if the
+ operating system scheduling granularity affected the sender's
+ response to feedback packets as well as the general scheduling of the
+ sender. In this case, the sender's performance would be severely
+ limited by the scheduling granularity being greater than the round-
+ trip time, with the sender able to send an RTT of data, at the
+ allowed sending rate, at most once every 1 ms. This restriction of
+ the sending rate is an unavoidable consequence of allowing burstiness
+ of at most a round-trip time of data.
+
+
+
+Floyd, et al. Standards Track [Page 35]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+8.4. Calculation of the Average Loss Interval
+
+ The calculation of the average loss interval in Section 5.4 involves
+ multiplications by the weights w_0 to w_(n-1), which for n=8 are:
+
+ 1.0, 1.0, 1.0, 1.0, 0.8, 0.6, 0.4, 0.2.
+
+ With a minor loss of smoothness, it would be possible to use weights
+ that were powers of two or sums of powers of two, e.g.,
+
+ 1.0, 1.0, 1.0, 1.0, 0.75, 0.5, 0.25, 0.25.
+
+8.5. The Optional History Discounting Mechanism
+
+ The optional history discounting mechanism described in Section 5.5
+ is used in the calculation of the average loss rate. The history
+ discounting mechanism is invoked only when there has been an
+ unusually long interval with no packet losses. For a more efficient
+ operation, the discount factor, DF_i, could be restricted to be a
+ power of two.
+
+9. Changes from RFC 3448
+
+9.1. Overview of Changes
+
+ This section summarizes the changes from RFC 3448. At a high level,
+ the main change is to add mechanisms to address the case of a data-
+ limited sender. This document also explicitly allows the TFRC sender
+ to accumulate up to a round-trip time of unused send credits, and as
+ a result to send a burst of packets if data arrives from the
+ application in a burst after a data-limited period. This issue was
+ not explicitly addressed in RFC 3448.
+
+ This document changes RFC 3448 to incorporate TCP's higher initial
+ sending rates from RFC 3390. This document also changes RFC 3448 to
+ allow RFC 4342's use of a coarse-grained timestamp on data packets
+ instead of a more fine-grained timestamp.
+
+ Other changes address corner cases involving slow-start, the response
+ when the first data packet is dropped, and the like. This document
+ also incorporates the items in the RFC 3448 Errata.
+
+ This section is non-normative; the normative text is in the cited
+ sections.
+
+
+
+
+
+
+
+Floyd, et al. Standards Track [Page 36]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+9.2. Changes in Each Section
+
+ Section 4.1, estimating the average segment size: Section 4.1 was
+ modified to give a specific algorithm that could be used for
+ estimating the average segment size.
+
+ Section 4.2, update to the initial sending rate: In RFC 3448, the
+ initial sending rate was two packets per round-trip time. In this
+ document, the initial sending rate can be as high as four packets per
+ round-trip time, following RFC 3390. The initial sending rate was
+ changed to be in terms of the segment size s, not in terms of the
+ MSS.
+
+ Section 4.2 now says that tld, the Time Last Doubled during slow-
+ start, can be initialized to either 0 or to -1. Section 4.2 was also
+ clarified to say that RTT measurements do not only come from feedback
+ packets; they could also come from other places, such as the SYN
+ exchange.
+
+ Section 4.3, response to feedback packets: Section 4.3 was modified
+ to change the way that the receive rate is used in limiting the
+ sender's allowed sending rate, by using the set of receive rate
+ values of the last two round-trip times, and initializing the set of
+ receive rate values by a large value.
+
+ The larger initial sending rate in Section 4.2 is of little use if
+ the receiver sends a feedback packet after the first packet is
+ received, and the sender, in response, reduces the allowed sending
+ rate to at most two packets per RTT, which would be twice the receive
+ rate. Because of the change in the sender's processing of the
+ receive rate, the sender now does not reduce the allowed sending rate
+ to twice the reported receive rate in response to the first feedback
+ packet.
+
+ During a data-limited period, the sender saves the receive rate
+ reported from just before the data-limited period, if it is larger
+ than the receive rate during the data-limited period. The sender
+ also reduces the saved values in X_recv_set in response to a loss
+ during a data-limited period. Appendix C discusses this response
+ further.
+
+ Section 4.4, response to an idle period: Following Section 5.1 from
+ [RFC4342], this document specifies that when the sending rate is
+ reduced after an idle period that covers the period since the
+ nofeedback timer was set, the allowed sending rate is not reduced
+ below the initial sending rate. (In Section 4.4, the variable
+ recover_rate is set to the initial sending rate.)
+
+
+
+
+Floyd, et al. Standards Track [Page 37]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ Section 4.4, correction from [RFC3448Err]. RFC 3448 had
+ contradictory text about whether the sender halved its sending rate
+ after *two* round-trip times without receiving a feedback report, or
+ after *four* round-trip times. This document clarifies that the
+ sender halves its sending rate after four round-trip times without
+ receiving a feedback report [RFC3448Err].
+
+ Section 4.4, clarification for slow-start: Section 4.4 was clarified
+ to specify that on the expiration of the nofeedback timer, if p = 0,
+ X_Bps cannot be used, because the sender does not yet have a value
+ for X_Bps. Section 4.4 was also clarified to check the case when the
+ sender does not yet have an RTT sample, but has sent a packet since
+ the nofeedback timer was set.
+
+ Section 4.6: credits for unused send time:
+
+ Section 4.6 has been clarified to say that the TFRC sender gets to
+ accumulate up to an RTT of credits for unused send time. Section 4.6
+ was also rewritten to clarify what is specification and what is
+ implementation.
+
+ Section 5.4, clarification: Section 5.4 was modified to clarify the
+ receiver's calculation of the average loss interval when the receiver
+ has not yet seen n loss intervals.
+
+ Section 5.5, correction: Section 5.5 was corrected to say that the
+ loss interval I_0 includes all transmitted packets, including lost
+ and marked packets (as defined in Section 5.3 in the general
+ definition of loss intervals).
+
+ Section 5.5, correction from [RFC3448Err]: A line in Section 5.5 was
+ changed from
+
+ for (i = 1 to n) { DF_i = 1; }
+
+ to
+
+ for (i = 0 to n) { DF_i = 1; }
+
+ [RFC3448Err].
+
+ Section 5.5, history discounting: THRESHOLD, the lower bound on the
+ history discounting parameter DF, has been changed from 0.5 to 0.25,
+ to allow more history discounting when the current interval is long.
+
+ Section 6, multiple feedback packets: Section 6 now contains more
+ discussion of procedures if the receiver sends multiple feedback
+ packets each round-trip time.
+
+
+
+Floyd, et al. Standards Track [Page 38]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ Section 6.3, initialization of the feedback timer: Section 6.3 now
+ specifies the receiver's initialization of the feedback timer if the
+ first data packet received does not have an estimate of the round-
+ trip time.
+
+ Section 6.3, a coarse-grained timestamp: Section 6.3 was modified to
+ incorporate, as an option, a coarse-grained timestamp from the sender
+ that increments every quarter of a round-trip time, instead of a more
+ fine-grained timestamp. This follows RFC 4342.
+
+ Section 6.3.1, after the first loss event: Section 6.3.1 now says
+ that for initializing the loss history after the first loss event,
+ the receiver uses the maximum receive rate so far, instead of the
+ receive rate in the last round-trip time.
+
+ Section 6.3.1, if the first data packet is dropped: Section 6.3.1 now
+ contains a specification for initializing the loss history if the
+ first data packet sent is lost or ECN-marked.
+
+ Section 7, sender-based variants: Section 7's discussion of sender-
+ based variants has been expanded, with reference to RFC 4342.
+
+10. Security Considerations
+
+ TFRC is not a transport protocol in its own right, but a congestion
+ control mechanism that is intended to be used in conjunction with a
+ transport protocol. Therefore, security primarily needs to be
+ considered in the context of a specific transport protocol and its
+ authentication mechanisms.
+
+ Congestion control mechanisms can potentially be exploited to create
+ denial of service. This may occur through spoofed feedback. Thus,
+ any transport protocol that uses TFRC should take care to ensure that
+ feedback is only accepted from the receiver of the data. The precise
+ mechanism to achieve this will however depend on the transport
+ protocol itself.
+
+ In addition, congestion control mechanisms may potentially be
+ manipulated by a greedy receiver that wishes to receive more than its
+ fair share of network bandwidth. A receiver might do this by
+ claiming to have received packets that, in fact, were lost due to
+ congestion. Possible defenses against such a receiver would normally
+ include some form of nonce that the receiver must feed back to the
+ sender to prove receipt. However, the details of such a nonce would
+ depend on the transport protocol, and in particular on whether the
+ transport protocol is reliable or unreliable.
+
+
+
+
+
+Floyd, et al. Standards Track [Page 39]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ We expect that protocols incorporating ECN with TFRC will also want
+ to incorporate feedback from the receiver to the sender using the ECN
+ nonce [RFC3540]. The ECN nonce is a modification to ECN that
+ protects the sender from the accidental or malicious concealment of
+ marked packets. Again, the details of such a nonce would depend on
+ the transport protocol, and are not addressed in this document.
+
+10.1. Security Considerations for TFRC in DCCP
+
+ TFRC is currently used in Congestion Control ID 3 (CCID 3) [RFC4342]
+ of the Datagram Congestion Control Protocol (DCCP) [RFC4340]. The
+ Security Considerations section of RFC 4340 [RFC4340] (Section 18)
+ discusses some of the security issues of DCCP, including sequence
+ number validity checks to protect against hijacked connections.
+ Section 18 of RFC 4340 also discusses mechanisms in DCCP to limit the
+ potential impact of denial-of-service attacks.
+
+ RFC 4342 specifies the use of TFRC in CCID 3. RFC 4342 includes
+ extensive discussions of the mechanisms the sender can use to verify
+ the information sent by the receiver. When ECN is used with CCID 3,
+ the receiver returns ECN Nonce information to the sender, to allow
+ the sender to verify information sent by the receiver. When ECN is
+ not used, Section 9 of RFC 4342 discusses how the sender could still
+ use various techniques that might catch the receiver in an error in
+ reporting congestion. However, as stated in RFC 4342, this is not as
+ robust or non-intrusive as the verification provided by the ECN
+ Nonce.
+
+11. Acknowledgments
+
+ We would like to acknowledge feedback and discussions on equation-
+ based congestion control with a wide range of people, including
+ members of the Reliable Multicast Research Group, the Reliable
+ Multicast Transport Working Group, and the End-to-End Research Group.
+ We would like to thank Dado Colussi, Gorry Fairhurst, Ladan Gharai,
+ Wim Heirman, Eddie Kohler, Ken Lofgren, Mike Luby, Ian McDonald,
+ Vladimir Moltchanov, Colin Perkins, Michele R., Gerrit Renker, Arjuna
+ Sathiaseelan, Vladica Stanisic, Randall Stewart, Eduardo Urzaiz,
+ Shushan Wen, and Wendy Lee (lhh@zsu.edu.cn) for feedback on earlier
+ versions of this document, and to thank Mark Allman for his extensive
+ feedback from using [RFC3448] to produce a working implementation.
+
+
+
+
+
+
+
+
+
+
+Floyd, et al. Standards Track [Page 40]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+Appendix A. Terminology
+
+ This document uses the following terms. Timer variables (e.g.,
+ t_now, tld) are assumed to be in seconds, with a timer resolution of
+ at least a millisecond.
+
+ data-limited interval:
+ An interval where the sender is data-limited (not sending as much
+ as it is allowed to send) over the entire interval (Section 4.3).
+
+ DF: Discount factor for a loss interval (Section 5.5).
+
+ initial_rate:
+ Allowed initial sending rate.
+
+ last_counter:
+ Greatest received value of the window counter (Section 6.3).
+
+ n: Number of loss intervals.
+
+ NDUPACK:
+ Number of dupacks for inferring loss (constant) (Section 5.1).
+
+ nofeedback timer:
+ Sender-side timer (Section 4).
+
+ p: Estimated Loss Event Rate.
+
+ p_prev:
+ Previous value of p (Section 6.1).
+
+ q: Filter constant for RTT (constant) (Section 4.3).
+
+ q2: Filter constant for long-term RTT (constant) (Section 4.6).
+
+ R: Estimated path round-trip time.
+
+ R_m:
+ A specific estimate of the path round-trip time (Sections 4.3, 6).
+
+ R_sample:
+ Measured path RTT (Section 4.3).
+
+ R_sqmean:
+ Long-term estimate of the square root of the RTT (Section 4.6).
+
+ recover_rate:
+ Allowed rate for resuming after an idle period (Section 4.4).
+
+
+
+Floyd, et al. Standards Track [Page 41]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ recv_limit;
+ Limit on sending rate computed from X_recv_set (Section 4.3).
+
+ s: Nominal packet size in bytes.
+
+ S: Sequence number.
+
+ t_delay:
+ Reported time delay between receipt of the last packet at the
+ receiver and the generation of the feedback packet (Section
+ 3.2.2).
+
+ t_delta:
+ Parameter for flexibility in send time (Section 8.3).
+
+ t_gran:
+ Scheduling timer granularity of the operating system (constant)
+ (Section 8.3).
+
+ t_ipi:
+ Inter-packet interval for sending packets (Section 4.6).
+
+ t_mbi:
+ Maximum RTO value of TCP (constant) (Section 4.3).
+
+ t_recvdata:
+ Timestamp of the last data packet received (Section 3.2.2).
+
+ timer_limit:
+ Limit on the sending rate from the expiration of the nofeedback
+ timer (Section 4.4).
+
+ tld:
+ Time Last Doubled (Section 4.2).
+
+ t_now:
+ Current time (Section 4.3).
+
+ t_RTO:
+ Estimated RTO of TCP (Section 4.3).
+
+ X: Allowed transmit rate, as limited by the receive rate.
+
+ X_Bps:
+ Calculated sending rate in bytes per second (Section 3.1).
+
+ X_pps:
+ Calculated sending rate in packets per second (Section 3.1).
+
+
+
+Floyd, et al. Standards Track [Page 42]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ X_inst:
+ Instantaneous allowed transmit rate (Section 4.6).
+
+ X_recv:
+ Estimated receive rate at the receiver (Section 3.2.2).
+
+ X_recv_set:
+ A small set of recent X_recv values (Section 4.3).
+
+ X_target:
+ The target sending rate after the first loss event (Section
+ 6.3.1).
+
+ W_init:
+ TCP initial window (constant) (Section 4.2).
+
+Appendix B. The Initial Value of the Nofeedback Timer
+
+ Why is the initial value of TFRC's nofeedback timer set to two
+ seconds, instead of the recommended initial value of three seconds
+ for TCP's retransmit timer, from [RFC2988]? There is not any
+ particular reason why TFRC's nofeedback timer should have the same
+ initial value as TCP's retransmit timer. TCP's retransmit timer is
+ used not only to reduce the sending rate in response to congestion,
+ but also to retransmit a packet that is assumed to have been dropped
+ in the network. In contrast, TFRC's nofeedback timer is only used to
+ reduce the allowed sending rate, not to trigger the sending of a new
+ packet. As a result, there is no danger to the network for the
+ initial value of TFRC's nofeedback timer to be smaller than the
+ recommended initial value for TCP's retransmit timer.
+
+ Further, when the nofeedback timer has not yet expired, TFRC has a
+ more slowly responding congestion control mechanism than TCP, and
+ TFRC's use of the receive rate for limiting the sending rate is
+ somewhat less precise than TCP's use of windows and ack-clocking, so
+ the nofeedback timer is a particularly important safety mechanism for
+ TFRC. For all of these reasons, it is perfectly reasonable for
+ TFRC's nofeedback timer to have a smaller initial value than that of
+ TCP's retransmit timer.
+
+
+
+
+
+
+
+
+
+
+
+
+Floyd, et al. Standards Track [Page 43]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+Appendix C. Response to Idle or Data-Limited Periods
+
+ Future work could explore alternate responses to using the receive
+ rate during a data-limited period, and to responding to a loss event
+ during a data-limited period.
+
+ In particular, an Experimental RFC [RFC2861] specifies Congestion
+ Window Validation (CWV) for TCP. For this discussion, we use the
+ term "Standard TCP" to refer to the TCP congestion control mechanisms
+ in [RFC2581] and [RFC2581bis]. [RFC2861] specifies a different
+ response to idle or data-limited periods than those of Standard TCP.
+ With CWV, the TCP sender halves the congestion window after each RTO
+ during an idle period, down to the initial window. Similarly, with
+ CWV the TCP sender halves the congestion window half-way down to the
+ flight size after each RTO during a data-limited period.
+
+ This document already specifies a TFRC response to idle periods that
+ is similar to that of TCP with Congestion Window Validation.
+ However, this document does not specify a TFRC response to data-
+ limited periods similar to that of CWV. Adding such a mechanism to
+ TFRC would require a one-line change to step (4) of Section 4.3. In
+ particular, the sender's response to a feedback packet could be
+ changed from:
+
+ If (the entire interval covered by the feedback packet
+ was a data-limited interval) {
+ If (the feedback packet reports a new loss event or an
+ increase in the loss event rate p) {
+ Halve entries in X_recv_set;
+ X_recv = 0.85 * X_recv;
+ Maximize X_recv_set();
+ recv_limit = max (X_recv_set);
+ } Else {
+ Maximize X_recv_set();
+ recv_limit = 2 * max (X_recv_set);
+ }
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Floyd, et al. Standards Track [Page 44]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ to:
+
+ If (the entire interval covered by the feedback packet
+ was a data-limited interval) {
+ Multiply old entries in X_recv_set by 0.85;
+ If (the feedback packet reports a new loss event or an
+ increase in the loss event rate p) {
+ Multiply new value X_recv by 0.85.
+ }
+ Maximize X_recv_set();
+ recv_limit = 2 * max (X_recv_set);
+ }
+
+ In particular, if the receive rate from before a data-limited period
+ is saved in X_recv_set, then the change in step (4) above would
+ multiply that receive rate by 0.85 each time that a feedback packet
+ is received and the above code is executed. As a result, after four
+ successive round-trip times of data-limited intervals, the receive
+ rate from before the data-limited period would be reduced by 0.85^4 =
+ 0.52. Thus, this one-line change to step (4) of Section 4.3 would
+ result in the allowed sending rate being halved for each four
+ roundtrip times in which the sender was data-limited. Because of the
+ nature of X_recv_set, this mechanism would never reduce the allowed
+ sending rate below twice the most recent receive rate.
+
+ We note that in the suggested code above, with CWV-style behavior in
+ response to data-limited intervals, we keep
+
+ recv_limit = 2 * max (X_recv_set);
+
+ instead of using
+
+ recv_limit = max (X_recv_set);
+
+ following loss events in data-limited intervals. This relaxed
+ response to a loss event is allowed because the CWV-style behavior
+ itself limits rapid fluctuations in the sending rate during data-
+ limited periods.
+
+C.1. Long Idle or Data-Limited Periods
+
+ Table 1 summarizes the response of Standard TCP [RFC2581], TCP with
+ Congestion Window Validation [RFC2861], Standard TFRC [RFC3448], and
+ Revised TFRC (this document) in response to long idle or data-limited
+ periods. For the purposes of this section, we define a long period
+ as a period of at least an RTO.
+
+
+
+
+
+Floyd, et al. Standards Track [Page 45]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ Protocol Long idle periods Long data-limited periods
+ -------------- -------------------- ----------------------
+ Standard TCP: Window -> initial. Window increases for
+ each cwnd of data.
+
+ TCP with CWV: Halve window Reduce window half way
+ (not below initial cwnd). to used window.
+
+ Standard TFRC: Halve rate Rate limited to
+ (not below 2 pkts/rtt). twice receive rate.
+ One RTT after sending pkt,
+ rate is limited by X_recv.
+
+ Revised TFRC: Halve rate Rate limited to twice
+ (not below initial rate). max (current X_recv,
+ receive rate before
+ data-limited period).
+
+ Table 1: Response to Long Idle or Data-Limited Periods
+
+ Standard TCP after long idle periods: For Standard TCP, [RFC2581]
+ specifies that TCP SHOULD set the congestion window to no more than
+ the initial window after an idle period of at least an RTO. (To be
+ precise, RFC 2581 specifies that the TCP sender should set cwnd to
+ the initial window if the sender has not sent data in an interval
+ exceeding the retransmission timeout.)
+
+ Standard TCP after long data-limited periods: Standard TCP [RFC2581]
+ does not reduce TCP's congestion window after a data-limited period,
+ when the congestion window is not fully used. Standard TCP in
+ [RFC2581] uses the FlightSize, the amount of outstanding data in the
+ network, only in setting the slow-start threshold after a retransmit
+ timeout. Standard TCP is not limited by TCP's ack-clocking mechanism
+ during a data-limited period.
+
+ Standard TCP's lax response to a data-limited period is quite
+ different from its stringent response to an idle period.
+
+ TCP with Congestion Window Validation (CWV) after long idle periods:
+ As an experimental alternative, [RFC2861] specifies a more moderate
+ response to an idle period than that of Standard TCP, where during an
+ idle period the TCP sender halves cwnd after each RTO, down to the
+ initial cwnd.
+
+ TCP with Congestion Window Validation after long data-limited
+ periods: As an experimental alternative, [RFC2861] specifies a more
+ stringent response to a data-limited period than that of Standard
+ TCP, where after each RTO seconds of a data-limited period, the
+
+
+
+Floyd, et al. Standards Track [Page 46]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ congestion window is reduced half way down to the window that is
+ actually used.
+
+ The response of TCP with CWV to an idle period is similar to its
+ response to a data-limited period. TCP with CWV is less restrictive
+ than Standard TCP in response to an idle period, and more restrictive
+ than Standard TCP in response to a data-limited period.
+
+ Standard TFRC after long idle periods: For Standard TFRC, [RFC3448]
+ specifies that the allowed sending rate is halved after each RTO
+ seconds of an idle period. The allowed sending rate is not reduced
+ below two packets per RTT after idle periods. After an idle period,
+ the first feedback packet received reports a receive rate of one
+ packet per round-trip time, and this receive rate is used to limit
+ the sending rate. Standard TFRC effectively slow-starts up from this
+ allowed sending rate.
+
+ Standard TFRC after long data-limited periods: [RFC3448] does not
+ distinguish between data-limited and non-data-limited periods. As a
+ consequence, the allowed sending rate is limited to at most twice the
+ receive rate during and after a data-limited period. This is a very
+ restrictive response, more restrictive than that of either Standard
+ TCP or of TCP with CWV.
+
+ Revised TFRC after long idle periods: For Revised TFRC, this document
+ specifies that the allowed sending rate is halved after each RTO
+ seconds of an idle period. The allowed sending rate is not reduced
+ below the initial sending rate as the result of an idle period. The
+ first feedback packet received after the idle period reports a
+ receive rate of one packet per round-trip time. However, the Revised
+ TFRC sender does not use this receive rate for limiting the sending
+ rate. Thus, Revised TFRC differs from Standard TFRC in the lower
+ limit used in the reduction of the sending rate, and in the better
+ response to the first feedback packet received after the idle period.
+
+ Revised TFRC after long data-limited periods: For Revised TFRC, this
+ document distinguishes between data-limited and non-data-limited
+ periods. As specified in Section 4.3, during a data-limited period
+ Revised TFRC remembers the receive rate before the data-limited
+ period began, and does not reduce the allowed sending rate below
+ twice that receive rate. This is somewhat similar to the response of
+ Standard TCP, and is quite different from the very restrictive
+ response of Standard TFRC to a data-limited period. However, the
+ response of Revised TFRC is not as conservative as the response of
+ TCP with Congestion Window Validation, where the congestion window is
+ gradually reduced down to the window actually used during a data-
+ limited period.
+
+
+
+
+Floyd, et al. Standards Track [Page 47]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ We note that for current TCP implementations, the congestion window
+ is generally not increased during a data-limited period (when the
+ current congestion window is not being fully used) [MAF05] (Section
+ 5.7). We note that there is no mechanism comparable to this in
+ Revised TFRC.
+
+ Recovery after idle or data-limited periods: When TCP reduces the
+ congestion window after an idle or data-utilized period, TCP can set
+ the slow-start threshold, ssthresh, to allow the TCP sender to slow-
+ start back up towards its old sending rate when the idle or data-
+ limited period is over. However, in TFRC, even when the TFRC
+ sender's sending rate is restricted by twice the previous receive
+ rate, this results in the sender being able to double the sending
+ rate from one round-trip time to the next, if permitted by the
+ throughput equation. Thus, TFRC does not need a mechanism such as
+ TCP's setting of ssthresh to allow a slow-start after an idle or
+ data-limited period.
+
+ For future work, one avenue to explore would be the addition of
+ Congestion Window Validation mechanisms for TFRC's response to data-
+ limited periods. Currently, following Standard TCP, during data-
+ limited periods Revised TFRC does not limit its allowed sending rate
+ as a function of the receive rate.
+
+C.2. Short Idle or Data-Limited Periods
+
+ Table 2 summarizes the response of Standard TCP [RFC2581], TCP with
+ Congestion Window Validation [RFC2861], Standard TFRC [RFC3448], and
+ Revised TFRC (this document) in response to short idle or data-
+ limited periods. For the purposes of this section, we define a short
+ period as a period of less than an RTT.
+
+ Protocol Short idle periods Short data-limited periods
+ -------------- -------------------- ----------------------
+ Standard TCP: Send a burst up to cwnd. Send a burst up to cwnd.
+
+ TCP with CWV: Send a burst up to cwnd. Send a burst up to cwnd.
+
+ Standard TFRC: ? ?
+
+ Revised TFRC: Send a burst Send a burst
+ (up to an RTT of (up to an RTT of
+ unused send credits). unused send credits).
+
+ Table 2: Response to Short Idle or Data-Limited Periods
+
+ Table 2 shows that Revised TFRC has a similar response to that of
+ Standard TCP and of TCP with CWV to a short idle or data-limited
+
+
+
+Floyd, et al. Standards Track [Page 48]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ period. For a short idle or data-limited period, TCP is limited only
+ by the size of the unused congestion window, and Revised TFRC is
+ limited only by the number of unused send credits (up to an RTT's
+ worth). For Standard TFRC, [RFC3448] did not explicitly specify the
+ behavior with respect to unused send credits.
+
+C.3. Moderate Idle or Data-Limited Periods
+
+ Table 3 summarizes the response of Standard TCP [RFC2581], TCP with
+ Congestion Window Validation [RFC2861], Standard TFRC [RFC3448], and
+ Revised TFRC (this document) in response to moderate idle or data-
+ limited periods. For the purposes of this section, we define a
+ moderate period as a period greater than an RTT, but less than an
+ RTO.
+
+ Protocol Moderate idle periods Moderate data-limited periods
+ ------------- --------------------- -------------------------
+ Standard TCP: Send a burst up to cwnd. Send a burst up to cwnd.
+
+ TCP with CWV: Send a burst up to cwnd. Send a burst up to cwnd.
+
+ Standard TFRC: ? Limited by X_recv.
+
+ Revised TFRC: Send a burst Send a burst
+ (up to an RTT of (up to an RTT of
+ unused send credits). unused send credits).
+
+ Table 3: Response to Moderate Idle or Data-Limited Periods
+
+ Table 3 shows that Revised TFRC has a similar response to that of
+ Standard TCP and of TCP with CWV to a moderate idle or data-limited
+ period. For a moderate idle or data-limited period, TCP is limited
+ only by the size of the unused congestion window. For a moderate
+ idle period, Revised TFRC is limited only by the number of unused
+ send credits (up to an RTT's worth). For a moderate data-limited
+ period, Standard TFRC would be limited by X_recv from the most recent
+ feedback packet. In contrast, Revised TFRC is not limited by the
+ receive rate from data-limited periods that cover an entire feedback
+ period of a round-trip time. For Standard TFRC, [RFC3448] did not
+ explicitly specify the behavior with respect to unused send credits.
+
+
+
+
+
+
+
+
+
+
+
+Floyd, et al. Standards Track [Page 49]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+C.4. Losses During Data-Limited Periods
+
+ This section discusses the response to a loss during a data-limited
+ period.
+
+ Protocol Response to a loss during a data-limited period
+ ------------- -----------------------------------------------
+ Standard TCP: Set ssthresh, cwnd to FlightSize/2.
+
+ TCP with CWV: Same as Standard TCP.
+
+ Standard TFRC: Calculate X_Bps, send at most 2*X_recv.
+
+ Revised TFRC: Calculate X_Bps, send at most recv_limit.
+ In addition, modify X_recv_set.
+
+ Table 4: Response to a Loss during a Data-Limited Period
+
+ In TCP [RFC2581], the response to a loss during a data-limited period
+ is the same as the response to a loss at any other time in TCP. This
+ response is to set the congestion window to half of the FlightSize,
+ where the FlightSize is the actual amount of unacknowledged data.
+ Thus, after a loss during a data-limited period, the TCP sender must
+ halve its allowed sending rate, as it normally does in response to a
+ loss.
+
+ In Standard TFRC, the response to a loss during a data-limited period
+ is also the same as the response to a loss at any other time in
+ Standard TFRC. The sending rate is limited by X_Bps, from the
+ throughput equation, and the sending rate is also limited by twice
+ X_recv, the most recent receive rate. As a result, after a loss in a
+ data-limited period, the sender can at most double its sending rate
+ to twice X_recv, even if the throughput equation X_Bps would allow a
+ sending rate much higher than that.
+
+ In Revised TFRC, there have been changes to the use of the receive
+ rate X_recv during data-limited intervals; the sender is limited to
+ sending at most recv_limit, where the sender can remember the receive
+ rate X_recv from just before the data-limited period. This allows
+ the sender to more than double its sending rate during data-limited
+ periods, up to the receive rate from before the data-limited period
+ (if allowed by the throughput equation as given in X_Bps). This is
+ similar to Standard TCP's practice of not reducing the window during
+ data-limited periods (in the absence of loss).
+
+ As with Standard TFRC, during a data-limited period the Revised TFRC
+ sender is sending less than is allowed by the throughput equation
+ X_Bps. After the loss event, the sender still might not want to be
+
+
+
+Floyd, et al. Standards Track [Page 50]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ sending as much as allowed by the recalculated value of X_Bps that
+ takes into account the new loss event. Revised TFRC adds an
+ additional mechanism to gradually limit the sender's sending rate
+ after losses during data-limited periods. Unlike TCP's response of
+ setting cwnd to half the FlightSize, this additional mechanism in
+ Revised TFRC uses TFRC's practice of using slowly-responding changes
+ for both increases and decreases in the allowed sending rate.
+
+ This is done in Revised TFRC (in step (4) of Section 4.3) by
+ decreasing the entry in X_recv_set after a loss in a data-limited
+ interval, and by allowing the sender to send at most max
+ (X_recv_set), instead of at most twice max (X_recv_set), in the
+ immediate round-trip time following the reported loss. Thus, the
+ 'price' for allowing the sender to send more than twice the most
+ immediately reported value of X_recv during a data-limited interval
+ is the introduction of an additional mechanism to reduce this allowed
+ sending rate following losses in data-limited periods.
+
+ In TFRC's response to a loss in a data-limited interval, we have
+ considered the following examples.
+
+ Example 1, Losses *after* a Data-Limited Period: This example shows
+ that losses after a data-limited period has ended are addressed by
+ the throughput equation X_Bps.
+
+ -------------------------------------------------------------------
+ Stage 1: Not data-limited.
+ Sending 100 packets per round-trip time (PPR).
+ Stage 2: Data-limited, sending 10 PPR.
+ Stage 3: Not data-limited.
+ Sending 100 PPR again, as allowed by X_Bps.
+ A packet loss in the first RTT of Stage 3.
+ X_Bps is updated,
+ Response of Revised TFRC: a slight reduction in the allowed sending
+ rate, depending on the number of packets since the last loss event.
+ -------------------------------------------------------------------
+
+ Table 5: Example 1, Losses after a Data-Limited Period
+
+ For example 1, when there is a packet loss in the first RTT of Stage
+ 3, this will be reflected in a modified value of X_Bps, and future
+ loss events would result in future reductions of the throughput
+ equation X_Bps. In particular, following TFRC's standard use of the
+ throughput equation [FHPW00] (Section A.2), the allowed TFRC sending
+ rate would be halved after something like five successive round-trip
+ times with loss.
+
+
+
+
+
+Floyd, et al. Standards Track [Page 51]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ Example 2, a Mildly Data-Limited Sender: This example considers
+ losses in a data-limited period when, during the data-limited period,
+ the sender is sending *almost* as much as it is allowed to send.
+
+ -------------------------------------------------------------------
+ Stage 1: Not data-limited. Sending 100 PPR.
+ Stage 2: Data-limited, sending 99 PPR.
+ A packet loss in Stage 2.
+ Response of Revised TFRC: a slight reduction in the allowed sending
+ rate, down to 85 PPR or less, depending on the number of packets
+ since the last loss event.
+ -------------------------------------------------------------------
+
+ Table 6: Example 2, a Mildly Data-Limited Sender
+
+ Consider a Revised TFRC connection where the sender has been sending
+ a hundred PPR and then enters a data-limited period of sending only
+ 99 PPR because of data limitations from the application. (That is,
+ at every instance of time during the data-limited period, the sender
+ could have sent one more packet.) If there are losses in the data-
+ limited period, the allowed sending rate is reduced to min(X_Bps,
+ recv_limit), where both the throughput equation X_Bps and the limit
+ recv_limit force a slight reduction in the allowed sending rate.
+
+ Example 3, a Single Packet Loss during a Data-Limited Period. This
+ example considers the loss of a single packet during a data-limited
+ period, after the sender has not sent a packet for two RTTs.
+
+ -------------------------------------------------------------------
+ Stage 1: Not data-limited. Sending 100 PPR.
+ Stage 2: Data-limited, sending 10 PPR.
+ Stage 3: Data-limited, sending no data for two RTTs.
+ Stage 4: Data-limited, sending one packet, which is ECN-marked.
+ Response of Revised TFRC: a reduction in the allowed sending
+ rate, down to 50 PPR or less. For each loss event during
+ the data-limited period, the 'remembered' X_recv from before
+ the data-limited period is effectively halved.
+ -------------------------------------------------------------------
+
+ Table 7: Example 3, a Single Packet Loss
+
+ Consider a Revised TFRC connection where the sender has been sending
+ a hundred PPR, and then enters a data-limited period of sending only
+ ten PPR, and then does not send any packets for two RTTs, and then
+ sends a single packet, which is ECN-marked. In this case, with
+ Revised TFRC, for each loss event during the data-limited period, the
+ sender halves its 'remembered' X_recv from before the data-limited
+ period
+
+
+
+Floyd, et al. Standards Track [Page 52]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ Example 4, Losses after Increasing the Sending Rate during a Data-
+ Limited Period. This example considers losses when the sender
+ significantly increases its sending rate during a data-limited
+ period.
+
+ -------------------------------------------------------------------
+ Stage 1: Not data-limited. Sending 100 PPR.
+ Stage 2: Data-limited, sending 1 PPR.
+ Stage 3: Data-limited, sending 20 PPR.
+ Several packets are lost in each RTT of Stage 3.
+ During Stage 3, the sender would *like* to send 20 PPR.
+ Response of Revised TFRC: For each loss event during
+ the data-limited period, the 'remembered' X_recv from before
+ the data-limited period is effectively halved, and the most
+ recent X_recv is reduced by 0.85.
+ -------------------------------------------------------------------
+
+ Table 8: Example 4, Losses after Increasing the Sending Rate
+
+ Consider a Revised TFRC connection where the sender has been sending
+ a hundred PPR, and then enters a data-limited period of sending only
+ one PPR, and then, while still data-limited, increases its sending
+ rate to twenty PPR, where it experiences a number of successive loss
+ events.
+
+ In this case, with Revised TFRC, for each loss event during the
+ data-limited period, the sender halves its 'remembered' X_recv from
+ before the data-limited period, and the most recent X_recv is reduced
+ by 0.85.
+
+C.5. Other Patterns
+
+ Other possible patterns to consider in evaluating Revised TFRC would
+ be to compare the behavior of TCP, Standard TFRC, and Revised TFRC
+ for connections with alternating busy and idle periods, alternating
+ idle and data-limited periods, or with idle or data-limited periods
+ during slow-start.
+
+C.6. Evaluating TFRC's Response to Idle Periods
+
+ In this section we focus on evaluating Revised TFRC's response to
+ idle or data-limited periods.
+
+ One drawback to Standard TFRC's strict response to idle or data-
+ limited periods is that it could be seen as encouraging applications
+ to pad their sending rate during idle or data-limited periods, by
+ sending dummy data when there was no other data to send. Because
+ Revised TFRC has a less strict response to data-limited periods than
+
+
+
+Floyd, et al. Standards Track [Page 53]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ that of Standard TFRC, Revised TFRC also could be seen as giving
+ applications less of an incentive to pad their sending rates during
+ data-limited periods. Work in progress, such as Faster Restart
+ [KFS07], can also decrease an application's incentive to pad its
+ sending rate, by allowing faster start-up after idle periods.
+ Further research would be useful to understand, in more detail, the
+ interaction between TCP or TFRC's congestion control mechanisms, and
+ an application's incentive to pad its sending rate during idle or
+ data-limited periods.
+
+ TCP Congestion Window Validation, described in Appendix C.1 above, is
+ an Experimental standard specifying that the TCP sender slowly
+ reduces the congestion window during an idle or data-limited period
+ [RFC2861]. While TFRC and Revised TFRC's responses to idle periods
+ are roughly similar to those of TCP with Congestion Window
+ Validation, Revised TFRC's response to data-limited periods is less
+ conservative than those of TCP with Congestion Window Validation (and
+ Standard TFRC's response to data-limited periods was considerably
+ *more* conservative than those of Congestion Window Validation).
+ Future work could include modifications to this document so that the
+ response of Revised TFRC to a data-limited period includes a slow
+ reduction of the allowed sending rate; Section C specifies a possible
+ mechanism for this. Such a modification would be particularly
+ compelling if Congestion Window Validation became a Proposed Standard
+ in the IETF for TCP.
+
+References
+
+Normative References
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC3448] Handley, M., Floyd, S., Padhye, J., and J. Widmer, "TCP
+ Friendly Rate Control (TFRC): Protocol Specification",
+ RFC 3448, January 2003.
+
+Informative References
+
+ [BRS99] Balakrishnan, H., Rahul, H., and Seshan, S., "An
+ Integrated Congestion Management Architecture for
+ Internet Hosts," Proc. ACM SIGCOMM, Cambridge, MA,
+ September 1999.
+
+ [CCID-4] Floyd, S., and E. Kohler, "Profile for DCCP Congestion
+ Control ID 4: the Small-Packet Variant of TFRC
+ Congestion Control", Work in Progress, February 2008.
+
+
+
+
+Floyd, et al. Standards Track [Page 54]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ [FHPW00] S. Floyd, M. Handley, J. Padhye, and J. Widmer,
+ "Equation-Based Congestion Control for Unicast
+ Applications", August 2000, Proc SIGCOMM 2000.
+
+ [FHPW00a] S. Floyd, M. Handley, J. Padhye, and J. Widmer,
+ "Equation-Based Congestion Control for Unicast
+ Applications: the Extended Version", ICSI tech report
+ TR-00-03, March 2000.
+
+ [FF99] Floyd, S., and K. Fall, Promoting the Use of End-to-End
+ Congestion Control in the Internet, IEEE/ACM
+ Transactions on Networking, August 1999.
+
+ [KFS07] E. Kohler, S. Floyd, and A. Sathiaseelan, "Faster
+ Restart for TCP Friendly Rate Control (TFRC)", Work in
+ Progress, November 2007.
+
+ [MAF05] A. Medina, M. Allman, and S. Floyd, "Measuring the
+ Evolution of Transport Protocols in the Internet", ACM
+ Computer Communications Review, April 2005.
+
+ [PFTK98] Padhye, J. and Firoiu, V. and Towsley, D. and Kurose,
+ J., "Modeling TCP Throughput: A Simple Model and its
+ Empirical Validation", Proc ACM SIGCOMM 1998.
+
+ [RFC2140] Touch, J., "TCP Control Block Interdependence", RFC
+ 2140, April 1997.
+
+ [RFC2581] Allman, M., Paxson, V., and W. Stevens, "TCP Congestion
+ Control", RFC 2581, April 1999.
+
+ [RFC2581bis] Allman, M., Paxson, V., and W. Stevens, "TCP Congestion
+ Control", Work in Progress, April 2008.
+
+ [RFC2861] Handley, M., Padhye, J., and S. Floyd, "TCP Congestion
+ Window Validation", RFC 2861, June 2000.
+
+ [RFC2988] Paxson, V. and M. Allman, "Computing TCP's
+ Retransmission Timer", RFC 2988, November 2000.
+
+ [RFC3168] Ramakrishnan, K., Floyd, S., and D. Black, "The Addition
+ of Explicit Congestion Notification (ECN) to IP", RFC
+ 3168, September 2001.
+
+ [RFC3390] Allman, M., Floyd, S., and C. Partridge, "Increasing
+ TCP's Initial Window", RFC 3390, October 2002.
+
+
+
+
+
+Floyd, et al. Standards Track [Page 55]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+ [RFC3448Err] RFC 3448 Errata,
+ <http://www.rfc-editor.org/errata_search.php?rfc=3448>.
+
+ [RFC3540] Spring, N., Wetherall, D., and D. Ely, "Robust Explicit
+ Congestion Notification (ECN) Signaling with Nonces",
+ RFC 3540, June 2003.
+
+ [RFC4340] Kohler, E., Handley, M., and S. Floyd, "Datagram
+ Congestion Control Protocol (DCCP)", RFC 4340, March
+ 2006.
+
+ [RFC4342] Floyd, S., Kohler, E., and J. Padhye, "Profile for
+ Datagram Congestion Control Protocol (DCCP) Congestion
+ Control ID 3: TCP-Friendly Rate Control (TFRC)", RFC
+ 4342, March 2006.
+
+ [RFC4828] Floyd, S. and E. Kohler, "TCP Friendly Rate Control
+ (TFRC): The Small-Packet (SP) Variant", RFC 4828, April
+ 2007.
+
+ [W00] Widmer, J., "Equation-Based Congestion Control", Diploma
+ Thesis, University of Mannheim, February 2000,
+ <http://www.icir.org/tfrc/>.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Floyd, et al. Standards Track [Page 56]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+Authors' Addresses
+
+ Sally Floyd
+ ICSI
+ 1947 Center St, Suite 600
+ Berkeley, CA 94708
+ EMail: floyd@icir.org
+
+ Mark Handley,
+ Department of Computer Science
+ University College London
+ Gower Street
+ London WC1E 6BT
+ UK
+ EMail: M.Handley@cs.ucl.ac.uk
+
+ Jitendra Padhye
+ Microsoft Research
+ EMail: padhye@microsoft.com
+
+ Joerg Widmer
+ DoCoMo Euro-Labs
+ Landsberger Strasse 312
+ 80687 Munich
+ Germany
+ EMail: widmer@acm.org
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Floyd, et al. Standards Track [Page 57]
+
+RFC 5348 TFRC: Protocol Specification September 2008
+
+
+Full Copyright Statement
+
+ Copyright (C) The IETF Trust (2008).
+
+ This document is subject to the rights, licenses and restrictions
+ contained in BCP 78, and except as set forth therein, the authors
+ retain all their rights.
+
+ This document and the information contained herein are provided on an
+ "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
+ OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY, THE IETF TRUST AND
+ THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF
+ THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
+ WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+
+Intellectual Property
+
+ The IETF takes no position regarding the validity or scope of any
+ Intellectual Property Rights or other rights that might be claimed to
+ pertain to the implementation or use of the technology described in
+ this document or the extent to which any license under such rights
+ might or might not be available; nor does it represent that it has
+ made any independent effort to identify any such rights. Information
+ on the procedures with respect to rights in RFC documents can be
+ found in BCP 78 and BCP 79.
+
+ Copies of IPR disclosures made to the IETF Secretariat and any
+ assurances of licenses to be made available, or the result of an
+ attempt made to obtain a general license or permission for the use of
+ such proprietary rights by implementers or users of this
+ specification can be obtained from the IETF on-line IPR repository at
+ http://www.ietf.org/ipr.
+
+ The IETF invites any interested party to bring to its attention any
+ copyrights, patents or patent applications, or other proprietary
+ rights that may cover technology that may be required to implement
+ this standard. Please address the information to the IETF at
+ ietf-ipr@ietf.org.
+
+
+
+
+
+
+
+
+
+
+
+
+Floyd, et al. Standards Track [Page 58]
+