Request for Comments: 4342 ICIR
Category: Standards Track E. Kohler
UCLA
J. Padhye
Microsoft Research
March 2006
Profile for Datagram Congestion Control Protocol (DCCP)
Congestion Control ID 3: TCP-Friendly Rate Control (TFRC)
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.
Copyright Notice
Copyright (C) The Internet Society (2006).
Abstract
This document contains the profile for Congestion Control Identifier
3, TCP-Friendly Rate Control (TFRC), in the Datagram Congestion
Control Protocol (DCCP). CCID 3 should be used by senders that want
a TCP-friendly sending rate, possibly with Explicit Congestion
Notification (ECN), while minimizing abrupt rate changes.
Table of Contents
1. Introduction ....................................................2
2. Conventions .....................................................3
3. Usage ...........................................................3
3.1. Relationship with TFRC .....................................4
3.2. Half-Connection Example ....................................4
4. Connection Establishment ........................................5
5. Congestion Control on Data Packets ..............................5
5.1. Response to Idle and Application-Limited Periods ...........7
5.2. Response to Data Dropped and Slow Receiver .................8
5.3. Packet Sizes ...............................................9
6. Acknowledgements ................................................9
6.1. Loss Interval Definition ..................................10
6.1.1. Loss Interval Lengths ..............................12
6.2. Congestion Control on Acknowledgements ....................13
6.3. Acknowledgements of Acknowledgements ......................13
6.4. Determining Quiescence ....................................14
7. Explicit Congestion Notification ...............................14
8. Options and Features ...........................................14
8.1. Window Counter Value ......................................15
8.2. Elapsed Time Options ......................................17
8.3. Receive Rate Option .......................................17
8.4. Send Loss Event Rate Feature ..............................18
8.5. Loss Event Rate Option ....................................18
8.6. Loss Intervals Option .....................................18
8.6.1. Option Details .....................................19
8.6.2. Example ............................................20
9. Verifying Congestion Control Compliance with ECN ...............22
9.1. Verifying the ECN Nonce Echo ..............................22
9.2. Verifying the Reported Loss Intervals and Loss
Event Rate ................................................23
10. Implementation Issues .........................................23
10.1. Timestamp Usage ..........................................23
10.2. Determining Loss Events at the Receiver ..................24
10.3. Sending Feedback Packets .................................25
11. Security Considerations .......................................27
12. IANA Considerations ...........................................28
12.1. Reset Codes ..............................................28
12.2. Option Types .............................................28
12.3. Feature Numbers ..........................................28
13. Thanks ........................................................29
A. Appendix: Possible Future Changes to CCID 3 ....................30
Normative References ..............................................31
Informative References ............................................31
List of Tables
Table 1: DCCP CCID 3 Options ......................................14
Table 2: DCCP CCID 3 Feature Numbers ..............................15
1. Introduction
This document contains the profile for Congestion Control Identifier
3, TCP-Friendly Rate Control (TFRC), in the Datagram Congestion
Control Protocol (DCCP) [RFC4340]. DCCP uses Congestion Control
Identifiers, or CCIDs, to specify the congestion control mechanism in
use on a half-connection.
TFRC is a receiver-based congestion control mechanism that provides a
TCP-friendly sending rate while minimizing the abrupt rate changes
characteristic of TCP or of TCP-like congestion control [RFC3448].
The sender’s allowed sending rate is set in response to the loss
event rate, which is typically reported by the receiver to the
sender. See Section 3 for more on application requirements.
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].
All multi-byte numerical quantities in CCID 3, such as arguments to
options, are transmitted in network byte order (most significant byte
first).
A DCCP half-connection consists of the application data sent by one
endpoint and the corresponding acknowledgements sent by the other
endpoint. The terms "HC-Sender" and "HC-Receiver" denote the
endpoints sending application data and acknowledgements,
respectively. Since CCIDs apply at the level of half-connections, we
abbreviate HC-Sender to "sender" and HC-Receiver to "receiver" in
this document. See [RFC4340] for more discussion.
For simplicity, we say that senders send DCCP-Data packets and
receivers send DCCP-Ack packets. Both of these categories are meant
to include DCCP-DataAck packets.
The phrases "ECN-marked" and "marked" refer to packets marked ECN
Congestion Experienced unless otherwise noted.
This document uses a number of variables from [RFC3448], including
the following:
o X_recv: The receive rate in bytes per second. See [RFC3448],
Section 3.2.2.
o s: The packet size in bytes. See [RFC3448], Section 3.1.
o p: The loss event rate. See [RFC3448], Section 3.1.
3. Usage
CCID 3’s TFRC congestion control is appropriate for flows that would
prefer to minimize abrupt changes in the sending rate, including
streaming media applications with small or moderate receiver
buffering before playback. TCP-like congestion control, such as that
of DCCP’s CCID 2 [RFC4341], halves the sending rate in response to
each congestion event and thus cannot provide a relatively smooth
sending rate.
As explained in [RFC3448], Section 1, the penalty of having smoother
throughput than TCP while competing fairly for bandwidth with TCP is
that the TFRC mechanism in CCID 3 responds slower to changes in
available bandwidth than do TCP or TCP-like mechanisms. Thus, CCID 3
should only be used for applications with a requirement for smooth
throughput. For applications that simply need to transfer as much
data as possible in as short a time as possible, we recommend using
TCP-like congestion control, such as CCID 2.
CCID 3 should also not be used by applications that change their
sending rate by varying the packet size, rather than by varying the
rate at which packets are sent. A new CCID will be required for
these applications.
3.1. Relationship with TFRC
The congestion control mechanisms described here follow the TFRC
mechanism standardized by the IETF [RFC3448]. Conforming CCID 3
implementations MAY track updates to the TCP throughput equation
directly, as updates are standardized in the IETF, rather than wait
for revisions of this document. However, conforming implementations
SHOULD wait for explicit updates to CCID 3 before implementing other
changes to TFRC congestion control.
3.2. Half-Connection Example
This example shows the typical progress of a half-connection using
CCID 3’s TFRC Congestion Control, not including connection initiation
and termination. The example is informative, not normative.
1. The sender transmits DCCP-Data packets. Its sending rate is
governed by the allowed transmit rate as specified in [RFC3448],
Section 3.2. Each DCCP-Data packet has a sequence number and the
DCCP header’s CCVal field contains the window counter value, which
is used by the receiver in determining when multiple losses belong
in a single loss event.
In the typical case of an ECN-capable half-connection, each DCCP-
Data and DCCP-DataAck packet is sent as ECN Capable, with either
the ECT(0) or the ECT(1) codepoint set. The use of the ECN Nonce
with TFRC is described in Section 9.
2. The receiver sends DCCP-Ack packets acknowledging the data packets
at least once per round-trip time, unless the sender is sending at
a rate of less than one packet per round-trip time, as indicated
by the TFRC specification ([RFC3448], Section 6). Each DCCP-Ack
packet uses a sequence number, identifies the most recent packet
received from the sender, and includes feedback about the recent
loss intervals experienced by the receiver.
3. The sender continues sending DCCP-Data packets as controlled by
the allowed transmit rate. Upon receiving DCCP-Ack packets, the
sender updates its allowed transmit rate as specified in
[RFC3448], Section 4.3. This update is based on a loss event rate
calculated by the sender using the receiver’s loss intervals
feedback. If it prefers, the sender can also use a loss event
rate calculated and reported by the receiver.
4. The sender estimates round-trip times and calculates a nofeedback
time, as specified in [RFC3448], Section 4.4. If no feedback is
received from the receiver in that time (at least four round-trip
times), the sender halves its sending rate.
4. Connection Establishment
The client initiates the connection by using mechanisms described in
the DCCP specification [RFC4340]. During or after CCID 3
negotiation, the client and/or server may want to negotiate the
values of the Send Ack Vector and Send Loss Event Rate features.
5. Congestion Control on Data Packets
CCID 3 uses the congestion control mechanisms of TFRC [RFC3448]. The
following discussion summarizes information from [RFC3448], which
should be considered normative except where specifically indicated
otherwise.
Loss Event Rate
The basic operation of CCID 3 centers around the calculation of a
loss event rate: the number of loss events as a fraction of the
number of packets transmitted, weighted over the last several loss
intervals. This loss event rate, a round-trip time estimate, and the
average packet size are plugged into the TCP throughput equation, as
specified in [RFC3448], Section 3.1. The result is a fair transmit
rate close to what a modern TCP would achieve in the same conditions.
CCID 3 senders are limited to this fair rate.
The loss event rate itself is calculated in CCID 3 using recent loss
interval lengths reported by the receiver. Loss intervals are
precisely defined in Section 6.1. In summary, a loss interval is up
to 1 RTT of possibly lost or ECN-marked data packets, followed by an
arbitrary number of non-dropped, non-marked data packets. Thus, long
loss intervals represent low congestion rates. The CCID 3 Loss
Intervals option is used to report loss interval lengths; see Section
8.6.
Other Congestion Control Mechanisms
The sender starts in a slow-start phase, roughly doubling its allowed
sending rate each round-trip time. The slow-start phase is ended by
the receiver’s report of a data packet drop or mark, after which the
sender uses the loss event rate to calculate its allowed sending
rate.
[RFC3448], Section 4, specifies an initial sending rate of one packet
per round-trip time (RTT) as follows: The sender initializes the
allowed sending rate to one packet per second. As soon as a feedback
packet is received from the receiver, the sender has a measurement of
the round-trip time and then sets the initial allowed sending rate to
one packet per RTT. However, while the initial TCP window used to be
one segment, [RFC2581] allows an initial TCP window of two segments,
and [RFC3390] allows an initial TCP window of three or four segments
(up to 4380 bytes). [RFC3390] gives an upper bound on the initial
window of min(4*MSS, max(2*MSS, 4380 bytes)).
Therefore, in contrast to [RFC3448], the initial CCID 3 sending rate
is allowed to be at least two packets per RTT, and at most four
packets per RTT, depending on the packet size. The initial rate is
only allowed to be three or four packets per RTT when, in terms of
segment size, that translates to at most 4380 bytes per RTT.
The sender’s measurement of the round-trip time uses the Elapsed Time
and/or Timestamp Echo option contained in feedback packets, as
described in Section 8.2. The Elapsed Time option is required, while
the Timestamp Echo option is not. The sender maintains an average
round-trip time heavily weighted on the most recent measurements.
Each DCCP-Data packet contains a sequence number. Each DCCP-Data
packet also contains a window counter value, as described in Section
8.1. The window counter is generally incremented by one every
quarter round-trip time. The receiver uses it as a coarse-grained
timestamp to determine when a packet loss should be considered part
of an existing loss interval and when it must begin a new loss
interval.
Because TFRC is rate-based instead of window-based, and because
feedback packets can be dropped in the network, the sender needs some
mechanism for reducing its sending rate in the absence of positive
feedback from the receiver. As described in Section 6, the receiver
sends feedback packets roughly once per round-trip time. As
specified in [RFC3448], Section 4.3, the sender sets a nofeedback
timer to at least four round-trip times, or to twice the interval
between data packets, whichever is larger. If the sender hasn’t
received a feedback packet from the receiver when the nofeedback
timer expires, then the sender halves its allowed sending rate. The
allowed sending rate is never reduced below one packet per 64
seconds. Note that not all acknowledgements are considered feedback
packets, since feedback packets must contain valid Loss Intervals,
Elapsed Time, and Receive Rate options.
If the sender never receives a feedback packet from the receiver, and
as a consequence never gets to set the allowed sending rate to one
packet per RTT, then the sending rate is left at its initial rate of
one packet per second, with the nofeedback timer expiring after two
seconds. The allowed sending rate is halved each time the nofeedback
timer expires. Thus, if no feedback is received from the receiver,
the allowed sending rate is never above one packet per second and is
quickly reduced below one packet per second.
The feedback packets from the receiver contain a Receive Rate option
specifying the rate at which data packets arrived at the receiver
since the last feedback packet. The allowed sending rate can be at
most twice the rate received at the receiver in the last round-trip
time. This may be less than the nominal fair rate if, for example,
the application is sending less than its fair share.
5.1. Response to Idle and Application-Limited Periods
One consequence of the nofeedback timer is that the sender reduces
the allowed sending rate when the sender has been idle for a
significant period of time. In [RFC3448], Section 4.4, the allowed
sending rate is never reduced to fewer than two packets per round-
trip time as the result of an idle period. CCID 3 revises this to
take into account the larger initial windows allowed by [RFC3390]:
the allowed sending rate is never reduced to less than the [RFC3390]
initial sending rate as the result of an idle period. If the allowed
sending rate is less than the initial sending rate upon entry to the
idle period, then it will still be less than the initial sending rate
when the idle period is exited. However, if the allowed sending rate
is greater than or equal to the initial sending rate upon entry to
the idle period, then it should not be reduced below the initial
sending rate no matter how long the idle period lasts.
The sender’s allowed sending rate is limited to at most twice the
receive rate reported by the receiver. Thus, after an application-
limited period, the sender can at most double its sending rate from
one round-trip time to the next, until it reaches the allowed sending
rate determined by the loss event rate.
5.2. Response to Data Dropped and Slow Receiver
DCCP’s Data Dropped option lets a receiver declare that a packet was
dropped at the end host before delivery to the application -- for
instance, because of corruption or receive buffer overflow. Its Slow
Receiver option lets a receiver declare that it is having trouble
keeping up with the sender’s packets, although nothing has yet been
dropped. CCID 3 senders respond to these options as described in
[RFC4340], with the following further clarifications.
o Drop Code 2 ("receive buffer drop"). The allowed sending rate is
reduced by one packet per RTT for each packet newly acknowledged
as Drop Code 2, except that it is never reduced below one packet
per RTT as a result of Drop Code 2.
o Adjusting the receive rate X_recv. A CCID 3 sender SHOULD also
respond to non-network-congestion events, such as those implied by
Data Dropped and Slow Receiver options, by adjusting X_recv, the
receive rate reported by the receiver in Receive Rate options (see
Section 8.3). The CCID 3 sender’s allowed sending rate is limited
to at most twice the receive rate reported by the receiver via the
"min(..., 2*X_recv)" clause in TFRC’s throughput calculations
([RFC3448], Section 4.3). When the sender receives one or more
Data Dropped and Slow Receiver options, the sender adjusts X_recv
as follows:
1. X_inrecv is equal to the Receive Rate in bytes per second
reported by the receiver in the most recent acknowledgement.
2. X_drop is set to the sending rate upper bound implied by Data
Dropped and Slow Receiver options. If the sender receives a
Slow Receiver option, which requests that the sender not
increase its sending rate for roughly a round-trip time
[RFC4340], then X_drop should be set to X_inrecv. Similarly,
if the sender receives a Data Dropped option indicating, for
example, that three packets were dropped with Drop Code 2, then
the upper bound on the sending rate will be decreased by at
most three packets per RTT, by the sender setting X_drop to
max(X_inrecv - 3*s/RTT, min(X_inrecv, s/RTT)).
Again, s is the packet size in bytes.
3. X_recv is then set to min(X_inrecv, X_drop/2).
As a result, the next round-trip time’s sending rate will be
limited to at most 2*(X_drop/2) = X_drop. The effects of the Slow
Receiver and Data Dropped options on X_recv will mostly vanish by
the round-trip time after that, which is appropriate for this
non-network-congestion feedback. This procedure MUST only be used
for those Drop Codes not related to corruption (see [RFC4340]).
Currently, this is limited to Drop Codes 0, 1, and 2.
5.3. Packet Sizes
CCID 3 is intended for applications that use a fixed packet size, and
that vary their sending rate in packets per second in response to
congestion. CCID 3 is not appropriate for applications that require
a fixed interval of time between packets and vary their packet size
instead of their packet rate in response to congestion. However,
some attention might be required for applications using CCID 3 that
vary their packet size not in response to congestion, but in response
to other application-level requirements.
The packet size s is used in the TCP throughput equation. A CCID 3
implementation MAY calculate s as the segment size averaged over
multiple round trip times -- for example, over the most recent four
loss intervals, for loss intervals as defined in Section 6.1.
Alternately, a CCID 3 implementation MAY use the Maximum Packet Size
to derive s. In this case, s is set to the Maximum Segment Size
(MSS), the maximum size in bytes for the data segment, not including
the default DCCP and IP packet headers. Each packet transmitted then
counts as one MSS, regardless of the actual segment size, and the TCP
throughput equation can be interpreted as specifying the sending rate
in packets per second.
CCID 3 implementations MAY check for applications that appear to be
manipulating the packet size inappropriately. For example, an
application might send small packets for a while, building up a fast
rate, then switch to large packets to take advantage of the fast
rate. (Preliminary simulations indicate that applications may not be
able to increase their overall transfer rates this way, so it is not
clear that this manipulation will occur in practice [V03].)
6. Acknowledgements
The receiver sends a feedback packet to the sender roughly once per
round-trip time, if the sender is sending packets that frequently.
This rate is determined by the TFRC protocol as specified in
[RFC3448], Section 6.
Each feedback packet contains an Acknowledgement Number, which equals
the greatest valid sequence number received so far on this
connection. ("Greatest" is, of course, measured in circular sequence
space.) Each feedback packet also includes at least the following
options:
1. An Elapsed Time and/or Timestamp Echo option specifying the amount
of time elapsed since the arrival at the receiver of the packet
whose sequence number appears in the Acknowledgement Number field.
These options are described in [RFC4340], Section 13.
2. A Receive Rate option, defined in Section 8.3, specifying the rate
at which data was received since the last DCCP-Ack was sent.
3. A Loss Intervals option, defined in Section 8.6, specifying the
most recent loss intervals experienced by the receiver. (The
definition of a loss interval is provided below.) From Loss
Intervals, the sender can easily calculate the loss event rate p
using the procedure described in [RFC3448], Section 5.4.
Acknowledgements not containing at least these three options are not
considered feedback packets.
The receiver MAY also include other options concerning the loss event
rate, including Loss Event Rate, which gives the loss event rate
calculated by the receiver (Section 8.5), and DCCP’s generic Ack
Vector option, which reports the specific sequence numbers of any
lost or marked packets ([RFC4340], Section 11.4). Ack Vector is not
required by CCID 3’s congestion control mechanisms: the Loss
Intervals option provides all the information needed to manage the
transmit rate and probabilistically verify receiver feedback.
However, Ack Vector may be useful for applications that need to
determine exactly which packets were lost. The receiver MAY also
include other acknowledgement-related options, such as DCCP’s Data
Dropped option ([RFC4340], Section 11.7).
If the HC-Receiver is also sending data packets to the HC-Sender,