RFC 5622

Profile for Datagram Congestion Control Protocol (DCCP) Congestion ID 4: TCP-Friendly Rate Control for Small Packets (TFRC-SP)

๐Ÿ“… published August 2009, from ietf

RFC 5622: Profile for Datagram Congestion Control Protocol (DCCP) Congestion ID 4: TCP-Friendly Rate Control for Small Packets (TFRC-SP) ๐ŸŽ€

Okay bestie, let's get you set up ๐Ÿ’… This doc comes from the Network Working Group and is an Experimental one from August 2009 ๐Ÿฆ‹ The authors are S. Floyd (ICIR) and E. Kohler (UCLA). Its header doesn't list anything it obsoletes or updates, so no drama there โœจ

Abstract โœจ

So the big idea is that this doc is a profile for Congestion Control Identifier 4 (CCID 4), which is the small-packet version of TCP-Friendly Rate Control (TFRC) inside the Datagram Congestion Control Protocol (DCCP) ๐ŸŒธ CCID 4 is for experimental use. It uses TFRC-SP (RFC 4828), which is a version of TFRC made for apps that send small packets ๐Ÿ’œ

CCID 4 is experimental because TFRC-SP is still experimental itself, and it's not being pushed for widespread use across the global Internet right now ๐Ÿ™ˆ

The goal of TFRC-SP is to get roughly the same bandwidth in bits per second (bps) as a TCP flow using packets of up to 1500 bytes, even when both are dealing with the same level of congestion. Iconic ๐Ÿ”ฅ

CCID 4 is for senders that send small packets and want a TCP-friendly sending rate, possibly with Explicit Congestion Notification (ECN), while also keeping abrupt rate changes to a minimum ๐Ÿซถ

Status of This Memo ๐Ÿ“œ

This memo defines an Experimental Protocol for the Internet community. It does not specify an Internet standard of any kind. Discussion and suggestions for improvement are requested. Distribution of this memo is unlimited โœจ

Copyright (c) 2009 IETF Trust and the persons identified as the document authors. All rights reserved.

This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents, as they stood on the date this document was published (http://trustee.ietf.org/license-info). Please read these carefully, because they spell out your rights and restrictions for this document ๐Ÿ“–

This document may contain material from IETF Documents or IETF Contributions that were published or made publicly available before November 10, 2008. The person or people who control the copyright in some of that material may not have given the IETF Trust permission to allow changes to it outside the IETF Standards Process. Without getting an adequate license from whoever controls the copyright in those materials, this document may not be modified outside the IETF Standards Process, and derivative works of it may not be created outside the IETF Standards Process. The exceptions are formatting it for publication as an RFC, or translating it into languages other than English ๐ŸŒˆ

Table of Contents ๐Ÿ—‚๏ธ

   1. Introduction ....................................................3
   2. Conventions .....................................................4
   3. Usage ...........................................................4
      3.1. Relationship with TFRC and TFRC-SP .........................5
      3.2. Example Half-Connection ....................................5
   4. Connection Establishment ........................................6
   5. Congestion Control on Data Packets ..............................6
      5.1. Response to Idle and Application-Limited Periods ...........7
      5.2. Response to Data Dropped and Slow Receiver .................7
      5.3. Packet Sizes ...............................................7
   6. Acknowledgements ................................................8
      6.1. Loss Interval Definition ...................................8
      6.2. Congestion Control on Acknowledgements .....................8
      6.3. Acknowledgements of Acknowledgements .......................8
      6.4. Quiescence .................................................8
   7. Explicit Congestion Notification ................................8
   8. Options and Features ............................................9
      8.1. Window Counter Value ......................................10
      8.2. Elapsed Time Options ......................................10
      8.3. Receive Rate Option .......................................10
      8.4. Send Loss Event Rate Feature ..............................10
      8.5. Loss Event Rate Option ....................................11
      8.6. Loss Intervals Option .....................................11
      8.7. Dropped Packets Option ....................................11
           8.7.1. Example ............................................13
   9. Verifying Congestion Control Compliance with ECN ...............14
      9.1. Verifying the ECN Nonce Echo ..............................14
      9.2. Verifying the Reported Loss Intervals and Loss
           Event Rate ................................................14
   10. Implementation Issues .........................................14
      10.1. Timestamp Usage ..........................................14
      10.2. Determining Loss Events at the Receiver ..................15
      10.3. Sending Feedback Packets .................................15
   11. Design Considerations .........................................15
      11.1. The Field Size in the Loss Intervals Option ..............15
      11.2. The Field Size in the Dropped Packets Option .............16
   12. Experimental Status of This Document ..........................17
   13. Security Considerations .......................................17
   14. IANA Considerations ...........................................17
      14.1. Reset Codes ..............................................17
      14.2. Option Types .............................................17
      14.3. Feature Numbers ..........................................18
   15. Thanks ........................................................18
   16. References ....................................................18
      16.1. Normative References .....................................18
      16.2. Informative References ...................................19

List of Tables

   Table 1: DCCP CCID 4 Options .......................................9
   Table 2: DCCP CCID 4 Feature Numbers ...............................9

1. Introduction โœจ

This doc specifies an experimental profile for Congestion Control Identifier 4, TCP-Friendly Rate Control for Small Packets (TFRC-SP), inside the Datagram Congestion Control Protocol (DCCP) [RFC4340] ๐Ÿฆ‹ CCID 4 is a modified version of Congestion Control Identifier 3 (CCID 3), which is specified in [RFC4342]. This doc assumes you already know CCID 3, so it doesn't repeat that stuff unnecessarily ๐Ÿ’…

CCID 3 uses TCP-Friendly Rate Control (TFRC), which is now specified in RFC 5348 [RFC5348]. CCID 4 is different from CCID 3 because it uses TFRC-SP [RFC4828], an experimental, small-packet variant of TFRC. The original TFRC spec, RFC 3448 [RFC3448], has been obsoleted by RFC 5348. CCID 3 and TFRC-SP both predate RFC 5348, so they point to RFC 3448 for the TFRC spec. This document, though, assumes RFC 5348 is used instead of RFC 3448 for TFRC ๐ŸŽ€

CCID 4 differs from CCID 3 only in the following respects:

  • Header size: For TFRC-SP, the allowed transmit rate in bytes per second is reduced by a factor that accounts for packet header size. This is specified for TFRC-SP in Section 4.2 of [RFC4828], and described for CCID 4 in Section 5 below.
  • Maximum sending rate: TFRC-SP enforces a minimum interval of 10 milliseconds between data packets. This is specified for TFRC-SP in Section 4.3 of [RFC4828], and described for CCID 4 in Section 5 below.
  • Loss rates for short loss intervals: For short loss intervals of at most two round-trip times (RTTs), the loss rate is computed by counting the actual number of packets lost or marked. For such a short loss interval with N data packets, including K lost or marked data packets, the loss interval length is calculated as N/K, instead of as N. This is specified for TFRC-SP in Section 4.4 of [RFC4828]. If the sender is computing the loss event rate, the Dropped Packets option specified in Section 8.7 is required, in addition to the default CCID 3's Loss Intervals option. Section 8.7 describes how the Dropped Packets option is used when calculating the loss event rate. The computation of the loss rate by the receiver for the Loss Event Rate option is described for CCID 4 in Section 8.4 below.
  • The nominal segment size: In TFRC-SP, the nominal segment size used by the TCP throughput equation is set to 1460 bytes. This is specified for TFRC-SP in Section 4.5 of [RFC4828], and described for CCID 4 in Section 5 below.

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] ๐Ÿ’–

Additional terminology is described in Section 2 of [RFC4342] ๐Ÿงš

3. Usage ๐ŸŒธ

Like CCID 3, CCID 4's congestion control is a good fit for flows that want to minimize abrupt changes in the sending rate, including streaming media apps with small or moderate receiver buffering before playback. Main character energy ๐Ÿ‘‘

CCID 4 is designed to be used either by applications that use a small fixed segment size, or by applications that change their sending rate by varying the segment size. If CCID 4 is used by an app that varies its segment size in response to changes in the allowed sending rate in bps, note that CCID 4 doesn't dictate the segment size. The app itself does that ๐Ÿ“ The CCID 4 sender works out the allowed sending rate in bps based on ongoing feedback from the CCID 4 receiver, and the app can use info about the current allowed sending rate to decide whether to change its current segment size โœจ

We should also note that in some environments there's a feedback loop. Changes in the packet size or in the sending rate in bps can affect congestion along the path, which then affects the allowed sending rate in the future. It's giving cycle ๐Ÿ”

3.1. Relationship with TFRC and TFRC-SP ๐Ÿฆ‹

The congestion control mechanisms here follow the TFRC-SP mechanism specified in [RFC4828]. Just like CCID 3, conformant CCID 4 implementations MAY track updates to the TCP throughput equation directly, as those updates get standardized in the IETF, instead of waiting for revisions of this document ๐Ÿซถ This document is based on CCID 3 [RFC4342], TFRC, and TFRC-SP. For TFRC, RFC 3448 [RFC3448] has been obsoleted by RFC 5348 [RFC5348] ๐Ÿ’œ

3.2. Example Half-Connection ๐Ÿฆ‹

okay so this example walks through how a half-connection behaves when it's using CCID 4's TFRC Congestion Control ๐ŸŽ€. It skips connection initiation and termination, and it's informative, not normative ๐Ÿซถ. It's basically the CCID 3 example from [RFC4342] with one glow-up: with CCID 4, the allowed transmit rate is determined by [RFC4828] as well as by [RFC5348] โœจ.

  1. The sender sends DCCP-Data packets, and its sending rate is controlled by the allowed transmit rate from [RFC4828] ๐Ÿ’…. Every DCCP-Data packet has a sequence number, and the CCVal field in the DCCP header holds the window counter value. The receiver uses that counter to figure out when several losses belong to one loss event ๐Ÿงš.

In the usual case of an ECN-capable half-connection, every DCCP-Data and DCCP-DataAck packet goes out as ECN-capable, with either the ECT(0) or the ECT(1) codepoint set ๐ŸŒˆ. The ECN Nonce is used with TFRC as described in Section 9 ๐Ÿ’œ.

  1. The receiver sends DCCP-Ack packets to acknowledge 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 [RFC5348] (Section 6) ๐ŸŒธ. Each DCCP-Ack packet has a sequence number that identifies the most recent packet the receiver got from the sender, and it includes feedback about the recent loss intervals the receiver experienced ๐Ÿ“.
  2. The sender keeps sending DCCP-Data packets at the allowed transmit rate ๐Ÿš€. When DCCP-Ack packets arrive, the sender updates its allowed transmit rate as specified in [RFC5348] (Section 4.3) and [RFC4828] ๐Ÿ”ฅ. That update is based on a loss event rate the sender calculates from the receiver's loss-interval feedback. If it prefers, the sender can also use a loss event rate that the receiver calculated and reported ๐Ÿ‘‘.
  3. The sender estimates round-trip times and works out a nofeedback time, as specified in [RFC5348] (Section 4.4) โฐ. If no feedback shows up from the receiver in that time (at least four round-trip times), the sender halves its sending rate ๐Ÿ˜ญ.

4. Connection Establishment ๐Ÿ’–

connection establishment is exactly as specified in Section 4 of [RFC4342] โœจ.


5. Congestion Control on Data Packets ๐Ÿ”ฅ

CCID 4 uses the congestion control mechanisms of TFRC [RFC5348] and TFRC-SP [RFC4828] ๐Ÿ’…. [RFC4828] MUST be considered normative except where specifically indicated ๐Ÿซถ.

Loss Event Rate

just like CCID 3, CCID 4 is all about calculating a loss event rate ๐Ÿฆ‹. That's the number of loss events as a fraction of the number of packets transmitted, weighted over the last several loss intervals ๐Ÿ“Š. For CCID 4, this loss event rate, a round-trip time estimate, and a nominal packet size of 1460 bytes get plugged into the TCP throughput equation, as specified in RFC 5348 (Section 3.1) and [RFC4828] ๐ŸŽ€.

Because CCID 4 is built for apps that send small packets, the allowed transmit rate derived from the TCP throughput equation gets reduced by a factor that accounts for packet header size, as specified in Section 4.2 of [RFC4828] ๐Ÿ“. The header size on data packets is estimated as 36 bytes (20 bytes for the IPv4 header and 16 bytes for the DCCP-Data header with 48-bit sequence numbers) ๐ŸŒˆ. If the DCCP sender is sending N-byte data packets, the allowed transmit rate is reduced by N/(N+36) ๐Ÿงฎ. CCID 4 senders are limited to this fair rate ๐Ÿ’œ. The header size would be 32 bytes instead of 36 bytes when 24-bit sequence numbers are used in the DCCP-Data header โœจ.

As explained in Section 4.2 of [RFC4828], the actual header could be larger or smaller than the assumed value because of IP or DCCP options, IPv6, IP tunnels, header compression, and the like ๐Ÿ™ˆ. Since we're only aiming at rough fairness, and at a rough incentive for applications, the default use of a 32-byte or 36-byte header in the header bandwidth calculations is good enough for both IPv4 and IPv6 ๐Ÿ’….

If the sender is calculating the loss event rate itself, it can use recent loss interval lengths reported by the receiver ๐Ÿฆ‹. Loss intervals are precisely defined in Section 6.1 of [RFC4342], with the modification in [RFC4828] (Section 3) for loss intervals of at most two round-trip times ๐Ÿ”ฅ. 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 ๐ŸŒธ. The CCID 3 Loss Intervals option is used to report loss interval lengths; see Section 8.6 ๐Ÿซถ.

For loss intervals of at most two round-trip times, CCID 4 calculates the loss event rate for that interval by counting the number of packets lost or marked, as described in Section 4.4 of [RFC4828] ๐Ÿง . So for such a short loss interval with N data packets, including K lost or marked data packets, the loss interval length is calculated as N/K, instead of N ๐Ÿคฏ. The Dropped Packets option is used to report K, the count of lost or marked data packets ๐Ÿ“.

Unlike CCID 3, the CCID 4 sender enforces a minimum interval of 10 ms between data packets, regardless of the allowed transmit rate โฑ๏ธ. If operating system scheduling granularity makes this impractical, up to one additional packet MAY be sent per timeslice, as long as no more than three packets are sent in any 30 ms interval ๐ŸŒˆ.

Other Congestion Control Mechanisms

The other congestion control mechanisms, like slow-start and feedback packets, are exactly as in CCID 3 ๐Ÿ’–. They're described in the subsection on "Other Congestion Control Mechanisms" of Section 5 in [RFC4342] โœจ.

5.1. Response to Idle and Application-Limited Periods ๐ŸŒ™

This is described in Section 5.1 of [RFC4342] ๐Ÿซถ. If Faster Restart is standardized in the IETF for TFRC [KFS07], then Faster Restart MAY be implemented in CCID4 without having to wait for an explicit update to this document ๐Ÿš€.

5.2. Response to Data Dropped and Slow Receiver ๐Ÿข

This is described in Section 5.2 of [RFC4342] ๐Ÿ’….

5.3. Packet Sizes ๐Ÿ“ฆ

CCID 4 is intended for applications that use a fixed small segment size, or that vary their segment size in response to congestion ๐ŸŽ€.

The CCID 4 sender uses a segment size of 1460 bytes in the TCP throughput equation ๐Ÿงฎ. This gives the CCID 4 sender roughly the same sending rate in bytes per second as a TFRC flow using 1460-byte segments but experiencing the same packet drop rate ๐Ÿ“.


6. Acknowledgements ๐Ÿ’Œ

The acknowledgements are as specified in Section 6 of [RFC4342], with the exception of the Loss Interval lengths specified below โœจ.

6.1. Loss Interval Definition ๐Ÿงฉ

The loss interval definition is as defined in Section 6.1 of [RFC4342], except as specified below ๐Ÿฆ‹. Section 6.1.1 of RFC 4342 specifies that for all loss intervals except the first one, the data length equals the sequence length minus the number of non-data packets the sender transmitted during the loss interval, with a minimum data length of one packet ๐Ÿ“Š. For short loss intervals of at most two round-trip times, TFRC-SP computes the loss interval length as the data length divided by the number of dropped or marked data packets (rather than as the data length of the loss interval) ๐Ÿ”ฅ.

Section 5.4 of RFC 4342 describes when to use the most recent loss interval in the calculation of the average loss interval ๐ŸŒธ. [RFC4828] adds a restriction to this procedure: the most recent loss interval is only used in the calculation of the average loss interval if it's greater than two round-trip times ๐Ÿซถ. The pseudocode is given in Section 3 of [RFC4828] ๐Ÿง .

6.2. Congestion Control on Acknowledgements ๐ŸŽ€

The congestion control on acknowledgements is as specified in Section 6.2 of [RFC4342] ๐Ÿ’….

6.3. Acknowledgements of Acknowledgements ๐Ÿ“

Procedures for the acknowledgement of acknowledgements are as specified in Section 6.3 of [RFC4342] ๐ŸŒˆ.

6.4. Quiescence ๐Ÿ˜ด

The procedure for detecting that the sender has gone quiescent is as specified in Section 6.4 of [RFC4342] ๐Ÿ’œ.


7. Explicit Congestion Notification ๐ŸŒˆ

Procedures for the use of Explicit Congestion Notification (ECN) are as specified in Section 7 of [RFC4342] โœจ.


8. Options and Features ๐Ÿ‘‘

CCID 4 can make use of DCCP's Ack Vector, Timestamp, Timestamp Echo, and Elapsed Time options, plus its Send Ack Vector and ECN Incapable features ๐Ÿฆ‹. CCID 4 also imports the currently defined CCID-3-specific options and features [RFC4342], augmented by the Dropped Packets option specified in this document ๐Ÿ’–. Each CCID4-specific option and feature contains the same data as the corresponding CCID 3 option or feature, and is interpreted in the same way, except as specified elsewhere in this document (or in a subsequent IETF standards-track RFC that updates or obsoletes this specification) ๐Ÿซถ.

                Option                        DCCP-   Section
       Type     Length     Meaning            Data?  Reference
       -----    ------     -------            -----  ---------
      128-183              Unassigned
      184-190              Reserved for
                            experimental
                            and testing use
        191                Unassigned
        192        6       Loss Event Rate      N      8.5
        193     variable   Loss Intervals       N      8.6
        194        6       Receive Rate         N      8.3
        195     variable   Dropped Packets      N      8.7
      196-247              Unassigned
      248-254              Reserved for
                            experimental
                            and testing use
        255                Unassigned

                         Table 1: DCCP CCID 4 Options

The "DCCP-Data?" column shows that all currently defined CCID4-specific options MUST be ignored when they occur on DCCP-Data packets ๐Ÿ™…โ€โ™€๏ธ.

As with CCID 3, the following CCID-specific features are also defined ๐Ÿ“‹.

      Number   Meaning                  Rule   Value  Req'd Reference
      ------   -------                  -----  -----  ----- ---------
      128-183  Unassigned
      184-190  Reserved for experimental
                and testing use
        191    Unassigned
        192    Send Loss Event Rate      SP      0      N      8.4
      193-247  Unassigned
      248-254  Reserved for experimental
                and testing use
        255    Unassigned

                     Table 2: DCCP CCID 4 Feature Numbers

More information is available in Section 8 of [RFC4342] ๐Ÿ’œ.

8.1. Window Counter Value ๐ŸชŸ

The use of the Window Counter Value in the DCCP generic header's CCVal field is as specified in Section 8.1 of [RFC4342] ๐ŸŽ€. On top of the uses described for CCID 3, CCID 4 receivers use the CCVal counters to determine when the length of a loss interval is at most two round-trip times ๐Ÿงš. None of these procedures require the receiver to maintain an explicit estimate of the round-trip time ๐Ÿซถ. However, Section 8.1 of [RFC4342] gives a procedure that implementors may use if they wish to keep such an RTT estimate using CCVal ๐Ÿง .

8.2. Elapsed Time Options โณ

The use of the Elapsed Time option is defined in Section 8.2 of [RFC4342] โœจ.

8.3. Receive Rate Option ๐Ÿ“ˆ

The Receive Rate option is as specified in Section 8.3 of [RFC4342] ๐Ÿ’….

8.4. Send Loss Event Rate Feature โœจ

Okay so the Send Loss Event Rate feature is exactly the one defined in Section 8.4 of [RFC4342] ๐Ÿ’… Nothing new to see here, bestie.

If you want the official, normative way to calculate the loss event rate, go check [RFC5348], Section 5, and [RFC4828], Section 4.4 ๐Ÿค“ Heads up, Section 4.4 of [RFC4828] tweaks how you calculate the loss interval size for loss intervals of at most two round-trip times. Very specific, very important.

Now here's the tricky bit ๐Ÿ˜ญ If the CCID 4 receiver is using the Loss Event Rate option, it needs to be able to tell whether a loss interval is short, meaning at most two round-trip times. The receiver can guess this heuristically by looking at the Window Counter in arriving data packets ๐Ÿฆ‹ The sender bumps the Window Counter by 1 every quarter of a round-trip time, with one caveat: it never jumps by more than five (modulo 16) from one data packet to the next.

BUT here's the catch, and it's not a small one ๐Ÿ’€ Using the Window Counter to spot short loss intervals can give you false positives, where a longer loss interval gets labelled as short. Like, if the loss interval only has data packets with two Window Counter values, say k and k+5, the receiver literally cannot tell if that interval was at most two round-trip times long or not. Same vibe with a sender that sends packets with Window Counter values of 4, 8, 12, 0, 5, but the packets with 8, 12, and 0 get lost in the network. The receiver only sees 4 and 5, and it wrongly concludes the loss interval was at most two round-trip times. Not it ๐Ÿ™ˆ

8.5. Loss Event Rate Option ๐ŸŒธ

The Loss Event Rate option is as specified in Section 8.5 of [RFC4342], no changes!

For the normative calculation of the loss event rate, look at [RFC5348] (Section 5) and [RFC4828] ๐Ÿซถ

8.6. Loss Intervals Option ๐Ÿงš

The Loss Intervals option is as specified in Section 8.6 of [RFC4342]. Same option, same vibes, nothing extra to learn here โœจ

8.7. Dropped Packets Option ๐Ÿ’œ

This section is all about the Dropped Packets option, which is the mechanism for reporting how many lost and marked packets there are per loss interval ๐Ÿ”ฅ When the receiver reports both the Loss Intervals and Dropped Packets options on its feedback packets, it gives the sender enough info to calculate the loss event rate. Or, if the sender is feeling extra and wants to, it can check the reported loss event rate by doing the math itself ๐Ÿ‘‘

The core info that CCID 4 receivers report is a list of recent loss intervals. Each loss interval starts with a lost or ECN-marked data packet, keeps going with at most one round-trip time's worth of packets that may or may not be lost or marked, and then ends with an arbitrarily long run of packets that were neither dropped nor marked ๐ŸŒˆ Loss intervals model how TCP NewReno senders behave, since they cut their sending rate at most once per window of data packets. So the number of packets lost in a loss interval doesn't matter for either TCP's or TFRC's congestion response. CCID 3's Loss Intervals option only reports the length of the lossy part of each loss interval, not how many packets actually got lost or marked in that part ๐Ÿคทโ€โ™€๏ธ

BUT, for computing the loss event rate over periods that include short loss intervals, the TFRC-SP sender needs to know how many packets were lost or marked in a loss interval, on top of the interval's length in packets. That's where the Dropped Packets option comes in ๐Ÿฆ‹ It's a CCID4-specific option, and together with the existing Loss Intervals option, it lets the CCID 4 sender figure out exactly how many packets were dropped from each loss interval. The receiver reports the number of lost or marked packets in its recently observed loss intervals using this option.

The Dropped Packets option is laid out like this:

   +--------+--------+-------...-------+--------+-------
   |11000011| Length |   Drop Count    | More Drop Counts...
   +--------+--------+-------...-------+--------+-------
    Type=195               3 bytes

         Figure 1: Dropped Packets Option

The Dropped Packets option covers one to 84 consecutive loss intervals, and it always includes the most recent one โœจ Just like the Loss Intervals option, the intervals are listed in reverse chronological order. If you need to report more than 84 loss intervals, you can send multiple Dropped Packets options. The second one picks up right where the first one left off, and so on ๐Ÿ’…

Each loss interval gets one Drop Count. A Drop Count is a 24-bit number equal to the number of packets, lost or received, that were ECN-marked during the matching loss interval. By definition, this number MUST NOT exceed the matching loss interval's Loss Length ๐Ÿšซ

CCID 4 receivers MUST report Dropped Packets options with every feedback packet ๐Ÿซถ Any packet that has a Loss Intervals option MUST also have a Dropped Packets option covering the same loss intervals. And if a feedback packet doesn't include a relevant Dropped Packets option, but the CCID 4 sender is computing the loss event rate itself, the sender MUST treat the relevant loss intervals' Drop Counts as equal to the corresponding Loss Lengths, as explained below ๐Ÿ’–

Here's the full picture. Say we've got a CCID 4 receiver ๐ŸŽ€ As specified in Section 8.6.1 of RFC 4342, the receiver sends the Loss Intervals option for every interval that the sender hasn't acknowledged yet. When this receiver sends a feedback packet with info about the N most recent loss intervals (packed into one or more Loss Intervals options), it also includes one or more Dropped Packets options that cover exactly those N loss intervals. Now, CCID 4 senders MUST ignore Drop Counts info for any loss interval not covered by a Loss Intervals option on the same feedback packet. Flip side: a CCID 4 sender might want to interpolate Drop Counts for a loss interval that isn't covered by any Dropped Packets options. If it does, it MUST use that loss interval's Loss Length as its Drop Count ๐Ÿ“

One more rule, because it matters: each loss interval's Drop Count MUST, by definition, be less than or equal to its Loss Length. And if a Drop Count is bigger than its Loss Length, it MUST be treated as equal to the Loss Length ๐Ÿ™Œ

8.7.1. Example ๐Ÿ“

Let's look at a sequence of packets, where "-" means a safely delivered packet and "*" means a lost or marked packet. This sequence is repeated from [RFC4342] ๐Ÿ”

   Sequence
    Numbers: 0         10        20        30        40  44
             |         |         |         |         |   |
             ----------*--------***-*--------*----------*-

   Figure 2:  Sequence of Delivered (-) and Lost (*) Packets

Assuming packet 43 was lost (not marked), this sequence can be split into loss intervals like so:

   0         10        20        30        40  44
   |         |         |         |         |   |
   ----------*--------***-*--------*----------*-
   \________/\_______/\___________/\_________/
       L0       L1         L2          L3

   Figure 3:  Loss Intervals for the Packet Sequence

A Loss Intervals option sent on a packet with Acknowledgement Number 44, acknowledging this set of loss intervals, might contain the bytes 193,39,2, 0,0,10, 128,0,1, 0,0,10, 0,0,8, 0,0,5, 0,0,10, 0,0,8, 0,0,1, 0,0,8, 0,0,10, 128,0,0, 0,0,15. For how to interpret that option, see [RFC4342] ๐Ÿ“– A Dropped Packets option sent alongside it on this same packet would contain the bytes 195,14, 0,0,1, 0,0,4, 0,0,1, 0,0,0. Here's how that one breaks down:

  • 195 is the Dropped Packets option number.
  • 14 is the length of the option, including the option type and length bytes. This option has info about (14 - 2)/3 = 4 loss intervals. Heads up: the two most recent sequence numbers aren't part of any loss interval yet (the Loss Intervals option counts them in its Skip Length), so they're not included in the Dropped Packets option ๐Ÿ‘€
  • 0,0,1 defines the Drop Count for L3, which is 1. As required, that Drop Count is less than or equal to L3's Loss Length, which is also 1 โœ…
  • 0,0,4 is the Drop Count for L2, which is 4.
  • 0,0,1 is the Drop Count for L1, which is 1.
  • 0,0,0 is the Drop Count for L0, which is 0. Finally!

9. Verifying Congestion Control Compliance with ECN ๐Ÿ”

Checking congestion control compliance with ECN works just like Section 9 of [RFC4342] describes ๐Ÿ’…

9.1. Verifying the ECN Nonce Echo ๐ŸŽ€

For verifying the ECN Nonce Echo, follow the procedures in Section 9.1 of [RFC4342] โœจ

9.2. Verifying the Reported Loss Intervals and Loss Event Rate ๐Ÿง

Section 9.2 of [RFC4342] talks about how the sender can verify the loss intervals and loss event rate info that the receiver reports ๐Ÿ’œ

10. Implementation Issues ๐Ÿ› ๏ธ

10.1. Timestamp Usage โฑ๏ธ

The Timestamp option gets used as discussed in Section 10.1 of [RFC4342] ๐Ÿฆ‹

10.2. Determining Loss Events at the Receiver ๐ŸŒธ

The receiver uses the window counter to figure out whether multiple lost packets belong to the same loss event. This is described in Section 10.2 of [RFC4342] ๐Ÿงš

10.3. Sending Feedback Packets ๐Ÿ“จ

The procedure for sending feedback packets is described in Section 10.3 of [RFC4342] ๐Ÿ’–

11. Design Considerations ๐ŸŽจ

This section covers the design considerations for the field sizes in the Loss Intervals and Dropped Packets options ๐ŸŒˆ

11.1. The Field Size in the Loss Intervals Option ๐Ÿ“

Section 8.6 of RFC 4342 specifies a Loss Intervals option with three fields for each loss interval, used for reporting the Lossless Length, Loss Length, and Data Length. Each field is three bytes. Section 8.6 of this document says CCID 4 uses the same Loss Intervals option as CCID 3, with the same field sizes. That's a big win because it keeps the implementation differences between CCID 3 and CCID 4 to a minimum ๐Ÿ™Œ BUT, someone suggested that CCID 4 could use a Loss Intervals option with smaller field sizes, since a CCID 4 sender enforces a minimum interval of 10 ms between data packets. This section explains why CCID 4 sticks with the same Loss Intervals option as CCID 3 ๐Ÿค”

The Lossless Length field reports the number of packets in the loss interval's lossless part, and the Loss Length field reports the number of packets in the loss interval's lossy part. The Data Length field reports the number of packets in the loss interval's data length (not counting non-data packets). A two-byte Data Length field can report a data length of 65,536 packets, which corresponds to a loss event rate of 0.00002. That's enough to give the CCID 4 sender an allowed sending rate of roughly 250 packets per RTT, which is plenty for a connection with a round-trip time of at most 2.5 seconds ๐Ÿš€ For a CCID 4 connection with a larger round-trip time, you'd need the three-byte Lossless Length and Data Length fields.

For the Loss Length field in the Loss Intervals option, which reports the number of packets in the one-RTT lossy part of the loss interval, a one-byte field wouldn't be enough for a CCID 4 connection with a long RTT (three seconds or longer). For Loss Length, a two-byte field should be sufficient for CCID 4. However, our judgement is that the advantages of using the same Loss Intervals option as CCID 3 outweigh any advantage of a CCID 4 Loss Intervals option that uses eight bytes instead of nine bytes for reporting the fields for each loss interval ๐Ÿ’…โœจ

11.2. The Field Size in the Dropped Packets Option ๐Ÿ’…

okay so this bit is about how big the drop count box is in the Dropped Packets option ๐Ÿ“ฆ. Section 8.7 says each loss interval gets three bytes for that count ๐ŸŽ€. Honestly the three bytes are mostly for simplicity, because it matches the Loss Intervals option from RFC 4342 ๐Ÿ’–. People have suggested that CCID 4 could get away with a smaller field ๐Ÿค”, so this section digs into whether that's true.

Spoiler: a three-byte field is not required โœจ. One byte can hold a count up to 255, and two bytes can hold up to 65,535 ๐ŸŒธ. Two bytes would be plenty for CCID 4 ๐Ÿ‘‘.

A one-byte field would probably be fine too ๐Ÿฆ‹. Here's the math bestie ๐Ÿงฎ. A CCID 4 sender enforces a minimum gap of 10 ms between data packets โฑ๏ธ. So you'd need a round-trip time over 2.55 seconds to get more than 255 packets lost or marked in one loss interval ๐Ÿ˜ญ. And round-trip times over three seconds aren't unusual on some satellite-link flows ๐Ÿ›ฐ๏ธ.

Why does the drop count even matter? CCID 4 uses it to work out the actual loss rate for short loss intervals, instead of the loss event rate it uses for longer ones ๐Ÿ”. Say a loss interval of at most two round-trip times had N packets sent, and more than 255 of them got lost or marked. A one-byte field could only report 255, so the computed loss rate would be 255/N โœจ. That might be lower than the real rate, but it's way higher than the loss event rate of 1/N ๐Ÿ“ˆ, which should be enough to stop a steady state where several packets keep getting dropped every round-trip time ๐Ÿ™ˆ. So yes, one byte would probably work.

Still, this document goes with the three-byte field anyway ๐ŸŽ€, purely for consistency with the Loss Intervals option ๐Ÿซถ.


12. Experimental Status of This Document ๐Ÿงช

okay now the experimental stuff ๐Ÿ”ฌ. TFRC-SP is a congestion control mechanism defined in RFC 4828 ๐Ÿ’œ. Section 10 of [RFC4828] explains why TFRC-SP is currently marked experimental, and why it isn't meant for widespread deployment on the global Internet right now ๐ŸŒ. Since TFRC-SP is Experimental, CCID 4 is experimental too ๐Ÿงชโœจ. If the IETF ever publishes a Standards-Track RFC that changes TFRC-SP's status, then CCID 4 should be updated to match ๐Ÿฆ‹.


13. Security Considerations ๐Ÿ”

๐Ÿ’€ okay bestie, this part is serious, so read it carefully. Security considerations include those discussed in Section 11 of [RFC4342], and you need to keep those in mind ๐Ÿ™. CCID 4 does not introduce any new security considerations ๐Ÿ›ก๏ธ.

14. IANA Considerations ๐Ÿ“‹

this is the IANA section ๐Ÿ—‚๏ธ. This specification defines the value 4 in the DCCP CCID namespace that IANA manages ๐Ÿ”ข. It's a permanent codepoint, which is needed so people can experiment across the Internet with different codebases ๐Ÿง‘โ€๐Ÿ’ป๐Ÿ’–.

CCID 4 also uses three sets of numbers that IANA allocates: CCID4-specific Reset Codes, option types, and feature numbers ๐ŸŽ€. This document doesn't make any particular allocations from the Reset Code range, except for experimental and testing use [RFC3692] ๐Ÿงช. The Standards Action policy from [RFC5226] is the one we refer to ๐Ÿ“œ.

14.1. Reset Codes ๐Ÿ”

Each entry in the DCCP CCID 4 Reset Code registry has three parts: a CCID4-specific Reset Code (a number from 128-255), a short description of the Reset Code, and a reference to the RFC that defines it ๐Ÿ“. Reset Codes 184-190 and 248-254 are permanently reserved for experimental and testing use ๐Ÿงช. The remaining Reset Codes, which are 128-183, 191-247, and 255, are currently reserved ๐Ÿ”’. They should be allocated under the Standards Action policy, which needs IESG review and approval plus Standards-Track IETF RFC publication ๐Ÿ‘‘.

14.2. Option Types ๐Ÿงฉ

Each entry in the DCCP CCID 4 option type registry has a CCID4-specific option type (a number from 128-255), the name of the option such as "Loss Intervals", and a reference to the RFC that defines the option type ๐Ÿ“–. The registry starts out populated with the values in Table 1, in Section 8 ๐ŸŽ€. That includes the value 195 for the Dropped Packets option ๐ŸŒธ. This document allocates option types 192-195 โœจ, and option types 184-190 and 248-254 are permanently reserved for experimental and testing use ๐Ÿงช. The remaining option types, which are 128-183, 191, 196-247, and 255, are currently reserved ๐Ÿ”’. They should be allocated under the Standards Action policy, which needs IESG review and approval plus Standards-Track IETF RFC publication ๐Ÿ‘‘.

14.3. Feature Numbers ๐ŸŽ›๏ธ

Each entry in the DCCP CCID 4 feature number registry has a CCID4-specific feature number (a number from 128-255), the name of the feature such as "Send Loss Event Rate", and a reference to the RFC that defines the feature number ๐Ÿท๏ธ. The registry starts out populated with the values in Table 2, in Section 8 ๐ŸŒˆ. This document allocates feature number 192 ๐Ÿฆ‹, and feature numbers 184-190 and 248-254 are permanently reserved for experimental and testing use ๐Ÿงช. The remaining feature numbers, which are 128-183, 191, 193-247, and 255, are currently reserved ๐Ÿ”’. They should be allocated under the Standards Action policy, which needs IESG review and approval plus Standards-Track IETF RFC publication ๐Ÿ‘‘.


15. Thanks ๐Ÿซถ

we thank Gorry Fairhurst, Alfred Hoenes, Ian McDonald, Gerrit Renker, and Leandro Sales for their feedback on this document ๐Ÿ’–โœจ. You all are iconic ๐Ÿ‘‘.


16. References ๐Ÿ“š

16.1. 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.
  • [RFC3692] Narten, T., "Assigning Experimental and Testing Numbers Considered Useful", BCP 82, RFC 3692, January 2004.
  • [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.
  • [RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing an IANA Considerations Section in RFCs", BCP 26, RFC 5226, May 2008.
  • [RFC5348] Floyd, S., Handley, M., Padhye, J., and J. Widmer, "TCP Friendly Rate Control (TFRC): Protocol Specification", RFC 5348, September 2008.

16.2. Informative References ๐ŸŒธ

  • [KFS07] Kohler, E., Floyd, S., and A. Sathiaseelan, "Faster Restart for TCP Friendly Rate Control (TFRC)", Work in Progress, July 2008.

Authors' Addresses ๐Ÿ’Œ

Sally Floyd
ICSI Center for Internet Research
1947 Center Street, Suite 600
Berkeley, CA 94704
USA

EMail:  floyd@icir.org

Eddie Kohler
4531C Boelter Hall
UCLA Computer Science Department
Los Angeles, CA 90095
USA

EMail: kohler@cs.ucla.edu
๐Ÿ“ฆ where this page comes from