summaryrefslogtreecommitdiff
path: root/doc/rfc/rfc4342.txt
blob: c57ca9b7976e243a2b39abea47c7479bf02f34a6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
Network Working Group                                           S. Floyd
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



Floyd, et al.               Standards Track                     [Page 1]
^L
RFC 4342                    DCCP CCID3 TFRC                   March 2006


      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




Floyd, et al.               Standards Track                     [Page 2]
^L
RFC 4342                    DCCP CCID3 TFRC                   March 2006


   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.




Floyd, et al.               Standards Track                     [Page 3]
^L
RFC 4342                    DCCP CCID3 TFRC                   March 2006


   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




Floyd, et al.               Standards Track                     [Page 4]
^L
RFC 4342                    DCCP CCID3 TFRC                   March 2006


      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




Floyd, et al.               Standards Track                     [Page 5]
^L
RFC 4342                    DCCP CCID3 TFRC                   March 2006


   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



Floyd, et al.               Standards Track                     [Page 6]
^L
RFC 4342                    DCCP CCID3 TFRC                   March 2006


   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.




Floyd, et al.               Standards Track                     [Page 7]
^L
RFC 4342                    DCCP CCID3 TFRC                   March 2006


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



Floyd, et al.               Standards Track                     [Page 8]
^L
RFC 4342                    DCCP CCID3 TFRC                   March 2006


      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:



Floyd, et al.               Standards Track                     [Page 9]
^L
RFC 4342                    DCCP CCID3 TFRC                   March 2006


   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,
   then it MAY piggyback acknowledgement information on those data
   packets more frequently than TFRC's specified acknowledgement rate
   allows.

6.1.  Loss Interval Definition

   As described in [RFC3448], Section 5.2, a loss interval begins with a
   lost or ECN-marked data packet; continues with at most one round-trip
   time's worth of packets that may or may not be lost or marked; and
   completes with an arbitrarily long series of non-dropped, non-marked
   data packets.  For example, here is a single loss interval, assuming
   that sequence numbers increase as you move right:








Floyd, et al.               Standards Track                    [Page 10]
^L
RFC 4342                    DCCP CCID3 TFRC                   March 2006


           Lossy Part
            <= 1 RTT   __________ Lossless Part __________
          /          \/                                   \
          *----*--*--*-------------------------------------
          ^    ^  ^  ^
         losses or marks

   Note that a loss interval's lossless part might be empty, as in the
   first interval below:

          Lossy Part   Lossy Part
           <= 1 RTT     <= 1 RTT   _____ Lossless Part _____
         /          \/           \/                         \
         *----*--*--***--------*-*---------------------------
         ^    ^  ^  ^^^        ^ ^
         \_ Int. 1 _/\_____________ Interval 2 _____________/

   As in [RFC3448], Section 5.2, the length of the lossy part MUST be
   less than or equal to 1 RTT.  CCID 3 uses window counter values, not
   receive times, to determine whether multiple packets occurred in the
   same RTT and thus belong to the same loss event; see Section 10.2.  A
   loss interval whose lossy part lasts for more than 1 RTT, or whose
   lossless part contains a dropped or marked data packet, is invalid.

   A missing data packet doesn't begin a new loss interval until NDUPACK
   packets have been seen after the "hole", where NDUPACK = 3.  Thus, up
   to NDUPACK of the most recent sequence numbers (including the
   sequence numbers of any holes) might temporarily not be part of any
   loss interval while the implementation waits to see whether a hole
   will be filled.  See [RFC3448], Section 5.1, and [RFC2581], Section
   3.2, for further discussion of NDUPACK.

   As specified by [RFC3448], Section 5, all loss intervals except the
   first begin with a lost or marked data packet, and all loss intervals
   are as long as possible, subject to the validity constraints above.

   Lost and ECN-marked non-data packets may occur freely in the lossless
   part of a loss interval.  (Non-data packets consist of those packet
   types that cannot carry application data; namely, DCCP-Ack, DCCP-
   Close, DCCP-CloseReq, DCCP-Reset, DCCP-Sync, and DCCP-SyncAck.)  In
   the absence of better information, a receiver MUST conservatively
   assume that every lost packet was a data packet and thus must occur
   in some lossy part.  DCCP's NDP Count option can help the receiver
   determine whether a particular packet contained data; see [RFC4340],
   Section 7.7.






Floyd, et al.               Standards Track                    [Page 11]
^L
RFC 4342                    DCCP CCID3 TFRC                   March 2006


6.1.1.  Loss Interval Lengths

   [RFC3448] defines the TFRC congestion control mechanism in terms of a
   one-way transfer of data, with data packets going from the sender to
   the receiver and feedback packets going from the receiver back to the
   sender.  However, CCID 3 applies in a context of two half-
   connections, with DCCP-Data and DCCP-DataAck packets from one half-
   connection sharing sequence number space with DCCP-Ack packets from
   the other half-connection.  For the purposes of CCID 3 congestion
   control, loss interval lengths should include data packets and should
   exclude the acknowledgement packets from the reverse half-connection.
   However, it is also useful to report the total number of packets in
   each loss interval (for example, to facilitate ECN Nonce
   verification).

   CCID 3's Loss Intervals option thus reports three lengths for each
   loss interval, the lengths of the lossy and lossless parts defined
   above and a separate data length.  First, the lossy and lossless
   lengths are measured in sequence numbers.  Together, they sum to the
   interval's sequence length, which is the total number of packets the
   sender transmitted during the interval.  This is easily calculated in
   DCCP as the greatest packet sequence number in the interval minus the
   greatest packet sequence number in the preceding interval (or, if
   there is no preceding interval, then the predecessor to the half-
   connection's initial sequence number).  The interval's data length,
   however, is the number used in TFRC's loss event rate calculation, as
   defined in [RFC3448], Section 5, and is calculated as follows.

   For all loss intervals except the first, the data length equals the
   sequence length minus the number of non-data packets the sender
   transmitted during the loss interval, except that the minimum data
   length is one packet.  In the absence of better information, an
   endpoint MUST conservatively assume that the loss interval contained
   only data packets, in which case the data length equals the sequence
   length.  To achieve greater precision, the sender can calculate the
   exact number of non-data packets in an interval by remembering which
   sent packets contained data; the receiver can account for received
   non-data packets by not including them in the data length, and for
   packets that were not received, it may be able to discriminate
   between lost data packets and lost non-data packets using DCCP's NDP
   Count option.

   The first loss interval's data length is undefined until the first
   loss event.  [RFC3448], Section 6.3.1 specifies how the first loss
   interval's data length is calculated once the first loss event has
   occurred; this calculation uses X_recv, the most recent receive rate,
   as input.  Until this first loss event, the loss event rate is zero,




Floyd, et al.               Standards Track                    [Page 12]
^L
RFC 4342                    DCCP CCID3 TFRC                   March 2006


   as is the data length reported for the interval in the Loss Intervals
   option.

   The first loss interval's data length might be less than, equal to,
   or even greater than its sequence length.  Any other loss interval's
   data length must be less than or equal to its sequence length.

   A sender MAY use the loss event rate or loss interval data lengths as
   reported by the receiver, or it MAY recalculate loss event rate
   and/or loss interval data lengths based on receiver feedback and
   additional information.  For example, assume the network drops a
   DCCP-Ack packet with sequence number 50.  The receiver might then
   report a loss interval beginning at sequence number 50.  If the
   sender determined that this loss interval actually contained no lost
   or ECN-marked data packets, then it might coalesce the loss interval
   with the previous loss interval, resulting in a larger allowed
   transmit rate.

6.2.  Congestion Control on Acknowledgements

   The rate and timing for generating acknowledgements is determined by
   the TFRC algorithm ([RFC3448], Section 6).  The sending rate for
   acknowledgements is relatively low -- roughly once per round-trip
   time -- so there is no need for explicit congestion control on
   acknowledgements.

6.3.  Acknowledgements of Acknowledgements

   TFRC acknowledgements don't generally need to be reliable, so the
   sender generally need not acknowledge the receiver's
   acknowledgements.  When Ack Vector or Data Dropped is used, however,
   the sender, DCCP A, MUST occasionally acknowledge the receiver's
   acknowledgements so that the receiver can free up Ack Vector or Data
   Dropped state.  When both half-connections are active, the necessary
   acknowledgements will be contained in A's acknowledgements to B's
   data.  If the B-to-A half-connection goes quiescent, however, DCCP A
   must send an acknowledgement proactively.

   Thus, when Ack Vector or Data Dropped is used, an active sender MUST
   acknowledge the receiver's acknowledgements approximately once per
   round-trip time, within a factor of two or three, probably by sending
   a DCCP-DataAck packet.  No acknowledgement options are necessary,
   just the Acknowledgement Number in the DCCP-DataAck header.

   The sender MAY choose to acknowledge the receiver's acknowledgements
   even if they do not contain Ack Vectors or Data Dropped options.  For
   instance, regular acknowledgements can shrink the size of the Loss
   Intervals option.  Unlike Ack Vector and Data Dropped, however, the



Floyd, et al.               Standards Track                    [Page 13]
^L
RFC 4342                    DCCP CCID3 TFRC                   March 2006


   Loss Intervals option is bounded in size (and receiver state), so
   acks-of-acks are not required.

6.4.  Determining Quiescence

   This section describes how a CCID 3 receiver determines that the
   corresponding sender is not sending any data and therefore has gone
   quiescent.  See [RFC4340], Section 11.1, for general information on
   quiescence.

   Let T equal the greater of 0.2 seconds and two round-trip times.  (A
   CCID 3 receiver has a rough measure of the round-trip time so that it
   can pace its acknowledgements.)  The receiver detects that the sender
   has gone quiescent after T seconds have passed without receiving any
   additional data from the sender.

7.  Explicit Congestion Notification

   CCID 3 supports Explicit Congestion Notification (ECN) [RFC3168].  In
   the typical case of an ECN-capable half-connection (where the
   receiver's ECN Incapable feature is set to zero), the sender will use
   the ECN Nonce for its data packets, as specified in [RFC4340],
   Section 12.2.  Information about the ECN Nonce MUST be returned by
   the receiver using the Loss Intervals option, and any Ack Vector
   options MUST include the ECN Nonce Sum.  The sender MAY maintain a
   table with the ECN nonce sum for each packet and use this information
   to probabilistically verify the ECN nonce sums returned in Loss
   Intervals or Ack Vector options.  Section 9 describes this further.

8.  Options and Features

   CCID 3 can make use of DCCP's Ack Vector, Timestamp, Timestamp Echo,
   and Elapsed Time options, and its Send Ack Vector and ECN Incapable
   features.  In addition, the following CCID-specific options are
   defined for use with CCID 3.

                   Option                        DCCP-   Section
          Type     Length     Meaning            Data?  Reference
          -----    ------     -------            -----  ---------
         128-191              Reserved
           192        6       Loss Event Rate      N      8.5
           193     variable   Loss Intervals       N      8.6
           194        6       Receive Rate         N      8.3
         195-255              Reserved

                       Table 1: DCCP CCID 3 Options





Floyd, et al.               Standards Track                    [Page 14]
^L
RFC 4342                    DCCP CCID3 TFRC                   March 2006


   The "DCCP-Data?" column indicates that all currently defined CCID 3-
   specific options MUST be ignored when they occur on DCCP-Data
   packets.

   The following CCID-specific feature is also defined.

                                        Rec'n Initial        Section
      Number   Meaning                  Rule   Value  Req'd Reference
      ------   -------                  -----  -----  ----- ---------
      128-191  Reserved
        192    Send Loss Event Rate      SP      0      N      8.4
      193-255  Reserved

                   Table 2: DCCP CCID 3 Feature Numbers

   The column meanings are described in [RFC4340], Table 4.  "Rec'n
   Rule" defines the feature's reconciliation rule, where "SP" means
   server-priority.  "Req'd" specifies whether every CCID 3
   implementation MUST understand a feature; Send Loss Event Rate is
   optional, in that it behaves like an extension ([RFC4340], Section
   15).

8.1.  Window Counter Value

   The data sender stores a 4-bit window counter value in the DCCP
   generic header's CCVal field on every data packet it sends.  This
   value is set to 0 at the beginning of the transmission and generally
   increased by 1 every quarter of a round-trip time, as described in
   [RFC3448], Section 3.2.1.  Window counters use circular arithmetic
   modulo 16 for all operations, including comparisons; see [RFC4340],
   Section 3.1, for more information on circular arithmetic.  For
   reference, the DCCP generic header is as follows.  (The diagram is
   repeated from [RFC4340], Section 5.1, which also shows the generic
   header with a 24-bit Sequence Number field.)

     0                   1                   2                   3
     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |          Source Port          |           Dest Port           |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |  Data Offset  | CCVal | CsCov |           Checksum            |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | Res | Type  |1|   Reserved    |  Sequence Number (high bits)  .
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    .                  Sequence Number (low bits)                   |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+





Floyd, et al.               Standards Track                    [Page 15]
^L
RFC 4342                    DCCP CCID3 TFRC                   March 2006


   The CCVal field has enough space to express 4 round-trip times at
   quarter-RTT granularity.  The sender MUST avoid wrapping CCVal on
   adjacent packets, as might happen, for example, if two data-carrying
   packets were sent 4 round-trip times apart with no packets
   intervening.  Therefore, the sender SHOULD use the following
   algorithm for setting CCVal.  The algorithm uses three variables:
   "last_WC" holds the last window counter value sent, "last_WC_time" is
   the time at which the first packet with window counter value
   "last_WC" was sent, and "RTT" is the current round-trip time
   estimate.  last_WC is initialized to zero, and last_WC_time to the
   time of the first packet sent.  Before sending a new packet, proceed
   like this:

      Let quarter_RTTs = floor((current_time - last_WC_time) / (RTT/4)).
      If quarter_RTTs > 0, then:
         Set last_WC := (last_WC + min(quarter_RTTs, 5)) mod 16.
         Set last_WC_time := current_time.
      Set the packet header's CCVal field to last_WC.

   When this algorithm is used, adjacent data-carrying packets' CCVal
   counters never differ by more than five, modulo 16.

   The window counter value may also change as feedback packets arrive.
   In particular, after receiving an acknowledgement for a packet sent
   with window counter WC, the sender SHOULD increase its window
   counter, if necessary, so that subsequent packets have window counter
   value at least (WC + 4) mod 16.

   The CCVal counters are used by the receiver to determine whether
   multiple losses belong to a single loss event, to determine the
   interval to use for calculating the receive rate, and to determine
   when to send feedback packets.  None of these procedures require the
   receiver to maintain an explicit estimate of the round-trip time.
   However, implementors who wish to keep such an RTT estimate may do so
   using CCVal.  Let T(I) be the arrival time of the earliest valid
   received packet with CCVal = I.  (Of course, when the window counter
   value wraps around to the same value mod 16, we must recalculate
   T(I).)  Let D = 2, 3, or 4 and say that T(K) and T(K+D) both exist
   (packets were received with window counters K and K+D).  Then the
   value (T(K+D) - T(K)) * 4/D MAY serve as an estimate of the round-
   trip time.  Values of D = 4 SHOULD be preferred for RTT estimation.
   Concretely, say that the following packets arrived:

   Time:       T1  T2  T3 T4  T5           T6  T7   T8  T9
          ------*---*---*-*----*------------*---*----*--*---->
   CCVal:      K-1 K-1  K K   K+1          K+3 K+4  K+3 K+4





Floyd, et al.               Standards Track                    [Page 16]
^L
RFC 4342                    DCCP CCID3 TFRC                   March 2006


   Then T7 - T3, the difference between the receive times of the first
   packet received with window counter K+4 and the first packet received
   with window counter K, is a reasonable round-trip time estimate.
   Because of the necessary constraint that measurements only come from
   packet pairs whose CCVals differ by at most 4, this procedure does
   not work when the inter-packet sending times are significantly
   greater than the RTT, resulting in packet pairs whose CCVals differ
   by 5.  Explicit RTT measurement techniques, such as Timestamp and
   Timestamp Echo, should be used in that case.

8.2.  Elapsed Time Options

   The data receiver MUST include an elapsed time value on every
   required acknowledgement.  This helps the sender distinguish between
   network round-trip time, which it must include in its rate equations,
   and delay at the receiver due to TFRC's infrequent acknowledgement
   rate, which it need not include.  The receiver MUST at least include
   an Elapsed Time option on every feedback packet, but if at least one
   recent data packet (i.e., a packet received after the previous DCCP-
   Ack was sent) included a Timestamp option, then the receiver SHOULD
   include the corresponding Timestamp Echo option, with Elapsed Time
   value, as well.  All of these option types are defined in the main
   DCCP specification [RFC4340].

8.3.  Receive Rate Option

   +--------+--------+--------+--------+--------+--------+
   |11000010|00000110|            Receive Rate           |
   +--------+--------+--------+--------+--------+--------+
    Type=194   Len=6

   This option MUST be sent by the data receiver on all required
   acknowledgements.  Its four data bytes indicate the rate at which the
   receiver has received data since it last sent an acknowledgement, in
   bytes per second.  To calculate this receive rate, the receiver sets
   t to the larger of the estimated round-trip time and the time since
   the last Receive Rate option was sent.  (Received data packets'
   window counters can be used to produce a suitable RTT estimate, as
   described in Section 8.1.)  The receive rate then equals the number
   of data bytes received in the most recent t seconds, divided by t.

   Receive Rate options MUST NOT be sent on DCCP-Data packets, and any
   Receive Rate options on received DCCP-Data packets MUST be ignored.








Floyd, et al.               Standards Track                    [Page 17]
^L
RFC 4342                    DCCP CCID3 TFRC                   March 2006


8.4.  Send Loss Event Rate Feature

   The Send Loss Event Rate feature lets CCID 3 endpoints negotiate
   whether the receiver MUST provide Loss Event Rate options on its
   acknowledgements.  DCCP A sends a "Change R(Send Loss Event Rate, 1)"
   option to ask DCCP B to send Loss Event Rate options as part of its
   acknowledgement traffic.

   Send Loss Event Rate has feature number 192 and is server-priority.
   It takes one-byte Boolean values.  DCCP B MUST send Loss Event Rate
   options on its acknowledgements when Send Loss Event Rate/B is one,
   although it MAY send Loss Event Rate options even when Send Loss
   Event Rate/B is zero.  Values of two or more are reserved.  A CCID 3
   half-connection starts with Send Loss Event Rate equal to zero.

8.5.  Loss Event Rate Option

   +--------+--------+--------+--------+--------+--------+
   |11000000|00000110|          Loss Event Rate          |
   +--------+--------+--------+--------+--------+--------+
    Type=192   Len=6

   The option value indicates the inverse of the loss event rate,
   rounded UP, as calculated by the receiver.  Its units are data
   packets per loss interval.  Thus, if the Loss Event Rate option value
   is 100, then the loss event rate is 0.01 loss events per data packet
   (and the average loss interval contains 100 data packets).  When each
   loss event has exactly one data packet loss, the loss event rate is
   the same as the data packet drop rate.

   See [RFC3448], Section 5, for a normative calculation of loss event
   rate.  Before any losses have occurred, when the loss event rate is
   zero, the Loss Event Rate option value is set to
   "11111111111111111111111111111111" in binary (or, equivalently, to
   2^32 - 1).  The loss event rate calculation uses loss interval data
   lengths, as defined in Section 6.1.1.

   Loss Event Rate options MUST NOT be sent on DCCP-Data packets, and
   any Loss Event Rate options on received DCCP-Data packets MUST be
   ignored.

8.6.  Loss Intervals Option

   +--------+--------+--------+--------...--------+--------+---
   |11000001| Length |  Skip  |   Loss Interval   | More Loss
   |        |        | Length |                   | Intervals...
   +--------+--------+--------+--------...--------+--------+---
    Type=193                         9 bytes



Floyd, et al.               Standards Track                    [Page 18]
^L
RFC 4342                    DCCP CCID3 TFRC                   March 2006


   Each 9-byte Loss Interval contains three fields, as follows:

     ____________________ Loss Interval _____________________
    /                                                        \
   +--------...-------+--------...--------+--------...--------+
   | Lossless Length  |E|   Loss Length   |    Data Length    |
   +--------...-------+--------...--------+--------...--------+
          3 bytes            3 bytes             3 bytes

   The receiver reports its observed loss intervals using a Loss
   Intervals option.  Section 6.1 defines loss intervals.  This option
   MUST be sent by the data receiver on all required acknowledgements.
   The option reports up to 28 loss intervals seen by the receiver,
   although TFRC currently uses at most the latest 9 of these.  This
   lets the sender calculate a loss event rate and probabilistically
   verify the receiver's ECN Nonce Echo.

   The Loss Intervals option serves several purposes.

   o  The sender can use the Loss Intervals option to calculate the loss
      event rate.

   o  Loss Intervals information is easily checked for consistency
      against previous Loss Intervals options, and against any Loss
      Event Rate calculated by the receiver.

   o  The sender can probabilistically verify the ECN Nonce Echo for
      each Loss Interval, reducing the likelihood of misbehavior.

   Loss Intervals options MUST NOT be sent on DCCP-Data packets, and any
   Loss Intervals options on received DCCP-Data packets MUST be ignored.

8.6.1.  Option Details

   The Loss Intervals option contains information about one to 28
   consecutive loss intervals, always including the most recent loss
   interval.  Intervals are listed in reverse chronological order.
   Should more than 28 loss intervals need to be reported, then multiple
   Loss Intervals options can be sent; the second option begins where
   the first left off, and so forth.  The options MUST contain
   information about at least the most recent NINTERVAL + 1 = 9 loss
   intervals unless (1) there have not yet been NINTERVAL + 1 loss
   intervals, or (2) the receiver knows, because of the sender's
   acknowledgements, that some previously transmitted loss interval
   information has been received.  In this second case, the receiver
   need not send loss intervals that the sender already knows about,
   except that it MUST transmit at least one loss interval regardless.




Floyd, et al.               Standards Track                    [Page 19]
^L
RFC 4342                    DCCP CCID3 TFRC                   March 2006


   The NINTERVAL parameter is equal to "n" as defined in [RFC3448],
   Section 5.4.

   Loss interval sequence numbers are delta encoded starting from the
   Acknowledgement Number.  Therefore, Loss Intervals options MUST NOT
   be sent on packets without an Acknowledgement Number, and any Loss
   Intervals options received on such packets MUST be ignored.

   The first byte of option data is Skip Length, which indicates the
   number of packets up to and including the Acknowledgement Number that
   are not part of any Loss Interval.  As discussed above, Skip Length
   must be less than or equal to NDUPACK = 3.  In a packet containing
   multiple Loss Intervals options, the Skip Lengths of the second and
   subsequent options MUST equal zero; such options with nonzero Skip
   Lengths MUST be ignored.

   Loss Interval structures follow Skip Length.  Each Loss Interval
   consists of a Lossless Length, a Loss Length, an ECN Nonce Echo (E),
   and a Data Length.

   Lossless Length, a 24-bit number, specifies the number of packets in
   the loss interval's lossless part.  Note again that this part may
   contain lost or marked non-data packets.

   Loss Length, a 23-bit number, specifies the number of packets in the
   loss interval's lossy part.  The sum of the Lossless Length and the
   Loss Length equals the loss interval's sequence length.  Receivers
   SHOULD report the minimum valid Loss Length for each loss interval,
   making the first and last sequence numbers in each lossy part
   correspond to lost or marked data packets.

   The ECN Nonce Echo, stored in the high-order bit of the 3-byte field
   containing Loss Length, equals the one-bit sum (exclusive-or, or
   parity) of data packet nonces received over the loss interval's
   lossless part (which is Lossless Length packets long).  If Lossless
   Length is 0, the receiver is ECN Incapable, or the Lossless Length
   contained no data packets, then the ECN Nonce Echo MUST be reported
   as 0.  Note that any ECN nonces on received non-data packets MUST NOT
   contribute to the ECN Nonce Echo.

   Finally, Data Length, a 24-bit number, specifies the loss interval's
   data length, as defined in Section 6.1.1.

8.6.2.  Example

   Consider the following sequence of packets, where "-" represents a
   safely delivered packet and "*" represents a lost or marked packet.




Floyd, et al.               Standards Track                    [Page 20]
^L
RFC 4342                    DCCP CCID3 TFRC                   March 2006


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

   Assuming that packet 43 was lost, not marked, this sequence might be
   divided into loss intervals as follows:

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

   A Loss Intervals option sent on a packet with Acknowledgement Number
   44 to acknowledge 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.  This option is interpreted as
   follows.

   193 The Loss Intervals option number.

   39  The length of the option, including option type and length bytes.
       This option contains information about (39 - 3)/9 = 4 loss
       intervals.

   2   The Skip Length is 2 packets.  Thus, the most recent loss
       interval, L3, ends immediately before sequence number 44 - 2 + 1
       = 43.

   0,0,10, 128,0,1, 0,0,10
       These bytes define L3.  L3 consists of a 10-packet lossless part
       (0,0,10), preceded by a 1-packet lossy part.  Continuing to
       subtract, the lossless part begins with sequence number 43 - 10 =
       33, and the lossy part begins with sequence number 33 - 1 = 32.
       The ECN Nonce Echo for the lossless part (namely, packets 33
       through 42, inclusive) equals 1.  The interval's data length is
       10, so the receiver believes that the interval contained exactly
       one non-data packet.

   0,0,8, 0,0,5, 0,0,10
       This defines L2, whose lossless part begins with sequence number
       32 - 8 = 24; whose lossy part begins with sequence number 24 - 5
       = 19; whose ECN Nonce Echo (for packets [24,31]) equals 0; and
       whose data length is 10.






Floyd, et al.               Standards Track                    [Page 21]
^L
RFC 4342                    DCCP CCID3 TFRC                   March 2006


   0,0,8, 0,0,1, 0,0,8
       L1's lossless part begins with sequence number 11, its lossy part
       begins with sequence number 10, its ECN Nonce Echo (for packets
       [11,18]) equals 0, and its data length is 8.

   0,0,10, 128,0,0, 0,0,15
       L0's lossless part begins with sequence number 0, it has no lossy
       part, its ECN Nonce Echo (for packets [0,9]) equals 1, and its
       data length is 15.  (This must be the first loss interval in the
       connection; otherwise, a data length greater than the sequence
       length would be invalid.)

9.  Verifying Congestion Control Compliance with ECN

   The sender can use Loss Intervals options' ECN Nonce Echoes (and
   possibly any Ack Vectors' ECN Nonce Echoes) to probabilistically
   verify that the receiver is correctly reporting all dropped or marked
   packets.  Even if ECN is not used (the receiver's ECN Incapable
   feature is set to one), the sender could still check on the receiver
   by occasionally not sending a packet, or sending a packet out-of-
   order, to catch the receiver in an error in Loss Intervals or Ack
   Vector information.  This is not as robust or non-intrusive as the
   verification provided by the ECN Nonce, however.

9.1.  Verifying the ECN Nonce Echo

   To verify the ECN Nonce Echo included with a Loss Intervals option,
   the sender maintains a table with the ECN nonce sum for each data
   packet.  As defined in [RFC3540], the nonce sum for sequence number S
   is the one-bit sum (exclusive-or, or parity) of data packet nonces
   over the sequence number range [I,S], where I is the initial sequence
   number.  Let NonceSum(S) represent this nonce sum for sequence number
   S, and define NonceSum(I - 1) as 0.  Note that NonceSum does not
   account for the nonces of non-data packets such as DCCP-Ack.  Then
   the Nonce Echo for an interval of packets with sequence numbers X to
   Y, inclusive, should equal the following one-bit sum:

         NonceSum(X - 1) + NonceSum(Y)

   Since an ECN Nonce Echo is returned for the lossless part of each
   Loss Interval, a misbehaving receiver -- meaning a receiver that
   reports a lost or marked data packet as "received non-marked", to
   avoid rate reductions -- has only a 50% chance of guessing the
   correct Nonce Echo for each loss interval.

   To verify the ECN Nonce Echo included with an Ack Vector option, the
   sender maintains a table with the ECN nonce value sent for each
   packet.  The Ack Vector option explicitly says which packets were



Floyd, et al.               Standards Track                    [Page 22]
^L
RFC 4342                    DCCP CCID3 TFRC                   March 2006


   received non-marked; the sender just adds up the nonces for those
   packets using a one-bit sum and compares the result to the Nonce Echo
   encoded in the Ack Vector's option type.  Again, a misbehaving
   receiver has only a 50% chance of guessing an Ack Vector's correct
   Nonce Echo.  Alternatively, an Ack Vector's ECN Nonce Echo may also
   be calculated from a table of ECN nonce sums, rather than from ECN
   nonces.  If the Ack Vector contains many long runs of non-marked,
   non-dropped packets, the nonce sum-based calculation will probably be
   faster than a straightforward nonce-based calculation.

   Note that Ack Vector's ECN Nonce Echo is measured over both data
   packets and non-data packets, while the Loss Intervals option reports
   ECN Nonce Echoes for data packets only.  Thus, different nonce sum
   tables are required to verify the two options.

9.2.  Verifying the Reported Loss Intervals and Loss Event Rate

   Besides probabilistically verifying the ECN Nonce Echoes reported by
   the receiver, the sender may also verify the loss intervals and any
   loss event rate reported by the receiver, if it so desires.
   Specifically, the Loss Intervals option explicitly reports the size
   of each loss interval as seen by the receiver; the sender can verify
   that the receiver is not falsely combining two loss events into one
   reported Loss Interval by using saved window counter information.
   The sender can also compare any Loss Event Rate option to the loss
   event rate it calculates using the Loss Intervals option.

   Note that in some cases the loss event rate calculated by the sender
   could differ from an explicit Loss Event Rate option sent by the
   receiver.  In particular, when a number of successive packets are
   dropped, the receiver does not know the sending times for these
   packets and interprets these losses as a single loss event.  In
   contrast, if the sender has saved the sending times or window counter
   information for these packets, then the sender can determine if these
   losses constitute a single loss event or several successive loss
   events.  Thus, with its knowledge of the sending times of dropped
   packets, the sender is able to make a more accurate calculation of
   the loss event rate.  These kinds of differences SHOULD NOT be
   misinterpreted as attempted receiver misbehavior.

10.  Implementation Issues

10.1.  Timestamp Usage

   CCID 3 data packets need not carry Timestamp options.  The sender can
   store the times at which recent packets were sent; the
   Acknowledgement Number and Elapsed Time option contained on each
   required acknowledgement then provide sufficient information to



Floyd, et al.               Standards Track                    [Page 23]
^L
RFC 4342                    DCCP CCID3 TFRC                   March 2006


   compute the round trip time.  Alternatively, the sender MAY include
   Timestamp options on some of its data packets.  The receiver will
   respond with Timestamp Echo options including Elapsed Times, allowing
   the sender to calculate round-trip times without storing sent
   packets' timestamps at all.

10.2.  Determining Loss Events at the Receiver

   The window counter is used by the receiver to determine whether
   multiple lost packets belong to the same loss event.  The sender
   increases the window counter by one every quarter round-trip time.
   This section describes in detail the procedure for using the window
   counter to determine when two lost packets belong to the same loss
   event.

   [RFC3448], Section 3.2.1 specifies that each data packet contains a
   timestamp and gives as an alternative implementation a "timestamp"
   that is incremented every quarter of an RTT, as is the window counter
   in CCID 3.  However, [RFC3448], Section 5.2 on "Translation from Loss
   History to Loss Events" is written in terms of timestamps, not in
   terms of window counters.  In this section, we give a procedure for
   the translation from loss history to loss events that is explicitly
   in terms of window counters.

   To determine whether two lost packets with sequence numbers X and Y
   belong to different loss events, the receiver proceeds as follows.
   Assume Y > X in circular sequence space.

   o  Let X_prev be the greatest valid sequence number received with
      X_prev < X.

   o  Let Y_prev be the greatest valid sequence number received with
      Y_prev < Y.

   o  Given a sequence number N, let C(N) be the window counter value
      associated with that packet.

   o  Packets X and Y belong to different loss events if there exists a
      packet with sequence number S so that X_prev < S <= Y_prev, and
      the distance from C(X_prev) to C(S) is greater than 4.  (The
      distance is the number D so that C(X_prev) + D = C(S) (mod
      WCTRMAX), where WCTRMAX is the maximum value for the window
      counter -- in our case, 16.)

      That is, the receiver only considers losses X and Y as separate
      loss events if there exists some packet S received between X and
      Y, with the distance from C(X_prev) to C(S) greater than 4.  This
      complex calculation is necessary in order to handle the case where



Floyd, et al.               Standards Track                    [Page 24]
^L
RFC 4342                    DCCP CCID3 TFRC                   March 2006


      window counter space wrapped completely between X and Y.  When
      that space does not wrap, the receiver can simply check whether
      the distance from C(X_prev) to C(Y_prev) is greater than 4; if so,
      then X and Y belong to separate loss events.

   Window counters can help the receiver disambiguate multiple losses
   after a sudden decrease in the actual round-trip time.  When the
   sender receives an acknowledgement acknowledging a data packet with
   window counter i, the sender increases its window counter, if
   necessary, so that subsequent data packets are sent with window
   counter values of at least i+4.  This can help minimize errors where
   the receiver incorrectly interprets multiple loss events as a single
   loss event.

   We note that if all of the packets between X and Y are lost in the
   network, then X_prev and Y_prev are equal, and the series of
   consecutive losses is treated by the receiver as a single loss event.
   However, the sender will receive no DCCP-Ack packets during a period
   of consecutive losses, and the sender will reduce its sending rate
   accordingly.

   As an alternative to the window counter, the sender could have sent
   its estimate of the round-trip time to the receiver directly in a
   round-trip time option; the receiver would use the sender's round-
   trip time estimate to infer when multiple lost or marked packets
   belong in the same loss event.  In some respects, a round-trip time
   option would give a more precise encoding of the sender's round-trip
   time estimate than does the window counter.  However, the window
   counter conveys information about the relative *sending* times for
   packets, while the receiver could only use the round-trip time option
   to distinguish between the relative *receive* times (in the absence
   of timestamps).  That is, the window counter will give more robust
   performance when there is a large variation in delay for packets sent
   within a window of data.  Slightly more speculatively, a round-trip
   time option might possibly be used more easily by middleboxes
   attempting to verify that a flow used conforming end-to-end
   congestion control.

10.3.  Sending Feedback Packets

   [RFC3448], Sections 6.1 and 6.2 specify that the TFRC receiver must
   send a feedback packet when a newly calculated loss event rate p is
   greater than its previous value.  CCID 3 follows this rule.

   In addition, [RFC3448], Section 6.2, specifies that the receiver use
   a feedback timer to decide when to send additional feedback packets.
   If the feedback timer expires and data packets have been received
   since the previous feedback was sent, then the receiver sends a



Floyd, et al.               Standards Track                    [Page 25]
^L
RFC 4342                    DCCP CCID3 TFRC                   March 2006


   feedback packet.  When the feedback timer expires, the receiver
   resets the timer to expire after R_m seconds, where R_m is the most
   recent estimate of the round-trip time received from the sender.
   CCID 3 receivers, however, generally use window counter values
   instead of a feedback timer to determine when to send additional
   feedback packets.  This section describes how.

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

   This procedure ensures that when the sender is sending at a rate less
   than one packet per round-trip time, the receiver sends a feedback
   packet after each data packet.  Similarly, this procedure ensures
   that when the sender is sending several packets per round-trip time,
   the receiver will send a feedback packet each time that a data packet
   arrives with a window counter at least four greater than the window
   counter when the last feedback packet was sent.  Thus, the feedback
   timer is not necessary when the window counter is used.

   However, the feedback timer still could be useful in some rare cases
   to prevent the sender from unnecessarily halving its sending rate.
   In particular, one could construct scenarios where the use of the
   feedback timer at the receiver would prevent the unnecessary
   expiration of the nofeedback timer at the sender.  Consider the case
   below, in which a feedback packet is sent when a data packet arrives
   with a window counter of K.

      Window
      Counters: K   K+1 K+2 K+3 K+4 K+5 K+6  ...  K+15 K+16 K+17 ...
                |   |   |   |   |   |   |         |    |    |
      Data      |   |   |   |   |   |   |         |    |    |
      Packets   |   |   |   |   |   |   |         |    |    |
      Received:   - -  ---  -                ...   - - -- -  -- --  -
                  |                |               |    |    |        |
                  |                |               |    |    |        |
      Events:     1:               2:              3:   4:   5:       6:
                 "A"                              "B"  Timer "B"
                 sent                             sent       received

           1:  Feedback message A is sent.
           2:  A feedback message would have been sent if feedback
               timers had been used.



Floyd, et al.               Standards Track                    [Page 26]
^L
RFC 4342                    DCCP CCID3 TFRC                   March 2006


           3:  Feedback message B is sent.
           4:  Sender's nofeedback timer expires.
           5:  Feedback message B is received at the sender.
           6:  Sender's nofeedback timer would have expired if feedback
               timers had been used, and the feedback message at 2 had
               been sent.

   The receiver receives data after the feedback packet has been sent
   but has received no data packets with a window counter between K+4
   and K+14.  A data packet with a window counter of K+4 or larger would
   have triggered sending a new feedback packet, but no feedback packet
   is sent until time 3.

   The TFRC protocol specifies that after a feedback packet is received,
   the sender sets a nofeedback timer to at least four times the round-
   trip time estimate.  If the sender doesn't receive any feedback
   packets before the nofeedback timer expires, then the sender halves
   its sending rate.  In the figure, the sender receives feedback
   message A (time 1) and then sets the nofeedback timer to expire
   roughly four round-trip times later (time 4).  The sender starts
   sending again just before the nofeedback timer expires but doesn't
   receive the resulting feedback message until after its expiration,
   resulting in an unnecessary halving of the sending rate.  If the
   connection had used feedback timers, the receiver would have sent a
   feedback message when the feedback timer expired at time 2, and the
   halving of the sending rate would have been avoided.

   For implementors who wish to implement a feedback timer for the data
   receiver, we suggest estimating the round-trip time from the most
   recent data packet, as described in Section 8.1.  We note that this
   procedure does not work when the inter-packet sending times are
   greater than the RTT.

11.  Security Considerations

   Security considerations for DCCP have been discussed in [RFC4340],
   and security considerations for TFRC have been discussed in
   [RFC3448], Section 9.  The security considerations for TFRC include
   the need to protect against spoofed feedback and the need to protect
   the congestion control mechanisms against incorrect information from
   the receiver.

   In this document, we have extensively discussed the mechanisms the
   sender can use to verify the information sent by the receiver.  When
   ECN is used, the receiver returns ECN Nonce information to the
   sender.  When ECN is not used, then, as Section 9 shows, the sender
   could still use various techniques that might catch the receiver in




Floyd, et al.               Standards Track                    [Page 27]
^L
RFC 4342                    DCCP CCID3 TFRC                   March 2006


   an error in reporting congestion, but this is not as robust or non-
   intrusive as the verification provided by the ECN Nonce.

12.  IANA Considerations

   This specification defines the value 3 in the DCCP CCID namespace
   managed by IANA.  This assignment is also mentioned in [RFC4340].

   CCID 3 also introduces three sets of numbers whose values should be
   allocated by IANA; namely, CCID 3-specific Reset Codes, option types,
   and feature numbers.  These ranges will prevent any future CCID 3-
   specific allocations from polluting DCCP's corresponding global
   namespaces; see [RFC4340], Section 10.3.  However, we note that this
   document makes no particular allocations from the Reset Code range,
   except for experimental and testing use [RFC3692].  We refer to the
   Standards Action policy outlined in [RFC2434].

12.1.  Reset Codes

   Each entry in the DCCP CCID 3 Reset Code registry contains a CCID 3-
   specific Reset Code, which is a number in the range 128-255; a short
   description of the Reset Code; and a reference to the RFC defining
   the Reset Code.  Reset Codes 184-190 and 248-254 are permanently
   reserved for experimental and testing use.  The remaining Reset Codes
   -- 128-183, 191-247, and 255 -- are currently reserved and should be
   allocated with the Standards Action policy, which requires IESG
   review and approval and standards-track IETF RFC publication.

12.2.  Option Types

   Each entry in the DCCP CCID 3 option type registry contains a CCID
   3-specific option type, which is a number in the range 128-255; the
   name of the option, such as "Loss Intervals"; and a reference to the
   RFC defining the option type.  The registry is initially populated
   using the values in Table 1, in Section 8.  This document allocates
   option types 192-194, and option types 184-190 and 248-254 are
   permanently reserved for experimental and testing use.  The remaining
   option types -- 128-183, 191, 195-247, and 255 -- are currently
   reserved and should be allocated with the Standards Action policy,
   which requires IESG review and approval and standards-track IETF RFC
   publication.

12.3.  Feature Numbers

   Each entry in the DCCP CCID 3 feature number registry contains a CCID
   3-specific feature number, which is a number in the range 128-255;
   the name of the feature, such as "Send Loss Event Rate"; and a
   reference to the RFC defining the feature number.  The registry is



Floyd, et al.               Standards Track                    [Page 28]
^L
RFC 4342                    DCCP CCID3 TFRC                   March 2006


   initially populated using 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 -- 128-183, 191, 193-247, and 255
   -- are currently reserved and should be allocated with the Standards
   Action policy, which requires IESG review and approval and
   standards-track IETF RFC publication.

13.  Thanks

   We thank Mark Handley for his help in defining CCID 3.  We also thank
   Mark Allman, Aaron Falk, Ladan Gharai, Sara Karlberg, Greg Minshall,
   Arun Venkataramani, David Vos, Yufei Wang, Magnus Westerlund, and
   members of the DCCP Working Group for feedback on versions of this
   document.




































Floyd, et al.               Standards Track                    [Page 29]
^L
RFC 4342                    DCCP CCID3 TFRC                   March 2006


A.  Appendix: Possible Future Changes to CCID 3

   There are a number of cases where the behavior of TFRC as specified
   in [RFC3448] does not match the desires of possible users of DCCP.
   These include the following:

   1. The initial sending rate of at most four packets per RTT, as
      specified in [RFC3390].

   2. The receiver's sending of an acknowledgement for every data packet
      received, when the receiver receives at a rate less than one
      packet per round-trip time.

   3. The sender's limitation of at most doubling the sending rate from
      one round-trip time to the next (or, more specifically, of
      limiting the sending rate to at most twice the reported receive
      rate over the previous round-trip time).

   4. The limitation of halving the allowed sending rate after an idle
      period of four round-trip times (possibly down to the initial
      sending rate of two to four packets per round-trip time).

   5. The response function used in [RFC3448], Section 3.1, which does
      not closely match the behavior of TCP in environments with high
      packet drop rates [RFC3714].

   One suggestion for higher initial sending rates is an initial sending
   rate of up to eight small packets per RTT, when the total packet
   size, including headers, is at most 4380 bytes.  Because the packets
   would be rate-paced out over a round-trip time, instead of sent
   back-to-back as they would be in TCP, an initial sending rate of
   eight small packets per RTT with TFRC-based congestion control would
   be considerably milder than the impact of an initial window of eight
   small packets sent back-to-back in TCP.  As Section 5.1 describes,
   the initial sending rate also serves as a lower bound for reductions
   of the allowed sending rate during an idle period.

   We note that with CCID 3, the sender is in slow-start in the
   beginning and responds promptly to the report of a packet loss or
   mark.  However, in the absence of feedback from the receiver, the
   sender can maintain its old sending rate for up to four round-trip
   times.  One possibility would be that for an initial window of eight
   small packets, the initial nofeedback timer would be set to two
   round-trip times instead of four, so that the sending rate would be
   reduced after two round-trips without feedback.






Floyd, et al.               Standards Track                    [Page 30]
^L
RFC 4342                    DCCP CCID3 TFRC                   March 2006


   Research and engineering will be needed to investigate the pros and
   cons of modifying these limitations in order to allow larger initial
   sending rates, to send fewer acknowledgements when the data sending
   rate is low, to allow more abrupt changes in the sending rate, or to
   allow a higher sending rate after an idle period.

Normative References

   [RFC2119]      Bradner, S., "Key words for use in RFCs to Indicate
                  Requirement Levels", BCP 14, RFC 2119, March 1997.

   [RFC2434]      Narten, T. and H. Alvestrand, "Guidelines for Writing
                  an IANA Considerations Section in RFCs", BCP 26, RFC
                  2434, October 1998.

   [RFC2581]      Allman, M., Paxson, V., and W. Stevens, "TCP
                  Congestion Control", RFC 2581, April 1999.

   [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.

   [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.

Informative References

   [RFC3540]      Spring, N., Wetherall, D., and D. Ely, "Robust
                  Explicit Congestion Notification (ECN) Signaling with
                  Nonces", RFC 3540, June 2003.









Floyd, et al.               Standards Track                    [Page 31]
^L
RFC 4342                    DCCP CCID3 TFRC                   March 2006


   [RFC3714]      Floyd, S. and J. Kempf, "IAB Concerns Regarding
                  Congestion Control for Voice Traffic in the Internet",
                  RFC 3714, March 2004.

   [RFC4341]      Floyd, S. and E. Kohler, "Profile for Datagram
                  Congestion Control Protocol (DCCP) Congestion Control
                  ID 2: TCP-like Congestion Control", RFC 4341, March
                  2006.

   [V03]          Arun Venkataramani, August 2003.  Citation for
                  acknowledgement purposes only.

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


   Jitendra Padhye
   Microsoft Research
   One Microsoft Way
   Redmond, WA 98052
   USA

   EMail: padhye@microsoft.com












Floyd, et al.               Standards Track                    [Page 32]
^L
RFC 4342                    DCCP CCID3 TFRC                   March 2006


Full Copyright Statement

   Copyright (C) The Internet Society (2006).

   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 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.

Acknowledgement

   Funding for the RFC Editor function is provided by the IETF
   Administrative Support Activity (IASA).







Floyd, et al.               Standards Track                    [Page 33]
^L