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
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
4949
4950
4951
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231
5232
5233
5234
5235
5236
5237
5238
5239
5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
5252
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266
5267
5268
5269
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291
5292
5293
5294
5295
5296
5297
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310
5311
5312
5313
5314
5315
5316
5317
5318
5319
5320
5321
5322
5323
5324
5325
5326
5327
5328
5329
5330
5331
5332
5333
5334
5335
5336
5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372
5373
5374
5375
5376
5377
5378
5379
5380
5381
5382
5383
5384
5385
5386
5387
5388
5389
5390
5391
5392
5393
5394
5395
5396
5397
5398
5399
5400
5401
5402
5403
5404
5405
5406
5407
5408
5409
5410
5411
5412
5413
5414
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
5441
5442
5443
5444
5445
5446
5447
5448
5449
5450
5451
5452
5453
5454
5455
5456
5457
5458
5459
5460
5461
5462
5463
5464
5465
5466
5467
5468
5469
5470
5471
5472
5473
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
5488
5489
5490
5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517
5518
5519
5520
5521
5522
5523
5524
5525
5526
5527
5528
5529
5530
5531
5532
5533
5534
5535
5536
5537
5538
5539
5540
5541
5542
5543
5544
5545
5546
5547
5548
5549
5550
5551
5552
5553
5554
5555
5556
5557
5558
5559
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586
5587
5588
5589
5590
5591
5592
5593
5594
5595
5596
5597
5598
5599
5600
5601
5602
5603
5604
5605
5606
5607
5608
5609
5610
5611
5612
5613
5614
5615
5616
5617
5618
5619
5620
5621
5622
5623
5624
5625
5626
5627
5628
5629
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640
5641
5642
5643
5644
5645
5646
5647
5648
5649
5650
5651
5652
5653
5654
5655
5656
5657
5658
5659
5660
5661
5662
5663
5664
5665
5666
5667
5668
5669
5670
5671
5672
5673
5674
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686
5687
5688
5689
5690
5691
5692
5693
5694
5695
5696
5697
5698
5699
5700
5701
5702
5703
5704
5705
5706
5707
5708
5709
5710
5711
5712
5713
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723
5724
5725
5726
5727
5728
5729
5730
5731
5732
5733
5734
5735
5736
5737
5738
5739
5740
5741
5742
5743
5744
5745
5746
5747
5748
5749
5750
5751
5752
5753
5754
5755
5756
5757
5758
5759
5760
5761
5762
5763
5764
5765
5766
5767
5768
5769
5770
5771
5772
5773
5774
5775
5776
5777
5778
5779
5780
5781
5782
5783
5784
5785
5786
5787
5788
5789
5790
5791
5792
5793
5794
5795
5796
5797
5798
5799
5800
5801
5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
5816
5817
5818
5819
5820
5821
5822
5823
5824
5825
5826
5827
5828
5829
5830
5831
5832
5833
5834
5835
5836
5837
5838
5839
5840
5841
5842
5843
5844
5845
5846
5847
5848
5849
5850
5851
5852
5853
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866
5867
5868
5869
5870
5871
5872
5873
5874
5875
5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
5887
5888
5889
5890
5891
5892
5893
5894
5895
5896
5897
5898
5899
5900
5901
5902
5903
5904
5905
5906
5907
5908
5909
5910
5911
5912
5913
5914
5915
5916
5917
5918
5919
5920
5921
5922
5923
5924
5925
5926
5927
5928
5929
5930
5931
5932
5933
5934
5935
5936
5937
5938
5939
5940
5941
5942
5943
5944
5945
5946
5947
5948
5949
5950
5951
5952
5953
5954
5955
5956
5957
5958
5959
5960
5961
5962
5963
5964
5965
5966
5967
5968
5969
5970
5971
5972
5973
5974
5975
5976
5977
5978
5979
5980
5981
5982
5983
5984
5985
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996
5997
5998
5999
6000
6001
6002
6003
6004
6005
6006
6007
6008
6009
6010
6011
6012
6013
6014
6015
6016
6017
6018
6019
6020
6021
6022
6023
6024
6025
6026
6027
6028
6029
6030
6031
6032
6033
6034
6035
6036
6037
6038
6039
6040
6041
6042
6043
6044
6045
6046
6047
6048
6049
6050
6051
6052
6053
6054
6055
6056
6057
6058
6059
6060
6061
6062
6063
6064
6065
6066
6067
6068
6069
6070
6071
6072
6073
6074
6075
6076
6077
6078
6079
6080
6081
6082
6083
6084
6085
6086
6087
6088
6089
6090
6091
6092
6093
6094
6095
6096
6097
6098
6099
6100
6101
6102
6103
6104
6105
6106
6107
6108
6109
6110
6111
6112
6113
6114
6115
6116
6117
6118
6119
6120
6121
6122
6123
6124
6125
6126
6127
6128
6129
6130
6131
6132
6133
6134
6135
6136
6137
6138
6139
6140
6141
6142
6143
6144
6145
6146
6147
6148
6149
6150
6151
6152
6153
6154
6155
6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189
6190
6191
6192
6193
6194
6195
6196
6197
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6215
6216
6217
6218
6219
6220
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
6231
6232
6233
6234
6235
6236
6237
6238
6239
6240
6241
6242
6243
6244
6245
6246
6247
6248
6249
6250
6251
6252
6253
6254
6255
6256
6257
6258
6259
6260
6261
6262
6263
6264
6265
6266
6267
6268
6269
6270
6271
6272
6273
6274
6275
6276
6277
6278
6279
6280
6281
6282
6283
6284
6285
6286
6287
6288
6289
6290
6291
6292
6293
6294
6295
6296
6297
6298
6299
6300
6301
6302
6303
6304
6305
6306
6307
6308
6309
6310
6311
6312
6313
6314
6315
6316
6317
6318
6319
6320
6321
6322
6323
6324
6325
6326
6327
6328
6329
6330
6331
6332
6333
6334
6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
6360
6361
6362
6363
6364
6365
6366
6367
6368
6369
6370
6371
6372
6373
6374
6375
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
6394
6395
6396
6397
6398
6399
6400
6401
6402
6403
6404
6405
6406
6407
6408
6409
6410
6411
6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
6427
6428
6429
6430
6431
6432
6433
6434
6435
6436
6437
6438
6439
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
6455
6456
6457
6458
6459
6460
6461
6462
6463
6464
6465
6466
6467
6468
6469
6470
6471
6472
6473
6474
6475
6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489
6490
6491
6492
6493
6494
6495
6496
6497
6498
6499
6500
6501
6502
6503
6504
6505
6506
6507
6508
6509
6510
6511
6512
6513
6514
6515
6516
6517
6518
6519
6520
6521
6522
6523
6524
6525
6526
6527
6528
6529
6530
6531
6532
6533
6534
6535
6536
6537
6538
6539
6540
6541
6542
6543
6544
6545
6546
6547
6548
6549
6550
6551
6552
6553
6554
6555
6556
6557
6558
6559
6560
6561
6562
6563
6564
6565
6566
6567
6568
6569
6570
6571
6572
6573
6574
6575
6576
6577
6578
6579
6580
6581
6582
6583
6584
6585
6586
6587
6588
6589
6590
6591
6592
6593
6594
6595
6596
6597
6598
6599
6600
6601
6602
6603
6604
6605
6606
6607
6608
6609
6610
6611
6612
6613
6614
6615
6616
6617
6618
6619
6620
6621
6622
6623
6624
6625
6626
6627
6628
6629
6630
6631
6632
6633
6634
6635
6636
6637
6638
6639
6640
6641
6642
6643
6644
6645
6646
6647
6648
6649
6650
6651
6652
6653
6654
6655
6656
6657
6658
6659
6660
6661
6662
6663
6664
6665
6666
6667
6668
6669
6670
6671
6672
6673
6674
6675
6676
6677
6678
6679
6680
6681
6682
6683
6684
6685
6686
6687
6688
6689
6690
6691
6692
6693
6694
6695
6696
6697
6698
6699
6700
6701
6702
6703
6704
6705
6706
6707
6708
6709
6710
6711
6712
6713
6714
6715
6716
6717
6718
6719
6720
6721
6722
6723
6724
6725
6726
6727
6728
6729
6730
6731
6732
6733
6734
6735
6736
6737
6738
6739
6740
6741
6742
6743
6744
6745
6746
6747
6748
6749
6750
6751
6752
6753
6754
6755
6756
6757
6758
6759
6760
6761
6762
6763
6764
6765
6766
6767
6768
6769
6770
6771
6772
6773
6774
6775
6776
6777
6778
6779
6780
6781
6782
6783
6784
6785
6786
6787
6788
6789
6790
6791
6792
6793
6794
6795
6796
6797
6798
6799
6800
6801
6802
6803
6804
6805
6806
6807
6808
6809
6810
6811
6812
6813
6814
6815
6816
6817
6818
6819
6820
6821
6822
6823
6824
6825
6826
6827
6828
6829
6830
6831
6832
6833
6834
6835
6836
6837
6838
6839
6840
6841
6842
6843
6844
6845
6846
6847
6848
6849
6850
6851
6852
6853
6854
6855
6856
6857
6858
6859
6860
6861
6862
6863
6864
6865
6866
6867
6868
6869
6870
6871
6872
6873
6874
6875
6876
6877
6878
6879
6880
6881
6882
6883
6884
6885
6886
6887
6888
6889
6890
6891
6892
6893
6894
6895
6896
6897
6898
6899
6900
6901
6902
6903
6904
6905
6906
6907
6908
6909
6910
6911
6912
6913
6914
6915
6916
6917
6918
6919
6920
6921
6922
6923
6924
6925
6926
6927
6928
6929
6930
6931
6932
6933
6934
6935
6936
6937
6938
6939
6940
6941
6942
6943
6944
6945
6946
6947
6948
6949
6950
6951
6952
6953
6954
6955
6956
6957
6958
6959
6960
6961
6962
6963
6964
6965
6966
6967
6968
6969
6970
6971
6972
6973
6974
6975
6976
6977
6978
6979
6980
6981
6982
6983
6984
6985
6986
6987
6988
6989
6990
6991
6992
6993
6994
6995
6996
6997
6998
6999
7000
7001
7002
7003
7004
7005
7006
7007
7008
7009
7010
7011
7012
7013
7014
7015
7016
7017
7018
7019
7020
7021
7022
7023
7024
7025
7026
7027
7028
7029
7030
7031
7032
7033
7034
7035
7036
7037
7038
7039
7040
7041
7042
7043
7044
7045
7046
7047
7048
7049
7050
7051
7052
7053
7054
7055
7056
7057
7058
7059
7060
7061
7062
7063
7064
7065
7066
7067
7068
7069
7070
7071
7072
7073
7074
7075
7076
7077
7078
7079
7080
7081
7082
7083
7084
7085
7086
7087
7088
7089
7090
7091
7092
7093
7094
7095
7096
7097
7098
7099
7100
7101
7102
7103
7104
7105
7106
7107
7108
7109
7110
7111
7112
7113
7114
7115
7116
7117
7118
7119
7120
7121
7122
7123
7124
7125
7126
7127
7128
7129
7130
7131
7132
7133
7134
7135
7136
7137
7138
7139
7140
7141
7142
7143
7144
7145
7146
7147
7148
7149
7150
7151
7152
7153
7154
7155
7156
7157
7158
7159
7160
7161
7162
7163
7164
7165
7166
7167
7168
7169
7170
7171
7172
7173
7174
7175
7176
7177
7178
7179
7180
7181
7182
7183
7184
7185
7186
7187
7188
7189
7190
7191
7192
7193
7194
7195
7196
7197
7198
7199
7200
7201
7202
7203
7204
7205
7206
7207
7208
7209
7210
7211
7212
7213
7214
7215
7216
7217
7218
7219
7220
7221
7222
7223
7224
7225
7226
7227
|
Network Working Group E. Kohler
Request for Comments: 4340 UCLA
Category: Standards Track M. Handley
UCL
S. Floyd
ICIR
March 2006
Datagram Congestion Control Protocol (DCCP)
Status of This Memo
This document specifies an Internet standards track protocol for the
Internet community, and requests discussion and suggestions for
improvements. Please refer to the current edition of the "Internet
Official Protocol Standards" (STD 1) for the standardization state
and status of this protocol. Distribution of this memo is unlimited.
Copyright Notice
Copyright (C) The Internet Society (2006).
Abstract
The Datagram Congestion Control Protocol (DCCP) is a transport
protocol that provides bidirectional unicast connections of
congestion-controlled unreliable datagrams. DCCP is suitable for
applications that transfer fairly large amounts of data and that can
benefit from control over the tradeoff between timeliness and
reliability.
Table of Contents
1. Introduction ....................................................5
2. Design Rationale ................................................6
3. Conventions and Terminology .....................................7
3.1. Numbers and Fields .........................................7
3.2. Parts of a Connection ......................................8
3.3. Features ...................................................9
3.4. Round-Trip Times ...........................................9
3.5. Security Limitation ........................................9
3.6. Robustness Principle ......................................10
4. Overview .......................................................10
4.1. Packet Types ..............................................10
4.2. Packet Sequencing .........................................11
4.3. States ....................................................12
4.4. Congestion Control Mechanisms .............................14
Kohler, et al. Standards Track [Page 1]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
4.5. Feature Negotiation Options ...............................15
4.6. Differences from TCP ......................................16
4.7. Example Connection ........................................17
5. Packet Formats .................................................18
5.1. Generic Header ............................................19
5.2. DCCP-Request Packets ......................................22
5.3. DCCP-Response Packets .....................................23
5.4. DCCP-Data, DCCP-Ack, and DCCP-DataAck Packets .............23
5.5. DCCP-CloseReq and DCCP-Close Packets ......................25
5.6. DCCP-Reset Packets ........................................25
5.7. DCCP-Sync and DCCP-SyncAck Packets ........................28
5.8. Options ...................................................29
5.8.1. Padding Option .....................................31
5.8.2. Mandatory Option ...................................31
6. Feature Negotiation ............................................32
6.1. Change Options ............................................32
6.2. Confirm Options ...........................................33
6.3. Reconciliation Rules ......................................33
6.3.1. Server-Priority ....................................34
6.3.2. Non-Negotiable .....................................34
6.4. Feature Numbers ...........................................35
6.5. Feature Negotiation Examples ..............................36
6.6. Option Exchange ...........................................37
6.6.1. Normal Exchange ....................................38
6.6.2. Processing Received Options ........................38
6.6.3. Loss and Retransmission ............................40
6.6.4. Reordering .........................................41
6.6.5. Preference Changes .................................42
6.6.6. Simultaneous Negotiation ...........................42
6.6.7. Unknown Features ...................................43
6.6.8. Invalid Options ....................................43
6.6.9. Mandatory Feature Negotiation ......................44
7. Sequence Numbers ...............................................44
7.1. Variables .................................................45
7.2. Initial Sequence Numbers ..................................45
7.3. Quiet Time ................................................46
7.4. Acknowledgement Numbers ...................................47
7.5. Validity and Synchronization ..............................47
7.5.1. Sequence and Acknowledgement Number Windows ........48
7.5.2. Sequence Window Feature ............................49
7.5.3. Sequence-Validity Rules ............................49
7.5.4. Handling Sequence-Invalid Packets ..................51
7.5.5. Sequence Number Attacks ............................52
7.5.6. Sequence Number Handling Examples ..................54
7.6. Short Sequence Numbers ....................................55
7.6.1. Allow Short Sequence Numbers Feature ...............55
7.6.2. When to Avoid Short Sequence Numbers ...............56
7.7. NDP Count and Detecting Application Loss ..................56
Kohler, et al. Standards Track [Page 2]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
7.7.1. NDP Count Usage Notes ..............................57
7.7.2. Send NDP Count Feature .............................57
8. Event Processing ...............................................58
8.1. Connection Establishment ..................................58
8.1.1. Client Request .....................................58
8.1.2. Service Codes ......................................59
8.1.3. Server Response ....................................61
8.1.4. Init Cookie Option .................................62
8.1.5. Handshake Completion ...............................63
8.2. Data Transfer .............................................63
8.3. Termination ...............................................64
8.3.1. Abnormal Termination ...............................66
8.4. DCCP State Diagram ........................................66
8.5. Pseudocode ................................................67
9. Checksums ......................................................72
9.1. Header Checksum Field .....................................73
9.2. Header Checksum Coverage Field ............................73
9.2.1. Minimum Checksum Coverage Feature ..................74
9.3. Data Checksum Option ......................................75
9.3.1. Check Data Checksum Feature ........................76
9.3.2. Checksum Usage Notes ...............................76
10. Congestion Control ............................................76
10.1. TCP-like Congestion Control ..............................77
10.2. TFRC Congestion Control ..................................78
10.3. CCID-Specific Options, Features, and Reset Codes .........78
10.4. CCID Profile Requirements ................................80
10.5. Congestion State .........................................81
11. Acknowledgements ..............................................81
11.1. Acks of Acks and Unidirectional Connections ..............82
11.2. Ack Piggybacking .........................................83
11.3. Ack Ratio Feature ........................................84
11.4. Ack Vector Options .......................................85
11.4.1. Ack Vector Consistency ............................88
11.4.2. Ack Vector Coverage ...............................89
11.5. Send Ack Vector Feature ..................................90
11.6. Slow Receiver Option .....................................90
11.7. Data Dropped Option ......................................91
11.7.1. Data Dropped and Normal Congestion Response .......94
11.7.2. Particular Drop Codes .............................95
12. Explicit Congestion Notification ..............................96
12.1. ECN Incapable Feature ....................................96
12.2. ECN Nonces ...............................................97
12.3. Aggression Penalties .....................................98
13. Timing Options ................................................99
13.1. Timestamp Option .........................................99
13.2. Elapsed Time Option ......................................99
13.3. Timestamp Echo Option ...................................100
14. Maximum Packet Size ..........................................101
Kohler, et al. Standards Track [Page 3]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
14.1. Measuring PMTU ..........................................102
14.2. Sender Behavior .........................................103
15. Forward Compatibility ........................................104
16. Middlebox Considerations .....................................105
17. Relations to Other Specifications ............................106
17.1. RTP .....................................................106
17.2. Congestion Manager and Multiplexing .....................108
18. Security Considerations ......................................108
18.1. Security Considerations for Partial Checksums ...........109
19. IANA Considerations ..........................................110
19.1. Packet Types Registry ...................................110
19.2. Reset Codes Registry ....................................110
19.3. Option Types Registry ...................................110
19.4. Feature Numbers Registry ................................111
19.5. Congestion Control Identifiers Registry .................111
19.6. Ack Vector States Registry ..............................111
19.7. Drop Codes Registry .....................................112
19.8. Service Codes Registry ..................................112
19.9. Port Numbers Registry ...................................112
20. Thanks .......................................................114
A. Appendix: Ack Vector Implementation Notes ....................116
A.1. Packet Arrival ..........................................118
A.1.1. New Packets ......................................118
A.1.2. Old Packets ......................................119
A.2. Sending Acknowledgements ................................120
A.3. Clearing State ..........................................120
A.4. Processing Acknowledgements .............................122
B. Appendix: Partial Checksumming Design Motivation .............123
Normative References .............................................124
Informative References ...........................................125
List of Tables
Table 1: DCCP Packet Types .......................................21
Table 2: DCCP Reset Codes ........................................28
Table 3: DCCP Options ............................................30
Table 4: DCCP Feature Numbers.....................................35
Table 5: DCCP Congestion Control Identifiers .....................77
Table 6: DCCP Ack Vector States ..................................86
Table 7: DCCP Drop Codes .........................................92
Kohler, et al. Standards Track [Page 4]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
1. Introduction
The Datagram Congestion Control Protocol (DCCP) is a transport
protocol that implements bidirectional, unicast connections of
congestion-controlled, unreliable datagrams. Specifically, DCCP
provides the following:
o Unreliable flows of datagrams.
o Reliable handshakes for connection setup and teardown.
o Reliable negotiation of options, including negotiation of a
suitable congestion control mechanism.
o Mechanisms allowing servers to avoid holding state for
unacknowledged connection attempts and already-finished
connections.
o Congestion control incorporating Explicit Congestion Notification
(ECN) [RFC3168] and the ECN Nonce [RFC3540].
o Acknowledgement mechanisms communicating packet loss and ECN
information. Acks are transmitted as reliably as the relevant
congestion control mechanism requires, possibly completely
reliably.
o Optional mechanisms that tell the sending application, with high
reliability, which data packets reached the receiver, and whether
those packets were ECN marked, corrupted, or dropped in the
receive buffer.
o Path Maximum Transmission Unit (PMTU) discovery [RFC1191].
o A choice of modular congestion control mechanisms. Two mechanisms
are currently specified: TCP-like Congestion Control [RFC4341] and
TCP-Friendly Rate Control (TFRC) [RFC4342]. DCCP is easily
extensible to further forms of unicast congestion control.
DCCP is intended for applications such as streaming media that can
benefit from control over the tradeoffs between delay and reliable
in-order delivery. TCP is not well suited for these applications,
since reliable in-order delivery and congestion control can cause
arbitrarily long delays. UDP avoids long delays, but UDP
applications that implement congestion control must do so on their
own. DCCP provides built-in congestion control, including ECN
Kohler, et al. Standards Track [Page 5]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
support, for unreliable datagram flows, avoiding the arbitrary delays
associated with TCP. It also implements reliable connection setup,
teardown, and feature negotiation.
2. Design Rationale
One DCCP design goal was to give most streaming UDP applications
little reason not to switch to DCCP, once it is deployed. To
facilitate this, DCCP was designed to have as little overhead as
possible, both in terms of the packet header size and in terms of the
state and CPU overhead required at end hosts. Only the minimal
necessary functionality was included in DCCP, leaving other
functionality, such as forward error correction (FEC), semi-
reliability, and multiple streams, to be layered on top of DCCP as
desired.
Different forms of conformant congestion control are appropriate for
different applications. For example, on-line games might want to
make quick use of any available bandwidth, while streaming media
might trade off this responsiveness for a steadier, less bursty rate.
(Sudden rate changes can cause unacceptable UI glitches such as
audible pauses or clicks in the playout stream.) DCCP thus allows
applications to choose from a set of congestion control mechanisms.
One alternative, TCP-like Congestion Control, halves the congestion
window in response to a packet drop or mark, as in TCP. Applications
using this congestion control mechanism will respond quickly to
changes in available bandwidth, but must tolerate the abrupt changes
in congestion window typical of TCP. A second alternative, TCP-
Friendly Rate Control (TFRC) [RFC3448], a form of equation-based
congestion control, minimizes abrupt changes in the sending rate
while maintaining longer-term fairness with TCP. Other alternatives
can be added as future congestion control mechanisms are
standardized.
DCCP also lets unreliable traffic safely use ECN. A UDP kernel
Application Programming Interface (API) might not allow applications
to set UDP packets as ECN capable, since the API could not guarantee
that the application would properly detect or respond to congestion.
DCCP kernel APIs will have no such issues, since DCCP implements
congestion control itself.
We chose not to require the use of the Congestion Manager [RFC3124],
which allows multiple concurrent streams between the same sender and
receiver to share congestion control. The current Congestion Manager
can only be used by applications that have their own end-to-end
feedback about packet losses, but this is not the case for many of
the applications currently using UDP. In addition, the current
Congestion Manager does not easily support multiple congestion
Kohler, et al. Standards Track [Page 6]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
control mechanisms or mechanisms where the state about past packet
drops or marks is maintained at the receiver rather than the sender.
DCCP should be able to make use of CM where desired by the
application, but we do not see any benefit in making the deployment
of DCCP contingent on the deployment of CM itself.
We intend for DCCP's protocol mechanisms, which are described in this
document, to suit any application desiring unicast congestion-
controlled streams of unreliable datagrams. However, the congestion
control mechanisms currently approved for use with DCCP, which are
described in separate Congestion Control ID Profiles [RFC4341,
RFC4342], may cause problems for some applications, including high-
bandwidth interactive video. These applications should be able to
use DCCP once suitable Congestion Control ID Profiles are
standardized.
3. Conventions and Terminology
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].
3.1. Numbers and Fields
All multi-byte numerical quantities in DCCP, such as port numbers,
Sequence Numbers, and arguments to options, are transmitted in
network byte order (most significant byte first).
We occasionally refer to the "left" and "right" sides of a bit field.
"Left" means towards the most significant bit, and "right" means
towards the least significant bit.
Random numbers in DCCP are used for their security properties and
SHOULD be chosen according to the guidelines in [RFC4086].
All operations on DCCP sequence numbers use circular arithmetic
modulo 2^48, as do comparisons such as "greater" and "greatest".
This form of arithmetic preserves the relationships between sequence
numbers as they roll over from 2^48 - 1 to 0. Implementation
strategies for DCCP sequence numbers will resemble those for other
circular arithmetic spaces, including TCP's sequence numbers [RFC793]
and DNS's serial numbers [RFC1982]. It may make sense to store DCCP
sequence numbers in the most significant 48 bits of 64-bit integers
and set the least significant 16 bits to zero, since this supports a
common technique that implements circular comparison A < B by testing
whether (A - B) < 0 using conventional two's-complement arithmetic.
Kohler, et al. Standards Track [Page 7]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
Reserved bitfields in DCCP packet headers MUST be set to zero by
senders and MUST be ignored by receivers, unless otherwise specified.
This allows for future protocol extensions. In particular, DCCP
processors MUST NOT reset a DCCP connection simply because a Reserved
field has non-zero value [RFC3360].
3.2. Parts of a Connection
Each DCCP connection runs between two hosts, which we often name DCCP
A and DCCP B. Each connection is actively initiated by one of the
hosts, which we call the client; the other, initially passive host is
called the server. The term "DCCP endpoint" is used to refer to
either of the two hosts explicitly named by the connection (the
client and the server). The term "DCCP processor" refers more
generally to any host that might need to process a DCCP header; this
includes the endpoints and any middleboxes on the path, such as
firewalls and network address translators.
DCCP connections are bidirectional: data may pass from either
endpoint to the other. This means that data and acknowledgements may
flow in both directions simultaneously. Logically, however, a DCCP
connection consists of two separate unidirectional connections,
called half-connections. Each half-connection consists of the
application data sent by one endpoint and the corresponding
acknowledgements sent by the other endpoint. We can illustrate this
as follows:
+--------+ A-to-B half-connection: +--------+
| | --> application data --> | |
| | <-- acknowledgements <-- | |
| DCCP A | | DCCP B |
| | B-to-A half-connection: | |
| | <-- application data <-- | |
+--------+ --> acknowledgements --> +--------+
Although they are logically distinct, in practice the half-
connections overlap; a DCCP-DataAck packet, for example, contains
application data relevant to one half-connection and acknowledgement
information relevant to the other.
In the context of a single half-connection, the terms "HC-Sender" and
"HC-Receiver" denote the endpoints sending application data and
acknowledgements, respectively. For example, DCCP A is the
HC-Sender and DCCP B is the HC-Receiver in the A-to-B
half-connection.
Kohler, et al. Standards Track [Page 8]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
3.3. Features
A DCCP feature is a connection attribute on whose value the two
endpoints agree. Many properties of a DCCP connection are controlled
by features, including the congestion control mechanisms in use on
the two half-connections. The endpoints achieve agreement through
the exchange of feature negotiation options in DCCP headers.
DCCP features are identified by a feature number and an endpoint.
The notation "F/X" represents the feature with feature number F
located at DCCP endpoint X. Each valid feature number thus
corresponds to two features, which are negotiated separately and need
not have the same value. The two endpoints know, and agree on, the
value of every valid feature. DCCP A is the "feature location" for
all features F/A, and the "feature remote" for all features F/B.
3.4. Round-Trip Times
DCCP round-trip time measurements are performed by congestion control
mechanisms; different mechanisms may measure round-trip time in
different ways, or not measure it at all. However, the main DCCP
protocol does use round-trip times occasionally, such as in the
initial values for certain timers. Each DCCP implementation thus
defines a default round-trip time for use when no estimate is
available. This parameter should default to not less than 0.2
seconds, a reasonably conservative round-trip time for Internet TCP
connections. Protocol behavior specified in terms of "round-trip
time" values actually refers to "a current round-trip time estimate
taken by some CCID, or, if no estimate is available, the default
round-trip time parameter".
The maximum segment lifetime, or MSL, is the maximum length of time a
packet can survive in the network. The DCCP MSL should equal that of
TCP, which is normally two minutes.
3.5. Security Limitation
DCCP provides no protection against attackers who can snoop on a
connection in progress, or who can guess valid sequence numbers in
other ways. Applications desiring stronger security should use IPsec
[RFC2401]; depending on the level of security required, application-
level cryptography may also suffice. These issues are discussed
further in Sections 7.5.5 and 18.
Kohler, et al. Standards Track [Page 9]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
3.6. Robustness Principle
DCCP implementations will follow TCP's "general principle of
robustness": "be conservative in what you do, be liberal in what you
accept from others" [RFC793].
4. Overview
DCCP's high-level connection dynamics echo those of TCP. Connections
progress through three phases: initiation, including a three-way
handshake; data transfer; and termination. Data can flow both ways
over the connection. An acknowledgement framework lets senders
discover how much data has been lost and thus avoid unfairly
congesting the network. Of course, DCCP provides unreliable datagram
semantics, not TCP's reliable bytestream semantics. The application
must package its data into explicit frames and must retransmit its
own data as necessary. It may be useful to think of DCCP as TCP
minus bytestream semantics and reliability, or as UDP plus congestion
control, handshakes, and acknowledgements.
4.1. Packet Types
Ten packet types implement DCCP's protocol functions. For example,
every new connection attempt begins with a DCCP-Request packet sent
by the client. In this way a DCCP-Request packet resembles a TCP
SYN, but since DCCP-Request is a packet type there is no way to send
an unexpected flag combination, such as TCP's SYN+FIN+ACK+RST.
Eight packet types occur during the progress of a typical connection,
shown here. Note the three-way handshakes during initiation and
termination.
Client Server
------ ------
(1) Initiation
DCCP-Request -->
<-- DCCP-Response
DCCP-Ack -->
(2) Data transfer
DCCP-Data, DCCP-Ack, DCCP-DataAck -->
<-- DCCP-Data, DCCP-Ack, DCCP-DataAck
(3) Termination
<-- DCCP-CloseReq
DCCP-Close -->
<-- DCCP-Reset
The two remaining packet types are used to resynchronize after bursts
of loss.
Kohler, et al. Standards Track [Page 10]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
Every DCCP packet starts with a fixed-size generic header.
Particular packet types include additional fixed-size header data;
for example, DCCP-Acks include an Acknowledgement Number. DCCP
options and any application data follow the fixed-size header.
The packet types are as follows:
DCCP-Request
Sent by the client to initiate a connection (the first part of the
three-way initiation handshake).
DCCP-Response
Sent by the server in response to a DCCP-Request (the second part
of the three-way initiation handshake).
DCCP-Data
Used to transmit application data.
DCCP-Ack
Used to transmit pure acknowledgements.
DCCP-DataAck
Used to transmit application data with piggybacked acknowledgement
information.
DCCP-CloseReq
Sent by the server to request that the client close the
connection.
DCCP-Close
Used by the client or the server to close the connection; elicits
a DCCP-Reset in response.
DCCP-Reset
Used to terminate the connection, either normally or abnormally.
DCCP-Sync, DCCP-SyncAck
Used to resynchronize sequence numbers after large bursts of loss.
4.2. Packet Sequencing
Each DCCP packet carries a sequence number so that losses can be
detected and reported. Unlike TCP sequence numbers, which are byte-
based, DCCP sequence numbers increment by one per packet. For
example:
Kohler, et al. Standards Track [Page 11]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
DCCP A DCCP B
------ ------
DCCP-Data(seqno 1) -->
DCCP-Data(seqno 2) -->
<-- DCCP-Ack(seqno 10, ackno 2)
DCCP-DataAck(seqno 3, ackno 10) -->
<-- DCCP-Data(seqno 11)
Every DCCP packet increments the sequence number, whether or not it
contains application data. DCCP-Ack pure acknowledgements increment
the sequence number; for instance, DCCP B's second packet above uses
sequence number 11, since sequence number 10 was used for an
acknowledgement. This lets endpoints detect all packet loss,
including acknowledgement loss. It also means that endpoints can get
out of sync after long bursts of loss. The DCCP-Sync and DCCP-
SyncAck packet types are used to recover (Section 7.5).
Since DCCP provides unreliable semantics, there are no
retransmissions, and having a TCP-style cumulative acknowledgement
field doesn't make sense. DCCP's Acknowledgement Number field equals
the greatest sequence number received, rather than the smallest
sequence number not received. Separate options indicate any
intermediate sequence numbers that weren't received.
4.3. States
DCCP endpoints progress through different states during the course of
a connection, corresponding roughly to the three phases of
initiation, data transfer, and termination. The figure below shows
the typical progress through these states for a client and server.
Kohler, et al. Standards Track [Page 12]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
Client Server
------ ------
(0) No connection
CLOSED LISTEN
(1) Initiation
REQUEST DCCP-Request -->
<-- DCCP-Response RESPOND
PARTOPEN DCCP-Ack or DCCP-DataAck -->
(2) Data transfer
OPEN <-- DCCP-Data, Ack, DataAck --> OPEN
(3) Termination
<-- DCCP-CloseReq CLOSEREQ
CLOSING DCCP-Close -->
<-- DCCP-Reset CLOSED
TIMEWAIT
CLOSED
The nine possible states are as follows. They are listed in
increasing order, so that "state >= CLOSEREQ" means the same as
"state = CLOSEREQ or state = CLOSING or state = TIMEWAIT". Section 8
describes the states in more detail.
CLOSED
Represents nonexistent connections.
LISTEN
Represents server sockets in the passive listening state. LISTEN
and CLOSED are not associated with any particular DCCP connection.
REQUEST
A client socket enters this state, from CLOSED, after sending a
DCCP-Request packet to try to initiate a connection.
RESPOND
A server socket enters this state, from LISTEN, after receiving a
DCCP-Request from a client.
PARTOPEN
A client socket enters this state, from REQUEST, after receiving a
DCCP-Response from the server. This state represents the third
phase of the three-way handshake. The client may send application
data in this state, but it MUST include an Acknowledgement Number
on all of its packets.
Kohler, et al. Standards Track [Page 13]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
OPEN
The central data transfer portion of a DCCP connection. Client
and server sockets enter this state from PARTOPEN and RESPOND,
respectively. Sometimes we speak of SERVER-OPEN and CLIENT-OPEN
states, corresponding to the server's OPEN state and the client's
OPEN state.
CLOSEREQ
A server socket enters this state, from SERVER-OPEN, to order the
client to close the connection and to hold TIMEWAIT state.
CLOSING
Server and client sockets can both enter this state to close the
connection.
TIMEWAIT
A server or client socket remains in this state for 2MSL (4
minutes) after the connection has been torn down, to prevent
mistakes due to the delivery of old packets. Only one of the
endpoints has to enter TIMEWAIT state (the other can enter CLOSED
state immediately), and a server can request its client to hold
TIMEWAIT state using the DCCP-CloseReq packet type.
4.4. Congestion Control Mechanisms
DCCP connections are congestion controlled, but unlike in TCP, DCCP
applications have a choice of congestion control mechanism. In fact,
the two half-connections can be governed by different mechanisms.
Mechanisms are denoted by one-byte congestion control identifiers, or
CCIDs. The endpoints negotiate their CCIDs during connection
initiation. Each CCID describes how the HC-Sender limits data packet
rates, how the HC-Receiver sends congestion feedback via
acknowledgements, and so forth. CCIDs 2 and 3 are currently defined;
CCIDs 0, 1, and 4-255 are reserved. Other CCIDs may be defined in
the future.
CCID 2 provides TCP-like Congestion Control, which is similar to that
of TCP. The sender maintains a congestion window and sends packets
until that window is full. Packets are acknowledged by the receiver.
Dropped packets and ECN [RFC3168] indicate congestion; the response
to congestion is to halve the congestion window. Acknowledgements in
CCID 2 contain the sequence numbers of all received packets within
some window, similar to a selective acknowledgement (SACK) [RFC2018].
CCID 3 provides TCP-Friendly Rate Control (TFRC), an equation-based
form of congestion control intended to respond to congestion more
smoothly than CCID 2. The sender maintains a transmit rate, which it
updates using the receiver's estimate of the packet loss and mark
Kohler, et al. Standards Track [Page 14]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
rate. CCID 3 behaves somewhat differently than TCP in the short
term, but is designed to operate fairly with TCP over the long term.
Section 10 describes DCCP's CCIDs in more detail. The behaviors of
CCIDs 2 and 3 are fully defined in separate profile documents
[RFC4341, RFC4342].
4.5. Feature Negotiation Options
DCCP endpoints use Change and Confirm options to negotiate and agree
on feature values. Feature negotiation will almost always happen on
the connection initiation handshake, but it can begin at any time.
There are four feature negotiation options in all: Change L, Confirm
L, Change R, and Confirm R. The "L" options are sent by the feature
location and the "R" options are sent by the feature remote. A
Change R option says to the feature location, "change this feature
value as follows". The feature location responds with Confirm L,
meaning, "I've changed it". Some features allow Change R options to
contain multiple values sorted in preference order. For example:
Client Server
------ ------
Change R(CCID, 2) -->
<-- Confirm L(CCID, 2)
* agreement that CCID/Server = 2 *
Change R(CCID, 3 4) -->
<-- Confirm L(CCID, 4, 4 2)
* agreement that CCID/Server = 4 *
Both exchanges negotiate the CCID/Server feature's value, which is
the CCID in use on the server-to-client half-connection. In the
second exchange, the client requests that the server use either CCID
3 or CCID 4, with 3 preferred; the server chooses 4 and supplies its
preference list, "4 2".
The Change L and Confirm R options are used for feature negotiations
initiated by the feature location. In the following example, the
server requests that CCID/Server be set to 3 or 2, with 3 preferred,
and the client agrees.
Kohler, et al. Standards Track [Page 15]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
Client Server
------ ------
<-- Change L(CCID, 3 2)
Confirm R(CCID, 3, 3 2) -->
* agreement that CCID/Server = 3 *
Section 6 describes the feature negotiation options further,
including the retransmission strategies that make negotiation
reliable.
4.6. Differences from TCP
DCCP's differences from TCP apart from those discussed so far include
the following:
o Copious space for options (up to 1008 bytes or the PMTU).
o Different acknowledgement formats. The CCID for a connection
determines how much acknowledgement information needs to be
transmitted. For example, in CCID 2 (TCP-like), this is about one
ack per 2 packets, and each ack must declare exactly which packets
were received. In CCID 3 (TFRC), it is about one ack per round-
trip time, and acks must declare at minimum just the lengths of
recent loss intervals.
o Denial of Service (DoS) protection. Several mechanisms help limit
the amount of state that possibly-misbehaving clients can force
DCCP servers to maintain. An Init Cookie option analogous to
TCP's SYN Cookies [SYNCOOKIES] avoids SYN-flood-like attacks.
Only one connection endpoint has to hold TIMEWAIT state; the
DCCP-CloseReq packet, which may only be sent by the server, passes
that state to the client. Various rate limits let servers avoid
attacks that might force extensive computation or packet
generation.
o Distinguishing different kinds of loss. A Data Dropped option
(Section 11.7) lets an endpoint declare that a packet was dropped
because of corruption, because of receive buffer overflow, and so
on. This facilitates research into more appropriate rate-control
responses for these non-network-congestion losses (although
currently such losses will cause a congestion response).
o Acknowledgeability. In TCP, a packet may be acknowledged only
once the data is reliably queued for application delivery. This
does not make sense in DCCP, where an application might, for
example, request a drop-from-front receive buffer. A DCCP packet
may be acknowledged as soon as its header has been successfully
processed. Concretely, a packet becomes acknowledgeable at Step 8
Kohler, et al. Standards Track [Page 16]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
of Section 8.5's packet processing pseudocode. Acknowledgeability
does not guarantee data delivery, however: the Data Dropped option
may later report that the packet's application data was discarded.
o No receive window. DCCP is a congestion control protocol, not a
flow control protocol.
o No simultaneous open. Every connection has one client and one
server.
o No half-closed states. DCCP has no states corresponding to TCP's
FINWAIT and CLOSEWAIT, where one half-connection is explicitly
closed while the other is still active. The Data Dropped option's
Drop Code 1, Application Not Listening (Section 11.7), can achieve
a similar effect, however.
4.7. Example Connection
The progress of a typical DCCP connection is as follows. (This
description is informative, not normative.)
Client Server
------ ------
0. [CLOSED] [LISTEN]
1. DCCP-Request -->
2. <-- DCCP-Response
3. DCCP-Ack -->
4. DCCP-Data, DCCP-Ack, DCCP-DataAck -->
<-- DCCP-Data, DCCP-Ack, DCCP-DataAck
5. <-- DCCP-CloseReq
6. DCCP-Close -->
7. <-- DCCP-Reset
8. [TIMEWAIT]
1. The client sends the server a DCCP-Request packet specifying the
client and server ports, the service being requested, and any
features being negotiated, including the CCID that the client
would like the server to use. The client may optionally piggyback
an application request on the DCCP-Request packet. The server may
ignore this application request.
2. The server sends the client a DCCP-Response packet indicating that
it is willing to communicate with the client. This response
indicates any features and options that the server agrees to,
begins other feature negotiations as desired, and optionally
includes Init Cookies that wrap up all this information and that
must be returned by the client for the connection to complete.
Kohler, et al. Standards Track [Page 17]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
3. The client sends the server a DCCP-Ack packet that acknowledges
the DCCP-Response packet. This acknowledges the server's initial
sequence number and returns any Init Cookies in the DCCP-Response.
It may also continue feature negotiation. The client may
piggyback an application-level request on this ack, producing a
DCCP-DataAck packet.
4. The server and client then exchange DCCP-Data packets, DCCP-Ack
packets acknowledging that data, and, optionally, DCCP-DataAck
packets containing data with piggybacked acknowledgements. If the
client has no data to send, then the server will send DCCP-Data
and DCCP-DataAck packets, while the client will send DCCP-Acks
exclusively. (However, the client may not send DCCP-Data packets
before receiving at least one non-DCCP-Response packet from the
server.)
5. The server sends a DCCP-CloseReq packet requesting a close.
6. The client sends a DCCP-Close packet acknowledging the close.
7. The server sends a DCCP-Reset packet with Reset Code 1, "Closed",
and clears its connection state. DCCP-Resets are part of normal
connection termination; see Section 5.6.
8. The client receives the DCCP-Reset packet and holds state for two
maximum segment lifetimes, or 2MSL, to allow any remaining packets
to clear the network.
An alternative connection closedown sequence is initiated by the
client:
5b. The client sends a DCCP-Close packet closing the connection.
6b. The server sends a DCCP-Reset packet with Reset Code 1, "Closed",
and clears its connection state.
7b. The client receives the DCCP-Reset packet and holds state for
2MSL to allow any remaining packets to clear the network.
5. Packet Formats
The DCCP header can be from 12 to 1020 bytes long. The initial part
of the header has the same semantics for all currently defined packet
types. Following this comes any additional fixed-length fields
required by the packet type, and then a variable-length list of
options. The application data area follows the header. In some
packet types, this area contains data for the application; in other
packet types, its contents are ignored.
Kohler, et al. Standards Track [Page 18]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
+---------------------------------------+ -.
| Generic Header | |
+---------------------------------------+ |
| Additional Fields (depending on type) | +- DCCP Header
+---------------------------------------+ |
| Options (optional) | |
+=======================================+ -'
| Application Data Area |
+---------------------------------------+
5.1. Generic Header
The DCCP generic header takes different forms depending on the value
of X, the Extended Sequence Numbers bit. If X is one, the Sequence
Number field is 48 bits long, and the generic header takes 16 bytes,
as follows.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Dest Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data Offset | CCVal | CsCov | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| | |X| | .
| Res | Type |=| Reserved | Sequence Number (high bits) .
| | |1| | .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
. Sequence Number (low bits) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
If X is zero, only the low 24 bits of the Sequence Number are
transmitted, and the generic header is 12 bytes long.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Dest Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data Offset | CCVal | CsCov | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| | |X| |
| Res | Type |=| Sequence Number (low bits) |
| | |0| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Kohler, et al. Standards Track [Page 19]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
The generic header fields are defined as follows.
Source and Destination Ports: 16 bits each
These fields identify the connection, similar to the corresponding
fields in TCP and UDP. The Source Port represents the relevant
port on the endpoint that sent this packet, and the Destination
Port represents the relevant port on the other endpoint. When
initiating a connection, the client SHOULD choose its Source Port
randomly to reduce the likelihood of attack.
DCCP APIs should treat port numbers similarly to TCP and UDP port
numbers. For example, machines that distinguish between
"privileged" and "unprivileged" ports for TCP and UDP should do
the same for DCCP.
Data Offset: 8 bits
The offset from the start of the packet's DCCP header to the start
of its application data area, in 32-bit words. The receiver MUST
ignore packets whose Data Offset is smaller than the minimum-sized
header for the given Type or larger than the DCCP packet itself.
CCVal: 4 bits
Used by the HC-Sender CCID. For example, the A-to-B CCID's
sender, which is active at DCCP A, MAY send 4 bits of information
per packet to its receiver by encoding that information in CCVal.
The sender MUST set CCVal to zero unless its HC-Sender CCID
specifies otherwise, and the receiver MUST ignore the CCVal field
unless its HC-Receiver CCID specifies otherwise.
Checksum Coverage (CsCov): 4 bits
Checksum Coverage determines the parts of the packet that are
covered by the Checksum field. This always includes the DCCP
header and options, but some or all of the application data may be
excluded. This can improve performance on noisy links for
applications that can tolerate corruption. See Section 9.
Checksum: 16 bits
The Internet checksum of the packet's DCCP header (including
options), a network-layer pseudoheader, and, depending on Checksum
Coverage, all, some, or none of the application data. See Section
9.
Reserved (Res): 3 bits
Senders MUST set this field to all zeroes on generated packets,
and receivers MUST ignore its value.
Kohler, et al. Standards Track [Page 20]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
Type: 4 bits
The Type field specifies the type of the packet. The following
values are defined:
Type Meaning
---- -------
0 DCCP-Request
1 DCCP-Response
2 DCCP-Data
3 DCCP-Ack
4 DCCP-DataAck
5 DCCP-CloseReq
6 DCCP-Close
7 DCCP-Reset
8 DCCP-Sync
9 DCCP-SyncAck
10-15 Reserved
Table 1: DCCP Packet Types
Receivers MUST ignore any packets with reserved type. That is,
packets with reserved type MUST NOT be processed, and they MUST
NOT be acknowledged as received.
Extended Sequence Numbers (X): 1 bit
Set to one to indicate the use of an extended generic header with
48-bit Sequence and Acknowledgement Numbers. DCCP-Data, DCCP-
DataAck, and DCCP-Ack packets MAY set X to zero or one. All
DCCP-Request, DCCP-Response, DCCP-CloseReq, DCCP-Close, DCCP-
Reset, DCCP-Sync, and DCCP-SyncAck packets MUST set X to one;
endpoints MUST ignore any such packets with X set to zero. High-
rate connections SHOULD set X to one on all packets to gain
increased protection against wrapped sequence numbers and attacks.
See Section 7.6.
Sequence Number: 48 or 24 bits
Identifies the packet uniquely in the sequence of all packets the
source sent on this connection. Sequence Number increases by one
with every packet sent, including packets such as DCCP-Ack that
carry no application data. See Section 7.
All currently defined packet types except DCCP-Request and DCCP-Data
carry an Acknowledgement Number Subheader in the four or eight bytes
immediately following the generic header. When X=1, its format is:
Kohler, et al. Standards Track [Page 21]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved | Acknowledgement Number .
| | (high bits) .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
. Acknowledgement Number (low bits) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
When X=0, only the low 24 bits of the Acknowledgement Number are
transmitted, giving the Acknowledgement Number Subheader this format:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved | Acknowledgement Number (low bits) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Reserved: 16 or 8 bits
Senders MUST set this field to all zeroes on generated packets,
and receivers MUST ignore its value.
Acknowledgement Number: 48 or 24 bits
Generally contains GSR, the Greatest Sequence Number Received on
any acknowledgeable packet so far. A packet is acknowledgeable
if and only if its header was successfully processed by the
receiver; Section 7.4 describes this further. Options such as
Ack Vector (Section 11.4) combine with the Acknowledgement
Number to provide precise information about which packets have
arrived.
Acknowledgement Numbers on DCCP-Sync and DCCP-SyncAck packets
need not equal GSR. See Section 5.7.
5.2. DCCP-Request Packets
A client initiates a DCCP connection by sending a DCCP-Request
packet. These packets MAY contain application data and MUST use
48-bit sequence numbers (X=1).
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/ Generic DCCP Header with X=1 (16 bytes) /
/ with Type=0 (DCCP-Request) /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Service Code |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/ Options and Padding /
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
/ Application Data /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Kohler, et al. Standards Track [Page 22]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
Service Code: 32 bits
Describes the application-level service to which the client
application wants to connect. Service Codes are intended to
provide information about which application protocol a connection
intends to use, thus aiding middleboxes and reducing reliance on
globally well-known ports. See Section 8.1.2.
5.3. DCCP-Response Packets
The server responds to valid DCCP-Request packets with DCCP-Response
packets. This is the second phase of the three-way handshake.
DCCP-Response packets MAY contain application data and MUST use
48-bit sequence numbers (X=1).
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/ Generic DCCP Header with X=1 (16 bytes) /
/ with Type=1 (DCCP-Response) /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/ Acknowledgement Number Subheader (8 bytes) /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Service Code |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/ Options and Padding /
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
/ Application Data /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Acknowledgement Number: 48 bits
Contains GSR. Since DCCP-Responses are only sent during
connection initiation, this will always equal the Sequence Number
on a received DCCP-Request.
Service Code: 32 bits
MUST equal the Service Code on the corresponding DCCP-Request.
5.4. DCCP-Data, DCCP-Ack, and DCCP-DataAck Packets
The central data transfer portion of every DCCP connection uses
DCCP-Data, DCCP-Ack, and DCCP-DataAck packets. These packets MAY use
24-bit sequence numbers, depending on the value of the Allow Short
Sequence Numbers feature (Section 7.6.1). DCCP-Data packets carry
application data without acknowledgements.
Kohler, et al. Standards Track [Page 23]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/ Generic DCCP Header (16 or 12 bytes) /
/ with Type=2 (DCCP-Data) /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/ Options and Padding /
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
/ Application Data /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
DCCP-Ack packets dispense with the data but contain an
Acknowledgement Number. They are used for pure acknowledgements.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/ Generic DCCP Header (16 or 12 bytes) /
/ with Type=3 (DCCP-Ack) /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/ Acknowledgement Number Subheader (8 or 4 bytes) /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/ Options and Padding /
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
/ Application Data Area (Ignored) /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
DCCP-DataAck packets carry both application data and an
Acknowledgement Number. This piggybacks acknowledgement information
on a data packet.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/ Generic DCCP Header (16 or 12 bytes) /
/ with Type=4 (DCCP-DataAck) /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/ Acknowledgement Number Subheader (8 or 4 bytes) /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/ Options and Padding /
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
/ Application Data /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
A DCCP-Data or DCCP-DataAck packet may have a zero-length application
data area, which indicates that the application sent a zero-length
datagram. This differs from DCCP-Request and DCCP-Response packets,
where an empty application data area indicates the absence of
Kohler, et al. Standards Track [Page 24]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
application data (not the presence of zero-length application data).
The API SHOULD report any received zero-length datagrams to the
receiving application.
A DCCP-Ack packet MAY have a non-zero-length application data area,
which essentially pads the DCCP-Ack to a desired length. Receivers
MUST ignore the content of the application data area in DCCP-Ack
packets.
DCCP-Ack and DCCP-DataAck packets often include additional
acknowledgement options, such as Ack Vector, as required by the
congestion control mechanism in use.
5.5. DCCP-CloseReq and DCCP-Close Packets
DCCP-CloseReq and DCCP-Close packets begin the handshake that
normally terminates a connection. Either client or server may send a
DCCP-Close packet, which will elicit a DCCP-Reset packet. Only the
server can send a DCCP-CloseReq packet, which indicates that the
server wants to close the connection but does not want to hold its
TIMEWAIT state. Both packet types MUST use 48-bit sequence numbers
(X=1).
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/ Generic DCCP Header with X=1 (16 bytes) /
/ with Type=5 (DCCP-CloseReq) or 6 (DCCP-Close) /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/ Acknowledgement Number Subheader (8 bytes) /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/ Options and Padding /
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
/ Application Data Area (Ignored) /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
As with DCCP-Ack packets, DCCP-CloseReq and DCCP-Close packets MAY
have non-zero-length application data areas, whose contents receivers
MUST ignore.
5.6. DCCP-Reset Packets
DCCP-Reset packets unconditionally shut down a connection.
Connections normally terminate with a DCCP-Reset, but resets may be
sent for other reasons, including bad port numbers, bad option
behavior, incorrect ECN Nonce Echoes, and so forth. DCCP-Resets MUST
use 48-bit sequence numbers (X=1).
Kohler, et al. Standards Track [Page 25]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/ Generic DCCP Header with X=1 (16 bytes) /
/ with Type=7 (DCCP-Reset) /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/ Acknowledgement Number Subheader (8 bytes) /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reset Code | Data 1 | Data 2 | Data 3 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/ Options and Padding /
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
/ Application Data Area (Error Text) /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Reset Code: 8 bits
Represents the reason that the sender reset the DCCP connection.
Data 1, Data 2, and Data 3: 8 bits each
The Data fields provide additional information about why the
sender reset the DCCP connection. The meanings of these fields
depend on the value of Reset Code.
Application Data Area: Error Text
If present, Error Text is a human-readable text string encoded in
Unicode UTF-8, and preferably in English, that describes the error
in more detail. For example, a DCCP-Reset with Reset Code 11,
"Aggression Penalty", might contain Error Text such as "Aggression
Penalty: Received 3 bad ECN Nonce Echoes, assuming misbehavior".
The following Reset Codes are currently defined. Unless otherwise
specified, the Data 1, 2, and 3 fields MUST be set to 0 by the sender
of the DCCP-Reset and ignored by its receiver. Section references
describe concrete situations that will cause each Reset Code to be
generated; they are not meant to be exhaustive.
0, "Unspecified"
Indicates the absence of a meaningful Reset Code. Use of Reset
Code 0 is NOT RECOMMENDED: the sender should choose a Reset Code
that more clearly defines why the connection is being reset.
1, "Closed"
Normal connection close. See Section 8.3.
2, "Aborted"
The sending endpoint gave up on the connection because of lack of
progress. See Sections 8.1.1 and 8.1.5.
Kohler, et al. Standards Track [Page 26]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
3, "No Connection"
No connection exists. See Section 8.3.1.
4, "Packet Error"
A valid packet arrived with unexpected type. For example, a
DCCP-Data packet with valid header checksum and sequence numbers
arrived at a connection in the REQUEST state. See Section 8.3.1.
The Data 1 field equals the offending packet type as an eight-bit
number; thus, an offending packet with Type 2 will result in a
Data 1 value of 2.
5, "Option Error"
An option was erroneous, and the error was serious enough to
warrant resetting the connection. See Sections 6.6.7, 6.6.8, and
11.4. The Data 1 field equals the offending option type; Data 2
and Data 3 equal the first two bytes of option data (or zero if
the option had less than two bytes of data).
6, "Mandatory Error"
The sending endpoint could not process an option O that was
immediately preceded by Mandatory. The Data fields report the
option type and data of option O, using the format of Reset Code
5, "Option Error". See Section 5.8.2.
7, "Connection Refused"
The Destination Port didn't correspond to a port open for
listening. Sent only in response to DCCP-Requests. See Section
8.1.3.
8, "Bad Service Code"
The Service Code didn't equal the service code attached to the
Destination Port. Sent only in response to DCCP-Requests. See
Section 8.1.3.
9, "Too Busy"
The server is too busy to accept new connections. Sent only in
response to DCCP-Requests. See Section 8.1.3.
10, "Bad Init Cookie"
The Init Cookie echoed by the client was incorrect or missing.
See Section 8.1.4.
11, "Aggression Penalty"
This endpoint has detected congestion control-related misbehavior
on the part of the other endpoint. See Section 12.3.
Kohler, et al. Standards Track [Page 27]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
12-127, Reserved
Receivers should treat these codes as they do Reset Code 0,
"Unspecified".
128-255, CCID-specific codes
Semantics depend on the connection's CCIDs. See Section 10.3.
Receivers should treat unknown CCID-specific Reset Codes as they
do Reset Code 0, "Unspecified".
The following table summarizes this information.
Reset
Code Name Data 1 Data 2 & 3
----- ---- ------ ----------
0 Unspecified 0 0
1 Closed 0 0
2 Aborted 0 0
3 No Connection 0 0
4 Packet Error pkt type 0
5 Option Error option # option data
6 Mandatory Error option # option data
7 Connection Refused 0 0
8 Bad Service Code 0 0
9 Too Busy 0 0
10 Bad Init Cookie 0 0
11 Aggression Penalty 0 0
12-127 Reserved
128-255 CCID-specific codes
Table 2: DCCP Reset Codes
Options on DCCP-Reset packets are processed before the connection is
shut down. This means that certain combinations of options,
particularly involving Mandatory, may cause an endpoint to respond to
a valid DCCP-Reset with another DCCP-Reset. This cannot lead to a
reset storm; since the first endpoint has already reset the
connection, the second DCCP-Reset will be ignored.
5.7. DCCP-Sync and DCCP-SyncAck Packets
DCCP-Sync packets help DCCP endpoints recover synchronization after
bursts of loss and recover from half-open connections. Each valid
received DCCP-Sync immediately elicits a DCCP-SyncAck. Both packet
types MUST use 48-bit sequence numbers (X=1).
Kohler, et al. Standards Track [Page 28]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/ Generic DCCP Header with X=1 (16 bytes) /
/ with Type=8 (DCCP-Sync) or 9 (DCCP-SyncAck) /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/ Acknowledgement Number Subheader (8 bytes) /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/ Options and Padding /
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
/ Application Data Area (Ignored) /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
The Acknowledgement Number field has special semantics for DCCP-Sync
and DCCP-SyncAck packets. First, the packet corresponding to a
DCCP-Sync's Acknowledgement Number need not have been
acknowledgeable. Thus, receivers MUST NOT assume that a packet was
processed simply because it appears in the Acknowledgement Number
field of a DCCP-Sync packet. This differs from all other packet
types, where the Acknowledgement Number by definition corresponds to
an acknowledgeable packet. Second, the Acknowledgement Number on any
DCCP-SyncAck packet MUST correspond to the Sequence Number on an
acknowledgeable DCCP-Sync packet. In the presence of reordering,
this might not equal GSR.
As with DCCP-Ack packets, DCCP-Sync and DCCP-SyncAck packets MAY have
non-zero-length application data areas, whose contents receivers MUST
ignore. Padded DCCP-Sync packets may be useful when performing Path
MTU discovery; see Section 14.
5.8. Options
Any DCCP packet may contain options, which occupy space at the end of
the DCCP header. Each option is a multiple of 8 bits in length.
Individual options are not padded to multiples of 32 bits, and any
option may begin on any byte boundary. However, the combination of
all options MUST add up to a multiple of 32 bits; Padding options
MUST be added as necessary to fill out option space to a word
boundary. Any options present are included in the header checksum.
The first byte of an option is the option type. Options with types 0
through 31 are single-byte options. Other options are followed by a
byte indicating the option's length. This length value includes the
two bytes of option-type and option-length as well as any option-data
bytes; it must therefore be greater than or equal to two.
Options MUST be processed sequentially, starting with the first
option in the packet header. Options with unknown types MUST be
Kohler, et al. Standards Track [Page 29]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
ignored. Also, options with nonsensical lengths (length byte less
than two or more than the remaining space in the options portion of
the header) MUST be ignored, and any option space following an option
with nonsensical length MUST likewise be ignored. Unless otherwise
specified, multiple occurrences of the same option MUST be processed
independently; for some options, this will mean in practice that the
last valid occurrence of an option takes precedence.
The following options are currently defined:
Option DCCP- Section
Type Length Meaning Data? Reference
---- ------ ------- ----- ---------
0 1 Padding Y 5.8.1
1 1 Mandatory N 5.8.2
2 1 Slow Receiver Y 11.6
3-31 1 Reserved
32 variable Change L N 6.1
33 variable Confirm L N 6.2
34 variable Change R N 6.1
35 variable Confirm R N 6.2
36 variable Init Cookie N 8.1.4
37 3-8 NDP Count Y 7.7
38 variable Ack Vector [Nonce 0] N 11.4
39 variable Ack Vector [Nonce 1] N 11.4
40 variable Data Dropped N 11.7
41 6 Timestamp Y 13.1
42 6/8/10 Timestamp Echo Y 13.3
43 4/6 Elapsed Time N 13.2
44 6 Data Checksum Y 9.3
45-127 variable Reserved
128-255 variable CCID-specific options - 10.3
Table 3: DCCP Options
Not all options are suitable for all packet types. For example,
since the Ack Vector option is interpreted relative to the
Acknowledgement Number, it isn't suitable on DCCP-Request and DCCP-
Data packets, which have no Acknowledgement Number. If an option
occurs on an unexpected packet type, it MUST generally be ignored;
any such restrictions are mentioned in each option's description.
The table summarizes the most common restriction: when the DCCP-
Data? column value is N, the corresponding option MUST be ignored
when received on a DCCP-Data packet. (Section 7.5.5 describes why
such options are ignored as opposed to, say, causing a reset.)
Options with invalid values MUST be ignored unless otherwise
specified. For example, any Data Checksum option with option length
Kohler, et al. Standards Track [Page 30]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
4 MUST be ignored, since all valid Data Checksum options have option
length 6.
This section describes two generic options, Padding and Mandatory.
Other options are described later.
5.8.1. Padding Option
+--------+
|00000000|
+--------+
Type=0
Padding is a single-byte "no-operation" option used to pad between or
after options. If the length of a packet's other options is not a
multiple of 32 bits, then Padding options are REQUIRED to pad out the
options area to the length implied by Data Offset. Padding may also
be used between options; for example, to align the beginning of a
subsequent option on a 32-bit boundary. There is no guarantee that
senders will use this option, so receivers must be prepared to
process options even if they do not begin on a word boundary.
5.8.2. Mandatory Option
+--------+
|00000001|
+--------+
Type=1
Mandatory is a single-byte option that marks the immediately
following option as mandatory. Say that the immediately following
option is O. Then the Mandatory option has no effect if the
receiving DCCP endpoint understands and processes O. If the endpoint
does not understand or process O, however, then it MUST reset the
connection using Reset Code 6, "Mandatory Failure". For instance,
the endpoint would reset the connection if it did not understand O's
type; if it understood O's type, but not O's data; if O's data was
invalid for O's type; if O was a feature negotiation option, and the
endpoint did not understand the enclosed feature number; or if the
endpoint understood O, but chose not to perform the action O implies.
This list is not exhaustive and, in particular, individual option
specifications may describe additional situations in which the
endpoint should reset the connection and situations in which it
should not.
Mandatory options MUST NOT be sent on DCCP-Data packets, and any
Mandatory options received on DCCP-Data packets MUST be ignored.
Kohler, et al. Standards Track [Page 31]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
The connection is in error and should be reset with Reset Code 5,
"Option Error", if option O is absent (Mandatory was the last byte of
the option list), or if option O equals Mandatory. However, the
combination "Mandatory Padding" is valid, and MUST behave like two
bytes of Padding.
Section 6.6.9 describes the behavior of Mandatory feature negotiation
options in more detail.
6. Feature Negotiation
Four DCCP options, Change L, Confirm L, Change R, and Confirm R, are
used to negotiate feature values. Change options initiate a
negotiation; Confirm options complete that negotiation. The "L"
options are sent by the feature location, and the "R" options are
sent by the feature remote. Change options are retransmitted to
ensure reliability.
All these options have the same format. The first byte of option
data is the feature number, and the second and subsequent data bytes
hold one or more feature values. The exact format of the feature
value area depends on the feature type; see Section 6.3.
+--------+--------+--------+--------+--------
| Type | Length |Feature#| Value(s) ...
+--------+--------+--------+--------+--------
Together, the feature number and the option type ("L" or "R")
uniquely identify the feature to which an option applies. The exact
format of the Value(s) area depends on the feature number.
Feature negotiation options MUST NOT be sent on DCCP-Data packets,
and any feature negotiation options received on DCCP-Data packets
MUST be ignored.
6.1. Change Options
Change L and Change R options initiate feature negotiation. The
option to use depends on the relevant feature's location: To start a
negotiation for feature F/A, DCCP A will send a Change L option; to
start a negotiation for F/B, it will send a Change R option. Change
options are retransmitted until some response is received. They
contain at least one Value, and thus have a length of at least 4.
Kohler, et al. Standards Track [Page 32]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
+--------+--------+--------+--------+--------
Change L: |00100000| Length |Feature#| Value(s) ...
+--------+--------+--------+--------+--------
Type=32
+--------+--------+--------+--------+--------
Change R: |00100010| Length |Feature#| Value(s) ...
+--------+--------+--------+--------+--------
Type=34
6.2. Confirm Options
Confirm L and Confirm R options complete feature negotiation and are
sent in response to Change R and Change L options, respectively.
Confirm options MUST NOT be generated except in response to Change
options. Confirm options need not be retransmitted, since Change
options are retransmitted as necessary. The first byte of the
Confirm option contains the feature number from the corresponding
Change. Following this is the selected Value, and then possibly the
sender's preference list.
+--------+--------+--------+--------+--------
Confirm L: |00100001| Length |Feature#| Value(s) ...
+--------+--------+--------+--------+--------
Type=33
+--------+--------+--------+--------+--------
Confirm R: |00100011| Length |Feature#| Value(s) ...
+--------+--------+--------+--------+--------
Type=35
If an endpoint receives an invalid Change option -- with an unknown
feature number, or an invalid value -- it will respond with an empty
Confirm option containing the problematic feature number, but no
value. Such options have length 3.
6.3. Reconciliation Rules
Reconciliation rules determine how the two sets of preferences for a
given feature are resolved into a unique result. The reconciliation
rule depends only on the feature number. Each reconciliation rule
must have the property that the result is uniquely determined given
the contents of Change options sent by the two endpoints.
All current DCCP features use one of two reconciliation rules:
server-priority ("SP") and non-negotiable ("NN").
Kohler, et al. Standards Track [Page 33]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
6.3.1. Server-Priority
The feature value is a fixed-length byte string (length determined by
the feature number). Each Change option contains a list of values
ordered by preference, with the most preferred value coming first.
Each Confirm option contains the confirmed value, followed by the
confirmer's preference list. Thus, the feature's current value will
generally appear twice in Confirm options' data, once as the current
value and once in the confirmer's preference list.
To reconcile the preference lists, select the first entry in the
server's list that also occurs in the client's list. If there is no
shared entry, the feature's value MUST NOT change, and the Confirm
option will confirm the feature's previous value (unless the Change
option was Mandatory; see Section 6.6.9).
6.3.2. Non-Negotiable
The feature value is a byte string. Each option contains exactly one
feature value. The feature location signals a new value by sending a
Change L option. The feature remote MUST accept any valid value,
responding with a Confirm R option containing the new value, and it
MUST send empty Confirm R options in response to invalid values
(unless the Change L option was Mandatory; see Section 6.6.9).
Change R and Confirm L options MUST NOT be sent for non-negotiable
features; see Section 6.6.8. Non-negotiable features use the feature
negotiation mechanism to achieve reliability.
Kohler, et al. Standards Track [Page 34]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
6.4. Feature Numbers
This document defines the following feature numbers.
Rec'n Initial Section
Number Meaning Rule Value Req'd Reference
------ ------- ----- ----- ----- ---------
0 Reserved
1 Congestion Control ID (CCID) SP 2 Y 10
2 Allow Short Seqnos SP 0 Y 7.6.1
3 Sequence Window NN 100 Y 7.5.2
4 ECN Incapable SP 0 N 12.1
5 Ack Ratio NN 2 N 11.3
6 Send Ack Vector SP 0 N 11.5
7 Send NDP Count SP 0 N 7.7.2
8 Minimum Checksum Coverage SP 0 N 9.2.1
9 Check Data Checksum SP 0 N 9.3.1
10-127 Reserved
128-255 CCID-specific features 10.3
Table 4: DCCP Feature Numbers
Rec'n Rule The reconciliation rule used for the feature. SP
means server-priority, NN means non-negotiable.
Initial Value The initial value for the feature. Every feature has
a known initial value.
Req'd This column is "Y" if and only if every DCCP
implementation MUST understand the feature. If it is
"N", then the feature behaves like an extension (see
Section 15), and it is safe to respond to Change
options for the feature with empty Confirm options.
Of course, a CCID might require the feature; a DCCP
that implements CCID 2 MUST support Ack Ratio and
Send Ack Vector, for example.
Kohler, et al. Standards Track [Page 35]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
6.5. Feature Negotiation Examples
Here are three example feature negotiations for features located at
the server, the first two for the Congestion Control ID feature, the
last for the Ack Ratio.
Client Server
------ ------
1. Change R(CCID, 2 3 1) -->
("2 3 1" is client's preference list)
2. <-- Confirm L(CCID, 3, 3 2 1)
(3 is the negotiated value;
"3 2 1" is server's pref list)
* agreement that CCID/Server = 3 *
1. XXX <-- Change L(CCID, 3 2 1)
2. Retransmission:
<-- Change L(CCID, 3 2 1)
3. Confirm R(CCID, 3, 2 3 1) -->
* agreement that CCID/Server = 3 *
1. <-- Change L(Ack Ratio, 3)
2. Confirm R(Ack Ratio, 3) -->
* agreement that Ack Ratio/Server = 3 *
This example shows a simultaneous negotiation.
Client Server
------ ------
1a. Change R(CCID, 2 3 1) -->
b. <-- Change L(CCID, 3 2 1)
2a. <-- Confirm L(CCID, 3, 3 2 1)
b. Confirm R(CCID, 3, 2 3 1) -->
* agreement that CCID/Server = 3 *
Here are the byte encodings of several Change and Confirm options.
Each option is sent by DCCP A.
Change L(CCID, 2 3) = 32,5,1,2,3
DCCP B should change CCID/A's value (feature number 1, a server-
priority feature); DCCP A's preferred values are 2 and 3, in that
preference order.
Kohler, et al. Standards Track [Page 36]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
Change L(Sequence Window, 1024) = 32,9,3,0,0,0,0,4,0
DCCP B should change Sequence Window/A's value (feature number 3,
a non-negotiable feature) to the 6-byte string 0,0,0,0,4,0 (the
value 1024).
Confirm L(CCID, 2, 2 3) = 33,6,1,2,2,3
DCCP A has changed CCID/A's value to 2; its preferred values are 2
and 3, in that preference order.
Empty Confirm L(126) = 33,3,126
DCCP A doesn't implement feature number 126, or DCCP B's proposed
value for feature 126/A was invalid.
Change R(CCID, 3 2) = 34,5,1,3,2
DCCP B should change CCID/B's value; DCCP A's preferred values are
3 and 2, in that preference order.
Confirm R(CCID, 2, 3 2) = 35,6,1,2,3,2
DCCP A has changed CCID/B's value to 2; its preferred values were
3 and 2, in that preference order.
Confirm R(Sequence Window, 1024) = 35,9,3,0,0,0,0,4,0
DCCP A has changed Sequence Window/B's value to the 6-byte string
0,0,0,0,4,0 (the value 1024).
Empty Confirm R(126) = 35,3,126
DCCP A doesn't implement feature number 126, or DCCP B's proposed
value for feature 126/B was invalid.
6.6. Option Exchange
A few basic rules govern feature negotiation option exchange.
1. Every non-reordered Change option gets a Confirm option in
response.
2. Change options are retransmitted until a response for the latest
Change is received.
3. Feature negotiation options are processed in strictly-increasing
order by Sequence Number.
The rest of this section describes the consequences of these rules in
more detail.
Kohler, et al. Standards Track [Page 37]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
6.6.1. Normal Exchange
Change options are generated when a DCCP endpoint wants to change the
value of some feature. Generally, this will happen at the beginning
of a connection, although it may happen at any time. We say the
endpoint "generates" or "sends" a Change L or Change R option, but of
course the option must be attached to a packet. The endpoint may
attach the option to a packet it would have generated anyway (such as
a DCCP-Request), or it may create a "feature negotiation packet",
often a DCCP-Ack or DCCP-Sync, just to carry the option. Feature
negotiation packets are controlled by the relevant congestion control
mechanism. For example, DCCP A may send a DCCP-Ack or DCCP-Sync for
feature negotiation only if the B-to-A CCID would allow sending a
DCCP-Ack. In addition, an endpoint SHOULD generate at most one
feature negotiation packet per round-trip time.
On receiving a Change L or Change R option, a DCCP endpoint examines
the included preference list, reconciles that with its own preference
list, calculates the new value, and sends back a Confirm R or Confirm
L option, respectively, informing its peer of the new value or that
the feature was not understood. Every non-reordered Change option
MUST result in a corresponding Confirm option, and any packet
including a Confirm option MUST carry an Acknowledgement Number.
(Section 6.6.4 describes how Change reordering is detected and
handled.) Generated Confirm options may be attached to packets that
would have been sent anyway (such as DCCP-Response or DCCP-SyncAck)
or to new feature negotiation packets, as described above.
The Change-sending endpoint MUST wait to receive a corresponding
Confirm option before changing its stored feature value. The
Confirm-sending endpoint changes its stored feature value as soon as
it sends the Confirm.
A packet MAY contain more than one feature negotiation option,
possibly including two options that refer to the same feature; as
usual, the options are processed sequentially.
6.6.2. Processing Received Options
DCCP endpoints exist in one of three states relative to each feature.
STABLE is the normal state, where the endpoint knows the feature's
value and thinks the other endpoint agrees. An endpoint enters the
CHANGING state when it first sends a Change for the feature and
returns to STABLE once it receives a corresponding Confirm. The
final state, UNSTABLE, indicates that an endpoint in CHANGING state
changed its preference list but has not yet transmitted a Change
option with the new preference list.
Kohler, et al. Standards Track [Page 38]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
Feature state transitions at a feature location are implemented
according to this diagram. The diagram ignores sequence number and
option validity issues; these are handled explicitly in the
pseudocode that follows.
timeout/
rcv Confirm R app/protocol evt : snd Change L rcv non-ack
: ignore +---------------------------------------+ : snd Change L
+----+ | | +----+
| v | rcv Change R v | v
+------------+ rcv Confirm R : calc new value, +------------+
| | : accept value snd Confirm L | |
| STABLE |<-----------------------------------| CHANGING |
| | rcv empty Confirm R | |
+------------+ : revert to old value +------------+
| ^ | ^
+----+ pref list | | snd
rcv Change R changes | | Change L
: calc new value, snd Confirm L v |
+------------+
+---| |
rcv Confirm/Change R | | UNSTABLE |
: ignore +-->| |
+------------+
Feature locations SHOULD use the following pseudocode, which
corresponds to the state diagram, to react to each feature
negotiation option on each valid non-Data packet received. The
pseudocode refers to "P.seqno" and "P.ackno", which are properties of
the packet; "O.type" and "O.len", which are properties of the option;
"FGSR" and "FGSS", which are properties of the connection and handle
reordering as described in Section 6.6.4; "F.state", which is the
feature's state (STABLE, CHANGING, or UNSTABLE); and "F.value", which
is the feature's value.
First, check for unknown features (Section 6.6.7);
If F is unknown,
If the option was Mandatory, /* Section 6.6.9 */
Reset connection and return
Otherwise, if O.type == Change R,
Send Empty Confirm L on a future packet
Return
Second, check for reordering (Section 6.6.4);
If F.state == UNSTABLE or P.seqno <= FGSR
or (O.type == Confirm R and P.ackno < FGSS),
Ignore option and return
Kohler, et al. Standards Track [Page 39]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
Third, process Change R options;
If O.type == Change R,
If the option's value is valid, /* Section 6.6.8 */
Calculate new value
Send Confirm L on a future packet
Set F.state := STABLE
Otherwise, if the option was Mandatory,
Reset connection and return
Otherwise,
Send Empty Confirm L on a future packet
/* Remain in existing state. If that's CHANGING, this
endpoint will retransmit its Change L option later. */
Fourth, process Confirm R options (but only in CHANGING state).
If F.state == CHANGING and O.type == Confirm R,
If O.len > 3, /* nonempty */
If the option's value is valid,
Set F.value := new value
Otherwise,
Reset connection and return
Set F.state := STABLE
Versions of this diagram and pseudocode are also used by feature
remotes; simply switch the "L"s and "R"s, so that the relevant
options are Change R and Confirm L.
6.6.3. Loss and Retransmission
Packets containing Change and Confirm options might be lost or
delayed by the network. Therefore, Change options are repeatedly
transmitted to achieve reliability. We refer to this as
"retransmission", although of course there are no packet-level
retransmissions in DCCP: a Change option that is sent again will be
sent on a new packet with a new sequence number.
A CHANGING endpoint transmits another Change option once it realizes
that it has not heard back from the other endpoint. The new Change
option need not contain the same payload as the original; reordering
protection will ensure that agreement is reached based on the most
recently transmitted option.
A CHANGING endpoint MUST continue retransmitting Change options until
it gets some response or the connection terminates.
Endpoints SHOULD use an exponential-backoff timer to decide when to
retransmit Change options. (Packets generated specifically for
feature negotiation MUST use such a timer.) The timer interval is
initially set to not less than one round-trip time, and should back
Kohler, et al. Standards Track [Page 40]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
off to not less than 64 seconds. The backoff protects against
delayed agreement due to the reordering protection algorithms
described in the next section. Again, endpoints may piggyback Change
options on packets they would have sent anyway or create new packets
to carry the options. Any new packets are controlled by the relevant
congestion-control mechanism.
Confirm options are never retransmitted, but the Confirm-sending
endpoint MUST generate a Confirm option after every non-reordered
Change.
6.6.4. Reordering
Reordering might cause packets containing Change and Confirm options
to arrive in an unexpected order. Endpoints MUST ignore feature
negotiation options that do not arrive in strictly-increasing order
by Sequence Number. The rest of this section presents two algorithms
that fulfill this requirement.
The first algorithm introduces two sequence number variables that
each endpoint maintains for the connection.
FGSR Feature Greatest Sequence Number Received: The greatest
sequence number received, considering only valid packets
that contained one or more feature negotiation options
(Change and/or Confirm). This value is initialized to
ISR - 1.
FGSS Feature Greatest Sequence Number Sent: The greatest
sequence number sent, considering only packets that
contained one or more new Change options. A Change option
is new if and only if it was generated during a transition
from the STABLE or UNSTABLE state to the CHANGING state;
Change options generated within the CHANGING state are
retransmissions and MUST have exactly the same contents as
previously transmitted options, allowing tolerance for
reordering. FGSS is initialized to ISS.
Each endpoint checks two conditions on sequence numbers to decide
whether to process received feature negotiation options.
1. If a packet's Sequence Number is less than or equal to FGSR, then
its Change options MUST be ignored.
2. If a packet's Sequence Number is less than or equal to FGSR, if it
has no Acknowledgement Number, OR if its Acknowledgement Number is
less than FGSS, then its Confirm options MUST be ignored.
Kohler, et al. Standards Track [Page 41]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
Alternatively, an endpoint MAY maintain separate FGSR and FGSS values
for every feature. FGSR(F/X) would equal the greatest sequence
number received, considering only packets that contained Change or
Confirm options applying to feature F/X; FGSS(F/X) would be defined
similarly. This algorithm requires more state, but is slightly more
forgiving to multiple overlapped feature negotiations. Either
algorithm MAY be used; the first algorithm, with connection-wide FGSR
and FGSS variables, is RECOMMENDED.
One consequence of these rules is that a CHANGING endpoint will
ignore any Confirm option that does not acknowledge the latest Change
option sent. This ensures that agreement, once achieved, used the
most recent available information about the endpoints' preferences.
6.6.5. Preference Changes
Endpoints are allowed to change their preference lists at any time.
However, an endpoint that changes its preference list while in the
CHANGING state MUST transition to the UNSTABLE state. It will
transition back to CHANGING once it has transmitted a Change option
with the new preference list. This ensures that agreement is based
on active preference lists. Without the UNSTABLE state, simultaneous
negotiation -- where the endpoints began independent negotiations for
the same feature at the same time -- might lead to the negotiation's
terminating with the endpoints thinking the feature had different
values.
6.6.6. Simultaneous Negotiation
The two endpoints might simultaneously open negotiation for the same
feature, after which an endpoint in the CHANGING state will receive a
Change option for the same feature. Such received Change options can
act as responses to the original Change options. The CHANGING
endpoint MUST examine the received Change's preference list,
reconcile that with its own preference list (as expressed in its
generated Change options), and generate the corresponding Confirm
option. It can then transition to the STABLE state.
Kohler, et al. Standards Track [Page 42]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
6.6.7. Unknown Features
Endpoints may receive Change options referring to feature numbers
they do not understand -- for instance, when an extended DCCP
converses with a non-extended DCCP. Endpoints MUST respond to
unknown Change options with Empty Confirm options (that is, Confirm
options containing no data), which inform the CHANGING endpoint that
the feature was not understood. However, if the Change option was
Mandatory, the connection MUST be reset; see Section 6.6.9.
On receiving an empty Confirm option for some feature, the CHANGING
endpoint MUST transition back to the STABLE state, leaving the
feature's value unchanged. Section 15 suggests that the default
value for any extension feature correspond to "extension not
available".
Some features are required to be understood by all DCCPs (see Section
6.4). The CHANGING endpoint SHOULD reset the connection (with Reset
Code 5, "Option Error") if it receives an empty Confirm option for
such a feature.
Since Confirm options are generated only in response to Change
options, an endpoint should never receive a Confirm option referring
to a feature number it does not understand. Nevertheless, endpoints
MUST ignore any such options they receive.
6.6.8. Invalid Options
A DCCP endpoint might receive a Change or Confirm option for a known
feature that lists one or more values that it does not understand.
Some, but not all, such options are invalid, depending on the
relevant reconciliation rule (Section 6.3). For instance:
o All features have length limitations, and options with invalid
lengths are invalid. For example, the Ack Ratio feature takes
16-bit values, so valid "Confirm R(Ack Ratio)" options have option
length 5.
o Some non-negotiable features have value limitations. The Ack
Ratio feature takes two-byte, non-zero integer values, so a
"Change L(Ack Ratio, 0)" option is never valid. Note that
server-priority features do not have value limitations, since
unknown values are handled as a matter of course.
o Any Confirm option that selects the wrong value, based on the two
preference lists and the relevant reconciliation rule, is invalid.
Kohler, et al. Standards Track [Page 43]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
However, unexpected Confirm options -- that refer to unknown feature
numbers, or that don't appear to be part of a current negotiation --
are not invalid, although they are ignored by the receiver.
An endpoint receiving an invalid Change option MUST respond with the
corresponding empty Confirm option. An endpoint receiving an invalid
Confirm option MUST reset the connection, with Reset Code 5, "Option
Error".
6.6.9. Mandatory Feature Negotiation
Change options may be preceded by Mandatory options (Section 5.8.2).
Mandatory Change options are processed like normal Change options
except that the following failure cases will cause the receiver to
reset the connection with Reset Code 6, "Mandatory Failure", rather
than send a Confirm option. The connection MUST be reset if:
o the Change option's feature number was not understood;
o the Change option's value was invalid, and the receiver would
normally have sent an empty Confirm option in response; or
o for server-priority features, there was no shared entry in the two
endpoints' preference lists.
Other failure cases do not cause connection reset; in particular,
reordering protection may cause a Mandatory Change option to be
ignored without resetting the connection.
Confirm options behave identically and have the same reset conditions
whether or not they are Mandatory.
7. Sequence Numbers
DCCP uses sequence numbers to arrange packets into sequence, to
detect losses and network duplicates, and to protect against
attackers, half-open connections, and the delivery of very old
packets. Every packet carries a Sequence Number; most packet types
carry an Acknowledgement Number as well.
DCCP sequence numbers are packet based. That is, Sequence Numbers
generated by each endpoint increase by one, modulo 2^48, per packet.
Even DCCP-Ack and DCCP-Sync packets, and other packets that don't
carry user data, increment the Sequence Number. Since DCCP is an
unreliable protocol, there are no true retransmissions, but effective
retransmissions, such as retransmissions of DCCP-Request packets,
also increment the Sequence Number. This lets DCCP implementations
Kohler, et al. Standards Track [Page 44]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
detect network duplication, retransmissions, and acknowledgement
loss; it is a significant departure from TCP practice.
7.1. Variables
DCCP endpoints maintain a set of sequence number variables for each
connection.
ISS The Initial Sequence Number Sent by this endpoint. This
equals the Sequence Number of the first DCCP-Request or
DCCP-Response sent.
ISR The Initial Sequence Number Received from the other endpoint.
This equals the Sequence Number of the first DCCP-Request or
DCCP-Response received.
GSS The Greatest Sequence Number Sent by this endpoint. Here,
and elsewhere, "greatest" is measured in circular sequence
space.
GSR The Greatest Sequence Number Received from the other endpoint
on an acknowledgeable packet. (Section 7.4 defines this
term.)
GAR The Greatest Acknowledgement Number Received from the other
endpoint on an acknowledgeable packet that was not a DCCP-
Sync.
Some other variables are derived from these primitives.
SWL and SWH
(Sequence Number Window Low and High) The extremes of the
validity window for received packets' Sequence Numbers.
AWL and AWH
(Acknowledgement Number Window Low and High) The extremes of
the validity window for received packets' Acknowledgement
Numbers.
7.2. Initial Sequence Numbers
The endpoints' initial sequence numbers are set by the first DCCP-
Request and DCCP-Response packets sent. Initial sequence numbers
MUST be chosen to avoid two problems:
o delivery of old packets, where packets lingering in the network
from an old connection are delivered to a new connection with the
same addresses and port numbers; and
Kohler, et al. Standards Track [Page 45]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
o sequence number attacks, where an attacker can guess the sequence
numbers that a future connection would use [M85].
These problems are the same as those faced by TCP, and DCCP
implementations SHOULD use TCP's strategies to avoid them [RFC793,
RFC1948]. The rest of this section explains these strategies in more
detail.
To address the first problem, an implementation MUST ensure that the
initial sequence number for a given <source address, source port,
destination address, destination port> 4-tuple doesn't overlap with
recent sequence numbers on previous connections with the same
4-tuple. ("Recent" means sent within 2 maximum segment lifetimes, or
4 minutes.) The implementation MUST additionally ensure that the
lower 24 bits of the initial sequence number don't overlap with the
lower 24 bits of recent sequence numbers (unless the implementation
plans to avoid short sequence numbers; see Section 7.6). An
implementation that has state for a recent connection with the same
4-tuple can pick a good initial sequence number explicitly.
Otherwise, it could tie initial sequence number selection to some
clock, such as the 4-microsecond clock used by TCP [RFC793]. Two
separate clocks may be required, one for the upper 24 bits and one
for the lower 24 bits.
To address the second problem, an implementation MUST provide each
4-tuple with an independent initial sequence number space. Then,
opening a connection doesn't provide any information about initial
sequence numbers on other connections to the same host. [RFC1948]
achieves this by adding a cryptographic hash of the 4-tuple and a
secret to each initial sequence number. For the secret, [RFC1948]
recommends a combination of some truly random data [RFC4086], an
administratively installed passphrase, the endpoint's IP address, and
the endpoint's boot time, but truly random data is sufficient. Care
should be taken when the secret is changed; such a change alters all
initial sequence number spaces, which might make an initial sequence
number for some 4-tuple equal a recently sent sequence number for the
same 4-tuple. To avoid this problem, the endpoint might remember
dead connection state for each 4-tuple or stay quiet for 2 maximum
segment lifetimes around such a change.
7.3. Quiet Time
DCCP endpoints, like TCP endpoints, must take care before initiating
connections when they boot. In particular, they MUST NOT send
packets whose sequence numbers are close to the sequence numbers of
packets lingering in the network from before the boot. The simplest
way to enforce this rule is for DCCP endpoints to avoid sending any
packets until one maximum segment lifetime (2 minutes) after boot.
Kohler, et al. Standards Track [Page 46]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
Other enforcement mechanisms include remembering recent sequence
numbers across boots and reserving the upper 8 or so bits of initial
sequence numbers for a persistent counter that decrements by two each
boot. (The latter mechanism would require disallowing packets with
short sequence numbers; see Section 7.6.1.)
7.4. Acknowledgement Numbers
Cumulative acknowledgements are meaningless in an unreliable
protocol. Therefore, DCCP's Acknowledgement Number field has a
different meaning from TCP's.
A received packet is classified as acknowledgeable if and only if its
header was successfully processed by the receiving DCCP. In terms of
the pseudocode in Section 8.5, a received packet becomes
acknowledgeable when the receiving endpoint reaches Step 8. This
means, for example, that all acknowledgeable packets have valid
header checksums and sequence numbers. A sent packet's
Acknowledgement Number MUST equal the sending endpoint's GSR, the
Greatest Sequence Number Received on an acknowledgeable packet, for
all packet types except DCCP-Sync and DCCP-SyncAck.
"Acknowledgeable" does not refer to data processing. Even
acknowledgeable packets may have their application data dropped, due
to receive buffer overflow or corruption, for instance. Data Dropped
options report these data losses when necessary, letting congestion
control mechanisms distinguish between network losses and endpoint
losses. This issue is discussed further in Sections 11.4 and 11.7.
DCCP-Sync and DCCP-SyncAck packets' Acknowledgement Numbers differ as
follows: The Acknowledgement Number on a DCCP-Sync packet corresponds
to a received packet, but not necessarily to an acknowledgeable
packet; in particular, it might correspond to an out-of-sync packet
whose options were not processed. The Acknowledgement Number on a
DCCP-SyncAck packet always corresponds to an acknowledgeable DCCP-
Sync packet; it might be less than GSR in the presence of reordering.
7.5. Validity and Synchronization
Any DCCP endpoint might receive packets that are not actually part of
the current connection. For instance, the network might deliver an
old packet, an attacker might attempt to hijack a connection, or the
other endpoint might crash, causing a half-open connection.
DCCP, like TCP, uses sequence number checks to detect these cases.
Packets whose Sequence and/or Acknowledgement Numbers are out of
range are called sequence-invalid and are not processed normally.
Kohler, et al. Standards Track [Page 47]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
Unlike TCP, DCCP requires a synchronization mechanism to recover from
large bursts of loss. One endpoint might send so many packets during
a burst of loss that when one of its packets finally got through, the
other endpoint would label its Sequence Number as invalid. A
handshake of DCCP-Sync and DCCP-SyncAck packets recovers from this
case.
7.5.1. Sequence and Acknowledgement Number Windows
Each DCCP endpoint defines sequence validity windows that are subsets
of the Sequence and Acknowledgement Number spaces. These windows
correspond to packets the endpoint expects to receive in the next few
round-trip times. The Sequence and Acknowledgement Number windows
always contain GSR and GSS, respectively. The window widths are
controlled by Sequence Window features for the two half-connections.
The Sequence Number validity window for packets from DCCP B is [SWL,
SWH]. This window always contains GSR, the Greatest Sequence Number
Received on a sequence-valid packet from DCCP B. It is W packets
wide, where W is the value of the Sequence Window/B feature. One-
fourth of the sequence window, rounded down, is less than or equal to
GSR, and three-fourths is greater than GSR. (This asymmetric
placement assumes that bursts of loss are more common in the network
than significant reorderings.)
invalid | valid Sequence Numbers | invalid
<---------*|*===========*=======================*|*--------->
GSR -|GSR + 1 - GSR GSR +|GSR + 1 +
floor(W/4)|floor(W/4) ceil(3W/4)|ceil(3W/4)
= SWL = SWH
The Acknowledgement Number validity window for packets from DCCP B is
[AWL, AWH]. The high end of the window, AWH, equals GSS, the
Greatest Sequence Number Sent by DCCP A; the window is W' packets
wide, where W' is the value of the Sequence Window/A feature.
invalid | valid Acknowledgement Numbers | invalid
<---------*|*===================================*|*--------->
GSS - W'|GSS + 1 - W' GSS|GSS + 1
= AWL = AWH
SWL and AWL are initially adjusted so that they are not less than the
initial Sequence Numbers received and sent, respectively:
SWL := max(GSR + 1 - floor(W/4), ISR),
AWL := max(GSS + 1 - W', ISS).
Kohler, et al. Standards Track [Page 48]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
These adjustments MUST be applied only at the beginning of the
connection. (Long-lived connections may wrap sequence numbers so
that they appear to be less than ISR or ISS; the adjustments MUST NOT
be applied in that case.)
7.5.2. Sequence Window Feature
The Sequence Window/A feature determines the width of the Sequence
Number validity window used by DCCP B and the width of the
Acknowledgement Number validity window used by DCCP A. DCCP A sends
a "Change L(Sequence Window, W)" option to notify DCCP B that the
Sequence Window/A value is W.
Sequence Window has feature number 3 and is non-negotiable. It takes
48-bit (6-byte) integer values, like DCCP sequence numbers. Change
and Confirm options for Sequence Window are therefore 9 bytes long.
New connections start with Sequence Window 100 for both endpoints.
The minimum valid Sequence Window value is Wmin = 32. The maximum
valid Sequence Window value is Wmax = 2^46 - 1 = 70368744177663.
Change options suggesting Sequence Window values out of this range
are invalid and MUST be handled accordingly.
A proper Sequence Window/A value must reflect the number of packets
DCCP A expects to be in flight. Only DCCP A can anticipate this
number. Values that are too small increase the risk of the endpoints
getting out sync after bursts of loss, and values that are much too
small can prevent productive communication whether or not there is
loss. On the other hand, too-large values increase the risk of
connection hijacking; Section 7.5.5 quantifies this risk. One good
guideline is for each endpoint to set Sequence Window to about five
times the maximum number of packets it expects to send in a round-
trip time. Endpoints SHOULD send Change L(Sequence Window) options,
as necessary, as the connection progresses. Also, an endpoint MUST
NOT persistently send more than its Sequence Window number of packets
per round-trip time; that is, DCCP A MUST NOT persistently send more
than Sequence Window/A packets per RTT.
7.5.3. Sequence-Validity Rules
Sequence-validity depends on the received packet's type. This table
shows the sequence and acknowledgement number checks applied to each
packet; a packet is sequence-valid if it passes both tests, and
sequence-invalid if it does not. Many of the checks refer to the
sequence and acknowledgement number validity windows [SWL, SWH] and
[AWL, AWH] defined in Section 7.5.1.
Kohler, et al. Standards Track [Page 49]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
Acknowledgement Number
Packet Type Sequence Number Check Check
----------- --------------------- ----------------------
DCCP-Request SWL <= seqno <= SWH (*) N/A
DCCP-Response SWL <= seqno <= SWH (*) AWL <= ackno <= AWH
DCCP-Data SWL <= seqno <= SWH N/A
DCCP-Ack SWL <= seqno <= SWH AWL <= ackno <= AWH
DCCP-DataAck SWL <= seqno <= SWH AWL <= ackno <= AWH
DCCP-CloseReq GSR < seqno <= SWH GAR <= ackno <= AWH
DCCP-Close GSR < seqno <= SWH GAR <= ackno <= AWH
DCCP-Reset GSR < seqno <= SWH GAR <= ackno <= AWH
DCCP-Sync SWL <= seqno AWL <= ackno <= AWH
DCCP-SyncAck SWL <= seqno AWL <= ackno <= AWH
(*) Check not applied if connection is in LISTEN or REQUEST state.
In general, packets are sequence-valid if their Sequence and
Acknowledgement Numbers lie within the corresponding valid windows,
[SWL, SWH] and [AWL, AWH]. The exceptions to this rule are as
follows:
o Since DCCP-CloseReq, DCCP-Close, and DCCP-Reset packets end a
connection, they cannot have Sequence Numbers less than or equal
to GSR, or Acknowledgement Numbers less than GAR.
o DCCP-Sync and DCCP-SyncAck Sequence Numbers are not strongly
checked. These packet types exist specifically to get the
endpoints back into sync; checking their Sequence Numbers would
eliminate their usefulness.
The lenient checks on DCCP-Sync and DCCP-SyncAck packets allow
continued operation after unusual events, such as endpoint crashes
and large bursts of loss, but there's no need for leniency in the
absence of unusual events -- that is, during ongoing successful
communication. Therefore, DCCP implementations SHOULD use the
following, more stringent checks for active connections, where a
connection is considered active if it has received valid packets from
the other endpoint within the last three round-trip times.
Acknowledgement Number
Packet Type Sequence Number Check Check
----------- --------------------- ----------------------
DCCP-Sync SWL <= seqno <= SWH AWL <= ackno <= AWH
DCCP-SyncAck SWL <= seqno <= SWH AWL <= ackno <= AWH
Finally, an endpoint MAY apply the following more stringent checks to
DCCP-CloseReq, DCCP-Close, and DCCP-Reset packets, further lowering
the probability of successful blind attacks using those packet types.
Kohler, et al. Standards Track [Page 50]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
Since these checks can cause extra synchronization overhead and delay
connection closing when packets are lost, they should be considered
experimental.
Acknowledgement Number
Packet Type Sequence Number Check Check
----------- --------------------- ----------------------
DCCP-CloseReq seqno == GSR + 1 GAR <= ackno <= AWH
DCCP-Close seqno == GSR + 1 GAR <= ackno <= AWH
DCCP-Reset seqno == GSR + 1 GAR <= ackno <= AWH
Note that sequence-validity is only one of the validity checks
applied to received packets.
7.5.4. Handling Sequence-Invalid Packets
Endpoints respond to received sequence-invalid packets as follows.
o Any sequence-invalid DCCP-Sync or DCCP-SyncAck packet MUST be
ignored.
o A sequence-invalid DCCP-Reset packet MUST elicit a DCCP-Sync
packet in response (subject to a possible rate limit). This
response packet MUST use a new Sequence Number, and thus will
increase GSS; GSR will not change, however, since the received
packet was sequence-invalid. The response packet's
Acknowledgement Number MUST equal GSR.
o Any other sequence-invalid packet MUST elicit a similar DCCP-Sync
packet, except that the response packet's Acknowledgement Number
MUST equal the sequence-invalid packet's Sequence Number.
On receiving a sequence-valid DCCP-Sync packet, the peer endpoint
(say, DCCP B) MUST update its GSR variable and reply with a DCCP-
SyncAck packet. The DCCP-SyncAck packet's Acknowledgement Number
will equal the DCCP-Sync's Sequence Number, which is not necessarily
GSR. Upon receiving this DCCP-SyncAck, which will be sequence-valid
since it acknowledges the DCCP-Sync, DCCP A will update its GSR
variable, and the endpoints will be back in sync. As an exception,
if the peer endpoint is in the REQUEST state, it MUST respond with a
DCCP-Reset instead of a DCCP-SyncAck. This serves to clean up DCCP
A's half-open connection.
To protect against denial-of-service attacks, DCCP implementations
SHOULD impose a rate limit on DCCP-Syncs sent in response to
sequence-invalid packets, such as not more than eight DCCP-Syncs per
second.
Kohler, et al. Standards Track [Page 51]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
DCCP endpoints MUST NOT process sequence-invalid packets except,
perhaps, by generating a DCCP-Sync. For instance, options MUST NOT
be processed. An endpoint MAY temporarily preserve sequence-invalid
packets in case they become valid later, however; this can reduce the
impact of bursts of loss by delivering more packets to the
application. In particular, an endpoint MAY preserve sequence-
invalid packets for up to 2 round-trip times. If, within that time,
the relevant sequence windows change so that the packets become
sequence-valid, the endpoint MAY process them again.
Note that sequence-invalid DCCP-Reset packets cause DCCP-Syncs to be
generated. This is because endpoints in an unsynchronized state
(CLOSED, REQUEST, and LISTEN) might not have enough information to
generate a proper DCCP-Reset on the first try. For example, if a
peer endpoint is in CLOSED state and receives a DCCP-Data packet, it
cannot guess the right Sequence Number to use on the DCCP-Reset it
generates (since the DCCP-Data packet has no Acknowledgement Number).
The DCCP-Sync generated in response to this bad reset serves as a
challenge, and contains enough information for the peer to generate a
proper DCCP-Reset. However, the new DCCP-Reset may carry a different
Reset Code than the original DCCP-Reset; probably the new Reset Code
will be 3, "No Connection". The endpoint SHOULD use information from
the original DCCP-Reset when possible.
7.5.5. Sequence Number Attacks
Sequence and Acknowledgement Numbers form DCCP's main line of defense
against attackers. An attacker that cannot guess sequence numbers
cannot easily manipulate or hijack a DCCP connection, and
requirements like careful initial sequence number choice eliminate
the most serious attacks.
An attacker might still send many packets with randomly chosen
Sequence and Acknowledgement Numbers, however. If one of those
probes ends up sequence-valid, it may shut down the connection or
otherwise cause problems. The easiest such attacks to execute are as
follows:
o Send DCCP-Data packets with random Sequence Numbers. If one of
these packets hits the valid sequence number window, the attack
packet's application data may be inserted into the data stream.
o Send DCCP-Sync packets with random Sequence and Acknowledgement
Numbers. If one of these packets hits the valid acknowledgement
number window, the receiver will shift its sequence number window
accordingly, getting out of sync with the correct endpoint --
perhaps permanently.
Kohler, et al. Standards Track [Page 52]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
The attacker has to guess both Source and Destination Ports for any
of these attacks to succeed. Additionally, the connection would have
to be inactive for the DCCP-Sync attack to succeed, assuming the
victim implemented the more stringent checks for active connections
recommended in Section 7.5.3.
To quantify the probability of success, let N be the number of attack
packets the attacker is willing to send, W be the relevant sequence
window width, and L be the length of sequence numbers (24 or 48).
The attacker's best strategy is to space the attack packets evenly
over sequence space. Then the probability of hitting one sequence
number window is P = WN/2^L.
The success probability for a DCCP-Data attack using short sequence
numbers thus equals P = WN/2^24. For W = 100, then, the attacker
must send more than 83,000 packets to achieve a 50% chance of
success. For reference, the easiest TCP attack -- sending a SYN with
a random sequence number, which will cause a connection reset if it
falls within the window -- with W = 8760 (a common default) and
L = 32 requires more than 245,000 packets to achieve a 50% chance of
success.
A fast connection's W will generally be high, increasing the attack
success probability for fixed N. If this probability gets
uncomfortably high with L = 24, the endpoint SHOULD prevent the use
of short sequence numbers by manipulating the Allow Short Sequence
Numbers feature (see Section 7.6.1). The probability limit depends
on the application, however. Some applications, such as those
already designed to handle corruption, are quite resilient to data
injection attacks.
The DCCP-Sync attack has L = 48, since DCCP-Sync packets use long
sequence numbers exclusively; in addition, the success probability is
halved, since only half the Sequence Number space is valid. Attacks
have a correspondingly smaller probability of success. For a large W
of 2000 packets, then, the attacker must send more than 10^11 packets
to achieve a 50% chance of success.
Attacks involving DCCP-Ack, DCCP-DataAck, DCCP-CloseReq, DCCP-Close,
and DCCP-Reset packets are more difficult, since Sequence and
Acknowledgement Numbers must both be guessed. The probability of
attack success for these packet types equals P = WXN/2^(2L), where W
is the Sequence Number window, X is the Acknowledgement Number
window, and N and L are as before.
Since DCCP-Data attacks with short sequence numbers are relatively
easy for attackers to execute, DCCP has been engineered to prevent
these attacks from escalating to connection resets or other serious
Kohler, et al. Standards Track [Page 53]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
consequences. In particular, any options whose processing might
cause the connection to be reset are ignored when they appear on
DCCP-Data packets.
7.5.6. Sequence Number Handling Examples
In the following example, DCCP A and DCCP B recover from a large
burst of loss that runs DCCP A's sequence numbers out of DCCP B's
appropriate sequence number window.
DCCP A DCCP B
(GSS=1,GSR=10) (GSS=10,GSR=1)
--> DCCP-Data(seq 2) XXX
...
--> DCCP-Data(seq 100) XXX
--> DCCP-Data(seq 101) --> ???
seqno out of range;
send Sync
OK <-- DCCP-Sync(seq 11, ack 101) <--
(GSS=11,GSR=1)
--> DCCP-SyncAck(seq 102, ack 11) --> OK
(GSS=102,GSR=11) (GSS=11,GSR=102)
In the next example, a DCCP connection recovers from a simple blind
attack.
DCCP A DCCP B
(GSS=1,GSR=10) (GSS=10,GSR=1)
*ATTACKER* --> DCCP-Data(seq 10^6) --> ???
seqno out of range;
send Sync
??? <-- DCCP-Sync(seq 11, ack 10^6) <--
ackno out of range; ignore
(GSS=1,GSR=10) (GSS=11,GSR=1)
The final example demonstrates recovery from a half-open connection.
DCCP A DCCP B
(GSS=1,GSR=10) (GSS=10,GSR=1)
(Crash)
CLOSED OPEN
REQUEST --> DCCP-Request(seq 400) --> ???
!! <-- DCCP-Sync(seq 11, ack 400) <-- OPEN
REQUEST --> DCCP-Reset(seq 401, ack 11) --> (Abort)
REQUEST CLOSED
REQUEST --> DCCP-Request(seq 402) --> ...
Kohler, et al. Standards Track [Page 54]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
7.6. Short Sequence Numbers
DCCP sequence numbers are 48 bits long. This large sequence space
protects DCCP connections against some blind attacks, such as the
injection of DCCP-Resets into the connection. However, DCCP-Data,
DCCP-Ack, and DCCP-DataAck packets, which make up the body of any
DCCP connection, may reduce header space by transmitting only the
lower 24 bits of the relevant Sequence and Acknowledgement Numbers.
The receiving endpoint will extend these numbers to 48 bits using the
following pseudocode:
procedure Extend_Sequence_Number(S, REF)
/* S is a 24-bit sequence number from the packet header.
REF is the relevant 48-bit reference sequence number:
GSS if S is an Acknowledgement Number, and GSR if S is a
Sequence Number. */
Set REF_low := low 24 bits of REF
Set REF_hi := high 24 bits of REF
If REF_low (<) S /* circular comparison mod 2^24 */
and S |<| REF_low, /* conventional, non-circular
comparison */
Return (((REF_hi + 1) mod 2^24) << 24) | S
Otherwise, if S (<) REF_low and REF_low |<| S,
Return (((REF_hi - 1) mod 2^24) << 24) | S
Otherwise,
Return (REF_hi << 24) | S
The two different kinds of comparison in the if statements detect
when the low-order bits of the sequence space have wrapped. (The
circular comparison "REF_low (<) S" returns true if and only if
(S - REF_low), calculated using two's-complement arithmetic and then
represented as an unsigned number, is less than or equal to 2^23
(mod 2^24).) When this happens, the high-order bits are incremented
or decremented, as appropriate.
7.6.1. Allow Short Sequence Numbers Feature
Endpoints can require that all packets use long sequence numbers by
leaving the Allow Short Sequence Numbers feature value at its default
of zero. This can reduce the risk that data will be inappropriately
injected into the connection. DCCP A sends a "Change L(Allow Short
Seqnos, 1)" option to indicate its desire to send packets with short
sequence numbers.
Allow Short Sequence Numbers has feature number 2 and is server-
priority. It takes one-byte Boolean values. When Allow Short
Seqnos/B is zero, DCCP B MUST NOT send packets with short sequence
numbers and DCCP A MUST ignore any packets with short sequence
Kohler, et al. Standards Track [Page 55]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
numbers that are received. Values of two or more are reserved. New
connections start with Allow Short Sequence Numbers 0 for both
endpoints.
7.6.2. When to Avoid Short Sequence Numbers
Short sequence numbers reduce the rate DCCP connections can safely
achieve and increase the risks of certain kinds of attacks, including
blind data injection. Very-high-rate DCCP connections, and
connections with large sequence windows (Section 7.5.2), SHOULD NOT
use short sequence numbers on their data packets. The attack risk
issues have been discussed in Section 7.5.5; we discuss the rate
limitation issue here.
The sequence-validity mechanism assumes that the network does not
deliver extremely old data. In particular, it assumes that the
network must have dropped any packet by the time the connection wraps
around and uses its sequence number again. This constraint limits
the maximum connection rate that can be safely achieved. Let MSL
equal the maximum segment lifetime, P equal the average DCCP packet
size in bits, and L equal the length of sequence numbers (24 or 48
bits). Then the maximum safe rate, in bits per second, is
R = P*(2^L)/2MSL.
For the default MSL of 2 minutes, 1500-byte DCCP packets, and short
sequence numbers, the safe rate is therefore approximately 800 Mb/s.
Although 2 minutes is a very large MSL for any networks that could
sustain that rate with such small packets, long sequence numbers
allow much higher rates under the same constraints: up to 14 petabits
a second for 1500-byte packets and the default MSL.
7.7. NDP Count and Detecting Application Loss
DCCP's sequence numbers increment by one on every packet, including
non-data packets (packets that don't carry application data). This
makes DCCP sequence numbers suitable for detecting any network loss,
but not for detecting the loss of application data. The NDP Count
option reports the length of each burst of non-data packets. This
lets the receiving DCCP reliably determine when a burst of loss
included application data.
+--------+--------+-------- ... --------+
|00100101| Length | NDP Count |
+--------+--------+-------- ... --------+
Type=37 Len=3-8 (1-6 bytes)
If a DCCP endpoint's Send NDP Count feature is one (see below), then
that endpoint MUST send an NDP Count option on every packet whose
Kohler, et al. Standards Track [Page 56]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
immediate predecessor was a non-data packet. Non-data packets
consist of DCCP packet types DCCP-Ack, DCCP-Close, DCCP-CloseReq,
DCCP-Reset, DCCP-Sync, and DCCP-SyncAck. The other packet types,
namely DCCP-Request, DCCP-Response, DCCP-Data, and DCCP-DataAck, are
considered data packets, although not all DCCP-Request and DCCP-
Response packets will actually carry application data.
The value stored in NDP Count equals the number of consecutive non-
data packets in the run immediately previous to the current packet.
Packets with no NDP Count option are considered to have NDP Count
zero.
The NDP Count option can carry one to six bytes of data. The
smallest option format that can hold the NDP Count SHOULD be used.
With NDP Count, the receiver can reliably tell only whether a burst
of loss contained at least one data packet. For example, the
receiver cannot always tell whether a burst of loss contained a non-
data packet.
7.7.1. NDP Count Usage Notes
Say that K consecutive sequence numbers are missing in some burst of
loss, and that the Send NDP Count feature is on. Then some
application data was lost within those sequence numbers unless the
packet following the hole contains an NDP Count option whose value is
greater than or equal to K.
For example, say that an endpoint sent the following sequence of
non-data packets (Nx) and data packets (Dx).
N0 N1 D2 N3 D4 D5 N6 D7 D8 D9 D10 N11 N12 D13
Those packets would have NDP Counts as follows.
N0 N1 D2 N3 D4 D5 N6 D7 D8 D9 D10 N11 N12 D13
- 1 2 - 1 - - 1 - - - - 1 2
NDP Count is not useful for applications that include their own
sequence numbers with their packet headers.
7.7.2. Send NDP Count Feature
The Send NDP Count feature lets DCCP endpoints negotiate whether they
should send NDP Count options on their packets. DCCP A sends a
"Change R(Send NDP Count, 1)" option to ask DCCP B to send NDP Count
options.
Kohler, et al. Standards Track [Page 57]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
Send NDP Count has feature number 7 and is server-priority. It takes
one-byte Boolean values. DCCP B MUST send NDP Count options as
described above when Send NDP Count/B is one, although it MAY send
NDP Count options even when Send NDP Count/B is zero. Values of two
or more are reserved. New connections start with Send NDP Count 0
for both endpoints.
8. Event Processing
This section describes how DCCP connections move between states and
which packets are sent when. Note that feature negotiation takes
place in parallel with the connection-wide state transitions
described here.
8.1. Connection Establishment
DCCP connections' initiation phase consists of a three-way handshake:
an initial DCCP-Request packet sent by the client, a DCCP-Response
sent by the server in reply, and finally an acknowledgement from the
client, usually via a DCCP-Ack or DCCP-DataAck packet. The client
moves from the REQUEST state to PARTOPEN, and finally to OPEN; the
server moves from LISTEN to RESPOND, and finally to OPEN.
Client State Server State
CLOSED LISTEN
1. REQUEST --> Request -->
2. <-- Response <-- RESPOND
3. PARTOPEN --> Ack, DataAck -->
4. <-- Data, Ack, DataAck <-- OPEN
5. OPEN <-> Data, Ack, DataAck <-> OPEN
8.1.1. Client Request
When a client decides to initiate a connection, it enters the REQUEST
state, chooses an initial sequence number (Section 7.2), and sends a
DCCP-Request packet using that sequence number to the intended
server.
DCCP-Request packets will commonly carry feature negotiation options
that open negotiations for various connection parameters, such as
preferred congestion control IDs for each half-connection. They may
also carry application data, but the client should be aware that the
server may not accept such data.
A client in the REQUEST state SHOULD use an exponential-backoff timer
to send new DCCP-Request packets if no response is received. The
first retransmission should occur after approximately one second,
backing off to not less than one packet every 64 seconds; or the
Kohler, et al. Standards Track [Page 58]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
endpoint can use whatever retransmission strategy is followed for
retransmitting TCP SYNs. Each new DCCP-Request MUST increment the
Sequence Number by one and MUST contain the same Service Code and
application data as the original DCCP-Request.
A client MAY give up on its DCCP-Requests after some time (3 minutes,
for example). When it does, it SHOULD send a DCCP-Reset packet to
the server with Reset Code 2, "Aborted", to clean up state in case
one or more of the Requests actually arrived. A client in REQUEST
state has never received an initial sequence number from its peer, so
the DCCP-Reset's Acknowledgement Number MUST be set to zero.
The client leaves the REQUEST state for PARTOPEN when it receives a
DCCP-Response from the server.
8.1.2. Service Codes
Each DCCP-Request contains a 32-bit Service Code, which identifies
the application-level service to which the client application is
trying to connect. Service Codes should correspond to application
services and protocols. For example, there might be a Service Code
for SIP control connections and one for RTP audio connections.
Middleboxes, such as firewalls, can use the Service Code to identify
the application running on a nonstandard port (assuming the DCCP
header has not been encrypted).
Endpoints MUST associate a Service Code with every DCCP socket, both
actively and passively opened. The application will generally supply
this Service Code. Each active socket MUST have exactly one Service
Code. Passive sockets MAY, at the implementation's discretion, be
associated with more than one Service Code; this might let multiple
applications, or multiple versions of the same application, listen on
the same port, differentiated by Service Code. If the DCCP-Request's
Service Code doesn't equal any of the server's Service Codes for the
given port, the server MUST reject the request by sending a DCCP-
Reset packet with Reset Code 8, "Bad Service Code". A middlebox MAY
also send such a DCCP-Reset in response to packets whose Service Code
is considered unsuitable.
Service Codes are not intended to be DCCP-specific and are allocated
by IANA. Following the policies outlined in [RFC2434], most Service
Codes are allocated First Come First Served, subject to the following
guidelines.
o Service Codes are allocated one at a time, or in small blocks. A
short English description of the intended service is REQUIRED to
obtain a Service Code assignment, but no specification, standards
Kohler, et al. Standards Track [Page 59]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
track or otherwise, is necessary. IANA maintains an association
of Service Codes to the corresponding phrases.
o Users request specific Service Code values. We suggest that users
request Service Codes that can be represented using the "SC:"
formatting convention described below. Thus, the "Frobodyne Plotz
Protocol" might correspond to Service Code 17178548426 or,
equivalently, "SC:fdpz". The canonical interpretation of a
Service Code field is numeric.
o Service Codes whose bytes each have values in the set {32, 45-57,
65-90} use a Specification Required allocation policy. That is,
these Service Codes are used for international standard or
standards-track specifications, IETF or otherwise. (This set
consists of the ASCII digits, uppercase letters, and characters
space, '-', '.', and '/'.)
o Service Codes whose high-order byte equals 63 (ASCII '?') are
reserved for Private Use.
o Service Code 0 represents the absence of a meaningful Service Code
and MUST NOT be allocated.
o The value 4294967295 is an invalid Service Code. Servers MUST
reject any DCCP-Request with this Service Code value by sending a
DCCP-Reset packet with Reset Code 8, "Bad Service Code".
This design for Service Code allocation is based on the allocation of
4-byte identifiers for Macintosh resources, PNG chunks, and TrueType
and OpenType tables.
In text settings, we recommend that Service Codes be written in one
of three forms, prefixed by the ASCII letters SC and either a colon
":" or equals sign "=". These forms are interpreted as follows.
SC: Indicates a Service Code representable using a subset of the
ASCII characters. The colon is followed by one to four
characters taken from the following set: letters, digits, and
the characters in "-_+.*/?@" (not including quotes).
Numerically, these characters have values in {42-43, 45-57,
63-90, 95, 97-122}. The Service Code is calculated by
padding the string on the right with spaces (value 32) and
intepreting the four-character result as a 32-bit big-endian
number.
SC= Indicates a decimal Service Code. The equals sign is
followed by any number of decimal digits, which specify the
Service Code. Values above 4294967294 are illegal.
Kohler, et al. Standards Track [Page 60]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
SC=x or SC=X
Indicates a hexadecimal Service Code. The "x" or "X" is
followed by any number of hexadecimal digits (upper or lower
case), which specify the Service Code. Values above
4294967294 are illegal.
Thus, the Service Code 1717858426 might be represented in text as
either SC:fdpz, SC=1717858426, or SC=x6664707A.
8.1.3. Server Response
In the second phase of the three-way handshake, the server moves from
the LISTEN state to RESPOND and sends a DCCP-Response message to the
client. In this phase, a server will often specify the features it
would like to use, either from among those the client requested or in
addition to those. Among these options is the congestion control
mechanism the server expects to use.
The server MAY respond to a DCCP-Request packet with a DCCP-Reset
packet to refuse the connection. Relevant Reset Codes for refusing a
connection include 7, "Connection Refused", when the DCCP-Request's
Destination Port did not correspond to a DCCP port open for
listening; 8, "Bad Service Code", when the DCCP-Request's Service
Code did not correspond to the service code registered with the
Destination Port; and 9, "Too Busy", when the server is currently too
busy to respond to requests. The server SHOULD limit the rate at
which it generates these resets; for example, to not more than 1024
per second.
The server SHOULD NOT retransmit DCCP-Response packets; the client
will retransmit the DCCP-Request if necessary. (Note that the
"retransmitted" DCCP-Request will have, at least, a different
sequence number from the "original" DCCP-Request. The server can
thus distinguish true retransmissions from network duplicates.) The
server will detect that the retransmitted DCCP-Request applies to an
existing connection because of its Source and Destination Ports.
Every valid DCCP-Request received while the server is in the RESPOND
state MUST elicit a new DCCP-Response. Each new DCCP-Response MUST
increment the server's Sequence Number by one and MUST include the
same application data, if any, as the original DCCP-Response.
The server MUST NOT accept more than one piece of DCCP-Request
application data per connection. In particular, the DCCP-Response
sent in reply to a retransmitted DCCP-Request with application data
SHOULD contain a Data Dropped option, in which the retransmitted
DCCP-Request data is reported with Drop Code 0, Protocol Constraints.
The original DCCP-Request SHOULD also be reported in the Data Dropped
option, either in a Normal Block (if the server accepted the data or
Kohler, et al. Standards Track [Page 61]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
there was no data) or in a Drop Code 0 Drop Block (if the server
refused the data the first time as well).
The Data Dropped and Init Cookie options are particularly useful for
DCCP-Response packets (Sections 11.7 and 8.1.4).
The server leaves the RESPOND state for OPEN when it receives a valid
DCCP-Ack from the client, completing the three-way handshake. It MAY
also leave the RESPOND state for CLOSED after a timeout of not less
than 4MSL (8 minutes); when doing so, it SHOULD send a DCCP-Reset
with Reset Code 2, "Aborted", to clean up state at the client.
8.1.4. Init Cookie Option
+--------+--------+--------+--------+--------+--------
|00100100| Length | Init Cookie Value ...
+--------+--------+--------+--------+--------+--------
Type=36
The Init Cookie option lets a DCCP server avoid having to hold any
state until the three-way connection setup handshake has completed,
in a similar fashion as for TCP SYN cookies [SYNCOOKIES]. The server
wraps up the Service Code, server port, and any options it cares
about from both the DCCP-Request and DCCP-Response in an opaque
cookie. Typically the cookie will be encrypted using a secret known
only to the server and will include a cryptographic checksum or magic
value so that correct decryption can be verified. When the server
receives the cookie back in the response, it can decrypt the cookie
and instantiate all the state it avoided keeping. In the meantime,
it need not move from the LISTEN state.
The Init Cookie option MUST NOT be sent on DCCP-Request or DCCP-Data
packets. Any Init Cookie options received on DCCP-Request or DCCP-
Data packets, or after the connection has been established (when the
connection's state is >= OPEN), MUST be ignored. The server MAY
include Init Cookie options in its DCCP-Response. If so, then the
client MUST echo the same Init Cookie options, in the same order, in
each succeeding DCCP packet until one of those packets is
acknowledged (showing that the three-way handshake has completed) or
the connection is reset. As a result, the client MUST NOT use DCCP-
Data packets until the three-way handshake completes or the
connection is reset. The Init Cookie options on a client packet MUST
equal those received on the DCCP-Request indicated by the client
packet's Acknowledgement Number. The server SHOULD design its Init
Cookie format so that Init Cookies can be checked for tampering; it
SHOULD respond to a tampered Init Cookie option by resetting the
connection with Reset Code 10, "Bad Init Cookie".
Kohler, et al. Standards Track [Page 62]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
Init Cookie's precise implementation need not be specified here;
since Init Cookies are opaque to the client, there are no
interoperability concerns. An example cookie format might encrypt
(using a secret key) the connection's initial sequence and
acknowledgement numbers, ports, Service Code, any options included on
the DCCP-Request packet and the corresponding DCCP-Response, a random
salt, and a magic number. On receiving a reflected Init Cookie, the
server would decrypt the cookie, validate it by checking its magic
number, sequence numbers, and ports, and, if valid, create a
corresponding socket using the options.
Each individual Init Cookie option can hold at most 253 bytes of
data, but a server can send multiple Init Cookie options to gain more
space.
8.1.5. Handshake Completion
When the client receives a DCCP-Response from the server, it moves
from the REQUEST state to PARTOPEN and completes the three-way
handshake by sending a DCCP-Ack packet to the server. The client
remains in PARTOPEN until it can be sure that the server has received
some packet the client sent from PARTOPEN (either the initial DCCP-
Ack or a later packet). Clients in the PARTOPEN state that want to
send data MUST do so using DCCP-DataAck packets, not DCCP-Data
packets. This is because DCCP-Data packets lack Acknowledgement
Numbers, so the server can't tell from a DCCP-Data packet whether the
client saw its DCCP-Response. Furthermore, if the DCCP-Response
included an Init Cookie, that Init Cookie MUST be included on every
packet sent in PARTOPEN.
The single DCCP-Ack sent when entering the PARTOPEN state might, of
course, be dropped by the network. The client SHOULD ensure that
some packet gets through eventually. The preferred mechanism would
be a roughly 200-millisecond timer, set every time a packet is
transmitted in PARTOPEN. If this timer goes off and the client is
still in PARTOPEN, the client generates another DCCP-Ack and backs
off the timer. If the client remains in PARTOPEN for more than 4MSL
(8 minutes), it SHOULD reset the connection with Reset Code 2,
"Aborted".
The client leaves the PARTOPEN state for OPEN when it receives a
valid packet other than DCCP-Response, DCCP-Reset, or DCCP-Sync from
the server.
8.2. Data Transfer
In the central data transfer phase of the connection, both server and
client are in the OPEN state.
Kohler, et al. Standards Track [Page 63]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
DCCP A sends DCCP-Data and DCCP-DataAck packets to DCCP B due to
application events on host A. These packets are congestion-
controlled by the CCID for the A-to-B half-connection. In contrast,
DCCP-Ack packets sent by DCCP A are controlled by the CCID for the
B-to-A half-connection. Generally, DCCP A will piggyback
acknowledgement information on DCCP-Data packets when acceptable,
creating DCCP-DataAck packets. DCCP-Ack packets are used when there
is no data to send from DCCP A to DCCP B, or when the congestion
state of the A-to-B CCID will not allow data to be sent.
DCCP-Sync and DCCP-SyncAck packets may also occur in the data
transfer phase. Some cases causing DCCP-Sync generation are
discussed in Section 7.5. One important distinction between DCCP-
Sync packets and other packet types is that DCCP-Sync elicits an
immediate acknowledgement. On receiving a valid DCCP-Sync packet, a
DCCP endpoint MUST immediately generate and send a DCCP-SyncAck
response (subject to any implementation rate limits); the
Acknowledgement Number on that DCCP-SyncAck MUST equal the Sequence
Number of the DCCP-Sync.
A particular DCCP implementation might decide to initiate feature
negotiation only once the OPEN state was reached, in which case it
might not allow data transfer until some time later. Data received
during that time SHOULD be rejected and reported using a Data Dropped
Drop Block with Drop Code 0, Protocol Constraints (see Section 11.7).
8.3. Termination
DCCP connection termination uses a handshake consisting of an
optional DCCP-CloseReq packet, a DCCP-Close packet, and a DCCP-Reset
packet. The server moves from the OPEN state, possibly through the
CLOSEREQ state, to CLOSED; the client moves from OPEN through CLOSING
to TIMEWAIT, and after 2MSL wait time (4 minutes) to CLOSED.
The sequence DCCP-CloseReq, DCCP-Close, DCCP-Reset is used when the
server decides to close the connection but doesn't want to hold
TIMEWAIT state:
Client State Server State
OPEN OPEN
1. <-- CloseReq <-- CLOSEREQ
2. CLOSING --> Close -->
3. <-- Reset <-- CLOSED (LISTEN)
4. TIMEWAIT
5. CLOSED
Kohler, et al. Standards Track [Page 64]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
A shorter sequence occurs when the client decides to close the
connection.
Client State Server State
OPEN OPEN
1. CLOSING --> Close -->
2. <-- Reset <-- CLOSED (LISTEN)
3. TIMEWAIT
4. CLOSED
Finally, the server can decide to hold TIMEWAIT state:
Client State Server State
OPEN OPEN
1. <-- Close <-- CLOSING
2. CLOSED --> Reset -->
3. TIMEWAIT
4. CLOSED (LISTEN)
In all cases, the receiver of the DCCP-Reset packet holds TIMEWAIT
state for the connection. As in TCP, TIMEWAIT state, where an
endpoint quietly preserves a socket for 2MSL (4 minutes) after its
connection has closed, ensures that no connection duplicating the
current connection's source and destination addresses and ports can
start up while old packets might remain in the network.
The termination handshake proceeds as follows. The receiver of a
valid DCCP-CloseReq packet MUST respond with a DCCP-Close packet.
The receiver of a valid DCCP-Close packet MUST respond with a DCCP-
Reset packet with Reset Code 1, "Closed". The receiver of a valid
DCCP-Reset packet -- which is also the sender of the DCCP-Close
packet (and possibly the receiver of the DCCP-CloseReq packet) --
will hold TIMEWAIT state for the connection.
A DCCP-Reset packet completes every DCCP connection, whether the
termination is clean (due to application close; Reset Code 1,
"Closed") or unclean. Unlike TCP, which has two distinct termination
mechanisms (FIN and RST), DCCP ends all connections in a uniform
manner. This is justified because some aspects of connection
termination are the same independent of whether termination was
clean. For instance, the endpoint that receives a valid DCCP-Reset
SHOULD hold TIMEWAIT state for the connection. Processors that must
distinguish between clean and unclean termination can examine the
Reset Code. DCCP implementations generally transition to the CLOSED
state after sending a DCCP-Reset packet.
Endpoints in the CLOSEREQ and CLOSING states MUST retransmit DCCP-
CloseReq and DCCP-Close packets, respectively, until leaving those
Kohler, et al. Standards Track [Page 65]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
states. The retransmission timer should initially be set to go off
in two round-trip times and should back off to not less than once
every 64 seconds if no relevant response is received.
Only the server can send a DCCP-CloseReq packet or enter the CLOSEREQ
state. A server receiving a sequence-valid DCCP-CloseReq packet MUST
respond with a DCCP-Sync packet and otherwise ignore the DCCP-
CloseReq.
DCCP-Data, DCCP-DataAck, and DCCP-Ack packets received in CLOSEREQ or
CLOSING states MAY be either processed or ignored.
8.3.1. Abnormal Termination
DCCP endpoints generate DCCP-Reset packets to terminate connections
abnormally; a DCCP-Reset packet may be generated from any state.
Resets sent in the CLOSED, LISTEN, and TIMEWAIT states use Reset Code
3, "No Connection", unless otherwise specified. Resets sent in the
REQUEST or RESPOND states use Reset Code 4, "Packet Error", unless
otherwise specified.
DCCP endpoints in CLOSED, LISTEN, or TIMEWAIT state may need to
generate a DCCP-Reset packet in response to a packet received from a
peer. Since these states have no associated sequence number
variables, the Sequence and Acknowledgement Numbers on the DCCP-Reset
packet R are taken from the received packet P, as follows.
1. If P.ackno exists, then set R.seqno := P.ackno + 1. Otherwise,
set R.seqno := 0.
2. Set R.ackno := P.seqno.
3. If the packet used short sequence numbers (P.X == 0), then set the
upper 24 bits of R.seqno and R.ackno to 0.
8.4. DCCP State Diagram
The most common state transitions discussed above can be summarized
in the following state diagram. The diagram is illustrative; the
text in Section 8.5 and elsewhere should be considered definitive.
For example, there are arcs (not shown) from every state except
CLOSED to TIMEWAIT, contingent on the receipt of a valid DCCP-Reset.
Kohler, et al. Standards Track [Page 66]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
+---------------------------+ +---------------------------+
| v v |
| +----------+ |
| +-------------+ CLOSED +------------+ |
| | passive +----------+ active | |
| | open open | |
| | snd Request | |
| v v |
| +----------+ +----------+ |
| | LISTEN | | REQUEST | |
| +----+-----+ +----+-----+ |
| | rcv Request rcv Response | |
| | snd Response snd Ack | |
| v v |
| +----------+ +----------+ |
| | RESPOND | | PARTOPEN | |
| +----+-----+ +----+-----+ |
| | rcv Ack/DataAck rcv packet | |
| | | |
| | +----------+ | |
| +------------>| OPEN |<-----------+ |
| +--+-+--+--+ |
| server active close | | | active close |
| snd CloseReq | | | or rcv CloseReq |
| | | | snd Close |
| | | | |
| +----------+ | | | +----------+ |
| | CLOSEREQ |<---------+ | +--------->| CLOSING | |
| +----+-----+ | +----+-----+ |
| | rcv Close | rcv Reset | |
| | snd Reset | | |
|<---------+ | v |
| | +----+-----+ |
| rcv Close | | TIMEWAIT | |
| snd Reset | +----+-----+ |
+-----------------------------+ | |
+-----------+
2MSL timer expires
8.5. Pseudocode
This section presents an algorithm describing the processing steps a
DCCP endpoint must go through when it receives a packet. A DCCP
implementation need not implement the algorithm as it is described
here, but any implementation MUST generate observable effects exactly
as indicated by this pseudocode, except where allowed otherwise by
another part of this document.
Kohler, et al. Standards Track [Page 67]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
The received packet is written as P, the socket as S. Socket
variables are:
S.SWL - sequence number window low
S.SWH - sequence number window high
S.AWL - acknowledgement number window low
S.AWH - acknowledgement number window high
S.ISS - initial sequence number sent
S.ISR - initial sequence number received
S.OSR - first OPEN sequence number received
S.GSS - greatest sequence number sent
S.GSR - greatest valid sequence number received
S.GAR - greatest valid acknowledgement number received on a
non-Sync; initialized to S.ISS
"Send packet" actions always use, and increment, S.GSS.
Step 1: Check header basics
/* This step checks for malformed packets. Packets that fail
these checks are ignored -- they do not receive Resets in
response */
If the packet is shorter than 12 bytes, drop packet and return
If P.type is not understood, drop packet and return
If P.Data Offset is smaller than the given packet type's
fixed header length or larger than the packet's length,
drop packet and return
If P.type is not Data, Ack, or DataAck and P.X == 0 (the packet
has short sequence numbers), drop packet and return
If the header checksum is incorrect, drop packet and return
If P.CsCov is too large for the packet size, drop packet and
return
Step 2: Check ports and process TIMEWAIT state
/* Flow ID is <src addr, src port, dst addr, dst port> 4-tuple */
Look up flow ID in table and get corresponding socket
If no socket, or S.state == TIMEWAIT,
/* The following Reset's Sequence and Acknowledgement Numbers
are taken from the input packet; see Section 8.3.1. */
Generate Reset(No Connection) unless P.type == Reset
Drop packet and return
Kohler, et al. Standards Track [Page 68]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
Step 3: Process LISTEN state
If S.state == LISTEN,
If P.type == Request or P contains a valid Init Cookie option,
/* Must scan the packet's options to check for Init
Cookies. Only Init Cookies are processed here,
however; other options are processed in Step 8. This
scan need only be performed if the endpoint uses Init
Cookies */
/* Generate a new socket and switch to that socket */
Set S := new socket for this port pair
S.state = RESPOND
Choose S.ISS (initial seqno) or set from Init Cookies
Initialize S.GAR := S.ISS
Set S.ISR, S.GSR, S.SWL, S.SWH from packet or Init Cookies
Continue with S.state == RESPOND
/* A Response packet will be generated in Step 11 */
Otherwise,
Generate Reset(No Connection) unless P.type == Reset
Drop packet and return
Step 4: Prepare sequence numbers in REQUEST
If S.state == REQUEST,
If (P.type == Response or P.type == Reset)
and S.AWL <= P.ackno <= S.AWH,
/* Set sequence number variables corresponding to the
other endpoint, so P will pass the tests in Step 6 */
Set S.GSR, S.ISR, S.SWL, S.SWH
/* Response processing continues in Step 10; Reset
processing continues in Step 9 */
Otherwise,
/* Only Response and Reset are valid in REQUEST state */
Generate Reset(Packet Error)
Drop packet and return
Step 5: Prepare sequence numbers for Sync
If P.type == Sync or P.type == SyncAck,
If S.AWL <= P.ackno <= S.AWH and P.seqno >= S.SWL,
/* P is valid, so update sequence number variables
accordingly. After this update, P will pass the tests
in Step 6. A SyncAck is generated if necessary in
Step 15 */
Update S.GSR, S.SWL, S.SWH
Otherwise,
Drop packet and return
Kohler, et al. Standards Track [Page 69]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
Step 6: Check sequence numbers
If P.X == 0 and the relevant Allow Short Seqnos feature is 0,
/* Packet has short seqnos, but short seqnos not allowed */
Drop packet and return
Otherwise, if P.X == 0,
Extend P.seqno and P.ackno to 48 bits using the procedure
in Section 7.6
Let LSWL = S.SWL and LAWL = S.AWL
If P.type == CloseReq or P.type == Close or P.type == Reset,
LSWL := S.GSR + 1, LAWL := S.GAR
If LSWL <= P.seqno <= S.SWH
and (P.ackno does not exist or LAWL <= P.ackno <= S.AWH),
Update S.GSR, S.SWL, S.SWH
If P.type != Sync,
Update S.GAR
Otherwise,
If P.type == Reset,
Send Sync packet acknowledging S.GSR
Otherwise,
Send Sync packet acknowledging P.seqno
Drop packet and return
Step 7: Check for unexpected packet types
If (S.is_server and P.type == CloseReq)
or (S.is_server and P.type == Response)
or (S.is_client and P.type == Request)
or (S.state >= OPEN and P.type == Request
and P.seqno >= S.OSR)
or (S.state >= OPEN and P.type == Response
and P.seqno >= S.OSR)
or (S.state == RESPOND and P.type == Data),
Send Sync packet acknowledging P.seqno
Drop packet and return
Step 8: Process options and mark acknowledgeable
/* Option processing is not specifically described here.
Certain options, such as Mandatory, may cause the connection
to be reset, in which case Steps 9 and on are not executed */
Mark packet as acknowledgeable (in Ack Vector terms, Received
or Received ECN Marked)
Step 9: Process Reset
If P.type == Reset,
Tear down connection
S.state := TIMEWAIT
Set TIMEWAIT timer
Drop packet and return
Kohler, et al. Standards Track [Page 70]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
Step 10: Process REQUEST state (second part)
If S.state == REQUEST,
/* If we get here, P is a valid Response from the server (see
Step 4), and we should move to PARTOPEN state. PARTOPEN
means send an Ack, don't send Data packets, retransmit
Acks periodically, and always include any Init Cookie from
the Response */
S.state := PARTOPEN
Set PARTOPEN timer
Continue with S.state == PARTOPEN
/* Step 12 will send the Ack completing the three-way
handshake */
Step 11: Process RESPOND state
If S.state == RESPOND,
If P.type == Request,
Send Response, possibly containing Init Cookie
If Init Cookie was sent,
Destroy S and return
/* Step 3 will create another socket when the client
completes the three-way handshake */
Otherwise,
S.OSR := P.seqno
S.state := OPEN
Step 12: Process PARTOPEN state
If S.state == PARTOPEN,
If P.type == Response,
Send Ack
Otherwise, if P.type != Sync,
S.OSR := P.seqno
S.state := OPEN
Step 13: Process CloseReq
If P.type == CloseReq and S.state < CLOSEREQ,
Generate Close
S.state := CLOSING
Set CLOSING timer
Step 14: Process Close
If P.type == Close,
Generate Reset(Closed)
Tear down connection
Drop packet and return
Kohler, et al. Standards Track [Page 71]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
Step 15: Process Sync
If P.type == Sync,
Generate SyncAck
Step 16: Process data
/* At this point any application data on P can be passed to the
application, except that the application MUST NOT receive
data from more than one Request or Response */
9. Checksums
DCCP uses a header checksum to protect its header against corruption.
Generally, this checksum also covers any application data. DCCP
applications can, however, request that the header checksum cover
only part of the application data, or perhaps no application data at
all. Link layers may then reduce their protection on unprotected
parts of DCCP packets. For some noisy links, and for applications
that can tolerate corruption, this can greatly improve delivery rates
and perceived performance.
Checksum coverage may eventually impact congestion control mechanisms
as well. A packet with corrupt application data and complete
checksum coverage is treated as lost. This incurs a heavy-duty loss
response from the sender's congestion control mechanism, which can
unfairly penalize connections on links with high background
corruption. The combination of reduced checksum coverage and Data
Checksum options may let endpoints report packets as corrupt rather
than dropped, using Data Dropped options and Drop Code 3 (see Section
11.7). This may eventually benefit applications. However, further
research is required to determine an appropriate response to
corruption, which can sometimes correlate with congestion. Corrupt
packets currently incur a loss response.
The Data Checksum option, which contains a strong CRC, lets endpoints
detect application data corruption. An API can then be used to avoid
delivering corrupt data to the application, even if links deliver
corrupt data to the endpoint due to reduced checksum coverage.
However, the use of reduced checksum coverage for applications that
demand correct data is currently considered experimental. This is
because the combined loss-plus-corruption rate for packets with
reduced checksum coverage may be significantly higher than that for
packets with full checksum coverage, although the loss rate will
generally be lower. Actual behavior will depend on link design;
further research and experience is required.
Reduced checksum coverage introduces some security considerations;
see Section 18.1. See Appendix B for further motivation and
Kohler, et al. Standards Track [Page 72]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
discussion. DCCP's implementation of reduced checksum coverage was
inspired by UDP-Lite [RFC3828].
9.1. Header Checksum Field
DCCP uses the TCP/IP checksum algorithm. The Checksum field in the
DCCP generic header (see Section 5.1) equals the 16-bit one's
complement of the one's complement sum of all 16-bit words in the
DCCP header, DCCP options, a pseudoheader taken from the network-
layer header, and, depending on the value of the Checksum Coverage
field, some or all of the application data. When calculating the
checksum, the Checksum field itself is treated as 0. If a packet
contains an odd number of header and payload bytes to be checksummed,
8 zero bits are added on the right to form a 16-bit word for checksum
purposes. The pad byte is not transmitted as part of the packet.
The pseudoheader is calculated as for TCP. For IPv4, it is 96 bits
long and consists of the IPv4 source and destination addresses, the
IP protocol number for DCCP (padded on the left with 8 zero bits),
and the DCCP length as a 16-bit quantity (the length of the DCCP
header with options, plus the length of any data); see [RFC793],
Section 3.1. For IPv6, it is 320 bits long, and consists of the IPv6
source and destination addresses, the DCCP length as a 32-bit
quantity, and the IP protocol number for DCCP (padded on the left
with 24 zero bits); see [RFC2460], Section 8.1.
Packets with invalid header checksums MUST be ignored. In
particular, their options MUST NOT be processed.
9.2. Header Checksum Coverage Field
The Checksum Coverage field in the DCCP generic header (see Section
5.1) specifies what parts of the packet are covered by the Checksum
field, as follows:
CsCov = 0 The Checksum field covers the DCCP header, DCCP
options, network-layer pseudoheader, and all
application data in the packet, possibly padded on the
right with zeros to an even number of bytes.
CsCov = 1-15 The Checksum field covers the DCCP header, DCCP
options, network-layer pseudoheader, and the initial
(CsCov-1)*4 bytes of the packet's application data.
Thus, if CsCov is 1, none of the application data is protected by the
header checksum. The value (CsCov-1)*4 MUST be less than or equal to
the length of the application data. Packets with invalid CsCov
values MUST be ignored; in particular, their options MUST NOT be
Kohler, et al. Standards Track [Page 73]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
processed. The meanings of values other than 0 and 1 should be
considered experimental.
Values other than 0 specify that corruption is acceptable in some or
all of the DCCP packet's application data. In fact, DCCP cannot even
detect corruption in areas not covered by the header checksum, unless
the Data Checksum option is used. Applications should not make any
assumptions about the correctness of received data not covered by the
checksum and should, if necessary, introduce their own validity
checks.
A DCCP application interface should let sending applications suggest
a value for CsCov for sent packets, defaulting to 0 (full coverage).
The Minimum Checksum Coverage feature, described below, lets an
endpoint refuse delivery of application data on packets with partial
checksum coverage; by default, only fully covered application data is
accepted. Lower layers that support partial error detection MAY use
the Checksum Coverage field as a hint of where errors do not need to
be detected. Lower layers MUST use a strong error detection
mechanism to detect at least errors that occur in the sensitive part
of the packet, and to discard damaged packets. The sensitive part
consists of the bytes between the first byte of the IP header and the
last byte identified by Checksum Coverage.
For more details on application and lower-layer interface issues
relating to partial checksumming, see [RFC3828].
9.2.1. Minimum Checksum Coverage Feature
The Minimum Checksum Coverage feature lets a DCCP endpoint determine
whether its peer is willing to accept packets with reduced Checksum
Coverage. For example, DCCP A sends a "Change R(Minimum Checksum
Coverage, 1)" option to DCCP B to check whether B is willing to
accept packets with Checksum Coverage set to 1.
Minimum Checksum Coverage has feature number 8 and is server-
priority. It takes one-byte integer values between 0 and 15; values
of 16 or more are reserved. Minimum Checksum Coverage/B reflects
values of Checksum Coverage that DCCP B finds unacceptable. Say that
the value of Minimum Checksum Coverage/B is MinCsCov. Then:
o If MinCsCov = 0, then DCCP B only finds packets with CsCov = 0
acceptable.
o If MinCsCov > 0, then DCCP B additionally finds packets with
CsCov >= MinCsCov acceptable.
Kohler, et al. Standards Track [Page 74]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
DCCP B MAY refuse to process application data from packets with
unacceptable Checksum Coverage. Such packets SHOULD be reported
using Data Dropped options (Section 11.7) with Drop Code 0, Protocol
Constraints. New connections start with Minimum Checksum Coverage 0
for both endpoints.
9.3. Data Checksum Option
The Data Checksum option holds a 32-bit CRC-32c cyclic redundancy-
check code of a DCCP packet's application data.
+--------+--------+--------+--------+--------+--------+
|00101100|00000110| CRC-32c |
+--------+--------+--------+--------+--------+--------+
Type=44 Length=6
The sending DCCP computes the CRC of the bytes comprising the
application data area and stores it in the option data. The CRC-32c
algorithm used for Data Checksum is the same as that used for SCTP
[RFC3309]; note that the CRC-32c of zero bytes of data equals zero.
The DCCP header checksum will cover the Data Checksum option, so the
data checksum must be computed before the header checksum.
A DCCP endpoint receiving a packet with a Data Checksum option either
MUST or MAY check the Data Checksum; the choice depends on the value
of the Check Data Checksum feature described below. If it checks the
checksum, it computes the received application data's CRC-32c using
the same algorithm as the sender and compares the result with the
Data Checksum value. If the CRCs differ, the endpoint reacts in one
of two ways:
o The receiving application may have requested delivery of known-
corrupt data via some optional API. In this case, the packet's
data MUST be delivered to the application, with a note that it is
known to be corrupt. Furthermore, the receiving endpoint MUST
report the packet as delivered corrupt using a Data Dropped option
(Drop Code 7, Delivered Corrupt).
o Otherwise, the receiving endpoint MUST drop the application data
and report that data as dropped due to corruption using a Data
Dropped option (Drop Code 3, Corrupt).
In either case, the packet is considered acknowledgeable (since its
header was processed) and will therefore be acknowledged using the
equivalent of Ack Vector's Received or Received ECN Marked states.
Although Data Checksum is intended for packets containing application
data, it may be included on other packets, such as DCCP-Ack, DCCP-
Kohler, et al. Standards Track [Page 75]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
Sync, and DCCP-SyncAck. The receiver SHOULD calculate the
application data area's CRC-32c on such packets, just as it does for
DCCP-Data and similar packets. If the CRCs differ, the packets
similarly MUST be reported using Data Dropped options (Drop Code 3),
although their application data areas would not be delivered to the
application in any case.
9.3.1. Check Data Checksum Feature
The Check Data Checksum feature lets a DCCP endpoint determine
whether its peer will definitely check Data Checksum options. DCCP A
sends a Mandatory "Change R(Check Data Checksum, 1)" option to DCCP B
to require it to check Data Checksum options (the connection will be
reset if it cannot).
Check Data Checksum has feature number 9 and is server-priority. It
takes one-byte Boolean values. DCCP B MUST check any received Data
Checksum options when Check Data Checksum/B is one, although it MAY
check them even when Check Data Checksum/B is zero. Values of two or
more are reserved. New connections start with Check Data Checksum 0
for both endpoints.
9.3.2. Checksum Usage Notes
Internet links must normally apply strong integrity checks to the
packets they transmit [RFC3828, RFC3819]. This is the default case
when the DCCP header's Checksum Coverage value equals zero (full
coverage). However, the DCCP Checksum Coverage value might not be
zero. By setting partial Checksum Coverage, the application
indicates that it can tolerate corruption in the unprotected part of
the application data. Recognizing this, link layers may reduce error
detection and/or correction strength when transmitting this
unprotected part. This, in turn, can significantly increase the
likelihood of the endpoint's receiving corrupt data; Data Checksum
lets the receiver detect that corruption with very high probability.
10. Congestion Control
Each congestion control mechanism supported by DCCP is assigned a
congestion control identifier, or CCID: a number from 0 to 255.
During connection setup, and optionally thereafter, the endpoints
negotiate their congestion control mechanisms by negotiating the
values for their Congestion Control ID features. Congestion Control
ID has feature number 1. The CCID/A value equals the CCID in use for
the A-to-B half-connection. DCCP B sends a "Change R(CCID, K)"
option to ask DCCP A to use CCID K for its data packets.
Kohler, et al. Standards Track [Page 76]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
CCID is a server-priority feature, so CCID negotiation options can
list multiple acceptable CCIDs, sorted in descending order of
priority. For example, the option "Change R(CCID, 2 3 4)" asks the
receiver to use CCID 2 for its packets, although CCIDs 3 and 4 are
also acceptable. (This corresponds to the bytes "35, 6, 1, 2, 3, 4":
Change R option (35), option length (6), feature ID (1), CCIDs (2, 3,
4).) Similarly, "Confirm L(CCID, 2, 2 3 4)" tells the receiver that
the sender is using CCID 2 for its packets, but that CCIDs 3 and 4
might also be acceptable.
Currently allocated CCIDs are as follows:
CCID Meaning Reference
---- ------- ---------
0-1 Reserved
2 TCP-like Congestion Control [RFC4341]
3 TCP-Friendly Rate Control [RFC4342]
4-255 Reserved
Table 5: DCCP Congestion Control Identifiers
New connections start with CCID 2 for both endpoints. If this is
unacceptable for a DCCP endpoint, that endpoint MUST send Mandatory
Change(CCID) options on its first packets.
All CCIDs standardized for use with DCCP will correspond to
congestion control mechanisms previously standardized by the IETF.
We expect that for quite some time, all such mechanisms will be TCP
friendly, but TCP-friendliness is not an explicit DCCP requirement.
A DCCP implementation intended for general use, such as an
implementation in a general-purpose operating system kernel, SHOULD
implement at least CCID 2. The intent is to make CCID 2 broadly
available for interoperability, although particular applications
might disallow its use.
10.1. TCP-like Congestion Control
CCID 2, TCP-like Congestion Control, denotes Additive Increase,
Multiplicative Decrease (AIMD) congestion control with behavior
modelled directly on TCP, including congestion window, slow start,
timeouts, and so forth [RFC2581]. CCID 2 achieves maximum bandwidth
over the long term, consistent with the use of end-to-end congestion
control, but halves its congestion window in response to each
congestion event. This leads to the abrupt rate changes typical of
TCP. Applications should use CCID 2 if they prefer maximum bandwidth
utilization to steadiness of rate. This is often the case for
applications that are not playing their data directly to the user.
Kohler, et al. Standards Track [Page 77]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
For example, a hypothetical application that transferred files over
DCCP, using application-level retransmissions for lost packets, would
prefer CCID 2 to CCID 3. On-line games may also prefer CCID 2.
CCID 2 is further described in [RFC4341].
10.2. TFRC Congestion Control
CCID 3 denotes TCP-Friendly Rate Control (TFRC), an equation-based
rate-controlled congestion control mechanism. TFRC is designed to be
reasonably fair when competing for bandwidth with TCP-like flows,
where a flow is "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 CCID 3 more
suitable than CCID 2 for applications such as streaming media where a
relatively smooth sending rate is important.
CCID 3 is further described in [RFC4342]. The TFRC congestion
control algorithms were initially described in [RFC3448].
10.3. CCID-Specific Options, Features, and Reset Codes
Half of the option types, feature numbers, and Reset Codes are
reserved for CCID-specific use. CCIDs may often need new options,
for communicating acknowledgement or rate information, for example;
reserved option spaces let CCIDs create options at will without
polluting the global option space. Option 128 might have different
meanings on a half-connection using CCID 4 and a half-connection
using CCID 8. CCID-specific options and features will never conflict
with global options and features introduced by later versions of this
specification.
Any packet may contain information meant for either half-connection,
so CCID-specific option types, feature numbers, and Reset Codes
explicitly signal the half-connection to which they apply.
o Option numbers 128 through 191 are for options sent from the
HC-Sender to the HC-Receiver; option numbers 192 through 255 are
for options sent from the HC-Receiver to the HC-Sender.
o Reset Codes 128 through 191 indicate that the HC-Sender reset the
connection (most likely because of some problem with
acknowledgements sent by the HC-Receiver). Reset Codes 192
through 255 indicate that the HC-Receiver reset the connection
(most likely because of some problem with data packets sent by the
HC-Sender).
Kohler, et al. Standards Track [Page 78]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
o Finally, feature numbers 128 through 191 are used for features
located at the HC-Sender; feature numbers 192 through 255 are for
features located at the HC-Receiver. Since Change L and Confirm L
options for a feature are sent by the feature location, we know
that any Change L(128) option was sent by the HC-Sender, while any
Change L(192) option was sent by the HC-Receiver. Similarly,
Change R(128) options are sent by the HC-Receiver, while Change
R(192) options are sent by the HC-Sender.
For example, consider a DCCP connection where the A-to-B half-
connection uses CCID 4 and the B-to-A half-connection uses CCID 5.
Here is how a sampling of CCID-specific options are assigned to
half-connections.
Relevant Relevant
Packet Option Half-conn. CCID
------ ------ ---------- ----
A > B 128 A-to-B 4
A > B 192 B-to-A 5
A > B Change L(128, ...) A-to-B 4
A > B Change R(192, ...) A-to-B 4
A > B Confirm L(128, ...) A-to-B 4
A > B Confirm R(192, ...) A-to-B 4
A > B Change R(128, ...) B-to-A 5
A > B Change L(192, ...) B-to-A 5
A > B Confirm R(128, ...) B-to-A 5
A > B Confirm L(192, ...) B-to-A 5
B > A 128 B-to-A 5
B > A 192 A-to-B 4
B > A Change L(128, ...) B-to-A 5
B > A Change R(192, ...) B-to-A 5
B > A Confirm L(128, ...) B-to-A 5
B > A Confirm R(192, ...) B-to-A 5
B > A Change R(128, ...) A-to-B 4
B > A Change L(192, ...) A-to-B 4
B > A Confirm R(128, ...) A-to-B 4
B > A Confirm L(192, ...) A-to-B 4
Using CCID-specific options and feature options during a negotiation
for the corresponding CCID feature is NOT RECOMMENDED, since it is
difficult to predict which CCID will be in force when the option is
processed. For example, if a DCCP-Request contains the option
sequence "Change L(CCID, 3), 128", the CCID-specific option "128" may
be processed either by CCID 3 (if the server supports CCID 3) or by
the default CCID 2 (if it does not). However, it is safe to include
CCID-specific options following certain Mandatory Change(CCID)
Kohler, et al. Standards Track [Page 79]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
options. For example, if a DCCP-Request contains the option sequence
"Mandatory, Change L(CCID, 3), 128", then either the "128" option
will be processed by CCID 3 or the connection will be reset.
Servers that do not implement the default CCID 2 might nevertheless
receive CCID 2-specific options on a DCCP-Request packet. (Such a
server MUST send Mandatory Change(CCID) options on its DCCP-Response,
so CCID-specific options on any other packet won't refer to CCID 2.)
The server MUST treat such options as non-understood. Thus, it will
reset the connection on encountering a Mandatory CCID-specific option
or feature negotiation request, send an empty Confirm for a non-
Mandatory Change option for a CCID-specific feature, and ignore other
CCID-specific options.
10.4. CCID Profile Requirements
Each CCID Profile document MUST address at least the following
requirements:
o The profile MUST include the name and number of the CCID being
described.
o The profile MUST describe the conditions in which it is likely to
be useful. Often the best way to do this is by comparison to
existing CCIDs.
o The profile MUST list and describe any CCID-specific options,
features, and Reset Codes and SHOULD list those general options
and features described in this document that are especially
relevant to the CCID.
o Any newly defined acknowledgement mechanism MUST include a way to
transmit ECN Nonce Echoes back to the sender.
o The profile MUST describe the format of data packets, including
any options that should be included and the setting of the CCval
header field.
o The profile MUST describe the format of acknowledgement packets,
including any options that should be included.
o The profile MUST define how data packets are congestion
controlled. This includes responses to congestion events, to idle
and application-limited periods, and to the DCCP Data Dropped and
Slow Receiver options. CCIDs that implement per-packet congestion
control SHOULD discuss how packet size is factored in to
congestion control decisions.
Kohler, et al. Standards Track [Page 80]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
o The profile MUST specify when acknowledgement packets are
generated and how they are congestion controlled.
o The profile MUST define when a sender using the CCID is considered
quiescent.
o The profile MUST say whether its CCID's acknowledgements ever need
to be acknowledged and, if so, how often.
10.5. Congestion State
Most congestion control algorithms depend on past history to
determine the current allowed sending rate. In CCID 2, this
congestion state includes a congestion window and a measurement of
the number of packets outstanding in the network; in CCID 3, it
includes the lengths of recent loss intervals. Both CCIDs use an
estimate of the round-trip time. Congestion state depends on the
network path and is invalidated by path changes. Therefore, DCCP
senders and receivers SHOULD reset their congestion state --
essentially restarting congestion control from "slow start" or
equivalent -- on significant changes in the end-to-end path. For
example, an endpoint that sends or receives a Mobile IPv6 Binding
Update message [RFC3775] SHOULD reset its congestion state for any
corresponding DCCP connections.
A DCCP implementation MAY also reset its congestion state when a CCID
changes (that is, when a negotiation for the CCID feature completes
successfully and the new feature value differs from the old value).
Thus, a connection in a heavily congested environment might evade
end-to-end congestion control by frequently renegotiating a CCID,
just as it could evade end-to-end congestion control by opening new
connections for the same session. This behavior is prohibited. To
prevent it, DCCP implementations MAY limit the rate at which CCID can
be changed -- for instance, by refusing to change a CCID feature
value more than once per minute.
11. Acknowledgements
Congestion control requires that receivers transmit information about
packet losses and ECN marks to senders. DCCP receivers MUST report
all congestion they see, as defined by the relevant CCID profile.
Each CCID says when acknowledgements should be sent, what options
they must use, and so on. DCCP acknowledgements are congestion
controlled, although it is not required that the acknowledgement
stream be more than very roughly TCP friendly; each CCID defines how
acknowledgements are congestion controlled.
Kohler, et al. Standards Track [Page 81]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
Most acknowledgements use DCCP options. For example, on a half-
connection with CCID 2 (TCP-like), the receiver reports
acknowledgement information using the Ack Vector option. This
section describes common acknowledgement options and shows how acks
using those options will commonly work. Full descriptions of the ack
mechanisms used for each CCID are laid out in the CCID profile
specifications.
Acknowledgement options, such as Ack Vector, depend on the DCCP
Acknowledgement Number and are thus only allowed on packet types that
carry that number. Acknowledgement options received on other packet
types, namely DCCP-Request and DCCP-Data, MUST be ignored. Detailed
acknowledgement options are not necessarily required on every packet
that carries an Acknowledgement Number, however.
11.1. Acks of Acks and Unidirectional Connections
DCCP was designed to work well for both bidirectional and
unidirectional flows of data, and for connections that transition
between these states. However, acknowledgements required for a
unidirectional connection are very different from those required for
a bidirectional connection. In particular, unidirectional
connections need to worry about acks of acks.
The ack-of-acks problem arises because some acknowledgement
mechanisms are reliable. For example, an HC-Receiver using CCID 2,
TCP-like Congestion Control, sends Ack Vectors containing completely
reliable acknowledgement information. The HC-Sender should
occasionally inform the HC-Receiver that it has received an ack. If
it did not, the HC-Receiver might resend complete Ack Vector
information, going back to the start of the connection, with every
DCCP-Ack packet! However, note that acks-of-acks need not be
reliable themselves: when an ack-of-acks is lost, the HC-Receiver
will simply maintain, and periodically retransmit, old
acknowledgement-related state for a little longer. Therefore, there
is no need for acks-of-acks-of-acks.
When communication is bidirectional, any required acks-of-acks are
automatically contained in normal acknowledgements for data packets.
On a unidirectional connection, however, the receiver DCCP sends no
data, so the sender would not normally send acknowledgements.
Therefore, the CCID in force on that half-connection must explicitly
say whether, when, and how the HC-Sender should generate acks-of-
acks.
For example, consider a bidirectional connection where both half-
connections use the same CCID (either 2 or 3), and where DCCP B goes
"quiescent". This means that the connection becomes unidirectional:
Kohler, et al. Standards Track [Page 82]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
DCCP B stops sending data and sends only DCCP-Ack packets to DCCP A.
In CCID 2, TCP-like Congestion Control, DCCP B uses Ack Vector to
reliably communicate which packets it has received. As described
above, DCCP A must occasionally acknowledge a pure acknowledgement
from DCCP B so that B can free old Ack Vector state. For instance, A
might send a DCCP-DataAck packet instead of DCCP-Data every now and
then. In CCID 3, however, acknowledgement state is generally
bounded, so A does not need to acknowledge B's acknowledgements.
When communication is unidirectional, a single CCID -- in the
example, the A-to-B CCID -- controls both DCCPs' acknowledgements, in
terms of their content, their frequency, and so forth. For
bidirectional connections, the A-to-B CCID governs DCCP B's
acknowledgements (including its acks of DCCP A's acks) and the B-to-A
CCID governs DCCP A's acknowledgements.
DCCP A switches its ack pattern from bidirectional to unidirectional
when it notices that DCCP B has gone quiescent. It switches from
unidirectional to bidirectional when it must acknowledge even a
single DCCP-Data or DCCP-DataAck packet from DCCP B.
Each CCID defines how to detect quiescence on that CCID, and how that
CCID handles acks-of-acks on unidirectional connections. The B-to-A
CCID defines when DCCP B has gone quiescent. Usually, this happens
when a period has passed without B sending any data packets; in CCID
2, for example, this period is the maximum of 0.2 seconds and two
round-trip times. The A-to-B CCID defines how DCCP A handles
acks-of-acks once DCCP B has gone quiescent.
11.2. Ack Piggybacking
Acknowledgements of A-to-B data MAY be piggybacked on data sent by
DCCP B, as long as that does not delay the acknowledgement longer
than the A-to-B CCID would find acceptable. However, data
acknowledgements often require more than 4 bytes to express. A large
set of acknowledgements prepended to a large data packet might exceed
the allowed maximum packet size. In this case, DCCP B SHOULD send
separate DCCP-Data and DCCP-Ack packets, or wait, but not too long,
for a smaller datagram.
Piggybacking is particularly common at DCCP A when the B-to-A
half-connection is quiescent -- that is, when DCCP A is just
acknowledging DCCP B's acknowledgements. There are three reasons to
acknowledge DCCP B's acknowledgements: to allow DCCP B to free up
information about previously acknowledged data packets from A; to
shrink the size of future acknowledgements; and to manipulate the
rate at which future acknowledgements are sent. Since these are
Kohler, et al. Standards Track [Page 83]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
secondary concerns, DCCP A can generally afford to wait indefinitely
for a data packet to piggyback its acknowledgement onto; if DCCP B
wants to elicit an acknowledgement, it can send a DCCP-Sync.
Any restrictions on ack piggybacking are described in the relevant
CCID's profile.
11.3. Ack Ratio Feature
The Ack Ratio feature lets HC-Senders influence the rate at which
HC-Receivers generate DCCP-Ack packets, thus controlling reverse-path
congestion. This differs from TCP, which presently has no congestion
control for pure acknowledgement traffic. Ack Ratio reverse-path
congestion control does not try to be TCP friendly. It just tries to
avoid congestion collapse, and to be somewhat better than TCP in the
presence of a high packet loss or mark rate on the reverse path.
Ack Ratio applies to CCIDs whose HC-Receivers clock acknowledgements
off the receipt of data packets. The value of Ack Ratio/A equals the
rough ratio of data packets sent by DCCP A to DCCP-Ack packets sent
by DCCP B. Higher Ack Ratios correspond to lower DCCP-Ack rates; the
sender raises Ack Ratio when the reverse path is congested and lowers
Ack Ratio when it is not. Each CCID profile defines how it controls
congestion on the acknowledgement path, and, particularly, whether
Ack Ratio is used. CCID 2, for example, uses Ack Ratio for
acknowledgement congestion control, but CCID 3 does not. However,
each Ack Ratio feature has a value whether or not that value is used
by the relevant CCID.
Ack Ratio has feature number 5 and is non-negotiable. It takes two-
byte integer values. An Ack Ratio/A value of four means that DCCP B
will send at least one acknowledgement packet for every four data
packets sent by DCCP A. DCCP A sends a "Change L(Ack Ratio)" option
to notify DCCP B of its ack ratio. An Ack Ratio value of zero
indicates that the relevant half-connection does not use an Ack Ratio
to control its acknowledgement rate. New connections start with Ack
Ratio 2 for both endpoints; this Ack Ratio results in acknowledgement
behavior analogous to TCP's delayed acks.
Ack Ratio should be treated as a guideline rather than a strict
requirement. We intend Ack Ratio-controlled acknowledgement behavior
to resemble TCP's acknowledgement behavior when there is no reverse-
path congestion, and to be somewhat more conservative when there is
reverse-path congestion. Following this intent is more important
than implementing Ack Ratio precisely. In particular:
Kohler, et al. Standards Track [Page 84]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
o Receivers MAY piggyback acknowledgement information on data
packets, creating DCCP-DataAck packets. The Ack Ratio does not
apply to piggybacked acknowledgements. However, if the data
packets are too big to carry acknowledgement information, or if
the data sending rate is lower than Ack Ratio would suggest, then
DCCP B SHOULD send enough pure DCCP-Ack packets to maintain the
rate of one acknowledgement per Ack Ratio received data packets.
o Receivers MAY rate-pace their acknowledgements rather than send
acknowledgements immediately upon the receipt of data packets.
Receivers that rate-pace acknowledgements SHOULD pick a rate that
approximates the effect of Ack Ratio and SHOULD include Elapsed
Time options (Section 13.2) to help the sender calculate round-
trip times.
o Receivers SHOULD implement delayed acknowledgement timers like
TCP's, whereby any packet's acknowledgement is delayed by at most
T seconds. This delay lets the receiver collect additional
packets to acknowledge and thus reduce the per-packet overhead of
acknowledgements; but if T seconds have passed by and the ack is
still around, it is sent out right away. The default value of T
should be 0.2 seconds, as is common in TCP implementations. This
may lead to sending more acknowledgement packets than Ack Ratio
would suggest.
o Receivers SHOULD send acknowledgements immediately on receiving
packets marked ECN Congestion Experienced or packets whose out-
of-order sequence numbers potentially indicate loss. However,
there is no need to send such immediate acknowledgements for
marked packets more than once per round-trip time.
o Receivers MAY ignore Ack Ratio if they perform their own
congestion control on acknowledgements. For example, a receiver
that knows the loss and mark rate for its DCCP-Ack packets might
maintain a TCP-friendly acknowledgement rate on its own. Such a
receiver MUST either ensure that it always obtains sufficient
acknowledgement loss and mark information or fall back to Ack
Ratio when sufficient information is not available, as might
happen during periods when the receiver is quiescent.
11.4. Ack Vector Options
The Ack Vector gives a run-length encoded history of data packets
received at the client. Each byte of the vector gives the state of
that data packet in the loss history, and the number of preceding
packets with the same state. The option's data looks like this:
Kohler, et al. Standards Track [Page 85]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
+--------+--------+--------+--------+--------+--------
|0010011?| Length |SSLLLLLL|SSLLLLLL|SSLLLLLL| ...
+--------+--------+--------+--------+--------+--------
Type=38/39 \___________ Vector ___________...
The two Ack Vector options (option types 38 and 39) differ only in
the values they imply for ECN Nonce Echo. Section 12.2 describes
this further.
The vector itself consists of a series of bytes, each of whose
encoding is:
0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+
|Sta| Run Length|
+-+-+-+-+-+-+-+-+
Sta[te] occupies the most significant two bits of each byte and can
have one of four values, as follows:
State Meaning
----- -------
0 Received
1 Received ECN Marked
2 Reserved
3 Not Yet Received
Table 6: DCCP Ack Vector States
The term "ECN marked" refers to packets with ECN code point 11, CE
(Congestion Experienced); packets received with this ECN code point
MUST be reported using State 1, Received ECN Marked. Packets
received with ECN code points 00, 01, or 10 (Non-ECT, ECT(0), or
ECT(1), respectively) MUST be reported using State 0, Received.
Run Length, the least significant six bits of each byte, specifies
how many consecutive packets have the given State. Run Length zero
says the corresponding State applies to one packet only; Run Length
63 says it applies to 64 consecutive packets. Run lengths of 65 or
more must be encoded in multiple bytes.
The first byte in the first Ack Vector option refers to the packet
indicated in the Acknowledgement Number; subsequent bytes refer to
older packets. Ack Vector MUST NOT be sent on DCCP-Data and DCCP-
Request packets, which lack an Acknowledgement Number, and any Ack
Vector options encountered on such packets MUST be ignored.
Kohler, et al. Standards Track [Page 86]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
An Ack Vector containing the decimal values 0,192,3,64,5 and for
which the Acknowledgement Number is decimal 100 indicates that:
Packet 100 was received (Acknowledgement Number 100, State 0, Run
Length 0);
Packet 99 was lost (State 3, Run Length 0);
Packets 98, 97, 96 and 95 were received (State 0, Run Length 3);
Packet 94 was ECN marked (State 1, Run Length 0); and
Packets 93, 92, 91, 90, 89, and 88 were received (State 0, Run
Length 5).
A single Ack Vector option can acknowledge up to 16192 data packets.
Should more packets need to be acknowledged than can fit in 253 bytes
of Ack Vector, then multiple Ack Vector options can be sent; the
second Ack Vector begins where the first left off, and so forth.
Ack Vector states are subject to two general constraints. (These
principles SHOULD also be followed for other acknowledgement
mechanisms; referring to Ack Vector states simplifies their
explanation.)
1. Packets reported as State 0 or State 1 MUST be acknowledgeable:
their options have been processed by the receiving DCCP stack.
Any data on the packet need not have been delivered to the
receiving application; in fact, the data may have been dropped.
2. Packets reported as State 3 MUST NOT be acknowledgeable. Feature
negotiations and options on such packets MUST NOT have been
processed, and the Acknowledgement Number MUST NOT correspond to
such a packet.
Packets dropped in the application's receive buffer MUST be reported
as Received or Received ECN Marked (States 0 and 1), depending on
their ECN state; such packets' ECN Nonces MUST be included in the
Nonce Echo. The Data Dropped option informs the sender that some
packets reported as received actually had their application data
dropped.
One or more Ack Vector options that, together, report the status of a
packet with a sequence number less than ISN, the initial sequence
number, SHOULD be considered invalid. The receiving DCCP SHOULD
either ignore the options or reset the connection with Reset Code 5,
"Option Error". No Ack Vector option can refer to a packet that has
not yet been sent, as the Acknowledgement Number checks in Section
Kohler, et al. Standards Track [Page 87]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
7.5.3 ensure, but because of attack, implementation bug, or
misbehavior, an Ack Vector option can claim that a packet was
received before it is actually delivered. Section 12.2 describes how
this is detected and how senders should react. Packets that haven't
been included in any Ack Vector option SHOULD be treated as "not yet
received" (State 3) by the sender.
Appendix A provides a non-normative description of the details of
DCCP acknowledgement handling in the context of an abstract Ack
Vector implementation.
11.4.1. Ack Vector Consistency
A DCCP sender will commonly receive multiple acknowledgements for
some of its data packets. For instance, an HC-Sender might receive
two DCCP-Acks with Ack Vectors, both of which contained information
about sequence number 24. (Information about a sequence number is
generally repeated in every ack until the HC-Sender acknowledges an
ack. In this case, perhaps the HC-Receiver is sending acks faster
than the HC-Sender is acknowledging them.) In a perfect world, the
two Ack Vectors would always be consistent. However, there are many
reasons why they might not be. For example:
o The HC-Receiver received packet 24 between sending its acks, so
the first ack said 24 was not received (State 3) and the second
said it was received or ECN marked (State 0 or 1).
o The HC-Receiver received packet 24 between sending its acks, and
the network reordered the acks. In this case, the packet will
appear to transition from State 0 or 1 to State 3.
o The network duplicated packet 24, and one of the duplicates was
ECN marked. This might show up as a transition between States 0
and 1.
To cope with these situations, HC-Sender DCCP implementations SHOULD
combine multiple received Ack Vector states according to this table:
Received State
0 1 3
+---+---+---+
0 | 0 |0/1| 0 |
Old +---+---+---+
1 | 1 | 1 | 1 |
State +---+---+---+
3 | 0 | 1 | 3 |
+---+---+---+
Kohler, et al. Standards Track [Page 88]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
To read the table, choose the row corresponding to the packet's old
state and the column corresponding to the packet's state in the newly
received Ack Vector; then read the packet's new state off the table.
For an old state of 0 (received non-marked) and received state of 1
(received ECN marked), the packet's new state may be set to either 0
or 1. The HC-Sender implementation will be indifferent to ack
reordering if it chooses new state 1 for that cell.
The HC-Receiver should collect information about received packets
according to the following table:
Received Packet
0 1 3
+---+---+---+
0 | 0 |0/1| 0 |
Stored +---+---+---+
1 |0/1| 1 | 1 |
State +---+---+---+
3 | 0 | 1 | 3 |
+---+---+---+
This table equals the sender's table except that, when the stored
state is 1 and the received state is 0, the receiver is allowed to
switch its stored state to 0.
An HC-Sender MAY choose to throw away old information gleaned from
the HC-Receiver's Ack Vectors, in which case it MUST ignore newly
received acknowledgements from the HC-Receiver for those old packets.
It is often kinder to save recent Ack Vector information for a while
so that the HC-Sender can undo its reaction to presumed congestion
when a "lost" packet unexpectedly shows up (the transition from State
3 to State 0).
11.4.2. Ack Vector Coverage
We can divide the packets that have been sent from an HC-Sender to an
HC-Receiver into four roughly contiguous groups. From oldest to
youngest, these are:
1. Packets already acknowledged by the HC-Receiver, where the
HC-Receiver knows that the HC-Sender has definitely received the
acknowledgements;
2. Packets already acknowledged by the HC-Receiver, where the
HC-Receiver cannot be sure that the HC-Sender has received the
acknowledgements;
3. Packets not yet acknowledged by the HC-Receiver; and
Kohler, et al. Standards Track [Page 89]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
4. Packets not yet received by the HC-Receiver.
The union of groups 2 and 3 is called the Acknowledgement Window.
Generally, every Ack Vector generated by the HC-Receiver will cover
the whole Acknowledgement Window: Ack Vector acknowledgements are
cumulative. (This simplifies Ack Vector maintenance at the
HC-Receiver; see Appendix A, below.) As packets are received, this
window both grows on the right and shrinks on the left. It grows
because there are more packets, and shrinks because the HC-Sender's
Acknowledgement Numbers will acknowledge previous acknowledgements,
moving packets from group 2 into group 1.
11.5. Send Ack Vector Feature
The Send Ack Vector feature lets DCCPs negotiate whether they should
use Ack Vector options to report congestion. Ack Vector provides
detailed loss information and lets senders report back to their
applications whether particular packets were dropped. Send Ack
Vector is mandatory for some CCIDs and optional for others.
Send Ack Vector has feature number 6 and is server-priority. It
takes one-byte Boolean values. DCCP A MUST send Ack Vector options
on its acknowledgements when Send Ack Vector/A has value one,
although it MAY send Ack Vector options even when Send Ack Vector/A
is zero. Values of two or more are reserved. New connections start
with Send Ack Vector 0 for both endpoints. DCCP B sends a "Change
R(Send Ack Vector, 1)" option to DCCP A to ask A to send Ack Vector
options as part of its acknowledgement traffic.
11.6. Slow Receiver Option
An HC-Receiver sends the Slow Receiver option to its sender to
indicate that it is having trouble keeping up with the sender's data.
The HC-Sender SHOULD NOT increase its sending rate for approximately
one round-trip time after seeing a packet with a Slow Receiver
option. After one round-trip time, the effect of Slow Receiver
disappears, allowing the HC-Sender to increase its rate. Therefore,
the HC-Receiver SHOULD continue to send Slow Receiver options if it
needs to prevent the HC-Sender from going faster in the long term.
The Slow Receiver option does not indicate congestion, and the HC-
Sender need not reduce its sending rate. (If necessary, the receiver
can force the sender to slow down by dropping packets, with or
without Data Dropped, or by reporting false ECN marks.) APIs should
let receiver applications set Slow Receiver and sending applications
determine whether their receivers are Slow.
Kohler, et al. Standards Track [Page 90]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
Slow Receiver is a one-byte option.
+--------+
|00000010|
+--------+
Type=2
Slow Receiver does not specify why the receiver is having trouble
keeping up with the sender. Possible reasons include lack of buffer
space, CPU overload, and application quotas. A sending application
might react to Slow Receiver by reducing its application-level
sending rate, for example.
The sending application should not react to Slow Receiver by sending
more data, however. Although the optimal response to a CPU-bound
receiver might be to reduce compression and send more data (a
highly-compressed data format might overwhelm a slow CPU more
seriously than would the higher memory requirements of a less-
compressed data format), this kind of format change should be
requested at the application level, not via the Slow Receiver option.
Slow Receiver implements a portion of TCP's receive window
functionality.
11.7. Data Dropped Option
The Data Dropped option indicates that the application data on one or
more received packets did not actually reach the application. Data
Dropped additionally reports why the data was dropped: perhaps the
data was corrupt, or perhaps the receiver cannot keep up with the
sender's current rate and the data was dropped in some receive
buffer. Using Data Dropped, DCCP endpoints can discriminate between
different kinds of loss; this differs from TCP, in which all loss is
reported the same way.
Unless it is explicitly specified otherwise, DCCP congestion control
mechanisms MUST react as if each Data Dropped packet was marked as
ECN Congestion Experienced by the network. We intend for Data
Dropped to enable research into richer congestion responses to
corrupt and other endpoint-dropped packets, but DCCP CCIDs MUST react
conservatively to Data Dropped until this behavior is standardized.
Section 11.7.2, below, describes congestion responses for all current
Drop Codes.
If a received packet's application data is dropped for one of the
reasons listed below, this SHOULD be reported using a Data Dropped
option. Alternatively, the receiver MAY choose to report as
Kohler, et al. Standards Track [Page 91]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
"received" only those packets whose data were not dropped, subject to
the constraint that packets not reported as received MUST NOT have
had their options processed.
The option's data looks like this:
+--------+--------+--------+--------+--------+--------
|00101000| Length | Block | Block | Block | ...
+--------+--------+--------+--------+--------+--------
Type=40 \___________ Vector ___________ ...
The Vector consists of a series of bytes, called Blocks, each of
whose encoding corresponds to one of two choices:
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
|0| Run Length | or |1|DrpCd|Run Len|
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
Normal Block Drop Block
The first byte in the first Data Dropped option refers to the packet
indicated by the Acknowledgement Number; subsequent bytes refer to
older packets. Data Dropped MUST NOT be sent on DCCP-Data or DCCP-
Request packets, which lack an Acknowledgement Number, and any Data
Dropped options received on such packets MUST be ignored.
Normal Blocks, which have high bit 0, indicate that any received
packets in the Run Length had their data delivered to the
application. Drop Blocks, which have high bit 1, indicate that
received packets in the Run Len[gth] were not delivered as usual.
The 3-bit Drop Code [DrpCd] field says what happened; generally, no
data from that packet reached the application. Packets reported as
"not yet received" MUST be included in Normal Blocks; packets not
covered by any Data Dropped option are treated as if they were in a
Normal Block. Defined Drop Codes for Drop Blocks are as follows.
Drop Code Meaning
--------- -------
0 Protocol Constraints
1 Application Not Listening
2 Receive Buffer
3 Corrupt
4-6 Reserved
7 Delivered Corrupt
Table 7: DCCP Drop Codes
Kohler, et al. Standards Track [Page 92]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
In more detail:
0 The packet data was dropped due to protocol constraints. For
example, the data was included on a DCCP-Request packet, but
the receiving application does not allow such piggybacking; or
the data was included on a packet with inappropriately low
Checksum Coverage.
1 The packet data was dropped because the application is no
longer listening. See Section 11.7.2.
2 The packet data was dropped in a receive buffer, probably
because of receive buffer overflow. See Section 11.7.2.
3 The packet data was dropped due to corruption. See Section
9.3.
7 The packet data was corrupted but was delivered to the
application anyway. See Section 9.3.
For example, assume that a packet arrives with Acknowledgement Number
100, an Ack Vector reporting all packets as received, and a Data
Dropped option containing the decimal values 0,160,3,162. Then:
Packet 100 was received (Acknowledgement Number 100, Normal Block,
Run Length 0).
Packet 99 was dropped in a receive buffer (Drop Block, Drop Code
2, Run Length 0).
Packets 98, 97, 96, and 95 were received (Normal Block, Run Length
3).
Packets 95, 94, and 93 were dropped in the receive buffer (Drop
Block, Drop Code 2, Run Length 2).
Run lengths of more than 128 (for Normal Blocks) or 16 (for Drop
Blocks) must be encoded in multiple Blocks. A single Data Dropped
option can acknowledge up to 32384 Normal Block data packets,
although the receiver SHOULD NOT send a Data Dropped option when all
relevant packets fit into Normal Blocks. Should more packets need to
be acknowledged than can fit in 253 bytes of Data Dropped, then
multiple Data Dropped options can be sent. The second option will
begin where the first left off, and so forth.
One or more Data Dropped options that, together, report the status of
more packets than have been sent, or that change the status of a
packet, or that disagree with Ack Vector or equivalent options (by
Kohler, et al. Standards Track [Page 93]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
reporting a "not yet received" packet as "dropped in the receive
buffer", for example) SHOULD be considered invalid. The receiving
DCCP SHOULD either ignore such options, or respond by resetting the
connection with Reset Code 5, "Option Error".
A DCCP application interface should let receiving applications
specify the Drop Codes corresponding to received packets. For
example, this would let applications calculate their own checksums
but still report "dropped due to corruption" packets via the Data
Dropped option. The interface SHOULD NOT let applications reduce the
"seriousness" of a packet's Drop Code; for example, the application
should not be able to upgrade a packet from delivered corrupt (Drop
Code 7) to delivered normally (no Drop Code).
Data Dropped information is transmitted reliably. That is, endpoints
SHOULD continue to transmit Data Dropped options until receiving an
acknowledgement indicating that the relevant options have been
processed. In Ack Vector terms, each acknowledgement should contain
Data Dropped options that cover the whole Acknowledgement Window
(Section 11.4.2), although when every packet in that window would be
placed in a Normal Block, no actual option is required.
11.7.1. Data Dropped and Normal Congestion Response
When deciding on a response to a particular acknowledgement or set of
acknowledgements containing Data Dropped options, a congestion
control mechanism MUST consider dropped packets, ECN Congestion
Experienced marks (including marked packets that are included in Data
Dropped), and packets singled out in Data Dropped. For window-based
mechanisms, the valid response space is defined as follows.
Assume an old window of W. Independently calculate a new window
W_new1 that assumes no packets were Data Dropped (so W_new1 contains
only the normal congestion response), and a new window W_new2 that
assumes no packets were lost or marked (so W_new2 contains only the
Data Dropped response). We are assuming that Data Dropped
recommended a reduction in congestion window, so W_new2 < W.
Then the actual new window W_new MUST NOT be larger than the minimum
of W_new1 and W_new2; and the sender MAY combine the two responses,
by setting
W_new = W + min(W_new1 - W, 0) + min(W_new2 - W, 0).
The details of how this is accomplished are specified in CCID profile
documents. Non-window-based congestion control mechanisms MUST
behave analogously; again, CCID profiles define how.
Kohler, et al. Standards Track [Page 94]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
11.7.2. Particular Drop Codes
Drop Code 0, Protocol Constraints, does not indicate any kind of
congestion, so the sender's CCID SHOULD react to packets with Drop
Code 0 as if they were received (with or without ECN Congestion
Experienced marks, as appropriate). However, the sending endpoint
SHOULD NOT send data until it believes the protocol constraint no
longer applies.
Drop Code 1, Application Not Listening, means the application running
at the endpoint that sent the option is no longer listening for data.
For example, a server might close its receiving half-connection to
new data after receiving a complete request from the client. This
would limit the amount of state available at the server for incoming
data and thus reduce the potential damage from certain denial-of-
service attacks. A Data Dropped option containing Drop Code 1 SHOULD
be sent whenever received data is ignored due to a non-listening
application. Once an endpoint reports Drop Code 1 for a packet, it
SHOULD report Drop Code 1 for every succeeding data packet on that
half-connection; once an endpoint receives a Drop State 1 report, it
SHOULD expect that no more data will ever be delivered to the other
endpoint's application, so it SHOULD NOT send more data.
Drop Code 2, Receive Buffer, indicates congestion inside the
receiving host. For instance, if a drop-from-tail kernel socket
buffer is too full to accept a packet's application data, that packet
should be reported as Drop Code 2. For a drop-from-head or more
complex socket buffer, the dropped packet should be reported as Drop
Code 2. DCCP implementations may also provide an API by which
applications can mark received packets as Drop Code 2, indicating
that the application ran out of space in its user-level receive
buffer. (However, it is not generally useful to report packets as
dropped due to Drop Code 2 after more than a couple of round-trip
times have passed. The HC-Sender may have forgotten its
acknowledgement state for the packet by that time, so the Data
Dropped report will have no effect.) Every packet newly acknowledged
as Drop Code 2 SHOULD reduce the sender's instantaneous rate by one
packet per round-trip time, unless the sender is already sending one
packet per RTT or less. Each CCID profile defines the CCID-specific
mechanism by which this is accomplished.
Currently, the other Drop Codes (namely Drop Code 3, Corrupt; Drop
Code 7, Delivered Corrupt; and reserved Drop Codes 4-6) MUST cause
the relevant CCID to behave as if the relevant packets were ECN
marked (ECN Congestion Experienced).
Kohler, et al. Standards Track [Page 95]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
12. Explicit Congestion Notification
The DCCP protocol is fully ECN-aware [RFC3168]. Each CCID specifies
how its endpoints respond to ECN marks. Furthermore, DCCP, unlike
TCP, allows senders to control the rate at which acknowledgements are
generated (with options like Ack Ratio); since acknowledgements are
congestion controlled, they also qualify as ECN-Capable Transport.
Each CCID profile describes how that CCID interacts with ECN, both
for data traffic and pure-acknowledgement traffic. A sender SHOULD
set ECN-Capable Transport on its packets' IP headers unless the
receiver's ECN Incapable feature is on or the relevant CCID disallows
it.
The rest of this section describes the ECN Incapable feature and the
interaction of the ECN Nonce with acknowledgement options such as Ack
Vector.
12.1. ECN Incapable Feature
DCCP endpoints are ECN-aware by default, but the ECN Incapable
feature lets an endpoint reject the use of Explicit Congestion
Notification. The use of this feature is NOT RECOMMENDED. ECN
incapability both avoids ECN's possible benefits and prevents senders
from using the ECN Nonce to check for receiver misbehavior. A DCCP
stack MAY therefore leave the ECN Incapable feature unimplemented,
acting as if all connections were ECN capable. Note that the
inappropriate firewall interactions that dogged TCP's implementation
of ECN [RFC3360] involve TCP header bits, not the IP header's ECN
bits; we know of no middlebox that would block ECN-capable DCCP
packets but allow ECN-incapable DCCP packets.
ECN Incapable has feature number 4 and is server-priority. It takes
one-byte Boolean values. DCCP A MUST be able to read ECN bits from
received frames' IP headers when ECN Incapable/A is zero. (This is
independent of whether it can set ECN bits on sent frames.) DCCP A
thus sends a "Change L(ECN Inapable, 1)" option to DCCP B to inform
it that A cannot read ECN bits. If the ECN Incapable/A feature is
one, then all of DCCP B's packets MUST be sent as ECN incapable. New
connections start with ECN Incapable 0 (that is, ECN capable) for
both endpoints. Values of two or more are reserved.
If a DCCP is not ECN capable, it MUST send Mandatory "Change L(ECN
Incapable, 1)" options to the other endpoint until acknowledged (by
"Confirm R(ECN Incapable, 1)") or the connection closes.
Furthermore, it MUST NOT accept any data until the other endpoint
Kohler, et al. Standards Track [Page 96]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
sends "Confirm R(ECN Incapable, 1)". It SHOULD send Data Dropped
options on its acknowledgements, with Drop Code 0 ("protocol
constraints"), if the other endpoint does send data inappropriately.
12.2. ECN Nonces
Congestion avoidance will not occur, and the receiver will sometimes
get its data faster, if the sender isn't told about congestion
events. Thus, the receiver has some incentive to falsify
acknowledgement information, reporting that marked or dropped packets
were actually received unmarked. This problem is more serious with
DCCP than with TCP, since TCP provides reliable transport: it is more
difficult with TCP to lie about lost packets without breaking the
application.
ECN Nonces are a general mechanism to prevent ECN cheating (or loss
cheating). Two values for the two-bit ECN header field indicate
ECN-Capable Transport, 01 and 10. The second code point, 10, is the
ECN Nonce. In general, a protocol sender chooses between these code
points randomly on its output packets, remembering the sequence it
chose. On every acknowledgement, the protocol receiver reports the
number of ECN Nonces it has received thus far. This is called the
ECN Nonce Echo. Since ECN marking and packet dropping both destroy
the ECN Nonce, a receiver that lies about an ECN mark or packet drop
has a 50% chance of guessing right and avoiding discipline. The
sender may react punitively to an ECN Nonce mismatch, possibly up to
dropping the connection. The ECN Nonce Echo field need not be an
integer; one bit is enough to catch 50% of infractions, and the
probability of success drops exponentially as more packets are sent
[RFC3540].
In DCCP, the ECN Nonce Echo field is encoded in acknowledgement
options. For example, the Ack Vector option comes in two forms, Ack
Vector [Nonce 0] (option 38) and Ack Vector [Nonce 1] (option 39),
corresponding to the two values for a one-bit ECN Nonce Echo. The
Nonce Echo for a given Ack Vector equals the one-bit sum (exclusive-
or, or parity) of ECN nonces for packets reported by that Ack Vector
as received and not ECN marked. Thus, only packets marked as State 0
matter for this calculation (that is, valid received packets that
were not ECN marked). Every Ack Vector option is detailed enough for
the sender to determine what the Nonce Echo should have been. It can
check this calculation against the actual Nonce Echo and complain if
there is a mismatch. (The Ack Vector could conceivably report every
packet's ECN Nonce state, but this would severely limit its
compressibility without providing much extra protection.)
Each DCCP sender SHOULD set ECN Nonces on its packets and remember
which packets had nonces. When a sender detects an ECN Nonce Echo
Kohler, et al. Standards Track [Page 97]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
mismatch, it behaves as described in the next section. Each DCCP
receiver MUST calculate and use the correct value for ECN Nonce Echo
when sending acknowledgement options.
ECN incapability, as indicated by the ECN Incapable feature, is
handled as follows: an endpoint sending packets to an ECN-incapable
receiver MUST send its packets as ECN incapable, and an ECN-
incapable receiver MUST use the value zero for all ECN Nonce Echoes.
12.3. Aggression Penalties
DCCP endpoints have several mechanisms for detecting congestion-
related misbehavior. For example:
o A sender can detect an ECN Nonce Echo mismatch, indicating
possible receiver misbehavior.
o A receiver can detect whether the sender is responding to
congestion feedback or Slow Receiver.
o An endpoint may be able to detect that its peer is reporting
inappropriately small Elapsed Time values (Section 13.2).
An endpoint that detects possible congestion-related misbehavior
SHOULD try to verify that its peer is truly misbehaving. For
example, a sending endpoint might send a packet whose ECN header
field is set to Congestion Experienced, 11; a receiver that doesn't
report a corresponding mark is most likely misbehaving.
Upon detecting possible misbehavior, a sender SHOULD respond as if
the receiver had reported one or more recent packets as ECN-marked
(instead of unmarked), while a receiver SHOULD report one or more
recent non-marked packets as ECN-marked. Alternately, a sender might
act as if the receiver had sent a Slow Receiver option, and a
receiver might send Slow Receiver options. Other reactions that
serve to slow the transfer rate are also acceptable. An entity that
detects particularly egregious and ongoing misbehavior MAY also reset
the connection with Reset Code 11, "Aggression Penalty".
However, ECN Nonce mismatches and other warning signs can result from
innocent causes, such as implementation bugs or attack. In
particular, a successful DCCP-Data attack (Section 7.5.5) can cause
the receiver to report an incorrect ECN Nonce Echo. Therefore,
connection reset and other heavyweight mechanisms SHOULD be used only
as last resorts, after multiple round-trip times of verified
aggression.
Kohler, et al. Standards Track [Page 98]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
13. Timing Options
The Timestamp, Timestamp Echo, and Elapsed Time options help DCCP
endpoints explicitly measure round-trip times.
13.1. Timestamp Option
This option is permitted in any DCCP packet. The length of the
option is 6 bytes.
+--------+--------+--------+--------+--------+--------+
|00101001|00000110| Timestamp Value |
+--------+--------+--------+--------+--------+--------+
Type=41 Length=6
The four bytes of option data carry the timestamp of this packet.
The timestamp is a 32-bit integer that increases monotonically with
time, at a rate of 1 unit per 10 microseconds. At this rate,
Timestamp Value will wrap approximately every 11.9 hours. Endpoints
need not measure time at this fine granularity; for example, an
endpoint that preferred to measure time at millisecond granularity
might send Timestamp Values that were all multiples of 100. The
precise time corresponding to Timestamp Value zero is not specified:
Timestamp Values are only meaningful relative to other Timestamp
Values sent on the same connection. A DCCP receiving a Timestamp
option SHOULD respond with a Timestamp Echo option on the next packet
it sends.
13.2. Elapsed Time Option
This option is permitted in any DCCP packet that contains an
Acknowledgement Number; such options received on other packet types
MUST be ignored. It indicates how much time has elapsed since the
packet being acknowledged -- the packet with the given
Acknowledgement Number -- was received. The option may take 4 or 6
bytes, depending on the size of the Elapsed Time value. Elapsed Time
helps correct round-trip time estimates when the gap between
receiving a packet and acknowledging that packet may be long -- in
CCID 3, for example, where acknowledgements are sent infrequently.
Kohler, et al. Standards Track [Page 99]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
+--------+--------+--------+--------+
|00101011|00000100| Elapsed Time |
+--------+--------+--------+--------+
Type=43 Len=4
+--------+--------+--------+--------+--------+--------+
|00101011|00000110| Elapsed Time |
+--------+--------+--------+--------+--------+--------+
Type=43 Len=6
The option data, Elapsed Time, represents an estimated lower bound on
the amount of time elapsed since the packet being acknowledged was
received, with units of hundredths of milliseconds. If Elapsed Time
is less than a half-second, the first, smaller form of the option
SHOULD be used. Elapsed Times of more than 0.65535 seconds MUST be
sent using the second form of the option. The special Elapsed Time
value 4294967295, which corresponds to approximately 11.9 hours, is
used to represent any Elapsed Time greater than 42949.67294 seconds.
DCCP endpoints MUST NOT report Elapsed Times that are significantly
larger than the true elapsed times. A connection MAY be reset with
Reset Code 11, "Aggression Penalty", if one endpoint determines that
the other is reporting a much-too-large Elapsed Time.
Elapsed Time is measured in hundredths of milliseconds as a
compromise between two conflicting goals. First, it provides enough
granularity to reduce rounding error when measuring elapsed time over
fast LANs; second, it allows many reasonable elapsed times to fit
into two bytes of data.
13.3. Timestamp Echo Option
This option is permitted in any DCCP packet, as long as at least one
packet carrying the Timestamp option has been received. Generally, a
DCCP endpoint should send one Timestamp Echo option for each
Timestamp option it receives, and it should send that option as soon
as is convenient. The length of the option is between 6 and 10
bytes, depending on whether Elapsed Time is included and how large it
is.
Kohler, et al. Standards Track [Page 100]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
+--------+--------+--------+--------+--------+--------+
|00101010|00000110| Timestamp Echo |
+--------+--------+--------+--------+--------+--------+
Type=42 Len=6
+--------+--------+------- ... -------+--------+--------+
|00101010|00001000| Timestamp Echo | Elapsed Time |
+--------+--------+------- ... -------+--------+--------+
Type=42 Len=8 (4 bytes)
+--------+--------+------- ... -------+------- ... -------+
|00101010|00001010| Timestamp Echo | Elapsed Time |
+--------+--------+------- ... -------+------- ... -------+
Type=42 Len=10 (4 bytes) (4 bytes)
The first four bytes of option data, Timestamp Echo, carry a
Timestamp Value taken from a preceding received Timestamp option.
Usually, this will be the last packet that was received -- the packet
indicated by the Acknowledgement Number, if any -- but it might be a
preceding packet. Each Timestamp received will generally result in
exactly one Timestamp Echo transmitted. If an endpoint has received
multiple Timestamp options since the last time it sent a packet, then
it MAY ignore all Timestamp options but the one included on the
packet with the greatest sequence number. Alternatively, it MAY
include multiple Timestamp Echo options in its response, each
corresponding to a different Timestamp option.
The Elapsed Time value, similar to that in the Elapsed Time option,
indicates the amount of time elapsed since receiving the packet whose
timestamp is being echoed. This time MUST have units of hundredths
of milliseconds. Elapsed Time is meant to help the Timestamp sender
separate the network round-trip time from the Timestamp receiver's
processing time. This may be particularly important for CCIDs where
acknowledgements are sent infrequently, so that there might be
considerable delay between receiving a Timestamp option and sending
the corresponding Timestamp Echo. A missing Elapsed Time field is
equivalent to an Elapsed Time of zero. The smallest version of the
option SHOULD be used that can hold the relevant Elapsed Time value.
14. Maximum Packet Size
A DCCP implementation MUST maintain the maximum packet size (MPS)
allowed for each active DCCP session. The MPS is influenced by the
maximum packet size allowed by the current congestion control
mechanism (CCMPS), the maximum packet size supported by the path's
links (PMTU, the Path Maximum Transmission Unit) [RFC1191], and the
lengths of the IP and DCCP headers.
Kohler, et al. Standards Track [Page 101]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
A DCCP application interface SHOULD let the application discover
DCCP's current MPS. Generally, the DCCP implementation will refuse
to send any packet bigger than the MPS, returning an appropriate
error to the application. A DCCP interface MAY allow applications to
request fragmentation for packets larger than PMTU, but not larger
than CCMPS. (Packets larger than CCMPS MUST be rejected in any
case.) Fragmentation SHOULD NOT be the default, since it decreases
robustness: an entire packet is discarded if even one of its
fragments is lost. Applications can usually get better error
tolerance by producing packets smaller than the PMTU.
The MPS reported to the application SHOULD be influenced by the size
expected to be required for DCCP headers and options. If the
application provides data that, when combined with the options the
DCCP implementation would like to include, would exceed the MPS, the
implementation should either send the options on a separate packet
(such as a DCCP-Ack) or lower the MPS, drop the data, and return an
appropriate error to the application.
14.1. Measuring PMTU
Each DCCP endpoint MUST keep track of the current PMTU for each
connection, except that this is not required for IPv4 connections
whose applications have requested fragmentation. The PMTU SHOULD be
initialized from the interface MTU that will be used to send packets.
The MPS will be initialized with the minimum of the PMTU and the
CCMPS, if any.
Classical PMTU discovery uses unfragmentable packets. In IPv4, these
packets have the IP Don't Fragment (DF) bit set; in IPv6, all packets
are unfragmentable once emitted by an end host. As specified in
[RFC1191], when a router receives a packet with DF set that is larger
than the next link's MTU, it sends an ICMP Destination Unreachable
message back to the source whose Code indicates that an
unfragmentable packet was too large to forward (a "Datagram Too Big"
message). When a DCCP implementation receives a Datagram Too Big
message, it decreases its PMTU to the Next-Hop MTU value given in the
ICMP message. If the MTU given in the message is zero, the sender
chooses a value for PMTU using the algorithm described in [RFC1191],
Section 7. If the MTU given in the message is greater than the
current PMTU, the Datagram Too Big message is ignored, as described
in [RFC1191]. (We are aware that this may cause problems for DCCP
endpoints behind certain firewalls.)
A DCCP implementation may allow the application occasionally to
request that PMTU discovery be performed again. This will reset the
PMTU to the outgoing interface's MTU. Such requests SHOULD be rate
limited, to one per two seconds, for example.
Kohler, et al. Standards Track [Page 102]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
A DCCP sender MAY treat the reception of an ICMP Datagram Too Big
message as an indication that the packet being reported was not lost
due to congestion, and so for the purposes of congestion control it
MAY ignore the DCCP receiver's indication that this packet did not
arrive. However, if this is done, then the DCCP sender MUST check
the ECN bits of the IP header echoed in the ICMP message and only
perform this optimization if these ECN bits indicate that the packet
did not experience congestion prior to reaching the router whose link
MTU it exceeded.
A DCCP implementation SHOULD ensure, as far as possible, that ICMP
Datagram Too Big messages were actually generated by routers, so that
attackers cannot drive the PMTU down to a falsely small value. The
simplest way to do this is to verify that the Sequence Number on the
ICMP error's encapsulated header corresponds to a Sequence Number
that the implementation recently sent. (According to current
specifications, routers should return the full DCCP header and
payload up to a maximum of 576 bytes [RFC1812] or the minimum IPv6
MTU [RFC2463], although they are not required to return more than 64
bits [RFC792]. Any amount greater than 128 bits will include the
Sequence Number.) ICMP Datagram Too Big messages with incorrect or
missing Sequence Numbers may be ignored, or the DCCP implementation
may lower the PMTU only temporarily in response. If more than three
odd Datagram Too Big messages are received and the other DCCP
endpoint reports more than three lost packets, however, the DCCP
implementation SHOULD assume the presence of a confused router and
either obey the ICMP messages' PMTU or (on IPv4 networks) switch to
allowing fragmentation.
DCCP also allows upward probing of the PMTU [PMTUD], where the DCCP
endpoint begins by sending small packets with DF set and then
gradually increases the packet size until a packet is lost. This
mechanism does not require any ICMP error processing. DCCP-Sync
packets are the best choice for upward probing, since DCCP-Sync
probes do not risk application data loss. The DCCP implementation
inserts arbitrary data into the DCCP-Sync application area, padding
the packet to the right length. Since every valid DCCP-Sync
generates an immediate DCCP-SyncAck in response, the endpoint will
have a pretty good idea of when a probe is lost.
14.2. Sender Behavior
A DCCP sender SHOULD send every packet as unfragmentable, as
described above, with the following exceptions.
o On IPv4 connections whose applications have requested
fragmentation, the sender SHOULD send packets with the DF bit not
set.
Kohler, et al. Standards Track [Page 103]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
o On IPv6 connections whose applications have requested
fragmentation, the sender SHOULD use fragmentation extension
headers to fragment packets larger than PMTU into suitably-sized
chunks. (Those chunks are, of course, unfragmentable.)
o It is undesirable for PMTU discovery to occur on the initial
connection setup handshake, as the connection setup process may
not be representative of packet sizes used during the connection,
and performing MTU discovery on the initial handshake might
unnecessarily delay connection establishment. Thus, DCCP-Request
and DCCP-Response packets SHOULD be sent as fragmentable. In
addition, DCCP-Reset packets SHOULD be sent as fragmentable,
although typically these would be small enough to not be a
problem. For IPv4 connections, these packets SHOULD be sent with
the DF bit not set; for IPv6 connections, they SHOULD be
preemptively fragmented to a size not larger than the relevant
interface MTU.
If the DCCP implementation has decreased the PMTU, the sending
application has not requested fragmentation, and the sending
application attempts to send a packet larger than the new MPS, the
API MUST refuse to send the packet and return an appropriate error to
the application. The application should then use the API to query
the new value of MPS. The kernel might have some packets buffered
for transmission that are smaller than the old MPS but larger than
the new MPS. It MAY send these packets as fragmentable, or it MAY
discard these packets; it MUST NOT send them as unfragmentable.
15. Forward Compatibility
Future versions of DCCP may add new options and features. A few
simple guidelines will let extended DCCPs interoperate with normal
DCCPs.
o DCCP processors MUST NOT act punitively towards options and
features they do not understand. For example, DCCP processors
MUST NOT reset the connection if some field marked Reserved in
this specification is non-zero; if some unknown option is present;
or if some feature negotiation option mentions an unknown feature.
Instead, DCCP processors MUST ignore these events. The Mandatory
option is the single exception: if Mandatory precedes some unknown
option or feature, the connection MUST be reset.
o DCCP processors MUST anticipate the possibility of unknown feature
values, which might occur as part of a negotiation for a known
feature. For server-priority features, unknown values are handled
as a matter of course: since the non-extended DCCP's priority list
will not contain unknown values, the result of the negotiation
Kohler, et al. Standards Track [Page 104]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
cannot be an unknown value. A DCCP MUST respond with an empty
Confirm option if it is assigned an unacceptable value for some
non-negotiable feature.
o Each DCCP extension SHOULD be controlled by some feature. The
default value of this feature SHOULD correspond to "extension not
available". If an extended DCCP wants to use the extension, it
SHOULD attempt to change the feature's value using a Change L or
Change R option. Any non-extended DCCP will ignore the option,
thus leaving the feature value at its default, "extension not
available".
Section 19 lists DCCP assigned numbers reserved for experimental and
testing purposes.
16. Middlebox Considerations
This section describes properties of DCCP that firewalls, network
address translators, and other middleboxes should consider, including
parts of the packet that middleboxes should not change. The intent
is to draw attention to aspects of DCCP that may be useful, or
dangerous, for middleboxes, or that differ significantly from TCP.
The Service Code field in DCCP-Request packets provides information
that may be useful for stateful middleboxes. With Service Code, a
middlebox can tell what protocol a connection will use without
relying on port numbers. Middleboxes can disallow connections that
attempt to access unexpected services by sending a DCCP-Reset with
Reset Code 8, "Bad Service Code". Middleboxes should not modify the
Service Code unless they are really changing the service a connection
is accessing.
The Source and Destination Port fields are in the same packet
locations as the corresponding fields in TCP and UDP, which may
simplify some middlebox implementations.
The forward compatibility considerations in Section 15 apply to
middleboxes as well. In particular, middleboxes generally shouldn't
act punitively towards options and features they do not understand.
Modifying DCCP Sequence Numbers and Acknowledgement Numbers is more
tedious and dangerous than modifying TCP sequence numbers. A
middlebox that added packets to or removed packets from a DCCP
connection would have to modify acknowledgement options, such as Ack
Vector, and CCID-specific options, such as TFRC's Loss Intervals, at
minimum. On ECN-capable connections, the middlebox would have to
keep track of ECN Nonce information for packets it introduced or
removed, so that the relevant acknowledgement options continued to
Kohler, et al. Standards Track [Page 105]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
have correct ECN Nonce Echoes, or risk the connection being reset for
"Aggression Penalty". We therefore recommend that middleboxes not
modify packet streams by adding or removing packets.
Note that there is less need to modify DCCP's per-packet sequence
numbers than to modify TCP's per-byte sequence numbers; for example,
a middlebox can change the contents of a packet without changing its
sequence number. (In TCP, sequence number modification is required
to support protocols like FTP that carry variable-length addresses in
the data stream. If such an application were deployed over DCCP,
middleboxes would simply grow or shrink the relevant packets as
necessary without changing their sequence numbers. This might
involve fragmenting the packet.)
Middleboxes may, of course, reset connections in progress. Clearly,
this requires inserting a packet into one or both packet streams, but
the difficult issues do not arise.
DCCP is somewhat unfriendly to "connection splicing" [SHHP00], in
which clients' connection attempts are intercepted, but possibly
later "spliced in" to external server connections via sequence number
manipulations. A connection splicer at minimum would have to ensure
that the spliced connections agreed on all relevant feature values,
which might take some renegotiation.
The contents of this section should not be interpreted as a wholesale
endorsement of stateful middleboxes.
17. Relations to Other Specifications
17.1. RTP
The Real-Time Transport Protocol, RTP [RFC3550], is currently used
over UDP by many of DCCP's target applications (for instance,
streaming media). Therefore, it is important to examine the
relationship between DCCP and RTP and, in particular, the question of
whether any changes in RTP are necessary or desirable when it is
layered over DCCP instead of UDP.
There are two potential sources of overhead in the RTP-over-DCCP
combination: duplicated acknowledgement information and duplicated
sequence numbers. Together, these sources of overhead add slightly
more than 4 bytes per packet relative to RTP-over-UDP, and
eliminating the redundancy would not reduce the overhead.
First, consider acknowledgements. Both RTP and DCCP report feedback
about loss rates to data senders, via RTP Control Protocol Sender and
Receiver Reports (RTCP SR/RR packets) and via DCCP acknowledgement
Kohler, et al. Standards Track [Page 106]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
options. These feedback mechanisms are potentially redundant.
However, RTCP SR/RR packets contain information not present in DCCP
acknowledgements, such as "interarrival jitter", and DCCP's
acknowledgements contain information not transmitted by RTCP, such as
the ECN Nonce Echo. Neither feedback mechanism makes the other
redundant.
Sending both types of feedback need not be particularly costly
either. RTCP reports may be sent relatively infrequently: once every
5 seconds on average, for low-bandwidth flows. In DCCP, some
feedback mechanisms are expensive -- Ack Vector, for example, is
frequent and verbose -- but others are relatively cheap: CCID 3
(TFRC) acknowledgements take between 16 and 32 bytes of options sent
once per round-trip time. (Reporting less frequently than once per
RTT would make congestion control less responsive to loss.) We
therefore conclude that acknowledgement overhead in RTP-over-DCCP
need not be significantly higher than for RTP-over-UDP, at least for
CCID 3.
One clear redundancy can be addressed at the application level. The
verbose packet-by-packet loss reports sent in RTCP Extended Reports
Loss RLE Blocks [RFC3611] can be derived from DCCP's Ack Vector
options. (The converse is not true, since Loss RLE Blocks contain no
ECN information.) Since DCCP implementations should provide an API
for application access to Ack Vector information, RTP-over-DCCP
applications might request either DCCP Ack Vectors or RTCP Extended
Report Loss RLE Blocks, but not both.
Now consider sequence number redundancy on data packets. The
embedded RTP header contains a 16-bit RTP sequence number. Most data
packets will use the DCCP-Data type; DCCP-DataAck and DCCP-Ack
packets need not usually be sent. The DCCP-Data header is 12 bytes
long without options, including a 24-bit sequence number. This is 4
bytes more than a UDP header. Any options required on data packets
would add further overhead, although many CCIDs (for instance, CCID
3, TFRC) don't require options on most data packets.
The DCCP sequence number cannot be inferred from the RTP sequence
number since it increments on non-data packets as well as data
packets. The RTP sequence number cannot be inferred from the DCCP
sequence number either [RFC3550]. Furthermore, removing RTP's
sequence number would not save any header space because of alignment
issues. We therefore recommend that RTP transmitted over DCCP use
the same headers currently defined. The 4 byte header cost is a
reasonable tradeoff for DCCP's congestion control features and access
to ECN. Truly bandwidth-starved endpoints should use some header
compression scheme.
Kohler, et al. Standards Track [Page 107]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
17.2. Congestion Manager and Multiplexing
Since DCCP doesn't provide reliable, ordered delivery, multiple
application sub-flows may be multiplexed over a single DCCP
connection with no inherent performance penalty. Thus, there is no
need for DCCP to provide built-in support for multiple sub-flows.
This differs from SCTP [RFC2960].
Some applications might want to share congestion control state among
multiple DCCP flows that share the same source and destination
addresses. This functionality could be provided by the Congestion
Manager [RFC3124], a generic multiplexing facility. However, the CM
would not fully support DCCP without change; it does not gracefully
handle multiple congestion control mechanisms, for example.
18. Security Considerations
DCCP does not provide cryptographic security guarantees.
Applications desiring cryptographic security services (integrity,
authentication, confidentiality, access control, and anti-replay
protection) should use IPsec or end-to-end security of some kind;
Secure RTP is one candidate protocol [RFC3711].
Nevertheless, DCCP is intended to protect against some classes of
attackers: Attackers cannot hijack a DCCP connection (close the
connection unexpectedly, or cause attacker data to be accepted by an
endpoint as if it came from the sender) unless they can guess valid
sequence numbers. Thus, as long as endpoints choose initial sequence
numbers well, a DCCP attacker must snoop on data packets to get any
reasonable probability of success. Sequence number validity checks
provide this guarantee. Section 7.5.5 describes sequence number
security further. This security property only holds assuming that
DCCP's random numbers are chosen according to the guidelines in
[RFC4086].
DCCP also provides mechanisms to limit the potential impact of some
denial-of-service attacks. These mechanisms include Init Cookie
(Section 8.1.4), the DCCP-CloseReq packet (Section 5.5), the
Application Not Listening Drop Code (Section 11.7.2), limitations on
the processing of options that might cause connection reset (Section
7.5.5), limitations on the processing of some ICMP messages (Section
14.1), and various rate limits, which let servers avoid extensive
computation or packet generation (Sections 7.5.3, 8.1.3, and others).
DCCP provides no protection against attackers that can snoop on data
packets.
Kohler, et al. Standards Track [Page 108]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
18.1. Security Considerations for Partial Checksums
The partial checksum facility has a separate security impact,
particularly in its interaction with authentication and encryption
mechanisms. The impact is the same in DCCP as in the UDP-Lite
protocol, and what follows was adapted from the corresponding text in
the UDP-Lite specification [RFC3828].
When a DCCP packet's Checksum Coverage field is not zero, the
uncovered portion of a packet may change in transit. This is
contrary to the idea behind most authentication mechanisms:
authentication succeeds if the packet has not changed in transit.
Unless authentication mechanisms that operate only on the sensitive
part of packets are developed and used, authentication will always
fail for partially-checksummed DCCP packets whose uncovered part has
been damaged.
The IPsec integrity check (Encapsulation Security Protocol, ESP, or
Authentication Header, AH) is applied (at least) to the entire IP
packet payload. Corruption of any bit within that area will then
result in the IP receiver's discarding a DCCP packet, even if the
corruption happened in an uncovered part of the DCCP application
data.
When IPsec is used with ESP payload encryption, a link can not
determine the specific transport protocol of a packet being forwarded
by inspecting the IP packet payload. In this case, the link MUST
provide a standard integrity check covering the entire IP packet and
payload. DCCP partial checksums provide no benefit in this case.
Encryption (e.g., at the transport or application levels) may be
used. Note that omitting an integrity check can, under certain
circumstances, compromise confidentiality [B98].
If a few bits of an encrypted packet are damaged, the decryption
transform will typically spread errors so that the packet becomes too
damaged to be of use. Many encryption transforms today exhibit this
behavior. There exist encryption transforms, stream ciphers, that do
not cause error propagation. Proper use of stream ciphers can be
quite difficult, especially when authentication checking is omitted
[BB01]. In particular, an attacker can cause predictable changes to
the ultimate plaintext, even without being able to decrypt the
ciphertext.
Kohler, et al. Standards Track [Page 109]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
19. IANA Considerations
IANA has assigned IP Protocol Number 33 to DCCP.
DCCP introduces eight sets of numbers whose values should be
allocated by IANA. We refer to allocation policies, such as
Standards Action, outlined in [RFC2434], and most registries reserve
some values for experimental and testing use [RFC3692]. In addition,
DCCP requires that the IANA Port Numbers registry be opened for DCCP
port registrations; Section 19.9 describes how. The IANA should feel
free to contact the DCCP Expert Reviewer with questions on any
registry, regardless of the registry policy, for clarification or if
there is a problem with a request.
19.1. Packet Types Registry
Each entry in the DCCP Packet Types registry contains a packet type,
which is a number in the range 0-15; a packet type name, such as
DCCP-Request; and a reference to the RFC defining the packet type.
The registry is initially populated using the values in Table 1
(Section 5.1). This document allocates packet types 0-9, and packet
type 14 is permanently reserved for experimental and testing use.
Packet types 10-13 and 15 are currently reserved and should be
allocated with the Standards Action policy, which requires IESG
review and approval and standards-track IETF RFC publication.
19.2. Reset Codes Registry
Each entry in the DCCP Reset Codes registry contains a Reset Code,
which is a number in the range 0-255; a short description of the
Reset Code, such as "No Connection"; and a reference to the RFC
defining the Reset Code. The registry is initially populated using
the values in Table 2 (Section 5.6). This document allocates Reset
Codes 0-11, and Reset Codes 120-126 are permanently reserved for
experimental and testing use. Reset Codes 12-119 and 127 are
currently reserved and should be allocated with the IETF Consensus
policy, requiring an IETF RFC publication (standards track or not)
with IESG review and approval. Reset Codes 128-255 are permanently
reserved for CCID-specific registries; each CCID Profile document
describes how the corresponding registry is managed.
19.3. Option Types Registry
Each entry in the DCCP option types registry contains an option type,
which is a number in the range 0-255; the name of the option, such as
"Slow Receiver"; and a reference to the RFC defining the option type.
The registry is initially populated using the values in Table 3
(Section 5.8). This document allocates option types 0-2 and 32-44,
Kohler, et al. Standards Track [Page 110]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
and option types 31 and 120-126 are permanently reserved for
experimental and testing use. Option types 3-30, 45-119, and 127 are
currently reserved and should be allocated with the IETF Consensus
policy, requiring an IETF RFC publication (standards track or not)
with IESG review and approval. Option types 128-255 are permanently
reserved for CCID-specific registries; each CCID Profile document
describes how the corresponding registry is managed.
19.4. Feature Numbers Registry
Each entry in the DCCP feature numbers registry contains a feature
number, which is a number in the range 0-255; the name of the
feature, such as "ECN Incapable"; and a reference to the RFC defining
the feature number. The registry is initially populated using the
values in Table 4 (Section 6). This document allocates feature
numbers 0-9, and feature numbers 120-126 are permanently reserved for
experimental and testing use. Feature numbers 10-119 and 127 are
currently reserved and should be allocated with the IETF Consensus
policy, requiring an IETF RFC publication (standards track or not)
with IESG review and approval. Feature numbers 128-255 are
permanently reserved for CCID-specific registries; each CCID Profile
document describes how the corresponding registry is managed.
19.5. Congestion Control Identifiers Registry
Each entry in the DCCP Congestion Control Identifiers (CCIDs)
registry contains a CCID, which is a number in the range 0-255; the
name of the CCID, such as "TCP-like Congestion Control"; and a
reference to the RFC defining the CCID. The registry is initially
populated using the values in Table 5 (Section 10). CCIDs 2 and 3
are allocated by concurrently published profiles, and CCIDs 248-254
are permanently reserved for experimental and testing use. CCIDs 0,
1, 4-247, and 255 are currently reserved and should be allocated with
the IETF Consensus policy, requiring an IETF RFC publication
(standards track or not) with IESG review and approval.
19.6. Ack Vector States Registry
Each entry in the DCCP Ack Vector States registry contains an Ack
Vector State, which is a number in the range 0-3; the name of the
State, such as "Received ECN Marked"; and a reference to the RFC
defining the State. The registry is initially populated using the
values in Table 6 (Section 11.4). This document allocates States 0,
1, and 3. State 2 is currently reserved and should be allocated with
the Standards Action policy, which requires IESG review and approval
and standards-track IETF RFC publication.
Kohler, et al. Standards Track [Page 111]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
19.7. Drop Codes Registry
Each entry in the DCCP Drop Codes registry contains a Data Dropped
Drop Code, which is a number in the range 0-7; the name of the Drop
Code, such as "Application Not Listening"; and a reference to the RFC
defining the Drop Code. The registry is initially populated using
the values in Table 7 (Section 11.7). This document allocates Drop
Codes 0-3 and 7. Drop Codes 4-6 are currently reserved, and should
be allocated with the Standards Action policy, which requires IESG
review and approval and standards-track IETF RFC publication.
19.8. Service Codes Registry
Each entry in the Service Codes registry contains a Service Code,
which is a number in the range 0-4294967294; a short English
description of the intended service; and an optional reference to an
RFC or other publicly available specification defining the Service
Code. The registry should list the Service Code's numeric value as a
decimal number. When the Service Code may be represented in "SC:"
format according to the rules in Section 8.1.2, the registry should
also show the corresponding ASCII interpretation of the Service Code
minus the "SC:" prefix. Thus, the number 1717858426 would
additionally appear as "fdpz". Service Codes are not DCCP-specific.
Service Code 0 is permanently reserved (it represents the absence of
a meaningful Service Code), and Service Codes 1056964608-1073741823
(high byte ASCII "?") are reserved for Private Use. Note that
4294967295 is not a valid Service Code. Most of the remaining
Service Codes are allocated First Come First Served, with no RFC
publication required; exceptions are listed in Section 8.1.2. This
document allocates a single Service Code, 1145656131 ("DISC"). This
corresponds to the discard service, which discards all data sent to
the service and sends no data in reply.
19.9. Port Numbers Registry
DCCP services may use contact port numbers to provide service to
unknown callers, as in TCP and UDP. IANA is therefore requested to
open the existing Port Numbers registry for DCCP using the following
rules, which we intend to mesh well with existing Port Numbers
registration procedures.
Port numbers are divided into three ranges. The Well Known Ports are
those from 0 through 1023, the Registered Ports are those from 1024
through 49151, and the Dynamic and/or Private Ports are those from
49152 through 65535. Well Known and Registered Ports are intended
for use by server applications that desire a default contact point on
a system. On most systems, Well Known Ports can only be used by
system (or root) processes or by programs executed by privileged
Kohler, et al. Standards Track [Page 112]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
users, while Registered Ports can be used by ordinary user processes
or programs executed by ordinary users. Dynamic and/or Private Ports
are intended for temporary use, including client-side ports, out-of-
band negotiated ports, and application testing prior to registration
of a dedicated port; they MUST NOT be registered.
The Port Numbers registry should accept registrations for DCCP ports
in the Well Known Ports and Registered Ports ranges. Well Known and
Registered Ports SHOULD NOT be used without registration. Although
in some cases -- such as porting an application from UDP to DCCP --
it may seem natural to use a DCCP port before registration completes,
we emphasize that IANA will not guarantee registration of particular
Well Known and Registered Ports. Registrations should be requested
as early as possible.
Each port registration SHALL include the following information:
o A short port name, consisting entirely of letters (A-Z and a-z),
digits (0-9), and punctuation characters from "-_+./*" (not
including the quotes).
o The port number that is requested to be registered.
o A short English phrase describing the port's purpose. This MUST
include one or more space-separated textual Service Code
descriptors naming the port's corresponding Service Codes (see
Section 8.1.2).
o Name and contact information for the person or entity performing
the registration, and possibly a reference to a document defining
the port's use. Registrations coming from IETF working groups
need only name the working group, but indicating a contact person
is recommended.
Registrants are encouraged to follow these guidelines when submitting
a registration.
o A port name SHOULD NOT be registered for more than one DCCP port
number.
o A port name registered for UDP MAY be registered for DCCP as well.
Any such registration SHOULD use the same port number as the
existing UDP registration.
o Concrete intent to use a port SHOULD precede port registration.
For example, existing UDP ports SHOULD NOT be registered in
advance of any intent to use those ports for DCCP.
Kohler, et al. Standards Track [Page 113]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
o A port name generally associated with TCP and/or SCTP SHOULD NOT
be registered for DCCP, since that port name implies reliable
transport. For example, we discourage registration of any "http"
port for DCCP. However, if such a registration makes sense (that
is, if there is concrete intent to use such a port), the DCCP
registration SHOULD use the same port number as the existing
registration.
o Multiple DCCP registrations for the same port number are allowed
as long as the registrations' Service Codes do not overlap.
This document registers the following port. (This should be
considered a model registration.)
discard 9/dccp Discard SC:DISC
# IETF dccp WG, Eddie Kohler <kohler@cs.ucla.edu>, [RFC4340]
The discard service, which accepts DCCP connections on port 9,
discards all incoming application data and sends no data in response.
Thus, DCCP's discard port is analogous to TCP's discard port, and
might be used to check the health of a DCCP stack.
20. Thanks
Thanks to Jitendra Padhye for his help with early versions of this
specification.
Thanks to Junwen Lai and Arun Venkataramani, who, as interns at ICIR,
built a prototype DCCP implementation. In particular, Junwen Lai
recommended that the old feature negotiation mechanism be scrapped
and co-designed the current mechanism. Arun Venkataramani's feedback
improved Appendix A.
We thank the staff and interns of ICIR and, formerly, ACIRI, the
members of the End-to-End Research Group, and the members of the
Transport Area Working Group for their feedback on DCCP. We
especially thank the DCCP expert reviewers Greg Minshall, Eric
Rescorla, and Magnus Westerlund for detailed written comments and
problem spotting, and Rob Austein and Steve Bellovin for verbal
comments and written notes. We also especially thank Aaron Falk, the
working group chair during the development of this specification.
We also thank those who provided comments and suggestions via the
DCCP BOF, Working Group, and mailing lists, including Damon Lanphear,
Patrick McManus, Colin Perkins, Sara Karlberg, Kevin Lai, Bernard
Aboba, Youngsoo Choi, Pengfei Di, Dan Duchamp, Lars Eggert, Gorry
Fairhurst, Derek Fawcus, David Timothy Fleeman, John Loughney,
Ghyslain Pelletier, Hagen Paul Pfeifer, Tom Phelan, Stanislav
Kohler, et al. Standards Track [Page 114]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
Shalunov, Somsak Vanit-Anunchai, David Vos, Yufei Wang, and Michael
Welzl. In particular, Colin Perkins provided extensive, detailed
feedback, Michael Welzl suggested the Data Checksum option, Gorry
Fairhurst provided extensive feedback on various checksum issues, and
Somsak Vanit-Anunchai, Jonathan Billington, and Tul Kongprakaiwoot's
Colored Petri Net model [VBK05] discovered several problems with
message exchange.
Kohler, et al. Standards Track [Page 115]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
A. Appendix: Ack Vector Implementation Notes
This appendix discusses particulars of DCCP acknowledgement handling
in the context of an abstract implementation for Ack Vector. It is
informative and not normative.
The first part of our implementation runs at the HC-Receiver, and
therefore acknowledges data packets. It generates Ack Vector
options. The implementation has the following characteristics:
o At most one byte of state per acknowledged packet.
o O(1) time to update that state when a new packet arrives (normal
case).
o Cumulative acknowledgements.
o Quick removal of old state.
The basic data structure is a circular buffer containing information
about acknowledged packets. Each byte in this buffer contains a
state and run length; the state can be 0 (packet received), 1 (packet
ECN marked), or 3 (packet not yet received). The buffer grows from
right to left. The implementation maintains five variables, aside
from the buffer contents:
o "buf_head" and "buf_tail", which mark the live portion of the
buffer.
o "buf_ackno", the Acknowledgement Number of the most recent packet
acknowledged in the buffer. This corresponds to the "head"
pointer.
o "buf_nonce", the one-bit sum (exclusive-or, or parity) of the ECN
Nonces received on all packets acknowledged by the buffer with
State 0.
We draw acknowledgement buffers like this:
+---------------------------------------------------------------+
|S,L|S,L|S,L|S,L| | | | |S,L|S,L|S,L|S,L|S,L|S,L|S,L|S,L|
+---------------------------------------------------------------+
^ ^
buf_tail buf_head, buf_ackno = A buf_nonce = E
<=== buf_head and buf_tail move this way <===
Kohler, et al. Standards Track [Page 116]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
Each "S,L" represents a State/Run length byte. We will draw these
buffers showing only their live portion and will add an annotation
showing the Acknowledgement Number for the last live byte in the
buffer. For example:
+-----------------------------------------------+
A |S,L|S,L|S,L|S,L|S,L|S,L|S,L|S,L|S,L|S,L|S,L|S,L| T BN[E]
+-----------------------------------------------+
Here, buf_nonce equals E and buf_ackno equals A.
We will use this buffer as a running example.
+---------------------------+
10 |0,0|3,0|3,0|3,0|0,4|1,0|0,0| 0 BN[1] [Example Buffer]
+---------------------------+
In concrete terms, its meaning is as follows:
Packet 10 was received. (The head of the buffer has sequence
number 10, state 0, and run length 0.)
Packets 9, 8, and 7 have not yet been received. (The three bytes
preceding the head each have state 3 and run length 0.)
Packets 6, 5, 4, 3, and 2 were received.
Packet 1 was ECN marked.
Packet 0 was received.
The one-bit sum of the ECN Nonces on packets 10, 6, 5, 4, 3, 2,
and 0 equals 1.
Additionally, the HC-Receiver must keep some information about the
Ack Vectors it has recently sent. For each packet sent carrying an
Ack Vector, it remembers four variables:
o "ack_seqno", the Sequence Number used for the packet. This is an
HC-Receiver sequence number.
o "ack_ptr", the value of buf_head at the time of acknowledgement.
o "ack_runlen", the run length stored in the byte of buffer data at
buf_head at the time of acknowledgement.
Kohler, et al. Standards Track [Page 117]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
o "ack_ackno", the Acknowledgement Number used for the packet. This
is an HC-Sender sequence number. Since acknowledgements are
cumulative, this single number completely specifies all necessary
information about the packets acknowledged by this Ack Vector.
o "ack_nonce", the one-bit sum of the ECN Nonces for all State 0
packets in the buffer from buf_head to ack_ackno, inclusive.
Initially, this equals the Nonce Echo of the acknowledgement's Ack
Vector (or, if the ack packet contained more than one Ack Vector,
the exclusive-or of all the acknowledgement's Ack Vectors). It
changes as information about old acknowledgements is removed (so
ack_ptr and buf_head diverge) and as old packets arrive (so they
change from State 3 or State 1 to State 0).
A.1. Packet Arrival
This section describes how the HC-Receiver updates its
acknowledgement buffer as packets arrive from the HC-Sender.
A.1.1. New Packets
When a packet with Sequence Number greater than buf_ackno arrives,
the HC-Receiver updates buf_head (by moving it to the left
appropriately), buf_ackno (which is set to the new packet's Sequence
Number), and possibly buf_nonce (if the packet arrived unmarked with
ECN Nonce 1), in addition to the buffer itself. For example, if
HC-Sender packet 11 arrived ECN marked, the Example Buffer above
would enter this new state (changes are marked with stars):
** +***----------------------------+
11 |1,0|0,0|3,0|3,0|3,0|0,4|1,0|0,0| 0 BN[1]
** +***----------------------------+
If the packet's state equals the state at the head of the buffer, the
HC-Receiver may choose to increment its run length (up to the
maximum). For example, if HC-Sender packet 11 arrived without ECN
marking and with ECN Nonce 0, the Example Buffer might enter this
state instead:
** +--*------------------------+
11 |0,1|3,0|3,0|3,0|0,4|1,0|0,0| 0 BN[1]
** +--*------------------------+
Kohler, et al. Standards Track [Page 118]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
Of course, the new packet's sequence number might not equal the
expected sequence number. In this case, the HC-Receiver will enter
the intervening packets as State 3. If several packets are missing,
the HC-Receiver may prefer to enter multiple bytes with run length 0,
rather than a single byte with a larger run length; this simplifies
table updates if one of the missing packets arrives. For example, if
HC-Sender packet 12 arrived with ECN Nonce 1, the Example Buffer
would enter this state:
** +*******----------------------------+ *
12 |0,0|3,0|0,1|3,0|3,0|3,0|0,4|1,0|0,0| 0 BN[0]
** +*******----------------------------+ *
Of course, the circular buffer may overflow when the HC-Sender is
sending data at a very high rate, when the HC-Receiver's
acknowledgements are not reaching the HC-Sender, or when the
HC-Sender is forgetting to acknowledge those acks (so the HC-Receiver
is unable to clean up old state). In this case, the HC-Receiver
should either compress the buffer (by increasing run lengths when
possible), transfer its state to a larger buffer, or, as a last
resort, drop all received packets, without processing them at all,
until its buffer shrinks again.
A.1.2. Old Packets
When a packet with Sequence Number S <= buf_ackno arrives, the
HC-Receiver will scan the table for the byte corresponding to S.
(Indexing structures could reduce the complexity of this scan.) If S
was previously lost (State 3), and it was stored in a byte with run
length 0, the HC-Receiver can simply change the byte's state. For
example, if HC-Sender packet 8 was received with ECN Nonce 0, the
Example Buffer would enter this state:
+--------*------------------+
10 |0,0|3,0|0,0|3,0|0,4|1,0|0,0| 0 BN[1]
+--------*------------------+
If S was not marked as lost, or if it was not contained in the table,
the packet is probably a duplicate and should be ignored. (The new
packet's ECN marking state might differ from the state in the buffer;
Section 11.4.1 describes what is allowed then.) If S's buffer byte
has a non-zero run length, then the buffer might need to be
reshuffled to make space for one or two new bytes.
The ack_nonce fields may also need manipulation when old packets
arrive. In particular, when S transitions from State 3 or State 1 to
State 0, and S had ECN Nonce 1, then the implementation should flip
the value of ack_nonce for every acknowledgement with ack_ackno >= S.
Kohler, et al. Standards Track [Page 119]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
It is impossible with this data structure to shift packets from State
0 to State 1, since the buffer doesn't store individual packets' ECN
Nonces.
A.2. Sending Acknowledgements
Whenever the HC-Receiver needs to generate an acknowledgement, the
buffer's contents can simply be copied into one or more Ack Vector
options. Copied Ack Vectors might not be maximally compressed; for
example, the Example Buffer above contains three adjacent 3,0 bytes
that could be combined into a single 3,2 byte. The HC-Receiver
might, therefore, choose to compress the buffer in place before
sending the option, or to compress the buffer while copying it;
either operation is simple.
Every acknowledgement sent by the HC-Receiver SHOULD include the
entire state of the buffer. That is, acknowledgements are
cumulative.
If the acknowledgement fits in one Ack Vector, that Ack Vector's
Nonce Echo simply equals buf_nonce. For multiple Ack Vectors, more
care is required. The Ack Vectors should be split at points
corresponding to previous acknowledgements, since the stored
ack_nonce fields provide enough information to calculate correct
Nonce Echoes. The implementation should therefore acknowledge data
at least once per 253 bytes of buffer state. (Otherwise, there'd be
no way to calculate a Nonce Echo.)
For each acknowledgement it sends, the HC-Receiver will add an
acknowledgement record. ack_seqno will equal the HC-Receiver
sequence number it used for the ack packet; ack_ptr will equal
buf_head; ack_runlen will equal the run length stored in the buffer's
buf_head byte; ack_ackno will equal buf_ackno; and ack_nonce will
equal buf_nonce.
A.3. Clearing State
Some of the HC-Sender's packets will include acknowledgement numbers,
which ack the HC-Receiver's acknowledgements. When such an ack is
received, the HC-Receiver finds the acknowledgement record R with the
appropriate ack_seqno and then does the following:
o If the run length in the buffer's R.ack_ptr byte is greater than
R.ack_runlen, then it decrements that run length by
R.ack_runlen + 1 and sets buf_tail to R.ack_ptr. Otherwise, it
sets buf_tail to R.ack_ptr + 1.
Kohler, et al. Standards Track [Page 120]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
o If R.ack_nonce is 1, it flips buf_nonce, and the value of
ack_nonce for every later ack record.
o It throws away R and every preceding ack record.
(The HC-Receiver may choose to keep some older information, in case a
lost packet shows up late.) For example, say that the HC-Receiver
storing the Example Buffer had sent two acknowledgements already:
1. ack_seqno = 59, ack_runlen = 1, ack_ackno = 3, ack_nonce = 1.
2. ack_seqno = 60, ack_runlen = 0, ack_ackno = 10, ack_nonce = 0.
Say the HC-Receiver then received a DCCP-DataAck packet with
Acknowledgement Number 59 from the HC-Sender. This informs the
HC-Receiver that the HC-Sender received, and processed, all the
information in HC-Receiver packet 59. This packet acknowledged
HC-Sender packet 3, so the HC-Sender has now received HC-Receiver's
acknowledgements for packets 0, 1, 2, and 3. The Example Buffer
should enter this state:
+------------------*+ * *
10 |0,0|3,0|3,0|3,0|0,2| 4 BN[0]
+------------------*+ * *
The tail byte's run length was adjusted, since packet 3 was in the
middle of that byte. Since R.ack_nonce was 1, the buf_nonce field
was flipped, as were the ack_nonce fields for later acknowledgements
(here, the HC-Receiver Ack 60 record, not shown, has its ack_nonce
flipped to 1). The HC-Receiver can also throw away stored
information about HC-Receiver Ack 59 and any earlier
acknowledgements.
A careful implementation might try to ensure reasonable robustness to
reordering. Suppose that the Example Buffer is as before, but that
packet 9 now arrives, out of sequence. The buffer would enter this
state:
+----*----------------------+
10 |0,0|0,0|3,0|3,0|0,4|1,0|0,0| 0 BN[1]
+----*----------------------+
The danger is that the HC-Sender might acknowledge the HC-Receiver's
previous acknowledgement (with sequence number 60), which says that
Packet 9 was not received, before the HC-Receiver has a chance to
send a new acknowledgement saying that Packet 9 actually was
received. Therefore, when packet 9 arrived, the HC-Receiver might
modify its acknowledgement record as follows:
Kohler, et al. Standards Track [Page 121]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
1. ack_seqno = 59, ack_ackno = 3, ack_nonce = 1.
2. ack_seqno = 60, ack_ackno = 3, ack_nonce = 1.
That is, Ack 60 is now treated like a duplicate of Ack 59. This
would prevent the Tail pointer from moving past packet 9 until the
HC-Receiver knows that the HC-Sender has seen an Ack Vector
indicating that packet's arrival.
A.4. Processing Acknowledgements
When the HC-Sender receives an acknowledgement, it generally cares
about the number of packets that were dropped and/or ECN marked. It
simply reads this off the Ack Vector. Additionally, it should check
the ECN Nonce for correctness. (As described in Section 11.4.1, it
may want to keep more detailed information about acknowledged packets
in case packets change states between acknowledgements, or in case
the application queries whether a packet arrived.)
The HC-Sender must also acknowledge the HC-Receiver's
acknowledgements so that the HC-Receiver can free old Ack Vector
state. (Since Ack Vector acknowledgements are reliable, the
HC-Receiver must maintain and resend Ack Vector information until it
is sure that the HC-Sender has received that information.) A simple
algorithm suffices: since Ack Vector acknowledgements are cumulative,
a single acknowledgement number tells HC-Receiver how much ack
information has arrived. Assuming that the HC-Receiver sends no
data, the HC-Sender can ensure that at least once a round-trip time,
it sends a DCCP-DataAck packet acknowledging the latest DCCP-Ack
packet it has received. Of course, the HC-Sender only needs to
acknowledge the HC-Receiver's acknowledgements if the HC-Sender is
also sending data. If the HC-Sender is not sending data, then the
HC-Receiver's Ack Vector state is stable, and there is no need to
shrink it. The HC-Sender must watch for drops and ECN marks on
received DCCP-Ack packets so that it can adjust the HC-Receiver's
ack-sending rate in response to congestion, for example, with Ack
Ratio.
If the other half-connection is not quiescent -- that is, the
HC-Receiver is sending data to the HC-Sender, possibly using another
CCID -- then the acknowledgements on that half-connection are
sufficient for the HC-Receiver to free its state.
Kohler, et al. Standards Track [Page 122]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
B. Appendix: Partial Checksumming Design Motivation
A great deal of discussion has taken place regarding the utility of
allowing a DCCP sender to restrict the checksum so that it does not
cover the complete packet. This section attempts to capture some of
the rationale behind specific details of DCCP design.
Many of the applications that we envisage using DCCP are resilient to
some degree of data loss, or they would typically have chosen a
reliable transport. Some of these applications may also be resilient
to data corruption -- some audio payloads, for example. These
resilient applications might rather receive corrupted data than have
DCCP drop corrupted packets. This is particularly because of
congestion control: DCCP cannot tell the difference between packets
dropped due to corruption and packets dropped due to congestion, and
so it must reduce the transmission rate accordingly. This response
may cause the connection to receive less bandwidth than it is due;
corruption in some networking technologies is independent of, or at
least not always correlated to, congestion. Therefore, corrupted
packets do not need to cause as strong a reduction in transmission
rate as the congestion response would dictate (as long as the DCCP
header and options are not corrupt).
Thus DCCP allows the checksum to cover all of the packet, just the
DCCP header, or both the DCCP header and some number of bytes from
the application data. If the application cannot tolerate any data
corruption, then the checksum must cover the whole packet. If the
application would prefer to tolerate some corruption rather than have
the packet dropped, then it can set the checksum to cover only part
of the packet (but always the DCCP header). In addition, if the
application wishes to decouple checksumming of the DCCP header from
checksumming of the application data, it may do so by including the
Data Checksum option. This would allow DCCP to discard corrupted
application data without mistaking the corruption for network
congestion.
Thus, from the application point of view, partial checksums seem to
be a desirable feature. However, the usefulness of partial checksums
depends on partially corrupted packets being delivered to the
receiver. If the link-layer CRC always discards corrupted packets,
then this will not happen, and so the usefulness of partial checksums
would be restricted to corruption that occurred in routers and other
places not covered by link CRCs. There does not appear to be
consensus on how likely it is that future network links that suffer
significant corruption will not cover the entire packet with a single
strong CRC. DCCP makes it possible to tailor such links to the
application, but it is difficult to predict if this will be
compelling for future link technologies.
Kohler, et al. Standards Track [Page 123]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
In addition, partial checksums do not co-exist well with IP-level
authentication mechanisms such as IPsec AH, which cover the entire
packet with a cryptographic hash. Thus, if cryptographic
authentication mechanisms are required to co-exist with partial
checksums, the authentication must be carried in the application
data. A possible mode of usage would appear to be similar to that of
Secure RTP. However, such "application-level" authentication does
not protect the DCCP option negotiation and state machine from forged
packets. An alternative would be to use IPsec ESP, and to use
encryption to protect the DCCP headers against attack, while using
the DCCP header validity checks to authenticate that the header is
from someone who possessed the correct key. While this is resistant
to replay (due to the DCCP sequence number), it is not by itself
resistant to some forms of man-in-the-middle attacks because the
application data is not tightly coupled to the packet header. Thus,
an application-level authentication probably needs to be coupled with
IPsec ESP or a similar mechanism to provide a reasonably complete
security solution. The overhead of such a solution might be
unacceptable for some applications that would otherwise wish to use
partial checksums.
On balance, the authors believe that DCCP partial checksums have the
potential to enable some future uses that would otherwise be
difficult. As the cost and complexity of supporting them is small,
it seems worth including them at this time. It remains to be seen
whether they are useful in practice.
Normative References
[RFC793] Postel, J., "Transmission Control Protocol", STD 7,
RFC 793, September 1981.
[RFC1191] Mogul, J. and S. Deering, "Path MTU discovery", RFC
1191, November 1990.
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", BCP 14, RFC 2119, March 1997.
[RFC2434] Narten, T. and H. Alvestrand, "Guidelines for Writing
an IANA Considerations Section in RFCs", BCP 26, RFC
2434, October 1998.
[RFC2460] Deering, S. and R. Hinden, "Internet Protocol, Version
6 (IPv6) Specification", RFC 2460, December 1998.
[RFC3168] Ramakrishnan, K., Floyd, S., and D. Black, "The
Addition of Explicit Congestion Notification (ECN) to
IP", RFC 3168, September 2001.
Kohler, et al. Standards Track [Page 124]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
[RFC3309] Stone, J., Stewart, R., and D. Otis, "Stream Control
Transmission Protocol (SCTP) Checksum Change", RFC
3309, September 2002.
[RFC3692] Narten, T., "Assigning Experimental and Testing
Numbers Considered Useful", BCP 82, RFC 3692, January
2004.
[RFC3775] Johnson, D., Perkins, C., and J. Arkko, "Mobility
Support in IPv6", RFC 3775, June 2004.
[RFC3828] Larzon, L-A., Degermark, M., Pink, S., Jonsson, L-E.,
and G. Fairhurst, "The Lightweight User Datagram
Protocol (UDP-Lite)", RFC 3828, July 2004.
Informative References
[B98] Bellovin, S.M., "Cryptography and the Internet",
CRYPTO '98 (LNCS 1462), pp 46-55, August 1988.
[BB01] Bellovin, S.M. and M. Blaze, "Cryptographic Modes of
Operation for the Internet", 2nd NIST Workshop on
Modes of Operation, August 2001.
[M85] Morris, R.T., "A Weakness in the 4.2BSD Unix TCP/IP
Software", Computer Science Technical Report 117, AT&T
Bell Laboratories, Murray Hill, NJ, February 1985.
[PMTUD] Mathis, M. and J. Heffner, "Path MTU Discovery", Work
in Progress, March 2006.
[RFC792] Postel, J., "Internet Control Message Protocol", STD
5, RFC 792, September 1981.
[RFC1812] Baker, F., "Requirements for IP Version 4 Routers",
RFC 1812, June 1995.
[RFC1948] Bellovin, S., "Defending Against Sequence Number
Attacks", RFC 1948, May 1996.
[RFC1982] Elz, R. and R. Bush, "Serial Number Arithmetic", RFC
1982, August 1996.
[RFC2018] Mathis, M., Mahdavi, J., Floyd, S., and A. Romanow,
"TCP Selective Acknowledgement Options", RFC 2018,
October 1996.
Kohler, et al. Standards Track [Page 125]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
[RFC2401] Kent, S. and R. Atkinson, "Security Architecture for
the Internet Protocol", RFC 2401, November 1998.
[RFC2463] Conta, A. and S. Deering, "Internet Control Message
Protocol (ICMPv6) for the Internet Protocol Version 6
(IPv6) Specification", RFC 2463, December 1998.
[RFC2581] Allman, M., Paxson, V., and W. Stevens, "TCP
Congestion Control", RFC 2581, April 1999.
[RFC2960] Stewart, R., Xie, Q., Morneault, K., Sharp, C.,
Schwarzbauer, H., Taylor, T., Rytina, I., Kalla, M.,
Zhang, L., and V. Paxson, "Stream Control Transmission
Protocol", RFC 2960, October 2000.
[RFC3124] Balakrishnan, H. and S. Seshan, "The Congestion
Manager", RFC 3124, June 2001.
[RFC3360] Floyd, S., "Inappropriate TCP Resets Considered
Harmful", BCP 60, RFC 3360, August 2002.
[RFC3448] Handley, M., Floyd, S., Padhye, J., and J. Widmer,
"TCP Friendly Rate Control (TFRC): Protocol
Specification", RFC 3448, January 2003.
[RFC3540] Spring, N., Wetherall, D., and D. Ely, "Robust
Explicit Congestion Notification (ECN) Signaling with
Nonces", RFC 3540, June 2003.
[RFC3550] Schulzrinne, H., Casner, S., Frederick, R., and V.
Jacobson, "RTP: A Transport Protocol for Real-Time
Applications", STD 64, RFC 3550, July 2003.
[RFC3611] Friedman, T., Caceres, R., and A. Clark, "RTP Control
Protocol Extended Reports (RTCP XR)", RFC 3611,
November 2003.
[RFC3711] Baugher, M., McGrew, D., Naslund, M., Carrara, E., and
K. Norrman, "The Secure Real-time Transport Protocol
(SRTP)", RFC 3711, March 2004.
[RFC3819] Karn, P., Bormann, C., Fairhurst, G., Grossman, D.,
Ludwig, R., Mahdavi, J., Montenegro, G., Touch, J.,
and L. Wood, "Advice for Internet Subnetwork
Designers", BCP 89, RFC 3819, July 2004.
Kohler, et al. Standards Track [Page 126]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
[RFC4086] Eastlake, D., 3rd, Schiller, J., and S. Crocker,
"Randomness Requirements for Security", BCP 106, RFC
4086, June 2005.
[RFC4341] Floyd, S. and E. Kohler, "Profile for Datagram
Congestion Control Protocol (DCCP) Congestion Control
ID 2: TCP-like Congestion Control", RFC 4341, March
2006.
[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.
[SHHP00] Spatscheck, O., Hansen, J.S., Hartman, J.H., and L.L.
Peterson, "Optimizing TCP Forwarder Performance",
IEEE/ACM Transactions on Networking 8(2):146-157,
April 2000.
[SYNCOOKIES] Bernstein, D.J., "SYN Cookies",
http://cr.yp.to/syncookies.html, as of March 2006.
[VBK05] Vanit-Anunchai, S., Billington, J., and T.
Kongprakaiwoot, "Discovering Chatter and
Incompleteness in the Datagram Congestion Control
Protocol", FORTE 2005, pp 143-158, October 2005.
Kohler, et al. Standards Track [Page 127]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
Authors' Addresses
Eddie Kohler
4531C Boelter Hall
UCLA Computer Science Department
Los Angeles, CA 90095
USA
EMail: kohler@cs.ucla.edu
Mark Handley
Department of Computer Science
University College London
Gower Street
London WC1E 6BT
UK
EMail: M.Handley@cs.ucl.ac.uk
Sally Floyd
ICSI Center for Internet Research
1947 Center Street, Suite 600
Berkeley, CA 94704
USA
EMail: floyd@icir.org
Kohler, et al. Standards Track [Page 128]
^L
RFC 4340 Datagram Congestion Control Protocol (DCCP) March 2006
Full Copyright Statement
Copyright (C) The Internet Society (2006).
This document is subject to the rights, licenses and restrictions
contained in BCP 78, and except as set forth therein, the authors
retain all their rights.
This document and the information contained herein are provided on an
"AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET
ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE
INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
Intellectual Property
The IETF takes no position regarding the validity or scope of any
Intellectual Property Rights or other rights that might be claimed to
pertain to the implementation or use of the technology described in
this document or the extent to which any license under such rights
might or might not be available; nor does it represent that it has
made any independent effort to identify any such rights. Information
on the procedures with respect to rights in RFC documents can be
found in BCP 78 and BCP 79.
Copies of IPR disclosures made to the IETF Secretariat and any
assurances of licenses to be made available, or the result of an
attempt made to obtain a general license or permission for the use of
such proprietary rights by implementers or users of this
specification can be obtained from the IETF on-line IPR repository at
http://www.ietf.org/ipr.
The IETF invites any interested party to bring to its attention any
copyrights, patents or patent applications, or other proprietary
rights that may cover technology that may be required to implement
this standard. Please address the information to the IETF at ietf-
ipr@ietf.org.
Acknowledgement
Funding for the RFC Editor function is provided by the IETF
Administrative Support Activity (IASA).
Kohler, et al. Standards Track [Page 129]
^L
|