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
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
|
Network Working Group S. Floyd
Request for Comments: 5348 ICIR
Obsoletes: 3448 M. Handley
Updates: 4342 University College London
J. Padhye
Microsoft
J. Widmer
DoCoMo
September 2008
TCP Friendly Rate Control (TFRC): Protocol Specification
Status of This Memo
This document specifies an Internet standards track protocol for the
Internet community, and requests discussion and suggestions for
improvements. Please refer to the current edition of the "Internet
Official Protocol Standards" (STD 1) for the standardization state
and status of this protocol. Distribution of this memo is unlimited.
Abstract
This document specifies TCP Friendly Rate Control (TFRC). TFRC is a
congestion control mechanism for unicast flows operating in a best-
effort Internet environment. It is reasonably fair when competing
for bandwidth with TCP flows, but has a much lower variation of
throughput over time compared with TCP, making it more suitable for
applications such as streaming media where a relatively smooth
sending rate is of importance.
This document obsoletes RFC 3448 and updates RFC 4342.
Table of Contents
1. Introduction ....................................................3
2. Conventions .....................................................4
3. Protocol Mechanism ..............................................4
3.1. TCP Throughput Equation ....................................5
3.2. Packet Contents ............................................7
3.2.1. Data Packets ........................................7
3.2.2. Feedback Packets ....................................8
4. Data Sender Protocol ............................................8
4.1. Measuring the Segment Size .................................9
4.2. Sender Initialization .....................................10
4.3. Sender Behavior When a Feedback Packet Is Received ........10
4.4. Expiration of Nofeedback Timer ............................15
4.5. Reducing Oscillations .....................................17
Floyd, et al. Standards Track [Page 1]
^L
RFC 5348 TFRC: Protocol Specification September 2008
4.6. Scheduling of Packet Transmissions ........................18
5. Calculation of the Loss Event Rate (p) .........................19
5.1. Detection of Lost or Marked Packets .......................19
5.2. Translation from Loss History to Loss Events ..............20
5.3. The Size of a Loss Interval ...............................22
5.4. Average Loss Interval .....................................22
5.5. History Discounting .......................................24
6. Data Receiver Protocol .........................................26
6.1. Receiver Behavior When a Data Packet Is Received ..........27
6.2. Expiration of Feedback Timer ..............................27
6.3. Receiver Initialization ...................................28
6.3.1. Initializing the Loss History after the
First Loss Event ...................................29
7. Sender-Based Variants ..........................................30
8. Implementation Issues ..........................................31
8.1. Computing the Throughput Equation .........................31
8.2. Sender Behavior When a Feedback Packet Is Received ........32
8.2.1. Determining If an Interval Was a
Data-Limited Interval ..............................32
8.2.2. Maintaining X_recv_set .............................34
8.3. Sending Packets before Their Nominal Send Time ............34
8.4. Calculation of the Average Loss Interval ..................36
8.5. The Optional History Discounting Mechanism ................36
9. Changes from RFC 3448 ..........................................36
9.1. Overview of Changes .......................................36
9.2. Changes in Each Section ...................................37
10. Security Considerations .......................................39
10.1. Security Considerations for TFRC in DCCP .................40
11. Acknowledgments ...............................................40
Appendix A. Terminology ...........................................41
Appendix B. The Initial Value of the Nofeedback Timer .............43
Appendix C. Response to Idle or Data-Limited Periods ..............44
C.1. Long Idle or Data-Limited Periods ........................45
C.2. Short Idle or Data-Limited Periods .......................48
C.3. Moderate Idle or Data-Limited Periods ....................49
C.4. Losses During Data-Limited Periods .......................50
C.5. Other Patterns ...........................................53
C.6. Evaluating TFRC's Response to Idle Periods ...............53
References ........................................................54
Normative References ...........................................54
Informative References .........................................54
Floyd, et al. Standards Track [Page 2]
^L
RFC 5348 TFRC: Protocol Specification September 2008
1. Introduction
This document specifies TCP Friendly Rate Control (TFRC). TFRC is a
congestion control mechanism designed for unicast flows operating in
an Internet environment and competing with TCP traffic [FHPW00].
Instead of specifying a complete protocol, this document simply
specifies a congestion control mechanism that could be used in a
transport protocol such as DCCP (Datagram Congestion Control
Protocol) [RFC4340], in an application incorporating end-to-end
congestion control at the application level, or in the context of
endpoint congestion management [BRS99]. This document does not
discuss packet formats or reliability. Implementation-related issues
are discussed only briefly, in Section 8.
TFRC is designed to be reasonably fair when competing for bandwidth
with TCP flows, where we call a flow "reasonably fair" if its sending
rate is generally within a factor of two of the sending rate of a TCP
flow under the same conditions. However, TFRC has a much lower
variation of throughput over time compared with TCP, which makes it
more suitable for applications such as telephony or streaming media
where a relatively smooth sending rate is of importance.
The penalty of having smoother throughput than TCP while competing
fairly for bandwidth is that TFRC responds slower than TCP to changes
in available bandwidth. Thus, TFRC should only be used when the
application has a requirement for smooth throughput, in particular,
avoiding TCP's halving of the sending rate in response to a single
packet drop. For applications that simply need to transfer as much
data as possible in as short a time as possible, we recommend using
TCP, or if reliability is not required, using an Additive-Increase,
Multiplicative-Decrease (AIMD) congestion control scheme with similar
parameters to those used by TCP.
TFRC is designed for best performance with applications that use a
fixed segment size, and vary their sending rate in packets per second
in response to congestion. TFRC can also be used, perhaps with less
optimal performance, with applications that do not have a fixed
segment size, but where the segment size varies according to the
needs of the application (e.g., video applications).
Some applications (e.g., some audio applications) require a fixed
interval of time between packets and vary their segment size instead
of their packet rate in response to congestion. The congestion
control mechanism in this document is not designed for those
applications; TFRC-SP (Small-Packet TFRC) is a variant of TFRC for
applications that have a fixed sending rate in packets per second but
either use small packets or vary their packet size in response to
congestion. TFRC-SP is specified in a separate document [RFC4828].
Floyd, et al. Standards Track [Page 3]
^L
RFC 5348 TFRC: Protocol Specification September 2008
This document specifies TFRC as a receiver-based mechanism, with the
calculation of the congestion control information (i.e., the loss
event rate) in the data receiver rather in the data sender. This is
well-suited to an application where the sender is a large server
handling many concurrent connections, and the receiver has more
memory and CPU cycles available for computation. In addition, a
receiver-based mechanism is more suitable as a building block for
multicast congestion control. However, it is also possible to
implement TFRC in sender-based variants, as allowed in DCCP's
Congestion Control ID 3 (CCID 3) [RFC4342].
This document obsoletes RFC 3448. In the transport protocol DCCP
(Datagram Congestion Control Protocol) [RFC4340], the Congestion
Control ID Profiles CCID-3 [RFC4342] and CCID-4 [CCID-4] both specify
the use of TFRC from RFC 3448. CCID-3 and CCID-4 implementations
SHOULD use this document instead of RFC 3448 for the specification of
TFRC.
The normative specification of TFRC is in Sections 3-6. Section 7
discusses sender-based variants, Section 8 discusses implementation
issues, and Section 9 gives a non-normative overview of differences
with RFC 3448.
2. Conventions
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
document are to be interpreted as described in [RFC2119].
Appendix A gives a list of technical terms used in this document.
3. Protocol Mechanism
For its congestion control mechanism, TFRC directly uses a throughput
equation for the allowed sending rate as a function of the loss event
rate and round-trip time. In order to compete fairly with TCP, TFRC
uses the TCP throughput equation, which roughly describes TCP's
sending rate as a function of the loss event rate, round-trip time,
and segment size. We define a loss event as one or more lost or
marked packets from a window of data, where a marked packet refers to
a congestion indication from Explicit Congestion Notification (ECN)
[RFC3168].
Generally speaking, TFRC's congestion control mechanism works as
follows:
o The receiver measures the loss event rate and feeds this
information back to the sender.
Floyd, et al. Standards Track [Page 4]
^L
RFC 5348 TFRC: Protocol Specification September 2008
o The sender also uses these feedback messages to measure the
round-trip time (RTT).
o The loss event rate and RTT are then fed into TFRC's throughput
equation, and the resulting sending rate is limited to at most
twice the receive rate to give the allowed transmit rate X.
o The sender then adjusts its transmit rate to match the allowed
transmit rate X.
The dynamics of TFRC are sensitive to how the measurements are
performed and applied. We recommend specific mechanisms below to
perform and apply these measurements. Other mechanisms are possible,
but it is important to understand how the interactions between
mechanisms affect the dynamics of TFRC.
3.1. TCP Throughput Equation
Any realistic equation giving TCP throughput as a function of loss
event rate and RTT should be suitable for use in TFRC. However, we
note that the TCP throughput equation used must reflect TCP's
retransmit timeout behavior, as this dominates TCP throughput at
higher loss rates. We also note that the assumptions implicit in the
throughput equation about the loss event rate parameter have to be a
reasonable match to how the loss rate or loss event rate is actually
measured. While this match is not perfect for the throughput
equation and loss rate measurement mechanisms given below, in
practice the assumptions turn out to be close enough.
The throughput equation currently REQUIRED for TFRC is a slightly
simplified version of the throughput equation for Reno TCP from
[PFTK98]. Ideally, we would prefer a throughput equation based on
selective acknowledgment (SACK) TCP, but no one has yet derived the
throughput equation for SACK TCP, and simulations and experiments
suggest that the differences between the two equations would be
relatively minor [FF99] (Appendix B).
The throughput equation for X_Bps, TCP's average sending rate in
bytes per second, is:
s
X_Bps = ----------------------------------------------------------
R*sqrt(2*b*p/3) + (t_RTO * (3*sqrt(3*b*p/8)*p*(1+32*p^2)))
Where:
X_Bps is TCP's average transmit rate in bytes per second. (X_Bps
is the same as X_calc in RFC 3448.)
Floyd, et al. Standards Track [Page 5]
^L
RFC 5348 TFRC: Protocol Specification September 2008
s is the segment size in bytes (excluding IP and transport
protocol headers).
R is the round-trip time in seconds.
p is the loss event rate, between 0 and 1.0, of the number of loss
events as a fraction of the number of packets transmitted.
t_RTO is the TCP retransmission timeout value in seconds.
b is the maximum number of packets acknowledged by a single TCP
acknowledgement.
Setting the TCP retransmission timeout value t_RTO:
Implementations SHOULD set t_RTO = 4*R. Implementations MAY choose
to implement a more accurate calculation of t_RTO. Implementations
MAY also set t_RTO to max(4*R, one second), to match the recommended
minimum of one second on the RTO [RFC2988].
Setting the parameter b for delayed acknowledgements:
Some current TCP connections use delayed acknowledgements, sending an
acknowledgement for every two data packets received. However, TCP is
also allowed to send an acknowledgement for every data packet. For
the revised TCP congestion control mechanisms, [RFC2581bis] currently
specifies that the delayed acknowledgement algorithm should be used
with TCP. However, [RFC2581bis] recommends increasing the congestion
window during congestion avoidance by one segment per RTT even in the
face of delayed acknowledgements, consistent with a TCP throughput
equation with b = 1. On an experimental basis, [RFC2581bis] allows
for increases of the congestion window during slow-start that are
also consistent with a TCP throughput equation with b = 1. Thus, the
use of b = 1 is consistent with [RFC2581bis]. The use of b = 1 is
RECOMMENDED.
With t_RTO=4*R and b=1, the throughput equation for X_Bps, the TCP
sending rate in bytes per second, can be simplified as:
s
X_Bps = -----------------------------------------------
R * (sqrt(2*p/3) + 12*sqrt(3*p/8)*p*(1+32*p^2))
In the future, updates to this document could specify different TCP
equations to be substituted for this equation. The requirement is
that the throughput equation be a reasonable approximation of the
sending rate of TCP for conformant TCP congestion control.
Floyd, et al. Standards Track [Page 6]
^L
RFC 5348 TFRC: Protocol Specification September 2008
The throughput equation can also be expressed in terms of X_pps, the
sending rate in packets per second, with
X_pps = X_Bps / s .
The parameters s (segment size), p (loss event rate), and R (RTT)
need to be measured or calculated by a TFRC implementation. The
measurement of s is specified in Section 4.1, the measurement of R is
specified in Section 4.3, and the measurement of p is specified in
Section 5. In the rest of this document, data rates are measured in
bytes per second unless otherwise specified.
3.2. Packet Contents
Before specifying the sender and receiver functionality, we describe
the contents of the data packets sent by the sender and feedback
packets sent by the receiver. As TFRC will be used along with a
transport protocol, we do not specify packet formats, as these depend
on the details of the transport protocol used.
3.2.1. Data Packets
Each data packet sent by the data sender contains the following
information:
o A sequence number. This number MUST be incremented by one for
each data packet transmitted. The field must be sufficiently
large that it does not wrap causing two different packets with
the same sequence number to be in the receiver's recent packet
history at the same time.
o A timestamp indicating when the packet is sent. We denote by
ts_i the timestamp of the packet with sequence number i. The
resolution of the timestamp SHOULD typically be measured in
milliseconds.
This timestamp is used by the receiver to determine which losses
belong to the same loss event. The timestamp is also echoed by
the receiver to enable the sender to estimate the round-trip
time, for senders that do not save timestamps of transmitted data
packets.
We note that, as an alternative to a timestamp incremented in
milliseconds, a "timestamp" that increments every quarter of a
round-trip time MAY be used for determining when losses belong to
the same loss event, in the context of a protocol where this is
understood by both sender and receiver and where the sender saves
the timestamps of transmitted data packets.
Floyd, et al. Standards Track [Page 7]
^L
RFC 5348 TFRC: Protocol Specification September 2008
o The sender's current estimate of the round-trip time. The
estimate reported in packet i is denoted by R_i. The round-trip
time estimate is used by the receiver, along with the timestamp,
to determine when multiple losses belong to the same loss event.
The round-trip time estimate is also used by the receiver to
determine the interval to use for calculating the receive rate
and to determine when to send feedback packets.
If the sender sends a coarse-grained "timestamp" that increments
every quarter of a round-trip time, as discussed above, then the
sender is not required to send its current estimate of the round
trip time.
3.2.2. Feedback Packets
Each feedback packet sent by the data receiver contains the following
information:
o The timestamp of the last data packet received. We denote this by
t_recvdata. If the last packet received at the receiver has
sequence number i, then t_recvdata = ts_i. This timestamp is
used by the sender to estimate the round-trip time, and is only
needed if the sender does not save the timestamps of transmitted
data packets.
o The amount of time elapsed between the receipt of the last data
packet at the receiver and the generation of this feedback
report. We denote this by t_delay.
o The rate at which the receiver estimates that data was received
in the previous round-trip time. We denote this by X_recv.
o The receiver's current estimate of the loss event rate p.
4. Data Sender Protocol
The data sender sends a stream of data packets to the data receiver
at a controlled rate. When a feedback packet is received from the
data receiver, the data sender changes its sending rate based on the
information contained in the feedback report. If the sender does not
receive a feedback report for four round-trip times, then the sender
cuts its sending rate in half. This is achieved by means of a timer
called the nofeedback timer.
Floyd, et al. Standards Track [Page 8]
^L
RFC 5348 TFRC: Protocol Specification September 2008
We specify the sender-side protocol in the following steps:
o Measurement of the mean segment size being sent.
o Sender initialization.
o The sender behavior when a feedback packet is received.
o The sender behavior when the nofeedback timer expires.
o Oscillation prevention (optional).
o Scheduling of packet transmission and allowed burstiness.
4.1. Measuring the Segment Size
The TFRC sender uses the segment size, s, in the throughput equation,
in the setting of the maximum receive rate, the setting of the
minimum and initial sending rates, and the setting of the nofeedback
timer. The TFRC receiver MAY use the average segment size, s, in
initializing the loss history after the first loss event. As
specified in Section 6.3.1, if the TFRC receiver does not know the
segment size, s, used by the sender, the TFRC receiver MAY instead
use the arrival rate in packets per second in initializing the loss
history.
The segment size is normally known to an application. This may not
be so in two cases:
1) The segment size naturally varies depending on the data. In this
case, although the segment size varies, that variation is not
coupled to the transmit rate. The TFRC sender can either compute
the average segment size or use the maximum segment size for the
segment size, s.
2) The application needs to change the segment size rather than the
number of segments per second to perform congestion control.
This would normally be the case with packet audio applications
where a fixed interval of time needs to be represented by each
packet. Such applications need to have a completely different
way of measuring parameters.
For the first class of applications where the segment size varies
depending on the data, the sender SHOULD estimate the segment size,
s, as the average segment size over the last four loss intervals.
The sender MAY estimate the average segment size over longer time
intervals, if so desired.
Floyd, et al. Standards Track [Page 9]
^L
RFC 5348 TFRC: Protocol Specification September 2008
The second class of applications are discussed separately in a
separate document on TFRC-SP [RFC4828]. For the remainder of this
section we assume the sender can estimate the segment size and that
congestion control is performed by adjusting the number of packets
sent per second.
4.2. Sender Initialization
The initial values for X (the allowed sending rate in bytes per
second) and tld (the Time Last Doubled during slow-start, in seconds)
are undefined until they are set as described below. If the sender
is ready to send data when it does not yet have a round-trip sample,
the value of X is set to s bytes per second, for segment size s, the
nofeedback timer is set to expire after two seconds, and tld is set
to 0 (or to -1, either one is okay). Upon receiving the first
round-trip time measurement (e.g., after the first feedback packet or
the SYN exchange from the connection setup, or from a previous
connection [RFC2140]), tld is set to the current time, and the
allowed transmit rate, X, is set to the initial_rate, specified as
W_init/R, for W_init based on [RFC3390]:
initial_rate = W_init/R; W_init = min(4*MSS, max(2*MSS, 4380)).
In computing W_init, instead of using Maximum Segment Size (MSS), the
TFRC sender SHOULD use the maximum segment size to be used for the
initial round-trip time of data, if that is known by the TFRC sender
when X is initialized.
For responding to the initial feedback packet, this replaces step (4)
of Section 4.3 below.
Appendix B explains why the initial value of TFRC's nofeedback timer
is set to two seconds, instead of the recommended initial value of
three seconds for TCP's retransmit timer from [RFC2988].
4.3. Sender Behavior When a Feedback Packet Is Received
The sender knows its current allowed sending rate, X, and maintains
an estimate of the current round-trip time R. The sender also
maintains X_recv_set as a small set of recent X_recv values
(typically only two values).
Initialization: X_recv_set is first initialized to contain a single
item, with value Infinity. (As an implementation-specific issue,
X_recv_set MAY be initialized to a large number instead of to
Infinity, e.g., to the largest integer that is easily representable.)
Floyd, et al. Standards Track [Page 10]
^L
RFC 5348 TFRC: Protocol Specification September 2008
When a feedback packet is received by the sender at time t_now, the
current time in seconds, the following actions MUST be performed.
1) Calculate a new round-trip sample:
R_sample = (t_now - t_recvdata) - t_delay.
As described in Section 3.2.2, t_delay gives the elapsed time at the
receiver.
2) Update the round-trip time estimate:
If no feedback has been received before {
R = R_sample;
} Else {
R = q*R + (1-q)*R_sample;
}
TFRC is not sensitive to the precise value for the filter constant q,
but a default value of 0.9 is RECOMMENDED.
3) Update the timeout interval:
RTO = max(4*R, 2*s/X)
4) Update the allowed sending rate as follows. This procedure uses
the variables t_mbi and recv_limit:
t_mbi: the maximum backoff interval of 64 seconds.
recv_limit: the limit on the sending rate computed from
X_recv_set.
This procedure also uses the procedures Maximize X_recv_set() and
Update X_recv_set(), which are defined below.
Floyd, et al. Standards Track [Page 11]
^L
RFC 5348 TFRC: Protocol Specification September 2008
The procedure for updating the allowed sending rate:
If (the entire interval covered by the feedback packet
was a data-limited interval) {
If (the feedback packet reports a new loss event or an
increase in the loss event rate p) {
Halve entries in X_recv_set;
X_recv = 0.85 * X_recv;
Maximize X_recv_set();
recv_limit = max (X_recv_set);
} Else {
Maximize X_recv_set();
recv_limit = 2 * max (X_recv_set);
}
} Else { // typical behavior
Update X_recv_set();
recv_limit = 2 * max (X_recv_set);
}
If (p > 0) { // congestion avoidance phase
Calculate X_Bps using the TCP throughput equation.
X = max(min(X_Bps, recv_limit), s/t_mbi);
} Else if (t_now - tld >= R) {
// initial slow-start
X = max(min(2*X, recv_limit), initial_rate);
tld = t_now;
}
5) If oscillation reduction is used, calculate the instantaneous
transmit rate, X_inst, following Section 4.5.
6) Reset the nofeedback timer to expire after RTO seconds.
The procedure for maximizing X_recv_set keeps a single value, the
largest value from X_recv_set and the new X_recv.
Maximize X_recv_set():
Add X_recv to X_recv_set;
Delete initial value Infinity from X_recv_set,
if it is still a member.
Set the timestamp of the largest item to the current time;
Delete all other items.
Floyd, et al. Standards Track [Page 12]
^L
RFC 5348 TFRC: Protocol Specification September 2008
The procedure for updating X_recv_set keeps a set of X_recv values
with timestamps from the two most recent round-trip times.
Update X_recv_set():
Add X_recv to X_recv_set;
Delete from X_recv_set values older than
two round-trip times.
Definition of a data-limited interval:
We define a sender as data-limited any time it is not sending as much
as it is allowed to send. We define an interval as a 'data-limited
interval' if the sender was data-limited over the *entire* interval;
Section 8.2.1 discusses implementation issues for a sender in
determining if an interval was a data-limited interval. The term
'data-limited interval' is used in the first "if" condition in step
(4), which prevents a sender from having to reduce its sending rate
as a result of a feedback packet reporting the receive rate from a
data-limited period.
As an example, consider a sender that is sending at its full allowed
rate, except that it is sending packets in pairs, rather than sending
each packet as soon as it can. Such a sender is considered data-
limited part of the time, because it is not always sending packets as
soon as it can. However, consider an interval that covers this
sender's transmission of at least two data packets; such an interval
does not meet the definition of a data-limited interval because the
sender was not data-limited *over the entire interval*.
If the feedback packet reports a receive rate X_recv of zero (i.e.,
the first feedback packet), the sender does not consider that the
entire interval covered by the feedback packet was a data-limited
interval.
X_recv_set and the first feedback packet:
Because X_recv_set is initialized with a single item, with value
Infinity, recv_limit is set to Infinity for the first two round-trip
times of the connection. As a result, the sending rate is not
limited by the receive rate during that period. This avoids the
problem of the sending rate being limited by the value of X_recv from
the first feedback packet.
The interval covered by a feedback packet:
How does the sender determine the period covered by a feedback
packet? This is discussed in more detail in Section 8.2. In
general, the receiver will be sending a feedback packet once per
round-trip time; so typically, the sender will be able to determine
exactly the period covered by the current feedback packet from the
previous feedback packet. However, in cases when the previous
Floyd, et al. Standards Track [Page 13]
^L
RFC 5348 TFRC: Protocol Specification September 2008
feedback packet was lost, or when the receiver sends a feedback
packet early because it detected a lost or ECN-marked packet, the
sender will have to estimate the interval covered by the feedback
packet. As specified in Section 6.2, each feedback packet sent by
the receiver covers a round-trip time, for the round-trip time
estimate R_m maintained by the receiver R_m seconds before the
feedback packet was sent.
The response to a loss during a data-limited interval:
In TFRC, after the initial slow-start, the sender always updates the
calculated transmit rate, X_Bps, after a feedback packet is received,
and the allowed sending rate, X, is always limited by X_Bps.
However, during a data-limited interval, when the actual sending rate
is usually below X_Bps, the sending rate is still limited by
recv_limit, derived from X_recv_set. If the sender is data-limited,
possibly with a varying sending rate from one round-trip time to the
next, and is experiencing losses, then we decrease the entry in
X_recv_set in order to reduce the allowed sending rate.
The sender can detect a loss event during a data-limited period
either from explicit feedback from the receiver, or from a reported
increase in the loss event rate. When the sender receives a feedback
packet reporting such a loss event in a data-limited interval, the
sender limits the allowed increases in the sending rate during the
data-limited interval.
The initial slow-start phase:
Note that when p=0, the sender has not yet learned of any loss
events, and the sender is in the initial slow-start phase. In this
initial slow-start phase, the sender can approximately double the
sending rate each round-trip time until a loss occurs. The
initial_rate term in step (4) gives a minimum allowed sending rate
during slow-start of the initial allowed sending rate.
We note that if the sender is data-limited during slow-start, or if
the connection is limited by the path bandwidth, then the sender is
not necessarily able to double its sending rate each round-trip time;
the sender's sending rate is limited to at most twice the past
receive rate, or at most initial_rate, whichever is larger. This is
similar to TCP's behavior, where the sending rate is limited by the
rate of incoming acknowledgement packets as well as by the congestion
window. Thus, in TCP's slow-start, for the most aggressive case of
the TCP receiver acknowledging every data packet, the TCP sender's
sending rate is limited to at most twice the rate of these incoming
acknowledgment packets.
Floyd, et al. Standards Track [Page 14]
^L
RFC 5348 TFRC: Protocol Specification September 2008
The minimum allowed sending rate:
The term s/t_mbi ensures that when p > 0, the sender is allowed to
send at least one packet every 64 seconds.
4.4. Expiration of Nofeedback Timer
This section specifies the sender's response to a nofeedback timer.
The nofeedback timer could expire because of an idle period or
because of data or feedback packets dropped in the network.
This section uses the variable recover_rate. If the TFRC sender has
been idle ever since the nofeedback timer was set, the allowed
sending rate is not reduced below the recover_rate. For this
document, the recover_rate is set to the initial_rate (specified in
Section 4.2). Future updates to this specification may explore other
possible values for the recover_rate.
If the nofeedback timer expires, the sender MUST perform the
following actions:
1) Cut the allowed sending rate in half.
If the nofeedback timer expires when the sender has had at least
one RTT measurement, the allowed sending rate is reduced by
modifying X_recv_set as described in the pseudocode below
(including item (2)). In the general case, the sending rate is
limited to at most twice X_recv. Modifying X_recv_set limits the
sending rate, but still allows the sender to slow-start, doubling
its sending rate each RTT, if feedback messages resume reporting
no losses.
If the sender has been idle since this nofeedback timer was set
and X_recv is less than the recover_rate, then the allowed sending
rate is not halved, and X_recv_set is not changed. This ensures
that the allowed sending rate is not reduced to less than half the
recover_rate as a result of an idle period.
In the general case, the allowed sending rate is halved in
response to the expiration of the nofeedback timer. The details,
in the pseudocode below, depend on whether the sender is in slow-
start, is in congestion avoidance limited by X_recv, or is in
congestion avoidance limited by the throughput equation.
Floyd, et al. Standards Track [Page 15]
^L
RFC 5348 TFRC: Protocol Specification September 2008
X_recv = max (X_recv_set);
If (sender does not have an RTT sample,
has not received any feedback from receiver,
and has not been idle ever since the nofeedback timer
was set) {
// We do not have X_Bps or recover_rate yet.
// Halve the allowed sending rate.
X = max(X/2, s/t_mbi);
} Else if (((p>0 && X_recv < recover_rate) or
(p==0 && X < 2 * recover_rate)), and
sender has been idle ever
since nofeedback timer was set) {
// Don't halve the allowed sending rate.
Do nothing;
} Else if (p==0) {
// We do not have X_Bps yet.
// Halve the allowed sending rate.
X = max(X/2, s/t_mbi);
} Else if (X_Bps > 2*X_recv)) {
// 2*X_recv was already limiting the sending rate.
// Halve the allowed sending rate.
Update_Limits(X_recv;)
} Else {
// The sending rate was limited by X_Bps, not by X_recv.
// Halve the allowed sending rate.
Update_Limits(X_Bps/2);
}
The term s/t_mbi limits the backoff to one packet every 64
seconds.
The procedure Update_Limits() uses the variable timer_limit for
the limit on the sending rate computed from the expiration of the
nofeedback timer, as follows:
Update_Limits(timer_limit):
If (timer_limit < s/t_mbi)
timer_limit = s/t_mbi;
Replace X_recv_set contents with the single item
timer_limit/2;
Recalculate X as in step (4) of Section 4.3;
2) Restart the nofeedback timer to expire after max(4*R, 2*s/X)
seconds.
If the sender has been data-limited but not idle since the nofeedback
timer was set, it is possible that the nofeedback timer expired
because data or feedback packets were dropped in the network. In
Floyd, et al. Standards Track [Page 16]
^L
RFC 5348 TFRC: Protocol Specification September 2008
this case, the nofeedback timer is the backup mechanism for the
sender to detect these losses, similar to the retransmit timer in
TCP.
Note that when the sender stops sending data for a period of time,
the receiver will stop sending feedback. When the sender's
nofeedback timer expires, the sender could use the procedure above to
limit the sending rate. If the sender subsequently starts to send
again, X_recv_set will be used to limit the transmit rate, and slow-
start behavior will occur until the transmit rate reaches X_Bps.
The TFRC sender's reduction of the allowed sending rate after the
nofeedback timer expires is similar to TCP's reduction of the
congestion window, cwnd, after each RTO seconds of an idle period,
for TCP with Congestion Window Validation [RFC2861].
4.5. Reducing Oscillations
To reduce oscillations in queueing delay and sending rate in
environments with a low degree of statistical multiplexing at the
congested link, it is RECOMMENDED that the sender reduce the transmit
rate as the queueing delay (and hence RTT) increases. To do this,
the sender maintains R_sqmean, a long-term estimate of the square
root of the RTT, and modifies its sending rate depending on how the
square root of R_sample, the most recent sample of the RTT, differs
from the long-term estimate. The long-term estimate R_sqmean is set
as follows:
If no feedback has been received before {
R_sqmean = sqrt(R_sample);
} Else {
R_sqmean = q2*R_sqmean + (1-q2)*sqrt(R_sample);
}
Thus, R_sqmean gives the exponentially weighted moving average of the
square root of the RTT samples. The constant q2 should be set
similarly to q, the constant used in the round-trip time estimate R.
A value of 0.9 as the default for q2 is RECOMMENDED.
When sqrt(R_sample) is greater than R_sqmean, then the current
round-trip time is greater than the long-term average, implying that
queueing delay is probably increasing. In this case, the transmit
rate is decreased to minimize oscillations in queueing delay.
The sender obtains the base allowed transmit rate, X, as described in
step (4) of Section 4.3 above. It then calculates a modified
instantaneous transmit rate X_inst, as follows:
Floyd, et al. Standards Track [Page 17]
^L
RFC 5348 TFRC: Protocol Specification September 2008
X_inst = X * R_sqmean / sqrt(R_sample);
If (X_inst < s/t_mbi)
X_inst = s/t_mbi;
Because we are using square roots, there is generally only a moderate
difference between the instantaneous transmit rate X_inst and the
allowed transmit rate X. For example, in a somewhat extreme case
when the current RTT sample R_sample is twice as large as the long-
term average, then sqrt(R_sample) will be roughly 1.44 times
R_sqmean, and the allowed transmit rate will be reduced by a factor
of roughly 0.7.
We note that this modification for reducing oscillatory behavior is
not always needed, especially if the degree of statistical
multiplexing in the network is high. We also note that the
modification for reducing oscillatory behavior could cause problems
for connections where the round-trip time is not strongly correlated
with the queueing delay (e.g., in some wireless links, over paths
with frequent routing changes, etc.). However, this modification
SHOULD be implemented because it makes TFRC behave better in some
environments with a low level of statistical multiplexing. The
performance of this modification is illustrated in Section 3.1.3 of
[FHPW00]. If it is not implemented, implementations SHOULD use a
very low value of the weight q for the average round-trip time.
4.6. Scheduling of Packet Transmissions
As TFRC is rate-based, and as operating systems typically cannot
schedule events precisely, it is necessary to be opportunistic about
sending data packets so that the correct average rate is maintained
despite the coarse-grain or irregular scheduling of the operating
system. To help maintain the correct average sending rate, the TFRC
sender MAY send some packets before their nominal send time.
In addition, the scheduling of packet transmissions controls the
allowed burstiness of senders after an idle or data-limited period.
The TFRC sender MAY accumulate sending 'credits' for past unused send
times; this allows the TFRC sender to send a burst of data after an
idle or data-limited period. To compare with TCP, TCP may send up to
a round-trip time's worth of packets in a single burst, but never
more. As examples, packet bursts can be sent by TCP when an ACK
arrives acknowledging a window of data, or when a data-limited sender
suddenly has a window of data to send after a delay of nearly a
round-trip time.
Floyd, et al. Standards Track [Page 18]
^L
RFC 5348 TFRC: Protocol Specification September 2008
To limit burstiness, a TFRC implementation MUST prevent bursts of
arbitrary size. This limit MUST be less than or equal to one round-
trip time's worth of packets. A TFRC implementation MAY limit bursts
to less than a round-trip time's worth of packets. In addition, a
TFRC implementation MAY use rate-based pacing to smooth bursts.
As an implementation-specific example, a sending loop could calculate
the correct inter-packet interval, t_ipi, as follows:
t_ipi = s/X_inst;
Let t_now be the current time and i be a natural number, i = 0, 1,
..., with t_i the nominal send time for the i-th packet. Then, the
nominal send time t_(i+1) would derive recursively as:
t_0 = t_now,
t_(i+1) = t_i + t_ipi.
For TFRC senders allowed to accumulate sending credits for unused
send time over the last T seconds, the sender would be allowed to use
unused nominal send times t_j for t_j < now - T, for T set to the
round-trip time.
5. Calculation of the Loss Event Rate (p)
Obtaining an accurate and stable measurement of the loss event rate
is of primary importance for TFRC. Loss rate measurement is
performed at the receiver, based on the detection of lost or marked
packets from the sequence numbers of arriving packets. We describe
this process before describing the rest of the receiver protocol. If
the receiver has not yet detected a lost or marked packet, then the
receiver does not calculate the loss event rate, but reports a loss
event rate of zero.
5.1. Detection of Lost or Marked Packets
TFRC assumes that all packets contain a sequence number that is
incremented by one for each packet that is sent. For the purposes of
this specification, it is REQUIRED that if a lost packet is
retransmitted, the retransmission is given a new sequence number that
is the latest in the transmission sequence, and not the same sequence
number as the packet that was lost. If a transport protocol has the
requirement that it must retransmit with the original sequence
number, then the transport protocol designer must figure out how to
distinguish delayed from retransmitted packets and how to detect lost
retransmissions.
Floyd, et al. Standards Track [Page 19]
^L
RFC 5348 TFRC: Protocol Specification September 2008
The receiver maintains a data structure that keeps track of which
packets have arrived and which are missing. For the purposes of this
specification, we assume that the data structure consists of a list
of packets that have arrived along with the receiver timestamp when
each packet was received. In practice, this data structure will
normally be stored in a more compact representation, but this is
implementation-specific.
The loss of a packet is detected by the arrival of at least NDUPACK
packets with a higher sequence number than the lost packet, for
NDUPACK set to 3. The requirement for NDUPACK subsequent packets is
the same as with TCP, and is to make TFRC more robust in the presence
of reordering. In contrast to TCP, if a packet arrives late (after
NDUPACK subsequent packets arrived) in TFRC, the late packet can fill
the hole in TFRC's reception record, and the receiver can recalculate
the loss event rate. Future versions of TFRC might make the
requirement for NDUPACK subsequent packets adaptive based on
experienced packet reordering, but such a mechanism is not part of
the current specification.
For an ECN-capable connection, a marked packet is detected as a
congestion event as soon as it arrives, without having to wait for
the arrival of subsequent packets.
If an ECN-marked packet is preceded by a possibly-lost packet, then
the first detected congestion event begins with the lost packet. For
example, if the receiver receives a data packet with sequence number
n-1, followed by an unmarked data packet with sequence number n+1,
and a marked data packet with sequence number n+2, then the receiver
detects a congestion event when it receives the marked packet n+2.
The first congestion event detected begins with the lost packet n.
The guidelines in Section 5.2 below are used to determine whether the
lost and marked packets belong to the same loss event or to separate
loss events.
5.2. Translation from Loss History to Loss Events
TFRC requires that the loss fraction be robust to several consecutive
packets lost or marked in the same loss event. This is similar to
TCP, which (typically) only performs one halving of the congestion
window during any single RTT. Thus, the receiver needs to map the
packet loss history into a loss event record, where a loss event is
one or more packets lost or marked in an RTT. To perform this
mapping, the receiver needs to know the RTT to use, and this is
supplied periodically by the sender, typically as control information
Floyd, et al. Standards Track [Page 20]
^L
RFC 5348 TFRC: Protocol Specification September 2008
piggy-backed onto a data packet. TFRC is not sensitive to how the
RTT measurement sent to the receiver is made, but it is RECOMMENDED
to use the sender's calculated RTT, R, (see Section 4.3) for this
purpose.
To determine whether a lost or marked packet should start a new loss
event or be counted as part of an existing loss event, we need to
compare the sequence numbers and timestamps of the packets that
arrived at the receiver. For a marked packet, S_new, its reception
time, T_new, can be noted directly. For a lost packet, we can
interpolate to infer the nominal "arrival time". Assume:
S_loss is the sequence number of a lost packet.
S_before is the sequence number of the last packet to arrive,
before any packet arrivals with a sequence number above S_loss,
with a sequence number below S_loss.
S_after is the sequence number of the first packet to arrive after
S_before with a sequence number above S_loss.
S_max is the largest sequence number.
Therefore, S_before < S_loss < S_after <= S_max.
T_loss is the nominal estimated arrival time for the lost packet.
T_before is the reception time of S_before.
T_after is the reception time of S_after.
Note that T_before < T_after.
For a lost packet, S_loss, we can interpolate its nominal "arrival
time" at the receiver from the arrival times of S_before and S_after.
Thus:
T_loss = T_before + ( (T_after - T_before)
* (S_loss - S_before)/(S_after - S_before) );
To address sequence number wrapping, let S_MAX = 2^b, where b is the
bit-length of sequence numbers in a given implementation. In this
case, we can interpolate the arrival time T_loss as follows:
Floyd, et al. Standards Track [Page 21]
^L
RFC 5348 TFRC: Protocol Specification September 2008
T_loss = T_before + (T_after - T_before)
* Dist(S_loss, S_before)/Dist(S_after, S_before)
where
Dist(S_A, S_B) = (S_A + S_MAX - S_B) % S_MAX
If the lost packet S_old was determined to have started the previous
loss event, and we have just determined that S_new has been lost,
then we interpolate the nominal arrival times of S_old and S_new,
called T_old and T_new, respectively.
If T_old + R >= T_new, then S_new is part of the existing loss event.
Otherwise, S_new is the first packet in a new loss event.
5.3. The Size of a Loss Interval
After the detection of the first loss event, the receiver divides the
sequence space into loss intervals. If a loss interval, A, is
determined to have started with packet sequence number S_A and the
next loss interval, B, started with packet sequence number S_B, then
the number of packets in loss interval A is given by (S_B - S_A).
Thus, loss interval A contains all of the packets transmitted by the
sender starting with the first packet transmitted in loss interval A
and ending with but not including the first packet transmitted in
loss interval B.
The current loss interval I_0 is defined as the loss interval
containing the most recent loss event. If that loss event started
with packet sequence number S_A, and S_C is the highest received
sequence number so far, then the size of I_0 is S_C - S_A + 1. As an
example, if the current loss interval consists of a single ECN-
marked packet, then S_A == S_C, and the size of the loss interval is
one.
5.4. Average Loss Interval
To calculate the loss event rate, p, we first calculate the average
loss interval. This is done using a filter that weights the n most
recent loss event intervals in such a way that the measured loss
event rate changes smoothly. If the receiver has not yet seen a lost
or marked packet, then the receiver does not calculate the average
loss interval.
Floyd, et al. Standards Track [Page 22]
^L
RFC 5348 TFRC: Protocol Specification September 2008
Weights w_0 to w_(n-1) are calculated as:
If (i < n/2) {
w_i = 1;
} Else {
w_i = 2 * (n-i)/(n+2);
}
Thus, if n=8, the values of w_0 to w_7 are:
1.0, 1.0, 1.0, 1.0, 0.8, 0.6, 0.4, 0.2
The value n for the number of loss intervals used in calculating the
loss event rate determines TFRC's speed in responding to changes in
the level of congestion. It is RECOMMENDED to set the value n to 8.
TFRC SHOULD NOT use values of n greater than 8 for traffic that might
compete in the global Internet with TCP. At the very least, safe
operation with values of n greater than 8 would require a slight
change to TFRC's mechanisms to include a more severe response to two
or more round-trip times with heavy packet loss.
When calculating the average loss interval, we need to decide whether
to include the current loss interval. We only include the current
loss interval if it is sufficiently large to increase the average
loss interval.
Let the most recent loss intervals be I_0 to I_k, where I_0 is the
current loss interval. If there have been at least n loss intervals,
then k is set to n; otherwise, k is the maximum number of loss
intervals seen so far. We calculate the average loss interval I_mean
as follows:
I_tot0 = 0;
I_tot1 = 0;
W_tot = 0;
for (i = 0 to k-1) {
I_tot0 = I_tot0 + (I_i * w_i);
W_tot = W_tot + w_i;
}
for (i = 1 to k) {
I_tot1 = I_tot1 + (I_i * w_(i-1));
}
I_tot = max(I_tot0, I_tot1);
I_mean = I_tot/W_tot;
The loss event rate, p is simply:
p = 1 / I_mean;
Floyd, et al. Standards Track [Page 23]
^L
RFC 5348 TFRC: Protocol Specification September 2008
5.5. History Discounting
As described in Section 5.4, when there have been at least n loss
intervals, the most recent loss interval is only assigned 1/(0.75*n)
of the total weight in calculating the average loss interval,
regardless of the size of the most recent loss interval. This
section describes an OPTIONAL history discounting mechanism,
discussed further in [FHPW00a] and [W00], that allows the TFRC
receiver to adjust the weights, concentrating more of the relative
weight on the most recent loss interval, when the most recent loss
interval is more than twice as large as the computed average loss
interval.
To carry out history discounting, we associate a discount factor,
DF_i, with each loss interval, L_i, for i > 0, where each discount
factor is a floating point number. The discount array maintains the
cumulative history of discounting for each loss interval. At the
beginning, the values of DF_i in the discount array are initialized
to 1:
for (i = 0 to n) {
DF_i = 1;
}
History discounting also uses a general discount factor, DF, also a
floating point number, that is also initialized to 1. First, we show
how the discount factors are used in calculating the average loss
interval, and then we describe, later in this section, how the
discount factors are modified over time.
As described in Section 5.4, the average loss interval is calculated
using the n previous loss intervals I_1, ..., I_n and the current
loss interval I_0. The computation of the average loss interval
using the discount factors is a simple modification of the procedure
in Section 5.4, as follows:
Floyd, et al. Standards Track [Page 24]
^L
RFC 5348 TFRC: Protocol Specification September 2008
I_tot0 = I_0 * w_0;
I_tot1 = 0;
W_tot0 = w_0;
W_tot1 = 0;
for (i = 1 to n-1) {
I_tot0 = I_tot0 + (I_i * w_i * DF_i * DF);
W_tot0 = W_tot0 + w_i * DF_i * DF;
}
for (i = 1 to n) {
I_tot1 = I_tot1 + (I_i * w_(i-1) * DF_i);
W_tot1 = W_tot1 + w_(i-1) * DF_i;
}
p = min(W_tot0/I_tot0, W_tot1/I_tot1);
The general discounting factor, DF, is updated on every packet
arrival as follows. First, the receiver computes the weighted
average I_mean of the loss intervals I_1, ..., I_n:
I_tot = 0;
W_tot = 0;
for (i = 1 to n) {
W_tot = W_tot + w_(i-1) * DF_i;
I_tot = I_tot + (I_i * w_(i-1) * DF_i);
}
I_mean = I_tot / W_tot;
This weighted average I_mean is compared to I_0, the size of current
loss interval. If I_0 is greater than twice I_mean, then the new
loss interval is considerably larger than the old ones, and the
general discount factor, DF, is updated to decrease the relative
weight on the older intervals, as follows:
if (I_0 > 2 * I_mean) {
DF = 2 * I_mean/I_0;
if (DF < THRESHOLD) {
DF = THRESHOLD;
}
} else {
DF = 1;
}
A nonzero value for THRESHOLD ensures that older loss intervals from
an earlier time of high congestion are not discounted entirely. We
recommend a THRESHOLD of 0.25. Note that with each new packet
arrival, I_0 will increase further, and the discount factor DF will
be updated.
Floyd, et al. Standards Track [Page 25]
^L
RFC 5348 TFRC: Protocol Specification September 2008
When a new loss event occurs, the current interval shifts from I_0 to
I_1, loss interval I_i shifts to interval I_(i+1), and the loss
interval I_n is forgotten. The previous discount factor DF has to be
incorporated into the discount array. Because DF_i carries the
discount factor associated with loss interval I_i, the DF_i array has
to be shifted as well. This is done as follows:
for (i = 1 to n) {
DF_i = DF * DF_i;
}
for (i = n-1 to 0 step -1) {
DF_(i+1) = DF_i;
}
I_0 = 1;
DF_0 = 1;
DF = 1;
This completes the description of the optional history discounting
mechanism. We emphasize that this is an OPTIONAL mechanism whose
sole purpose is to allow TFRC to respond somewhat more quickly to the
sudden absence of congestion, as represented by a long current loss
interval.
6. Data Receiver Protocol
The receiver periodically sends feedback messages to the sender.
Feedback packets SHOULD normally be sent at least once per RTT,
unless the sender is sending at a rate of less than one packet per
RTT, in which case a feedback packet SHOULD be sent for every data
packet received. A feedback packet SHOULD also be sent whenever a
new loss event is detected without waiting for the end of an RTT, and
whenever an out-of-order data packet is received that removes a loss
event from the history.
If the sender is transmitting at a high rate (many packets per RTT),
there may be some advantages to sending periodic feedback messages
more than once per RTT as this allows faster response to changing RTT
measurements and more resilience to feedback packet loss.
If the receiver was sending k feedback packets per RTT, for k>1, step
(4) of Section 6.2 would be modified to set the feedback timer to
expire after R_m/k seconds. However, each feedback packet would
still report the receiver rate over the last RTT, not over a fraction
of an RTT. In this document, we do not specify the modifications
that might be required for a receiver sending more than one feedback
packet per RTT. We note that there is little gain from sending a
large number of feedback messages per RTT.
Floyd, et al. Standards Track [Page 26]
^L
RFC 5348 TFRC: Protocol Specification September 2008
6.1. Receiver Behavior When a Data Packet Is Received
When a data packet is received, the receiver performs the following
steps:
1) Add the packet to the packet history.
2) Check if done: If the new packet results in the detection of a
new loss event, or if no feedback packet was sent when the
feedback timer last expired, go to step 3. Otherwise, no action
need be performed (unless the optimization in the next paragraph
is used), so exit the procedure.
An OPTIONAL optimization might check to see if the arrival of the
packet caused a hole in the packet history to be filled, and
consequently, two loss intervals were merged into one. If this
is the case, the receiver might also send feedback immediately.
The effects of such an optimization are normally expected to be
small.
3) Calculate p: Let the previous value of p be p_prev. Calculate
the new value of p as described in Section 5.
4) Expire feedback timer: If p > p_prev, cause the feedback timer to
expire and perform the actions described in Section 6.2.
If p <= p_prev and no feedback packet was sent when the feedback
timer last expired, cause the feedback timer to expire and
perform the actions described in Section 6.2. If p <= p_prev and
a feedback packet was sent when the feedback timer last expired,
no action need be performed.
6.2. Expiration of Feedback Timer
When the feedback timer at the receiver expires, the action to be
taken depends on whether data packets have been received since the
last feedback was sent.
For the m-th expiration of the feedback timer, let the maximum
sequence number of a packet at the receiver, so far, be S_m and the
value of the RTT measurement included in packet S_m be R_m. As
described in Section 3.2.1, R_m is the sender's most recent estimate
of the round-trip time, as reported in data packets. If data packets
have been received since the previous feedback was sent, the receiver
performs the following steps:
1) Calculate the average loss event rate using the algorithm
described in Section 5.
Floyd, et al. Standards Track [Page 27]
^L
RFC 5348 TFRC: Protocol Specification September 2008
2) Calculate the measured receive rate, X_recv, based on the packets
received within the previous R_(m-1) seconds. This is performed
whether the feedback timer expired at its normal time or expired
early due to a new lost or marked packet (i.e., step (3) in
Section 6.1).
In the typical case, when the receiver is sending only one
feedback packet per round-trip time and the feedback timer did
not expire early due to a new lost packet, then the time interval
since the feedback timer last expired would be R_(m-1) seconds.
We note that when the feedback timer expires early due to a new
lost or marked packet, the time interval since the feedback timer
last expired is likely to be smaller than R_(m-1) seconds.
For ease of implementation, if the time interval since the
feedback timer last expired is not R_(m-1) seconds, the receive
rate MAY be calculated over a longer time interval, the time
interval going back to the most recent feedback timer expiration
that was at least R_(m-1) seconds ago.
3) Prepare and send a feedback packet containing the information
described in Section 3.2.2.
4) Restart the feedback timer to expire after R_m seconds.
Note that rule 2) above gives a minimum value for the measured
receive rate X_recv of one packet per round-trip time. If the sender
is limited to a sending rate of less than one packet per round-trip
time, this will be due to the loss event rate, not from a limit
imposed by the measured receive rate at the receiver.
If no data packets have been received since the last feedback was
sent, then no feedback packet is sent, and the feedback timer is
restarted to expire after R_m seconds.
6.3. Receiver Initialization
The receiver is initialized by the first data packet that arrives at
the receiver. Let the sequence number of this packet be i.
When the first packet is received:
o Set p = 0.
o Set X_recv = 0.
o Prepare and send a feedback packet.
Floyd, et al. Standards Track [Page 28]
^L
RFC 5348 TFRC: Protocol Specification September 2008
o Set the feedback timer to expire after R_i seconds.
If the first data packet does not contain an estimate R_i of the
round-trip time, then the receiver sends a feedback packet for every
arriving data packet until a data packet arrives containing an
estimate of the round-trip time.
If the sender is using a coarse-grained timestamp that increments
every quarter of a round-trip time, then a feedback timer is not
needed, and the following procedure from RFC 4342 is used to
determine when to send feedback messages.
o Whenever the receiver sends a feedback message, the receiver sets
a local variable last_counter to the greatest received value of
the window counter since the last feedback message was sent, if
any data packets have been received since the last feedback
message was sent.
o If the receiver receives a data packet with a window counter
value greater than or equal to last_counter + 4, then the
receiver sends a new feedback packet. ("Greater" and "greatest"
are measured in circular window counter space.)
6.3.1. Initializing the Loss History after the First Loss Event
This section describes the procedure that MUST be used for
initializing the loss history after the first loss event.
The number of packets until the first loss cannot be used to compute
the allowed sending rate directly, as the sending rate changes
rapidly during this time. TFRC assumes that the correct data rate
after the first loss is half of the maximum sending rate before the
loss occurred. TFRC approximates this target rate, X_target, by the
maximum value of X_recv so far. (For slow-start, for a particular
round-trip time, the sender's sending rate is generally twice the
receiver's receive rate for data sent over the previous round-trip
time.)
After the first loss, instead of initializing the first loss interval
to the number of packets sent until the first loss, the TFRC receiver
calculates the loss interval that would be required to produce the
data rate X_target, and uses this synthetic loss interval to seed the
loss history mechanism.
TFRC does this by finding some value, p, for which the throughput
equation in Section 3.1 gives a sending rate within 5% of X_target,
given the round-trip time R, and the first loss interval is then set
to 1/p. If the receiver knows the segment size, s, used by the
Floyd, et al. Standards Track [Page 29]
^L
RFC 5348 TFRC: Protocol Specification September 2008
sender, then the receiver MAY use the throughput equation for X;
otherwise, the receiver MAY measure the receive rate in packets per
second instead of bytes per second for this purpose, and use the
throughput equation for X_pps. (The 5% tolerance is introduced
simply because the throughput equation is difficult to invert, and we
want to reduce the costs of calculating p numerically.)
Special care is needed for initializing the first loss interval when
the first data packet is lost or marked. When the first data packet
is lost in TCP, the TCP sender retransmits the packet after the
retransmit timer expires. If TCP's first data packet is ECN-marked,
the TCP sender resets the retransmit timer, and sends a new data
packet only when the retransmit timer expires [RFC3168] (Section
6.1.2). For TFRC, if the first data packet is lost or ECN-marked,
then the first loss interval consists of the null interval with no
data packets. In this case, the loss interval length for this (null)
loss interval SHOULD be set to give a similar sending rate to that of
TCP, as specified in the paragraph below.
When the first TFRC loss interval is null, meaning that the first
data packet is lost or ECN-marked, in order to follow the behavior of
TCP, TFRC wants the allowed sending rate to be 1 packet every two
round-trip times, or equivalently, 0.5 packets per RTT. Thus, the
TFRC receiver calculates the loss interval that would be required to
produce the target rate X_target of 0.5/R packets per second, for the
round-trip time R, and uses this synthetic loss interval for the
first loss interval. The TFRC receiver uses 0.5/R packets per second
as the minimum value for X_target when initializing the first loss
interval.
We note that even though the TFRC receiver reports a synthetic loss
interval after the first loss event, the TFRC receiver still reports
the measured receive rate X_recv, as specified in Section 6.2 above.
7. Sender-Based Variants
In a sender-based variant of TFRC, the receiver uses reliable
delivery to send information about packet losses to the sender, and
the sender computes the packet loss rate and the acceptable transmit
rate.
The main advantage of a sender-based variant of TFRC is that the
sender does not have to trust the receiver's calculation of the
packet loss rate. However, with the requirement of reliable delivery
of loss information from the receiver to the sender, a sender-based
TFRC would have much tighter constraints on the transport protocol in
which it is embedded.
Floyd, et al. Standards Track [Page 30]
^L
RFC 5348 TFRC: Protocol Specification September 2008
In contrast, the receiver-based variant of TFRC specified in this
document is robust to the loss of feedback packets, and therefore
does not require the reliable delivery of feedback packets. It is
also better suited for applications where it is desirable to offload
work from the server to the client as much as possible.
RFC 4340 and RFC 4342 together specify DCCP's CCID 3, which can be
used as a sender-based variant of TFRC. In CCID 3, each feedback
packet from the receiver contains a Loss Intervals option, reporting
the lengths of the most recent loss intervals. Feedback packets may
also include the Ack Vector option, allowing the sender to determine
exactly which packets were dropped or marked and to check the
information reported in the Loss Intervals options. The Ack Vector
option can also include ECN Nonce Echoes, allowing the sender to
verify the receiver's report of having received an unmarked data
packet. The Ack Vector option allows the sender to see for itself
which data packets were lost or ECN-marked, to determine loss
intervals, and to calculate the loss event rate. Section 9 of RFC
4342 discusses issues in the sender verifying information reported by
the receiver.
8. Implementation Issues
This document has specified the TFRC congestion control mechanism,
for use by applications and transport protocols. This section
mentions briefly some of the implementation issues.
8.1. Computing the Throughput Equation
For t_RTO = 4*R and b = 1, the throughput equation in Section 3.1 can
be expressed as follows:
s
X_Bps = --------
R * f(p)
for
f(p) = sqrt(2*p/3) + (12*sqrt(3*p/8) * p * (1+32*p^2)).
A table lookup could be used for the function f(p).
Many of the multiplications (e.g., q and 1-q for the round-trip time
average, a factor of 4 for the timeout interval) are or could be by
powers of two, and therefore could be implemented as simple shift
operations.
Floyd, et al. Standards Track [Page 31]
^L
RFC 5348 TFRC: Protocol Specification September 2008
8.2. Sender Behavior When a Feedback Packet Is Received
This section discusses implementation issues for sender behavior when
a feedback packet is received, from Section 4.3.
8.2.1. Determining If an Interval Was a Data-Limited Interval
When a feedback packet is received, the sender has to determine if
the entire interval covered by that feedback packet was a data-
limited period. This section discusses one possible implementation
for the sender to determine if the interval covered by a feedback
packet was a data-limited period.
If the feedback packets all report the timestamp of the last data
packet received, then let t_new be the timestamp reported by this
feedback packet. Because all feedback packets cover an interval of
at least a round-trip time, it is sufficient for the sender to
determine if there was any time in the period (t_old, t_new] when the
sender was not data-limited, for R the sender's estimate of the
round-trip time, and for t_old set to t_new - R. (This procedure
estimates the interval covered by the feedback packet, rather than
computing it exactly. This seems fine to us.)
The pseudocode for determining if the sender was data-limited over
the entire interval covered in a feedback packet is given below. The
variables NotLimited1 and NotLimited2 both represent times when the
sender was *not* data-limited.
Initialization:
NotLimited1 = NotLimited2 = t_new = t_next = 0;
t_now = current time;
After sending a segment:
If (sender has sent all it is allowed to send) {
// Sender is not data-limited at this instant.
If NotLimited1 <= t_new
// Goal: NotLimited1 > t_new.
NotLimited1 = t_now;
Else if (NotLimited2 <= t_next)
// Goal: NotLimited2 > t_next.
NotLimited2 = t_now;
}
Floyd, et al. Standards Track [Page 32]
^L
RFC 5348 TFRC: Protocol Specification September 2008
When a feedback packet is received, is this interval data-limited:
t_new = timestamp reported in feedback packet.
t_old = t_new - R. // local variable
t_next = t_now;
If ((t_old < NotLimited1 <= t_new) or
(t_old < NotLimited2 <= t_new))
This was not a data-limited interval;
Else
This was a data-limited interval.
If (NotLimited1 <= t_new && NotLimited2 > t_new)
NotLimited1 = NotLimited2;
Transmission times refer to transmission of a segment or segments to
the layer below.
Between feedback packets, (t_old, t_new] gives the transmission time
interval estimated to be covered by the most recent feedback packet,
and t_next gives a time at least a round-trip time greater than
t_new. The next feedback packet can be expected to cover roughly the
interval (t_new, t_next] (unless the receiver sends the feedback
packet early because it is reporting a new loss event). The goal is
for NotLimited1 to save a non-data-limited time in (t_new, t_next],
if there was one, and for NotLimited2 to save a non-data-limited time
after t_next.
When a feedback packet was received, if either NotLimited1 or
NotLimited2 is in the time interval covered by the feedback packet,
then the interval is not a data-limited interval; the sender was not
data-limited at least once during that time interval. If neither
NotLimited1 nor NotLimited2 is in the time interval covered by a
feedback packet, then the sender is assumed to have been data-limited
over that time interval.
We note that this procedure is a heuristic, and in some cases the
sender might not determine correctly if the sender was data-limited
over the entire interval covered by the feedback packet. This
heuristic does not address the possible complications of reordering.
That seems acceptable to us. In order to improve its accuracy in
identifying if the entire interval covered by a feedback packet was a
data-limited interval, the sender could save more NotLimited times.
In some implementations of TFRC, the sender sends coarse-grained
timestamps that increment every quarter of a round-trip time, and the
feedback packet reports the greatest valid sequence number received
so far instead of reporting the timestamp of the last packet
received. In this case, the sender can maintain per-packet state to
Floyd, et al. Standards Track [Page 33]
^L
RFC 5348 TFRC: Protocol Specification September 2008
determine t_new (the time that the acknowledged packet was sent), or
the sender can estimate t_new from its estimate of the round-trip
time and the elapsed time t_delay reported by the feedback packet.
8.2.2. Maintaining X_recv_set
To reduce the complexity of maintaining X_recv_set, it is sufficient
to limit X_recv_set to at most N=3 elements. In this case, the
procedure Update X_recv_set() would be modified as follows:
Update X_recv_set():
Add X_recv to X_recv_set;
Delete from X_recv_set values older than
two round-trip times.
Keep only the most recent N values.
Maintaining at most *two* elements in X_recv_set would be sufficient
for the sender to save an old value of X_recv from before a data-
limited period, and to allow the sender not to be limited by the
first feedback packet after an idle period (reporting a receive rate
of one packet per round-trip time). However, it is *possible* that
maintaining at most two elements in X_recv_set would not give quite
as good performance as maintaining at most three elements.
Maintaining three elements in X_recv_set would allow X_recv_set to
contain X_recv values from two successive feedback packets, plus a
more recent X_recv value from a loss event.
8.3. Sending Packets before Their Nominal Send Time
This section discusses one possible scheduling mechanism for a sender
in an operating system with a coarse-grained timing granularity (from
Section 4.6).
Let t_gran be the scheduling timer granularity of the operating
system. Let t_ipi be the inter-packet interval, as specified in
Section 4.6. If the operating system has a coarse timer granularity
or otherwise cannot support short t_ipi intervals, then either the
TFRC sender will be restricted to a sending rate of at most 1 packet
every t_gran seconds, or the TFRC sender must be allowed to send
short bursts of packets. In addition to allowing the sender to
accumulate sending credits for past unused send times, it can be
useful to allow the sender to send a packet before its scheduled send
time, as described in the section below.
A parameter, t_delta, may be used to allow a packet to be sent before
its nominal send time. Consider an application that becomes idle and
requests re-scheduling for time t_i = t_(i-1) + t_ipi, for t_(i-1)
the send time for the previous packet. When the application is
Floyd, et al. Standards Track [Page 34]
^L
RFC 5348 TFRC: Protocol Specification September 2008
rescheduled, it checks the current time, t_now. If
(t_now > t_i - t_delta), then packet i is sent. When the nominal
send time, t_i, of the next packet is calculated, it may already be
the case that t_now > t_i - t_delta. In such a case, the packet
would be sent immediately.
In order to send at most one packet before its nominal send time, and
never to send a packet more than a round-trip time before its nominal
send time, the parameter t_delta would be set as follows:
t_delta = min(t_ipi, t_gran, rtt)/2;
(The scheduling granularity t_gran is 10 ms on some older Unix
systems.)
As an example, consider a TFRC flow with an allowed sending rate X of
10 packets per round-trip time (PPR), a round-trip time of 100 ms, a
system with a scheduling granularity t_gran of 10 ms, and the ability
to accumulate unused sending credits for a round-trip time. In this
case, t_ipi is 1 ms. The TFRC sender would be allowed to send
packets 0.5 ms before their nominal sending time, and would be
allowed to save unused sending credits for 100 ms. The scheduling
granularity of 10 ms would not significantly affect the performance
of the connection.
As a different example, consider a TFRC flow with a scheduling
granularity greater than the round-trip time, for example, with a
round-trip time of 0.1 ms and a system with a scheduling granularity
of 1 ms, and with the ability to accumulate unused sending credits
for a round-trip time. The TFRC sender would be allowed to save
unused sending credits for 0.1 ms. If the scheduling granularity
*did not* affect the sender's response to an incoming feedback
packet, then the TFRC sender would be able to send an RTT of data (as
determined by the allowed sending rate) each RTT, in response to
incoming feedback packets. In this case, the coarse scheduling
granularity would not significantly reduce the sending rate, but the
sending rate would be bursty, with a round-trip time of data sent in
response to each feedback packet.
However, performance would be different, in this case, if the
operating system scheduling granularity affected the sender's
response to feedback packets as well as the general scheduling of the
sender. In this case, the sender's performance would be severely
limited by the scheduling granularity being greater than the round-
trip time, with the sender able to send an RTT of data, at the
allowed sending rate, at most once every 1 ms. This restriction of
the sending rate is an unavoidable consequence of allowing burstiness
of at most a round-trip time of data.
Floyd, et al. Standards Track [Page 35]
^L
RFC 5348 TFRC: Protocol Specification September 2008
8.4. Calculation of the Average Loss Interval
The calculation of the average loss interval in Section 5.4 involves
multiplications by the weights w_0 to w_(n-1), which for n=8 are:
1.0, 1.0, 1.0, 1.0, 0.8, 0.6, 0.4, 0.2.
With a minor loss of smoothness, it would be possible to use weights
that were powers of two or sums of powers of two, e.g.,
1.0, 1.0, 1.0, 1.0, 0.75, 0.5, 0.25, 0.25.
8.5. The Optional History Discounting Mechanism
The optional history discounting mechanism described in Section 5.5
is used in the calculation of the average loss rate. The history
discounting mechanism is invoked only when there has been an
unusually long interval with no packet losses. For a more efficient
operation, the discount factor, DF_i, could be restricted to be a
power of two.
9. Changes from RFC 3448
9.1. Overview of Changes
This section summarizes the changes from RFC 3448. At a high level,
the main change is to add mechanisms to address the case of a data-
limited sender. This document also explicitly allows the TFRC sender
to accumulate up to a round-trip time of unused send credits, and as
a result to send a burst of packets if data arrives from the
application in a burst after a data-limited period. This issue was
not explicitly addressed in RFC 3448.
This document changes RFC 3448 to incorporate TCP's higher initial
sending rates from RFC 3390. This document also changes RFC 3448 to
allow RFC 4342's use of a coarse-grained timestamp on data packets
instead of a more fine-grained timestamp.
Other changes address corner cases involving slow-start, the response
when the first data packet is dropped, and the like. This document
also incorporates the items in the RFC 3448 Errata.
This section is non-normative; the normative text is in the cited
sections.
Floyd, et al. Standards Track [Page 36]
^L
RFC 5348 TFRC: Protocol Specification September 2008
9.2. Changes in Each Section
Section 4.1, estimating the average segment size: Section 4.1 was
modified to give a specific algorithm that could be used for
estimating the average segment size.
Section 4.2, update to the initial sending rate: In RFC 3448, the
initial sending rate was two packets per round-trip time. In this
document, the initial sending rate can be as high as four packets per
round-trip time, following RFC 3390. The initial sending rate was
changed to be in terms of the segment size s, not in terms of the
MSS.
Section 4.2 now says that tld, the Time Last Doubled during slow-
start, can be initialized to either 0 or to -1. Section 4.2 was also
clarified to say that RTT measurements do not only come from feedback
packets; they could also come from other places, such as the SYN
exchange.
Section 4.3, response to feedback packets: Section 4.3 was modified
to change the way that the receive rate is used in limiting the
sender's allowed sending rate, by using the set of receive rate
values of the last two round-trip times, and initializing the set of
receive rate values by a large value.
The larger initial sending rate in Section 4.2 is of little use if
the receiver sends a feedback packet after the first packet is
received, and the sender, in response, reduces the allowed sending
rate to at most two packets per RTT, which would be twice the receive
rate. Because of the change in the sender's processing of the
receive rate, the sender now does not reduce the allowed sending rate
to twice the reported receive rate in response to the first feedback
packet.
During a data-limited period, the sender saves the receive rate
reported from just before the data-limited period, if it is larger
than the receive rate during the data-limited period. The sender
also reduces the saved values in X_recv_set in response to a loss
during a data-limited period. Appendix C discusses this response
further.
Section 4.4, response to an idle period: Following Section 5.1 from
[RFC4342], this document specifies that when the sending rate is
reduced after an idle period that covers the period since the
nofeedback timer was set, the allowed sending rate is not reduced
below the initial sending rate. (In Section 4.4, the variable
recover_rate is set to the initial sending rate.)
Floyd, et al. Standards Track [Page 37]
^L
RFC 5348 TFRC: Protocol Specification September 2008
Section 4.4, correction from [RFC3448Err]. RFC 3448 had
contradictory text about whether the sender halved its sending rate
after *two* round-trip times without receiving a feedback report, or
after *four* round-trip times. This document clarifies that the
sender halves its sending rate after four round-trip times without
receiving a feedback report [RFC3448Err].
Section 4.4, clarification for slow-start: Section 4.4 was clarified
to specify that on the expiration of the nofeedback timer, if p = 0,
X_Bps cannot be used, because the sender does not yet have a value
for X_Bps. Section 4.4 was also clarified to check the case when the
sender does not yet have an RTT sample, but has sent a packet since
the nofeedback timer was set.
Section 4.6: credits for unused send time:
Section 4.6 has been clarified to say that the TFRC sender gets to
accumulate up to an RTT of credits for unused send time. Section 4.6
was also rewritten to clarify what is specification and what is
implementation.
Section 5.4, clarification: Section 5.4 was modified to clarify the
receiver's calculation of the average loss interval when the receiver
has not yet seen n loss intervals.
Section 5.5, correction: Section 5.5 was corrected to say that the
loss interval I_0 includes all transmitted packets, including lost
and marked packets (as defined in Section 5.3 in the general
definition of loss intervals).
Section 5.5, correction from [RFC3448Err]: A line in Section 5.5 was
changed from
for (i = 1 to n) { DF_i = 1; }
to
for (i = 0 to n) { DF_i = 1; }
[RFC3448Err].
Section 5.5, history discounting: THRESHOLD, the lower bound on the
history discounting parameter DF, has been changed from 0.5 to 0.25,
to allow more history discounting when the current interval is long.
Section 6, multiple feedback packets: Section 6 now contains more
discussion of procedures if the receiver sends multiple feedback
packets each round-trip time.
Floyd, et al. Standards Track [Page 38]
^L
RFC 5348 TFRC: Protocol Specification September 2008
Section 6.3, initialization of the feedback timer: Section 6.3 now
specifies the receiver's initialization of the feedback timer if the
first data packet received does not have an estimate of the round-
trip time.
Section 6.3, a coarse-grained timestamp: Section 6.3 was modified to
incorporate, as an option, a coarse-grained timestamp from the sender
that increments every quarter of a round-trip time, instead of a more
fine-grained timestamp. This follows RFC 4342.
Section 6.3.1, after the first loss event: Section 6.3.1 now says
that for initializing the loss history after the first loss event,
the receiver uses the maximum receive rate so far, instead of the
receive rate in the last round-trip time.
Section 6.3.1, if the first data packet is dropped: Section 6.3.1 now
contains a specification for initializing the loss history if the
first data packet sent is lost or ECN-marked.
Section 7, sender-based variants: Section 7's discussion of sender-
based variants has been expanded, with reference to RFC 4342.
10. Security Considerations
TFRC is not a transport protocol in its own right, but a congestion
control mechanism that is intended to be used in conjunction with a
transport protocol. Therefore, security primarily needs to be
considered in the context of a specific transport protocol and its
authentication mechanisms.
Congestion control mechanisms can potentially be exploited to create
denial of service. This may occur through spoofed feedback. Thus,
any transport protocol that uses TFRC should take care to ensure that
feedback is only accepted from the receiver of the data. The precise
mechanism to achieve this will however depend on the transport
protocol itself.
In addition, congestion control mechanisms may potentially be
manipulated by a greedy receiver that wishes to receive more than its
fair share of network bandwidth. A receiver might do this by
claiming to have received packets that, in fact, were lost due to
congestion. Possible defenses against such a receiver would normally
include some form of nonce that the receiver must feed back to the
sender to prove receipt. However, the details of such a nonce would
depend on the transport protocol, and in particular on whether the
transport protocol is reliable or unreliable.
Floyd, et al. Standards Track [Page 39]
^L
RFC 5348 TFRC: Protocol Specification September 2008
We expect that protocols incorporating ECN with TFRC will also want
to incorporate feedback from the receiver to the sender using the ECN
nonce [RFC3540]. The ECN nonce is a modification to ECN that
protects the sender from the accidental or malicious concealment of
marked packets. Again, the details of such a nonce would depend on
the transport protocol, and are not addressed in this document.
10.1. Security Considerations for TFRC in DCCP
TFRC is currently used in Congestion Control ID 3 (CCID 3) [RFC4342]
of the Datagram Congestion Control Protocol (DCCP) [RFC4340]. The
Security Considerations section of RFC 4340 [RFC4340] (Section 18)
discusses some of the security issues of DCCP, including sequence
number validity checks to protect against hijacked connections.
Section 18 of RFC 4340 also discusses mechanisms in DCCP to limit the
potential impact of denial-of-service attacks.
RFC 4342 specifies the use of TFRC in CCID 3. RFC 4342 includes
extensive discussions of the mechanisms the sender can use to verify
the information sent by the receiver. When ECN is used with CCID 3,
the receiver returns ECN Nonce information to the sender, to allow
the sender to verify information sent by the receiver. When ECN is
not used, Section 9 of RFC 4342 discusses how the sender could still
use various techniques that might catch the receiver in an error in
reporting congestion. However, as stated in RFC 4342, this is not as
robust or non-intrusive as the verification provided by the ECN
Nonce.
11. Acknowledgments
We would like to acknowledge feedback and discussions on equation-
based congestion control with a wide range of people, including
members of the Reliable Multicast Research Group, the Reliable
Multicast Transport Working Group, and the End-to-End Research Group.
We would like to thank Dado Colussi, Gorry Fairhurst, Ladan Gharai,
Wim Heirman, Eddie Kohler, Ken Lofgren, Mike Luby, Ian McDonald,
Vladimir Moltchanov, Colin Perkins, Michele R., Gerrit Renker, Arjuna
Sathiaseelan, Vladica Stanisic, Randall Stewart, Eduardo Urzaiz,
Shushan Wen, and Wendy Lee (lhh@zsu.edu.cn) for feedback on earlier
versions of this document, and to thank Mark Allman for his extensive
feedback from using [RFC3448] to produce a working implementation.
Floyd, et al. Standards Track [Page 40]
^L
RFC 5348 TFRC: Protocol Specification September 2008
Appendix A. Terminology
This document uses the following terms. Timer variables (e.g.,
t_now, tld) are assumed to be in seconds, with a timer resolution of
at least a millisecond.
data-limited interval:
An interval where the sender is data-limited (not sending as much
as it is allowed to send) over the entire interval (Section 4.3).
DF: Discount factor for a loss interval (Section 5.5).
initial_rate:
Allowed initial sending rate.
last_counter:
Greatest received value of the window counter (Section 6.3).
n: Number of loss intervals.
NDUPACK:
Number of dupacks for inferring loss (constant) (Section 5.1).
nofeedback timer:
Sender-side timer (Section 4).
p: Estimated Loss Event Rate.
p_prev:
Previous value of p (Section 6.1).
q: Filter constant for RTT (constant) (Section 4.3).
q2: Filter constant for long-term RTT (constant) (Section 4.6).
R: Estimated path round-trip time.
R_m:
A specific estimate of the path round-trip time (Sections 4.3, 6).
R_sample:
Measured path RTT (Section 4.3).
R_sqmean:
Long-term estimate of the square root of the RTT (Section 4.6).
recover_rate:
Allowed rate for resuming after an idle period (Section 4.4).
Floyd, et al. Standards Track [Page 41]
^L
RFC 5348 TFRC: Protocol Specification September 2008
recv_limit;
Limit on sending rate computed from X_recv_set (Section 4.3).
s: Nominal packet size in bytes.
S: Sequence number.
t_delay:
Reported time delay between receipt of the last packet at the
receiver and the generation of the feedback packet (Section
3.2.2).
t_delta:
Parameter for flexibility in send time (Section 8.3).
t_gran:
Scheduling timer granularity of the operating system (constant)
(Section 8.3).
t_ipi:
Inter-packet interval for sending packets (Section 4.6).
t_mbi:
Maximum RTO value of TCP (constant) (Section 4.3).
t_recvdata:
Timestamp of the last data packet received (Section 3.2.2).
timer_limit:
Limit on the sending rate from the expiration of the nofeedback
timer (Section 4.4).
tld:
Time Last Doubled (Section 4.2).
t_now:
Current time (Section 4.3).
t_RTO:
Estimated RTO of TCP (Section 4.3).
X: Allowed transmit rate, as limited by the receive rate.
X_Bps:
Calculated sending rate in bytes per second (Section 3.1).
X_pps:
Calculated sending rate in packets per second (Section 3.1).
Floyd, et al. Standards Track [Page 42]
^L
RFC 5348 TFRC: Protocol Specification September 2008
X_inst:
Instantaneous allowed transmit rate (Section 4.6).
X_recv:
Estimated receive rate at the receiver (Section 3.2.2).
X_recv_set:
A small set of recent X_recv values (Section 4.3).
X_target:
The target sending rate after the first loss event (Section
6.3.1).
W_init:
TCP initial window (constant) (Section 4.2).
Appendix B. The Initial Value of the Nofeedback Timer
Why is the initial value of TFRC's nofeedback timer set to two
seconds, instead of the recommended initial value of three seconds
for TCP's retransmit timer, from [RFC2988]? There is not any
particular reason why TFRC's nofeedback timer should have the same
initial value as TCP's retransmit timer. TCP's retransmit timer is
used not only to reduce the sending rate in response to congestion,
but also to retransmit a packet that is assumed to have been dropped
in the network. In contrast, TFRC's nofeedback timer is only used to
reduce the allowed sending rate, not to trigger the sending of a new
packet. As a result, there is no danger to the network for the
initial value of TFRC's nofeedback timer to be smaller than the
recommended initial value for TCP's retransmit timer.
Further, when the nofeedback timer has not yet expired, TFRC has a
more slowly responding congestion control mechanism than TCP, and
TFRC's use of the receive rate for limiting the sending rate is
somewhat less precise than TCP's use of windows and ack-clocking, so
the nofeedback timer is a particularly important safety mechanism for
TFRC. For all of these reasons, it is perfectly reasonable for
TFRC's nofeedback timer to have a smaller initial value than that of
TCP's retransmit timer.
Floyd, et al. Standards Track [Page 43]
^L
RFC 5348 TFRC: Protocol Specification September 2008
Appendix C. Response to Idle or Data-Limited Periods
Future work could explore alternate responses to using the receive
rate during a data-limited period, and to responding to a loss event
during a data-limited period.
In particular, an Experimental RFC [RFC2861] specifies Congestion
Window Validation (CWV) for TCP. For this discussion, we use the
term "Standard TCP" to refer to the TCP congestion control mechanisms
in [RFC2581] and [RFC2581bis]. [RFC2861] specifies a different
response to idle or data-limited periods than those of Standard TCP.
With CWV, the TCP sender halves the congestion window after each RTO
during an idle period, down to the initial window. Similarly, with
CWV the TCP sender halves the congestion window half-way down to the
flight size after each RTO during a data-limited period.
This document already specifies a TFRC response to idle periods that
is similar to that of TCP with Congestion Window Validation.
However, this document does not specify a TFRC response to data-
limited periods similar to that of CWV. Adding such a mechanism to
TFRC would require a one-line change to step (4) of Section 4.3. In
particular, the sender's response to a feedback packet could be
changed from:
If (the entire interval covered by the feedback packet
was a data-limited interval) {
If (the feedback packet reports a new loss event or an
increase in the loss event rate p) {
Halve entries in X_recv_set;
X_recv = 0.85 * X_recv;
Maximize X_recv_set();
recv_limit = max (X_recv_set);
} Else {
Maximize X_recv_set();
recv_limit = 2 * max (X_recv_set);
}
}
Floyd, et al. Standards Track [Page 44]
^L
RFC 5348 TFRC: Protocol Specification September 2008
to:
If (the entire interval covered by the feedback packet
was a data-limited interval) {
Multiply old entries in X_recv_set by 0.85;
If (the feedback packet reports a new loss event or an
increase in the loss event rate p) {
Multiply new value X_recv by 0.85.
}
Maximize X_recv_set();
recv_limit = 2 * max (X_recv_set);
}
In particular, if the receive rate from before a data-limited period
is saved in X_recv_set, then the change in step (4) above would
multiply that receive rate by 0.85 each time that a feedback packet
is received and the above code is executed. As a result, after four
successive round-trip times of data-limited intervals, the receive
rate from before the data-limited period would be reduced by 0.85^4 =
0.52. Thus, this one-line change to step (4) of Section 4.3 would
result in the allowed sending rate being halved for each four
roundtrip times in which the sender was data-limited. Because of the
nature of X_recv_set, this mechanism would never reduce the allowed
sending rate below twice the most recent receive rate.
We note that in the suggested code above, with CWV-style behavior in
response to data-limited intervals, we keep
recv_limit = 2 * max (X_recv_set);
instead of using
recv_limit = max (X_recv_set);
following loss events in data-limited intervals. This relaxed
response to a loss event is allowed because the CWV-style behavior
itself limits rapid fluctuations in the sending rate during data-
limited periods.
C.1. Long Idle or Data-Limited Periods
Table 1 summarizes the response of Standard TCP [RFC2581], TCP with
Congestion Window Validation [RFC2861], Standard TFRC [RFC3448], and
Revised TFRC (this document) in response to long idle or data-limited
periods. For the purposes of this section, we define a long period
as a period of at least an RTO.
Floyd, et al. Standards Track [Page 45]
^L
RFC 5348 TFRC: Protocol Specification September 2008
Protocol Long idle periods Long data-limited periods
-------------- -------------------- ----------------------
Standard TCP: Window -> initial. Window increases for
each cwnd of data.
TCP with CWV: Halve window Reduce window half way
(not below initial cwnd). to used window.
Standard TFRC: Halve rate Rate limited to
(not below 2 pkts/rtt). twice receive rate.
One RTT after sending pkt,
rate is limited by X_recv.
Revised TFRC: Halve rate Rate limited to twice
(not below initial rate). max (current X_recv,
receive rate before
data-limited period).
Table 1: Response to Long Idle or Data-Limited Periods
Standard TCP after long idle periods: For Standard TCP, [RFC2581]
specifies that TCP SHOULD set the congestion window to no more than
the initial window after an idle period of at least an RTO. (To be
precise, RFC 2581 specifies that the TCP sender should set cwnd to
the initial window if the sender has not sent data in an interval
exceeding the retransmission timeout.)
Standard TCP after long data-limited periods: Standard TCP [RFC2581]
does not reduce TCP's congestion window after a data-limited period,
when the congestion window is not fully used. Standard TCP in
[RFC2581] uses the FlightSize, the amount of outstanding data in the
network, only in setting the slow-start threshold after a retransmit
timeout. Standard TCP is not limited by TCP's ack-clocking mechanism
during a data-limited period.
Standard TCP's lax response to a data-limited period is quite
different from its stringent response to an idle period.
TCP with Congestion Window Validation (CWV) after long idle periods:
As an experimental alternative, [RFC2861] specifies a more moderate
response to an idle period than that of Standard TCP, where during an
idle period the TCP sender halves cwnd after each RTO, down to the
initial cwnd.
TCP with Congestion Window Validation after long data-limited
periods: As an experimental alternative, [RFC2861] specifies a more
stringent response to a data-limited period than that of Standard
TCP, where after each RTO seconds of a data-limited period, the
Floyd, et al. Standards Track [Page 46]
^L
RFC 5348 TFRC: Protocol Specification September 2008
congestion window is reduced half way down to the window that is
actually used.
The response of TCP with CWV to an idle period is similar to its
response to a data-limited period. TCP with CWV is less restrictive
than Standard TCP in response to an idle period, and more restrictive
than Standard TCP in response to a data-limited period.
Standard TFRC after long idle periods: For Standard TFRC, [RFC3448]
specifies that the allowed sending rate is halved after each RTO
seconds of an idle period. The allowed sending rate is not reduced
below two packets per RTT after idle periods. After an idle period,
the first feedback packet received reports a receive rate of one
packet per round-trip time, and this receive rate is used to limit
the sending rate. Standard TFRC effectively slow-starts up from this
allowed sending rate.
Standard TFRC after long data-limited periods: [RFC3448] does not
distinguish between data-limited and non-data-limited periods. As a
consequence, the allowed sending rate is limited to at most twice the
receive rate during and after a data-limited period. This is a very
restrictive response, more restrictive than that of either Standard
TCP or of TCP with CWV.
Revised TFRC after long idle periods: For Revised TFRC, this document
specifies that the allowed sending rate is halved after each RTO
seconds of an idle period. The allowed sending rate is not reduced
below the initial sending rate as the result of an idle period. The
first feedback packet received after the idle period reports a
receive rate of one packet per round-trip time. However, the Revised
TFRC sender does not use this receive rate for limiting the sending
rate. Thus, Revised TFRC differs from Standard TFRC in the lower
limit used in the reduction of the sending rate, and in the better
response to the first feedback packet received after the idle period.
Revised TFRC after long data-limited periods: For Revised TFRC, this
document distinguishes between data-limited and non-data-limited
periods. As specified in Section 4.3, during a data-limited period
Revised TFRC remembers the receive rate before the data-limited
period began, and does not reduce the allowed sending rate below
twice that receive rate. This is somewhat similar to the response of
Standard TCP, and is quite different from the very restrictive
response of Standard TFRC to a data-limited period. However, the
response of Revised TFRC is not as conservative as the response of
TCP with Congestion Window Validation, where the congestion window is
gradually reduced down to the window actually used during a data-
limited period.
Floyd, et al. Standards Track [Page 47]
^L
RFC 5348 TFRC: Protocol Specification September 2008
We note that for current TCP implementations, the congestion window
is generally not increased during a data-limited period (when the
current congestion window is not being fully used) [MAF05] (Section
5.7). We note that there is no mechanism comparable to this in
Revised TFRC.
Recovery after idle or data-limited periods: When TCP reduces the
congestion window after an idle or data-utilized period, TCP can set
the slow-start threshold, ssthresh, to allow the TCP sender to slow-
start back up towards its old sending rate when the idle or data-
limited period is over. However, in TFRC, even when the TFRC
sender's sending rate is restricted by twice the previous receive
rate, this results in the sender being able to double the sending
rate from one round-trip time to the next, if permitted by the
throughput equation. Thus, TFRC does not need a mechanism such as
TCP's setting of ssthresh to allow a slow-start after an idle or
data-limited period.
For future work, one avenue to explore would be the addition of
Congestion Window Validation mechanisms for TFRC's response to data-
limited periods. Currently, following Standard TCP, during data-
limited periods Revised TFRC does not limit its allowed sending rate
as a function of the receive rate.
C.2. Short Idle or Data-Limited Periods
Table 2 summarizes the response of Standard TCP [RFC2581], TCP with
Congestion Window Validation [RFC2861], Standard TFRC [RFC3448], and
Revised TFRC (this document) in response to short idle or data-
limited periods. For the purposes of this section, we define a short
period as a period of less than an RTT.
Protocol Short idle periods Short data-limited periods
-------------- -------------------- ----------------------
Standard TCP: Send a burst up to cwnd. Send a burst up to cwnd.
TCP with CWV: Send a burst up to cwnd. Send a burst up to cwnd.
Standard TFRC: ? ?
Revised TFRC: Send a burst Send a burst
(up to an RTT of (up to an RTT of
unused send credits). unused send credits).
Table 2: Response to Short Idle or Data-Limited Periods
Table 2 shows that Revised TFRC has a similar response to that of
Standard TCP and of TCP with CWV to a short idle or data-limited
Floyd, et al. Standards Track [Page 48]
^L
RFC 5348 TFRC: Protocol Specification September 2008
period. For a short idle or data-limited period, TCP is limited only
by the size of the unused congestion window, and Revised TFRC is
limited only by the number of unused send credits (up to an RTT's
worth). For Standard TFRC, [RFC3448] did not explicitly specify the
behavior with respect to unused send credits.
C.3. Moderate Idle or Data-Limited Periods
Table 3 summarizes the response of Standard TCP [RFC2581], TCP with
Congestion Window Validation [RFC2861], Standard TFRC [RFC3448], and
Revised TFRC (this document) in response to moderate idle or data-
limited periods. For the purposes of this section, we define a
moderate period as a period greater than an RTT, but less than an
RTO.
Protocol Moderate idle periods Moderate data-limited periods
------------- --------------------- -------------------------
Standard TCP: Send a burst up to cwnd. Send a burst up to cwnd.
TCP with CWV: Send a burst up to cwnd. Send a burst up to cwnd.
Standard TFRC: ? Limited by X_recv.
Revised TFRC: Send a burst Send a burst
(up to an RTT of (up to an RTT of
unused send credits). unused send credits).
Table 3: Response to Moderate Idle or Data-Limited Periods
Table 3 shows that Revised TFRC has a similar response to that of
Standard TCP and of TCP with CWV to a moderate idle or data-limited
period. For a moderate idle or data-limited period, TCP is limited
only by the size of the unused congestion window. For a moderate
idle period, Revised TFRC is limited only by the number of unused
send credits (up to an RTT's worth). For a moderate data-limited
period, Standard TFRC would be limited by X_recv from the most recent
feedback packet. In contrast, Revised TFRC is not limited by the
receive rate from data-limited periods that cover an entire feedback
period of a round-trip time. For Standard TFRC, [RFC3448] did not
explicitly specify the behavior with respect to unused send credits.
Floyd, et al. Standards Track [Page 49]
^L
RFC 5348 TFRC: Protocol Specification September 2008
C.4. Losses During Data-Limited Periods
This section discusses the response to a loss during a data-limited
period.
Protocol Response to a loss during a data-limited period
------------- -----------------------------------------------
Standard TCP: Set ssthresh, cwnd to FlightSize/2.
TCP with CWV: Same as Standard TCP.
Standard TFRC: Calculate X_Bps, send at most 2*X_recv.
Revised TFRC: Calculate X_Bps, send at most recv_limit.
In addition, modify X_recv_set.
Table 4: Response to a Loss during a Data-Limited Period
In TCP [RFC2581], the response to a loss during a data-limited period
is the same as the response to a loss at any other time in TCP. This
response is to set the congestion window to half of the FlightSize,
where the FlightSize is the actual amount of unacknowledged data.
Thus, after a loss during a data-limited period, the TCP sender must
halve its allowed sending rate, as it normally does in response to a
loss.
In Standard TFRC, the response to a loss during a data-limited period
is also the same as the response to a loss at any other time in
Standard TFRC. The sending rate is limited by X_Bps, from the
throughput equation, and the sending rate is also limited by twice
X_recv, the most recent receive rate. As a result, after a loss in a
data-limited period, the sender can at most double its sending rate
to twice X_recv, even if the throughput equation X_Bps would allow a
sending rate much higher than that.
In Revised TFRC, there have been changes to the use of the receive
rate X_recv during data-limited intervals; the sender is limited to
sending at most recv_limit, where the sender can remember the receive
rate X_recv from just before the data-limited period. This allows
the sender to more than double its sending rate during data-limited
periods, up to the receive rate from before the data-limited period
(if allowed by the throughput equation as given in X_Bps). This is
similar to Standard TCP's practice of not reducing the window during
data-limited periods (in the absence of loss).
As with Standard TFRC, during a data-limited period the Revised TFRC
sender is sending less than is allowed by the throughput equation
X_Bps. After the loss event, the sender still might not want to be
Floyd, et al. Standards Track [Page 50]
^L
RFC 5348 TFRC: Protocol Specification September 2008
sending as much as allowed by the recalculated value of X_Bps that
takes into account the new loss event. Revised TFRC adds an
additional mechanism to gradually limit the sender's sending rate
after losses during data-limited periods. Unlike TCP's response of
setting cwnd to half the FlightSize, this additional mechanism in
Revised TFRC uses TFRC's practice of using slowly-responding changes
for both increases and decreases in the allowed sending rate.
This is done in Revised TFRC (in step (4) of Section 4.3) by
decreasing the entry in X_recv_set after a loss in a data-limited
interval, and by allowing the sender to send at most max
(X_recv_set), instead of at most twice max (X_recv_set), in the
immediate round-trip time following the reported loss. Thus, the
'price' for allowing the sender to send more than twice the most
immediately reported value of X_recv during a data-limited interval
is the introduction of an additional mechanism to reduce this allowed
sending rate following losses in data-limited periods.
In TFRC's response to a loss in a data-limited interval, we have
considered the following examples.
Example 1, Losses *after* a Data-Limited Period: This example shows
that losses after a data-limited period has ended are addressed by
the throughput equation X_Bps.
-------------------------------------------------------------------
Stage 1: Not data-limited.
Sending 100 packets per round-trip time (PPR).
Stage 2: Data-limited, sending 10 PPR.
Stage 3: Not data-limited.
Sending 100 PPR again, as allowed by X_Bps.
A packet loss in the first RTT of Stage 3.
X_Bps is updated,
Response of Revised TFRC: a slight reduction in the allowed sending
rate, depending on the number of packets since the last loss event.
-------------------------------------------------------------------
Table 5: Example 1, Losses after a Data-Limited Period
For example 1, when there is a packet loss in the first RTT of Stage
3, this will be reflected in a modified value of X_Bps, and future
loss events would result in future reductions of the throughput
equation X_Bps. In particular, following TFRC's standard use of the
throughput equation [FHPW00] (Section A.2), the allowed TFRC sending
rate would be halved after something like five successive round-trip
times with loss.
Floyd, et al. Standards Track [Page 51]
^L
RFC 5348 TFRC: Protocol Specification September 2008
Example 2, a Mildly Data-Limited Sender: This example considers
losses in a data-limited period when, during the data-limited period,
the sender is sending *almost* as much as it is allowed to send.
-------------------------------------------------------------------
Stage 1: Not data-limited. Sending 100 PPR.
Stage 2: Data-limited, sending 99 PPR.
A packet loss in Stage 2.
Response of Revised TFRC: a slight reduction in the allowed sending
rate, down to 85 PPR or less, depending on the number of packets
since the last loss event.
-------------------------------------------------------------------
Table 6: Example 2, a Mildly Data-Limited Sender
Consider a Revised TFRC connection where the sender has been sending
a hundred PPR and then enters a data-limited period of sending only
99 PPR because of data limitations from the application. (That is,
at every instance of time during the data-limited period, the sender
could have sent one more packet.) If there are losses in the data-
limited period, the allowed sending rate is reduced to min(X_Bps,
recv_limit), where both the throughput equation X_Bps and the limit
recv_limit force a slight reduction in the allowed sending rate.
Example 3, a Single Packet Loss during a Data-Limited Period. This
example considers the loss of a single packet during a data-limited
period, after the sender has not sent a packet for two RTTs.
-------------------------------------------------------------------
Stage 1: Not data-limited. Sending 100 PPR.
Stage 2: Data-limited, sending 10 PPR.
Stage 3: Data-limited, sending no data for two RTTs.
Stage 4: Data-limited, sending one packet, which is ECN-marked.
Response of Revised TFRC: a reduction in the allowed sending
rate, down to 50 PPR or less. For each loss event during
the data-limited period, the 'remembered' X_recv from before
the data-limited period is effectively halved.
-------------------------------------------------------------------
Table 7: Example 3, a Single Packet Loss
Consider a Revised TFRC connection where the sender has been sending
a hundred PPR, and then enters a data-limited period of sending only
ten PPR, and then does not send any packets for two RTTs, and then
sends a single packet, which is ECN-marked. In this case, with
Revised TFRC, for each loss event during the data-limited period, the
sender halves its 'remembered' X_recv from before the data-limited
period
Floyd, et al. Standards Track [Page 52]
^L
RFC 5348 TFRC: Protocol Specification September 2008
Example 4, Losses after Increasing the Sending Rate during a Data-
Limited Period. This example considers losses when the sender
significantly increases its sending rate during a data-limited
period.
-------------------------------------------------------------------
Stage 1: Not data-limited. Sending 100 PPR.
Stage 2: Data-limited, sending 1 PPR.
Stage 3: Data-limited, sending 20 PPR.
Several packets are lost in each RTT of Stage 3.
During Stage 3, the sender would *like* to send 20 PPR.
Response of Revised TFRC: For each loss event during
the data-limited period, the 'remembered' X_recv from before
the data-limited period is effectively halved, and the most
recent X_recv is reduced by 0.85.
-------------------------------------------------------------------
Table 8: Example 4, Losses after Increasing the Sending Rate
Consider a Revised TFRC connection where the sender has been sending
a hundred PPR, and then enters a data-limited period of sending only
one PPR, and then, while still data-limited, increases its sending
rate to twenty PPR, where it experiences a number of successive loss
events.
In this case, with Revised TFRC, for each loss event during the
data-limited period, the sender halves its 'remembered' X_recv from
before the data-limited period, and the most recent X_recv is reduced
by 0.85.
C.5. Other Patterns
Other possible patterns to consider in evaluating Revised TFRC would
be to compare the behavior of TCP, Standard TFRC, and Revised TFRC
for connections with alternating busy and idle periods, alternating
idle and data-limited periods, or with idle or data-limited periods
during slow-start.
C.6. Evaluating TFRC's Response to Idle Periods
In this section we focus on evaluating Revised TFRC's response to
idle or data-limited periods.
One drawback to Standard TFRC's strict response to idle or data-
limited periods is that it could be seen as encouraging applications
to pad their sending rate during idle or data-limited periods, by
sending dummy data when there was no other data to send. Because
Revised TFRC has a less strict response to data-limited periods than
Floyd, et al. Standards Track [Page 53]
^L
RFC 5348 TFRC: Protocol Specification September 2008
that of Standard TFRC, Revised TFRC also could be seen as giving
applications less of an incentive to pad their sending rates during
data-limited periods. Work in progress, such as Faster Restart
[KFS07], can also decrease an application's incentive to pad its
sending rate, by allowing faster start-up after idle periods.
Further research would be useful to understand, in more detail, the
interaction between TCP or TFRC's congestion control mechanisms, and
an application's incentive to pad its sending rate during idle or
data-limited periods.
TCP Congestion Window Validation, described in Appendix C.1 above, is
an Experimental standard specifying that the TCP sender slowly
reduces the congestion window during an idle or data-limited period
[RFC2861]. While TFRC and Revised TFRC's responses to idle periods
are roughly similar to those of TCP with Congestion Window
Validation, Revised TFRC's response to data-limited periods is less
conservative than those of TCP with Congestion Window Validation (and
Standard TFRC's response to data-limited periods was considerably
*more* conservative than those of Congestion Window Validation).
Future work could include modifications to this document so that the
response of Revised TFRC to a data-limited period includes a slow
reduction of the allowed sending rate; Section C specifies a possible
mechanism for this. Such a modification would be particularly
compelling if Congestion Window Validation became a Proposed Standard
in the IETF for TCP.
References
Normative References
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", BCP 14, RFC 2119, March 1997.
[RFC3448] Handley, M., Floyd, S., Padhye, J., and J. Widmer, "TCP
Friendly Rate Control (TFRC): Protocol Specification",
RFC 3448, January 2003.
Informative References
[BRS99] Balakrishnan, H., Rahul, H., and Seshan, S., "An
Integrated Congestion Management Architecture for
Internet Hosts," Proc. ACM SIGCOMM, Cambridge, MA,
September 1999.
[CCID-4] Floyd, S., and E. Kohler, "Profile for DCCP Congestion
Control ID 4: the Small-Packet Variant of TFRC
Congestion Control", Work in Progress, February 2008.
Floyd, et al. Standards Track [Page 54]
^L
RFC 5348 TFRC: Protocol Specification September 2008
[FHPW00] S. Floyd, M. Handley, J. Padhye, and J. Widmer,
"Equation-Based Congestion Control for Unicast
Applications", August 2000, Proc SIGCOMM 2000.
[FHPW00a] S. Floyd, M. Handley, J. Padhye, and J. Widmer,
"Equation-Based Congestion Control for Unicast
Applications: the Extended Version", ICSI tech report
TR-00-03, March 2000.
[FF99] Floyd, S., and K. Fall, Promoting the Use of End-to-End
Congestion Control in the Internet, IEEE/ACM
Transactions on Networking, August 1999.
[KFS07] E. Kohler, S. Floyd, and A. Sathiaseelan, "Faster
Restart for TCP Friendly Rate Control (TFRC)", Work in
Progress, November 2007.
[MAF05] A. Medina, M. Allman, and S. Floyd, "Measuring the
Evolution of Transport Protocols in the Internet", ACM
Computer Communications Review, April 2005.
[PFTK98] Padhye, J. and Firoiu, V. and Towsley, D. and Kurose,
J., "Modeling TCP Throughput: A Simple Model and its
Empirical Validation", Proc ACM SIGCOMM 1998.
[RFC2140] Touch, J., "TCP Control Block Interdependence", RFC
2140, April 1997.
[RFC2581] Allman, M., Paxson, V., and W. Stevens, "TCP Congestion
Control", RFC 2581, April 1999.
[RFC2581bis] Allman, M., Paxson, V., and W. Stevens, "TCP Congestion
Control", Work in Progress, April 2008.
[RFC2861] Handley, M., Padhye, J., and S. Floyd, "TCP Congestion
Window Validation", RFC 2861, June 2000.
[RFC2988] Paxson, V. and M. Allman, "Computing TCP's
Retransmission Timer", RFC 2988, November 2000.
[RFC3168] Ramakrishnan, K., Floyd, S., and D. Black, "The Addition
of Explicit Congestion Notification (ECN) to IP", RFC
3168, September 2001.
[RFC3390] Allman, M., Floyd, S., and C. Partridge, "Increasing
TCP's Initial Window", RFC 3390, October 2002.
Floyd, et al. Standards Track [Page 55]
^L
RFC 5348 TFRC: Protocol Specification September 2008
[RFC3448Err] RFC 3448 Errata,
<http://www.rfc-editor.org/errata_search.php?rfc=3448>.
[RFC3540] Spring, N., Wetherall, D., and D. Ely, "Robust Explicit
Congestion Notification (ECN) Signaling with Nonces",
RFC 3540, June 2003.
[RFC4340] Kohler, E., Handley, M., and S. Floyd, "Datagram
Congestion Control Protocol (DCCP)", RFC 4340, March
2006.
[RFC4342] Floyd, S., Kohler, E., and J. Padhye, "Profile for
Datagram Congestion Control Protocol (DCCP) Congestion
Control ID 3: TCP-Friendly Rate Control (TFRC)", RFC
4342, March 2006.
[RFC4828] Floyd, S. and E. Kohler, "TCP Friendly Rate Control
(TFRC): The Small-Packet (SP) Variant", RFC 4828, April
2007.
[W00] Widmer, J., "Equation-Based Congestion Control", Diploma
Thesis, University of Mannheim, February 2000,
<http://www.icir.org/tfrc/>.
Floyd, et al. Standards Track [Page 56]
^L
RFC 5348 TFRC: Protocol Specification September 2008
Authors' Addresses
Sally Floyd
ICSI
1947 Center St, Suite 600
Berkeley, CA 94708
EMail: floyd@icir.org
Mark Handley,
Department of Computer Science
University College London
Gower Street
London WC1E 6BT
UK
EMail: M.Handley@cs.ucl.ac.uk
Jitendra Padhye
Microsoft Research
EMail: padhye@microsoft.com
Joerg Widmer
DoCoMo Euro-Labs
Landsberger Strasse 312
80687 Munich
Germany
EMail: widmer@acm.org
Floyd, et al. Standards Track [Page 57]
^L
RFC 5348 TFRC: Protocol Specification September 2008
Full Copyright Statement
Copyright (C) The IETF Trust (2008).
This document is subject to the rights, licenses and restrictions
contained in BCP 78, and except as set forth therein, the authors
retain all their rights.
This document and the information contained herein are provided on an
"AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY, THE IETF TRUST AND
THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF
THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
Intellectual Property
The IETF takes no position regarding the validity or scope of any
Intellectual Property Rights or other rights that might be claimed to
pertain to the implementation or use of the technology described in
this document or the extent to which any license under such rights
might or might not be available; nor does it represent that it has
made any independent effort to identify any such rights. Information
on the procedures with respect to rights in RFC documents can be
found in BCP 78 and BCP 79.
Copies of IPR disclosures made to the IETF Secretariat and any
assurances of licenses to be made available, or the result of an
attempt made to obtain a general license or permission for the use of
such proprietary rights by implementers or users of this
specification can be obtained from the IETF on-line IPR repository at
http://www.ietf.org/ipr.
The IETF invites any interested party to bring to its attention any
copyrights, patents or patent applications, or other proprietary
rights that may cover technology that may be required to implement
this standard. Please address the information to the IETF at
ietf-ipr@ietf.org.
Floyd, et al. Standards Track [Page 58]
^L
|