1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
|
Network Working Group M-K. Shin, Ed.
Request for Comments: 4038 ETRI/NIST
Category: Informational Y-G. Hong
ETRI
J. Hagino
IIJ
P. Savola
CSC/FUNET
E. M. Castro
GSYC/URJC
March 2005
Application Aspects of IPv6 Transition
Status of This Memo
This memo provides information for the Internet community. It does
not specify an Internet standard of any kind. Distribution of this
memo is unlimited.
Copyright Notice
Copyright (C) The Internet Society (2005).
Abstract
As IPv6 networks are deployed and the network transition is
discussed, one should also consider how to enable IPv6 support in
applications running on IPv6 hosts, and the best strategy to develop
IP protocol support in applications. This document specifies
scenarios and aspects of application transition. It also proposes
guidelines on how to develop IP version-independent applications
during the transition period.
Shin, Ed., et al. Informational [Page 1]
^L
RFC 4038 Application Aspects of IPv6 Transition March 2005
Table of Contents
1. Introduction ................................................. 3
2. Overview of IPv6 Application Transition ...................... 3
3. Problems with IPv6 Application Transition .................... 5
3.1. IPv6 Support in the OS and Applications Are Unrelated... 5
3.2. DNS Does Not Indicate Which IP Version Will Be Used .... 6
3.3. Supporting Many Versions of an Application Is Difficult. 6
4. Description of Transition Scenarios and Guidelines ........... 7
4.1. IPv4 Applications in a Dual-Stack Node ................. 7
4.2. IPv6 Applications in a Dual-Stack Node ................. 8
4.3. IPv4/IPv6 Applications in a Dual-Stack Node ............ 11
4.4. IPv4/IPv6 Applications in an IPv4-only Node ............ 12
5. Application Porting Considerations ........................... 12
5.1. Presentation Format for an IP Address .................. 13
5.2. Transport Layer API .................................... 14
5.3. Name and Address Resolution ............................ 15
5.4. Specific IP Dependencies ............................... 16
5.4.1. IP Address Selection ........................... 16
5.4.2. Application Framing ............................ 16
5.4.3. Storage of IP addresses ........................ 17
5.5. Multicast Applications ................................. 17
6. Developing IP Version - Independent Applications ............. 18
6.1. IP Version - Independent Structures..................... 18
6.2. IP Version - Independent APIs........................... 19
6.2.1. Example of Overly Simplistic TCP Server
Application .................................... 20
6.2.2. Example of Overly Simplistic TCP Client
Application .................................... 21
6.2.3. Binary/Presentation Format Conversion .......... 22
6.3. Iterated Jobs for Finding the Working Address .......... 23
6.3.1. Example of TCP Server Application .............. 23
6.3.2. Example of TCP Client Application .............. 25
7. Transition Mechanism Considerations .......................... 26
8. Security Considerations ...................................... 26
9. Acknowledgments .............................................. 27
10. References ................................................... 27
Appendix A. Other Binary/Presentation Format Conversions ........ 30
A.1. Binary to Presentation Using inet_ntop() ............... 30
A.2. Presentation to Binary Using inet_pton() ............... 31
Authors' Addresses ............................................... 32
Full Copyright Statement ......................................... 33
Shin, Ed., et al. Informational [Page 2]
^L
RFC 4038 Application Aspects of IPv6 Transition March 2005
1. Introduction
As IPv6 is introduced in the IPv4-based Internet, several general
issues will arise, such as routing, addressing, DNS, and scenarios.
An important key to a successful IPv6 transition is compatibility
with the large installed base of IPv4 hosts and routers. This issue
has already been extensively studied, and work is still in progress.
[2893BIS] describes the basic transition mechanisms: dual-stack
deployment and tunneling. Various other kinds of mechanisms have
been developed for the transition to an IPv6 network. However, these
transition mechanisms take no stance on whether applications support
IPv6.
This document specifies application aspects of IPv6 transition. Two
inter-related topics are covered:
1. How different network transition techniques affect
applications, and strategies for applications to support IPv6
and IPv4.
2. How to develop IPv6-capable or protocol-independent
applications ("application porting guidelines") using standard
APIs [RFC3493][RFC3542].
In the context of this document, the term "application" covers all
kinds of applications, but the focus is on those network applications
which have been developed using relatively low-level APIs (such as
the "C" language, using standard libraries). Many such applications
could be command-line driven, but that is not a requirement.
Applications will have to be modified to support IPv6 (and IPv4) by
using one of a number of techniques described in sections 2 - 4.
Guidelines for developing such applications are presented in sections
5 and 6.
2. Overview of IPv6 Application Transition
The transition of an application can be classified by using four
different cases (excluding the first case when there is no IPv6
support in either the application or the operating system):
Shin, Ed., et al. Informational [Page 3]
^L
RFC 4038 Application Aspects of IPv6 Transition March 2005
+-------------------+
| appv4 | (appv4 - IPv4-only applications)
+-------------------+
| TCP / UDP / others| (transport protocols - TCP, UDP,
+-------------------+ SCTP, DCCP, etc.)
| IPv4 | IPv6 | (IP protocols supported/enabled in the OS)
+-------------------+
Case 1. IPv4 applications in a dual-stack node.
+-------------------+ (appv4 - IPv4-only applications)
| appv4 | appv6 | (appv6 - IPv6-only applications)
+-------------------+
| TCP / UDP / others| (transport protocols - TCP, UDP,
+-------------------+ SCTP, DCCP, etc.)
| IPv4 | IPv6 | (IP protocols supported/enabled in the OS)
+-------------------+
Case 2. IPv4-only applications and IPv6-only applications
in a dual-stack node.
+-------------------+
| appv4/v6 | (appv4/v6 - applications supporting
+-------------------+ both IPv4 and IPv6)
| TCP / UDP / others| (transport protocols - TCP, UDP,
+-------------------+ SCTP, DCCP, etc.)
| IPv4 | IPv6 | (IP protocols supported/enabled in the OS)
+-------------------+
Case 3. Applications supporting both IPv4 and IPv6
in a dual-stack node.
+-------------------+
| appv4/v6 | (appv4/v6 - applications supporting
+-------------------+ both IPv4 and IPv6)
| TCP / UDP / others| (transport protocols - TCP, UDP,
+-------------------+ SCTP, DCCP, etc.)
| IPv4 | (IP protocols supported/enabled in the OS)
+-------------------+
Case 4. Applications supporting both IPv4 and IPv6
in an IPv4-only node.
Figure 1. Overview of Application Transition
Figure 1 shows the cases of application transition.
Shin, Ed., et al. Informational [Page 4]
^L
RFC 4038 Application Aspects of IPv6 Transition March 2005
Case 1: IPv4-only applications in a dual-stack node.
IPv6 protocol is introduced in a node, but
applications are not yet ported to support IPv6.
Case 2: IPv4-only applications and IPv6-only applications
in a dual-stack node.
Applications are ported for IPv6-only. Therefore
there are two similar applications, one for each
protocol version (e.g., ping and ping6).
Case 3: Applications supporting both IPv4 and IPv6 in a dual
stack node.
Applications are ported for both IPv4 and IPv6 support.
Therefore, the existing IPv4 applications can be
removed.
Case 4: Applications supporting both IPv4 and IPv6 in an
IPv4-only node.
Applications are ported for both IPv4 and IPv6 support,
but the same applications may also have to work when
IPv6 is not being used (e.g., disabled from the OS).
The first two cases are not interesting in the longer term; only few
applications are inherently IPv4- or IPv6-specific, and should work
with both protocols without having to care about which one is being
used.
3. Problems with IPv6 Application Transition
There are several reasons why the transition period between IPv4 and
IPv6 applications may not be straightforward. These issues are
described in this section.
3.1. IPv6 Support in the OS and Applications Are Unrelated
Considering the cases described in the previous section, IPv4 and
IPv6 protocol stacks are likely to co-exist in a node for a long
time.
Similarly, most applications are expected to be able to handle both
IPv4 and IPv6 during another long period. A dual-stack operating
system is not intended to have both IPv4 and IPv6 applications.
Therefore, IPv6-capable application transition may be independent of
protocol stacks in a node.
Applications capable of both IPv4 and IPv6 will probably have to
work properly in IPv4-only nodes (whether the IPv6 protocol is
completely disabled or there is no IPv6 connectivity at all).
Shin, Ed., et al. Informational [Page 5]
^L
RFC 4038 Application Aspects of IPv6 Transition March 2005
3.2. DNS Does Not Indicate Which IP Version Will Be Used
In a node, the DNS name resolver gathers the list of destination
addresses. DNS queries and responses are sent by using either IPv4
or IPv6 to carry the queries, regardless of the protocol version of
the data records [DNSTRANS].
The DNS name resolution issue related to application transition is
that by only doing a DNS name lookup a client application can not be
certain of the version of the peer application. For example, if a
server application does not support IPv6 yet but runs on a dual-stack
machine for other IPv6 services, and this host is listed with an AAAA
record in the DNS, the client application will fail to connect to the
server application. This is caused by a mismatch between the DNS
query result (i.e., IPv6 addresses) and a server application version
(i.e., IPv4).
Using SRV records would avoid these problems. Unfortunately, they
are not used widely enough to be applicable in most cases. Hence an
operational solution is to use "service names" in the DNS. If a node
offers multiple services, but only some of them over IPv6, a DNS name
may be added for each of these services or group of services (with
the associated A/AAAA records), not just a single name for the
physical machine, also including the AAAA records. However, the
applications cannot depend on this operational practice.
The application should request all IP addresses without address
family constraints and try all the records returned from the DNS, in
some order, until a working address is found. In particular, the
application has to be able to handle all IP versions returned from
the DNS. This issue is discussed in more detail in [DNSOPV6].
3.3. Supporting Many Versions of an Application is Difficult
During the application transition period, system administrators may
have various versions of the same application (an IPv4-only
application, an IPv6-only application, or an application supporting
both IPv4 and IPv6).
Typically one cannot know which IP versions must be supported prior
to doing a DNS lookup *and* trying (see section 3.2) the addresses
returned. Therefore if multiple versions of the same application are
available, the local users have difficulty selecting the right
version supporting the exact IP version required.
Shin, Ed., et al. Informational [Page 6]
^L
RFC 4038 Application Aspects of IPv6 Transition March 2005
To avoid problems with one application not supporting the specified
protocol version, it is desirable to have hybrid applications
supporting both.
An alternative approach for local client applications could be to
have a "wrapper application" that performs certain tasks (such as
figuring out which protocol version will be used) and calls the
IPv4/IPv6-only applications as necessary. This application would
perform connection establishment (or similar tasks) and pass the
opened socket to another application. However, as applications such
as this would have to do more than just perform a DNS lookup or
determine the literal IP address given, they will become complex --
likely much more so than a hybrid application. Furthermore, writing
"wrapping" applications that perform complex operations with IP
addresses (such as FTP clients) might be even more challenging or
even impossible. In short, wrapper applications do not look like a
robust approach for application transition.
4. Description of Transition Scenarios and Guidelines
Once the IPv6 network is deployed, applications supporting IPv6 can
use IPv6 network services to establish IPv6 connections. However,
upgrading every node to IPv6 at the same time is not feasible, and
transition from IPv4 to IPv6 will be a gradual process.
Dual-stack nodes provide one solution to maintaining IPv4
compatibility in unicast communications. In this section we will
analyze different application transition scenarios (as introduced in
section 2) and guidelines for maintaining interoperability between
applications running in different types of nodes.
Note that the first two cases, IPv4-only and IPv6-only applications,
are not interesting in the longer term; only few applications are
inherently IPv4- or IPv6-specific, and should work with both
protocols without having to care about which one is being used.
4.1. IPv4 Applications in a Dual-Stack Node
In this scenario, the IPv6 protocol is added in a node, but IPv6-
capable applications aren't yet available or installed. Although the
node implements the dual stack, IPv4 applications can only manage
IPv4 communications and accept/establish connections from/to nodes
that implement an IPv4 stack.
To allow an application to communicate with other nodes using IPv6,
the first priority is to port applications to IPv6.
Shin, Ed., et al. Informational [Page 7]
^L
RFC 4038 Application Aspects of IPv6 Transition March 2005
In some cases (e.g., when no source code is available), existing IPv4
applications can work if the Bump-in-the-Stack [BIS] or Bump-in-the-
API [BIA] mechanism is installed in the node. We strongly recommend
that application developers not use these mechanisms when application
source code is available. Also, they should not be used as an excuse
not to port software or to delay porting.
When [BIA] or [BIS] is used, the problem described in section 3.2
arises - (the IPv4 client in a [BIS]/[BIA] node tries to connect to
an IPv4 server in a dual stack system). However, one can rely on the
[BIA]/[BIS] mechanism, which should cycle through all the addresses
instead of applications.
[BIS] and [BIA] do not work with all kinds of applications - in
particular, with applications that exchange IP addresses as
application data (e.g., FTP). These mechanisms provide IPv4
temporary addresses to the applications and locally make a
translation between IPv4 and IPv6 communication. Therefore, these
IPv4 temporary addresses are only valid in the node scope.
4.2. IPv6 Applications in a Dual-Stack Node
As we have seen in the previous section, applications should be
ported to IPv6. The easiest way to port an IPv4 application is to
substitute the old IPv4 API references with the new IPv6 APIs with
one-to-one mapping. This way the application will be IPv6-only.
This IPv6-only source code cannot work in IPv4-only nodes, so the old
IPv4 application should be maintained in these nodes. This
necessitates having two similar applications working with different
protocol versions, depending on the node they are running (e.g.,
telnet and telnet6). This case is undesirable, as maintaining two
versions of the same source code per application could be difficult.
This approach would also cause problems for users having to select
which version of the application to use, as described in section 3.3.
Most implementations of dual stack allow IPv6-only applications to
interoperate with both IPv4 and IPv6 nodes. IPv4 packets going to
IPv6 applications on a dual-stack node reach their destination
because their addresses are mapped by using IPv4-mapped IPv6
addresses: the IPv6 address ::FFFF:x.y.z.w represents the IPv4
address x.y.z.w.
Shin, Ed., et al. Informational [Page 8]
^L
RFC 4038 Application Aspects of IPv6 Transition March 2005
+----------------------------------------------+
| +------------------------------------------+ |
| | | |
| | IPv6-only applications | |
| | | |
| +------------------------------------------+ |
| | |
| +------------------------------------------+ |
| | | |
| | TCP / UDP / others (SCTP, DCCP, etc.) | |
| | | |
| +------------------------------------------+ |
| IPv4-mapped | | IPv6 |
| IPv6 addresses | | addresses |
| +--------------------+ +-------------------+ |
| | IPv4 | | IPv6 | |
| +--------------------+ +-------------------+ |
| IPv4 | | |
| addresses | | |
+--------------|-----------------|-------------+
| |
IPv4 packets IPv6 packets
We will analyze the behaviour of IPv6-applications that exchange IPv4
packets with IPv4 applications by using the client/server model. We
consider the default case to be when the IPV6_V6ONLY socket option
has not been set. In these dual-stack nodes, this default behavior
allows a limited amount of IPv4 communication using the IPv4-mapped
IPv6 addresses.
IPv6-only server:
When an IPv4 client application sends data to an IPv6-only
server application running on a dual-stack node by using the
wildcard address, the IPv4 client address is interpreted as the
IPv4-mapped IPv6 address in the dual-stack node. This allows
the IPv6 application to manage the communication. The IPv6
server will use this mapped address as if it were a regular
IPv6 address, and a usual IPv6 connection. However, IPv4
packets will be exchanged between the nodes. Kernels with dual
stack properly interpret IPv4-mapped IPv6 addresses as IPv4
ones, and vice versa.
IPv6-only client:
IPv6-only client applications in a dual-stack node will not
receive IPv4-mapped addresses from the hostname resolution API
functions unless a special hint, AI_V4MAPPED, is given. If it
Shin, Ed., et al. Informational [Page 9]
^L
RFC 4038 Application Aspects of IPv6 Transition March 2005
is, the IPv6 client will use the returned mapped address as if
it were a regular IPv6 address, and a usual IPv6 connection.
However, IPv4 packets will be exchanged between applications.
Respectively, with IPV6_V6ONLY set, an IPv6-only server application
will only communicate with IPv6 nodes, and an IPv6-only client only
with IPv6 servers, as the mapped addresses have been disabled. This
option could be useful if applications use new IPv6 features such as
Flow Label. If communication with IPv4 is needed, either IPV6_V6ONLY
must not be used, or dual-stack applications must be used, as
described in section 4.3.
Some implementations of dual-stack do not allow IPv4-mapped IPv6
addresses to be used for interoperability between IPv4 and IPv6
applications. In these cases, there are two ways to handle the
problem:
1. Deploy two different versions of the application (possibly
attached with '6' in the name).
2. Deploy just one application supporting both protocol versions
as described in the next section.
The first method is not recommended because of a significant number
of problems associated with selecting the right applications. These
problems are described in sections 3.2 and 3.3.
Therefore, there are two distinct cases to consider when writing one
application to support both protocols:
1. Whether the application can (or should) support both IPv4 and
IPv6 through IPv4-mapped IPv6 addresses or the applications
should support both explicitly (see section 4.3), and
2. Whether the systems in which the applications are used support
IPv6 (see section 4.4).
Note that some systems will disable (by default) support for internal
IPv4-mapped IPv6 addresses. The security concerns regarding these
are legitimate, but disabling them internally breaks one transition
mechanism for server applications originally written to bind() and
listen() to a single socket by using a wildcard address. This forces
the software developer to rewrite the daemon to create two separate
sockets, one for IPv4 only and the other for IPv6 only, and then to
use select(). However, mapping-enabling of IPv4 addresses on any
particular system is controlled by the OS owner and not necessarily
Shin, Ed., et al. Informational [Page 10]
^L
RFC 4038 Application Aspects of IPv6 Transition March 2005
by a developer. This complicates developers' work, as they now have
to rewrite the daemon network code to handle both environments, even
for the same OS.
4.3. IPv4/IPv6 Applications in a Dual-Stack Node
Applications should be ported to support both IPv4 and IPv6. Over
time, the existing IPv4-only applications could be removed. As we
have only one version of each application, the source code will
typically be easy to maintain and to modify, and there are no
problems managing which application to select for which
communication.
This transition case is the most advisable. During the IPv6
transition period, applications supporting both IPv4 and IPv6 should
be able to communicate with other applications, irrespective of the
version of the protocol stack or the application in the node. Dual
applications allow more interoperability between heterogeneous
applications and nodes.
If the source code is written in a protocol-independent way, without
dependencies on either IPv4 or IPv6, applications will be able to
communicate with any combination of applications and types of nodes.
Implementations typically prefer IPv6 by default if the remote node
and application support it. However, if IPv6 connections fail,
version-independent applications will automatically try IPv4 ones.
The resolver returns a list of valid addresses for the remote node,
and applications can iterate through all of them until connection
succeeds.
Application writers should be aware of this protocol ordering, which
is typically the default, but the applications themselves usually
need not be [RFC3484].
If the source code is written in a protocol-dependent way, the
application will support IPv4 and IPv6 explicitly by using two
separate sockets. Note that there are some differences in bind()
implementation - that is, in whether one can first bind to IPv6
wildcard addresses, and then to those for IPv4. Writing applications
that cope with this can be a pain. Implementing IPV6_V6ONLY
simplifies this. The IPv4 wildcard bind fails on some systems
because the IPv4 address space is embedded into IPv6 address space
when IPv4-mapped IPv6 addresses are used.
A more detailed porting guideline is described in section 6.
Shin, Ed., et al. Informational [Page 11]
^L
RFC 4038 Application Aspects of IPv6 Transition March 2005
4.4. IPv4/IPv6 Applications in an IPv4-Only Node
As the transition is likely to take place over a longer time frame,
applications already ported to support both IPv4 and IPv6 may be run
on IPv4-only nodes. This would typically be done to avoid supporting
two application versions for older and newer operating systems, or to
support a case in which the user wants to disable IPv6 for some
reason.
The most important case is the application support on systems where
IPv6 support can be dynamically enabled or disabled by the users.
Applications on such a system should be able to handle a situation
IPv6 would not be enabled. Another scenario is when an application
is deployed on older systems that do not support IPv6 at all (even
the basic APIs such as getaddrinfo). In this case, the application
designer has to make a case-by-case judgment call as to whether it
makes sense to have compile-time toggle between an older and a newer
API (having to support both in the code), or whether to provide
getaddrinfo etc. function support on older platforms as part of the
application libraries.
Depending on application/operating system support, some may want to
ignore this case, but usually no assumptions can be made, and
applications should also work in this scenario.
An example is an application that issues a socket() command, first
trying AF_INET6 and then AF_INET. However, if the kernel does not
have IPv6 support, the call will result in an EPROTONOSUPPORT or
EAFNOSUPPORT error. Typically, errors like these lead to exiting the
socket loop, and AF_INET will not even be tried. The application
will need to handle this case or build the loop so that errors are
ignored until the last address family.
This case is just an extension of the IPv4/IPv6 support in the
previous case, covering one relatively common but often-ignored case.
5. Application Porting Considerations
The minimum changes for IPv4 applications to work with IPv6 are based
on the different size and format of IPv4 and IPv6 addresses.
Applications have been developed with IPv4 network protocol in mind.
This assumption has resulted in many IP dependencies through source
code.
The following list summarizes the more common IP version dependencies
in applications:
Shin, Ed., et al. Informational [Page 12]
^L
RFC 4038 Application Aspects of IPv6 Transition March 2005
a) Presentation format for an IP address: An ASCII string that
represents the IP address, a dotted-decimal string for IPv4,
and a hexadecimal string for IPv6.
b) Transport layer API: Functions to establish communications and
to exchange information.
c) Name and address resolution: Conversion functions between
hostnames and IP addresses.
d) Specific IP dependencies: More specific IP version
dependencies, such as IP address selection, application
framing, and storage of IP addresses.
e) Multicast applications: One must find the IPv6 equivalents to
the IPv4 multicast addresses and use the right socket
configuration options.
The following subsections describe the problems with the
aforementioned IP version dependencies. Although application source
code can be ported to IPv6 with minimum changes related to IP
addresses, some recommendations are given to modify the source code
in a protocol-independent way, which will allow applications to work
with both IPv4 and IPv6.
5.1. Presentation Format for an IP Address
Many applications use IP addresses to identify network nodes and to
establish connections to destination addresses. For instance, using
the client/server model, clients usually need an IP address as an
application parameter to connect to a server. This IP address is
usually provided in the presentation format, as a string. There are
two problems when porting the presentation format for an IP address:
the allocated memory and the management of the presentation format.
Usually, the memory allocated to contain an IPv4 address
representation as a string is unable to contain an IPv6 address.
Applications should be modified to prevent buffer overflows made
possible by the larger IPv6 address.
IPv4 and IPv6 do not use the same presentation format. IPv4 uses a
dot (.) to separate the four octets written in decimal notation, and
IPv6 uses a colon (:) to separate each pair of octets written in
hexadecimal notation [RFC3513]. In cases where one must be able to
specify, for example, port numbers with the address (see below), it
may be desirable to require placing the address inside the square
brackets [TextRep].
Shin, Ed., et al. Informational [Page 13]
^L
RFC 4038 Application Aspects of IPv6 Transition March 2005
A particular problem with IP address parsers comes when the input is
actually a combination of IP address and port number. With IPv4
these are often coupled with a colon; for example, "192.0.2.1:80".
However, this approach would be ambiguous with IPv6, as colons are
already used to structure the address.
Therefore, the IP address parsers that take the port number separated
with a colon should distinguish IPv6 addresses somehow. One way is
to enclose the address in brackets, as is done with Uniform Resource
Locators (URLs) [RFC2732]; for example, http://[2001:db8::1]:80.
Some applications also need to specify IPv6 prefixes and lengths:
The prefix length should be inserted outside of the square brackets,
if used; for example, [2001:db8::]/64 or 2001:db8::/64 and not
[2001:db8::/64]. Note that prefix/length notation is syntactically
indistinguishable from a legal URI; therefore, the prefix/length
notation must not be used when it isn't clear from the context that
it's used to specify the prefix and length and not, for example, a
URI.
In some specific cases, it may be necessary to give a zone identifier
as part of the address; for example, fe80::1%eth0. In general,
applications should not need to parse these identifiers.
The IP address parsers should support enclosing the IPv6 address in
brackets, even when the address is not used in conjunction with a
port number. Requiring that the user always give a literal IP
address enclosed in brackets is not recommended.
Note that some applications may also represent IPv6 address literals
differently; for example, SMTP [RFC2821] uses [IPv6:2001:db8::1].
Note that the use of address literals is strongly discouraged for
general-purpose direct input to the applications. Host names and DNS
should be used instead.
5.2. Transport Layer API
Communication applications often include a transport module that
establishes communications. Usually this module manages everything
related to communications and uses a transport-layer API, typically
as a network library. When an application is ported to IPv6, most
changes should be made in this application transport module in order
to be adapted to the new IPv6 API.
Shin, Ed., et al. Informational [Page 14]
^L
RFC 4038 Application Aspects of IPv6 Transition March 2005
In the general case, porting an existing application to IPv6 requires
an examination of the following issues related to the API:
- Network Information Storage: IP address Data Structures
The new structures must contain 128-bit IP addresses. The use
of generic address structures, which can store any address
family, is recommended.
Sometimes special addresses are hard-coded in the application
source code. Developers should pay attention to these in order
to use the new address format. Some of these special IP
addresses are wildcard local, loopback, and broadcast. IPv6
does not have the broadcast addresses, so applications can use
multicast instead.
- Address Conversion Functions
The address conversion functions convert the binary address
representation to the presentation format and vice versa. The
new conversion functions are specified to the IPv6 address
format.
- Communication API Functions
These functions manage communications. Their signatures are
defined based on a generic socket address structure. The same
functions are valid for IPv6; however, the IP address data
structures used when calling these functions require the
updates.
- Network Configuration Options
These are used when different communication models are
configured for Input/Output (I/O) operations
(blocking/nonblocking, I/O multiplexing, etc.) and should be
translated for IPv6.
5.3. Name and Address Resolution
From the application point of view, the name and address resolution
is a system-independent process. An application calls functions in a
system library, the resolver, which is linked into the application
when it is built. However, these functions use IP address
structures, that are protocol dependent and must be reviewed to
support the new IPv6 resolution calls.
With IPv6, there are two new basic resolution functions,
getaddrinfo() and getnameinfo(). The first returns a list of all
configured IP addresses for a hostname. These queries can be
constrained to one protocol family; for instance, only IPv4 or only
Shin, Ed., et al. Informational [Page 15]
^L
RFC 4038 Application Aspects of IPv6 Transition March 2005
IPv6 addresses. However, it is recommended that all configured IP
addresses be obtained to allow applications to work with every kind
of node. The second function returns the hostname associated to an
IP address.
5.4. Specific IP Dependencies
5.4.1. IP Address Selection
Unlike the IPv4 model, IPv6 promotes the configuration of multiple IP
addresses per node, however, applications only use a
destination/source pair for a communication. Choosing the right IP
source and destination addresses is a key factor that may determine
the route of IP datagrams.
Typically, nodes, not applications, automatically solve the source
address selection. A node will choose the source address for a
communication following some rules of best choice, per [RFC3484], but
will also allow applications to make changes in the ordering rules.
When selecting the destination address, applications usually ask a
resolver for the destination IP address. The resolver returns a set
of valid IP addresses from a hostname. Unless applications have a
specific reason to select any particular destination address, they
should try each element in the list until the communication succeeds.
In some cases, the application may need to specify its source
address. The destination address selection process picks the best
destination for the source address (instead of picking the best
source address for the chosen destination address). Note that if it
is not yet known which protocol will be used for communication there
may be an increase in complexity for IP version - independent
applications that have to specify the source address (especially for
client applications. Fortunately, specifying the source address is
not typically required).
5.4.2. Application Framing
The Application Level Framing (ALF) architecture controls mechanisms
that traditionally fall within the transport layer. Applications
implementing ALF are often responsible for packetizing data into
Application Data Units (ADUs). The application problem with ALF
arrives from the ADU size selection to obtain better performance.
Applications using connectionless protocols (such as UDP) typically
need application framing. These applications have three choices: (1)
to use packet sizes no larger than the IPv6 minimum Maximum
Transmission Unit (MTU) of 1280 bytes [RFC2460], (2) to use any
Shin, Ed., et al. Informational [Page 16]
^L
RFC 4038 Application Aspects of IPv6 Transition March 2005
packet sizes, but to force IPv6 fragmentation/reassembly when
necessary, or (3) to optimize the packet size and avoid unnecessary
fragmentation/reassembly, and to guess or find out the optimal packet
sizes that can be sent and received, end-to-end, on the network.
This memo takes no stance on that approach is best.
Note that the most optimal ALF depends on dynamic factors such as
Path MTU or whether IPv4 or IPv6 is being used (due to different
header sizes, possible IPv6-in-IPv4 tunneling overhead, etc.). These
factors have to be taken into consideration when application framing
is implemented.
5.4.3. Storage of IP Addresses
Some applications store IP addresses as remote peer information. For
instance, one of the most popular ways to register remote nodes in
collaborative applications uses IP addresses as registry keys.
Although the source code that stores IP addresses can be modified to
IPv6 by following the previous basic porting recommendations,
applications should not store IP addresses for the following reasons:
- IP addresses can change throughout time; for instance, after a
renumbering process.
- The same node can reach a destination host using different IP
addresses, possibly with a different protocol version.
When possible, applications should store names such as FQDNs or other
protocol-independent identities instead of addresses. In this case
applications are only bound to specific addresses at run time, or for
the duration of a cache lifetime. Other types of applications, such
as massive peer-to-peer systems with their own rendezvous and
discovery mechanisms, may need to cache addresses for performance
reasons, but cached addresses should not be treated as permanent,
reliable information. In highly dynamic networks, any form of name
resolution may be impossible, and here again addresses must be
cached.
5.5. Multicast Applications
There is an additional problem in porting multicast applications.
When multicast facilities are used some changes must be carried out
to support IPv6. First, applications must change the IPv4 multicast
addresses to IPv6 ones, and second, the socket configuration options
must be changed.
Shin, Ed., et al. Informational [Page 17]
^L
RFC 4038 Application Aspects of IPv6 Transition March 2005
All IPv6 multicast addresses encode scope; the scope was only
implicit in IPv4 (with multicast groups in 239/8). Also, although a
large number of application-specific multicast addresses have been
assigned with IPv4, this has been (luckily enough) avoided with IPv6.
So there are no direct equivalents for all the multicast addresses.
For link-local multicast, it's possible to pick almost anything
within the link-local scope. The global groups could use unicast
prefix - based addresses [RFC3306]. All in all, this may force the
application developers to write more protocol-dependent code.
Another problem is that IPv6 multicast does not yet have a
standardized mechanism for traditional Any Source Multicast for
Interdomain multicast. The models for Any Source Multicast (ASM) or
Source-Specific Multicast (SSM) are generally similar between IPv4
and IPv6, but it is possible that PIM-SSM will become more widely
deployed in IPv6 due to its simpler architecture.
It might be beneficial to port the applications to use SSM semantics,
requiring off-band source discovery mechanisms and a different API
[RFC3678]. Inter-domain ASM service is available only through a
method embedding the Rendezvous Point address in the multicast
address [Embed-RP].
Another generic problem with multiparty conferencing applications,
similar to the issues with peer-to-peer applications, is that all
users of the session must use the same protocol version (IPv4 or
IPv6), or some form of proxy or translator (e.g., [MUL-GW]).
6. Developing IP Version - Independent Applications
As stated, dual applications working with both IPv4 and IPv6 are
recommended. These applications should avoid IP dependencies in the
source code. However, if IP dependencies are required, one of the
better solutions would be to build a communication library that
provides an IP version - independent API to applications and that
hides all dependencies.
To develop IP version - independent applications, the following
guidelines should be considered.
6.1. IP Version - Independent Structures
All memory structures and APIs should be IP version-independent. One
should avoid structs in_addr, in6_addr, sockaddr_in, and
sockaddr_in6.
Shin, Ed., et al. Informational [Page 18]
^L
RFC 4038 Application Aspects of IPv6 Transition March 2005
Suppose a network address is passed to some function, foo(). If one
uses struct in_addr or struct in6_addr, results an extra parameter to
indicate address family, as below:
struct in_addr in4addr;
struct in6_addr in6addr;
/* IPv4 case */
foo(&in4addr, AF_INET);
/* IPv6 case */
foo(&in6addr, AF_INET6);
This leads to duplicated code and having to consider each scenario
from both perspectives independently, which is difficult to maintain.
So we should use struct sockaddr_storage, as below:
struct sockaddr_storage ss;
int sslen;
/* AF independent! - use sockaddr when passing a pointer */
/* note: it's typically necessary to also pass the length
explicitly */
foo((struct sockaddr *)&ss, sslen);
6.2. IP Version - Independent APIs
The new address independent variants getaddrinfo() and getnameinfo()
hide the gory details of name-to-address and address-to-name
translations. They implement functionalities of the following
functions:
gethostbyname()
gethostbyaddr()
getservbyname()
getservbyport()
They also obsolete the functionality of gethostbyname2(), defined in
[RFC2133].
The new variants can perform hostname/address and service name/port
lookups, though the features can be turned off, if desired.
Getaddrinfo() can return multiple addresses, as below:
localhost. IN A 127.0.0.1
IN A 127.0.0.2
IN AAAA ::1
In this example, if IPv6 is preferred, getaddrinfo first returns ::1;
then both 127.0.0.1 and 127.0.0.2 are in a random order.
Shin, Ed., et al. Informational [Page 19]
^L
RFC 4038 Application Aspects of IPv6 Transition March 2005
Getaddrinfo() and getnameinfo() can query hostname and service
name/port at once.
Hardcoding AF-dependent knowledge is not preferred in the program.
Constructs such as that below should be avoided:
/* BAD EXAMPLE */
switch (sa->sa_family) {
case AF_INET:
salen = sizeof(struct sockaddr_in);
break;
}
Instead, we should use the ai_addrlen member of the addrinfo
structure, as returned by getaddrinfo().
The gethostbyname(), gethostbyaddr(), getservbyname(), and
getservbyport() are mainly used to get server and client sockets. In
the following sections, we will see simple examples creating these
sockets by using the new IPv6 resolution functions.
6.2.1. Example of Overly Simplistic TCP Server Application
A simple TCP server socket at service name (or port number string)
SERVICE:
/*
* BAD EXAMPLE: does not implement the getaddrinfo loop as
* specified in 6.3. This may result in one of the following:
* - an IPv6 server, listening at the wildcard address,
* allowing IPv4 addresses through IPv4-mapped IPv6 addresses.
* - an IPv4 server, if IPv6 is not enabled,
* - an IPv6-only server, if IPv6 is enabled but IPv4-mapped IPv6
* addresses are not used by default, or
* - no server at all, if getaddrinfo supports IPv6, but the
* system doesn't, and socket(AF_INET6, ...) exits with an
* error.
*/
struct addrinfo hints, *res;
int error, sockfd;
memset(&hints, 0, sizeof(hints));
hints.ai_flags = AI_PASSIVE;
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
error = getaddrinfo(NULL, SERVICE, &hints, &res);
if (error != 0) {
/* handle getaddrinfo error */
Shin, Ed., et al. Informational [Page 20]
^L
RFC 4038 Application Aspects of IPv6 Transition March 2005
}
sockfd = socket(res->family, res->ai_socktype, res->ai_protocol);
if (sockfd < 0) {
/* handle socket error */
}
if (bind(sockfd, res->ai_addr, res->ai_addrlen) < 0) {
/* handle bind error */
}
/* ... */
freeaddrinfo(res);
6.2.2. Example of Overly Simplistic TCP Client Application
A simple TCP client socket connecting to a server running at node
name (or IP address presentation format) SERVER_NODE and service name
(or port number string) SERVICE follows:
/*
* BAD EXAMPLE: does not implement the getaddrinfo loop as
* specified in 6.3. This may result in one of the following:
* - an IPv4 connection to an IPv4 destination,
* - an IPv6 connection to an IPv6 destination,
* - an attempt to try to reach an IPv6 destination (if AAAA
* record found), but failing -- without fallbacks -- because:
* o getaddrinfo supports IPv6 but the system does not
* o IPv6 routing doesn't exist, so falling back to e.g., TCP
* timeouts
* o IPv6 server reached, but service not IPv6-enabled or
* firewalled away
* - if the first destination is not reached, there is no
* fallback to the next records
*/
struct addrinfo hints, *res;
int error, sockfd;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
error = getaddrinfo(SERVER_NODE, SERVICE, &hints, &res);
if (error != 0) {
/* handle getaddrinfo error */
}
Shin, Ed., et al. Informational [Page 21]
^L
RFC 4038 Application Aspects of IPv6 Transition March 2005
sockfd = socket(res->family, res->ai_socktype, res->ai_protocol);
if (sockfd < 0) {
/* handle socket error */
}
if (connect(sockfd, res->ai_addr, res->ai_addrlen) < 0 ) {
/* handle connect error */
}
/* ... */
freeaddrinfo(res);
6.2.3. Binary/Presentation Format Conversion
We should consider the binary and presentation address format
conversion APIs. The following functions convert network address
structure in its presentation address format and vice versa:
inet_ntop()
inet_pton()
Both are from the basic socket extensions for IPv6. However, these
conversion functions are protocol-dependent. It is better to use
getnameinfo()/getaddrinfo() (inet_pton and inet_ntop equivalents are
described in Appendix A).
Conversion from network address structure to presentation format can
be written as follows:
struct sockaddr_storage ss;
char addrStr[INET6_ADDRSTRLEN];
char servStr[NI_MAXSERV];
int error;
/* fill ss structure */
error = getnameinfo((struct sockaddr *)&ss, sizeof(ss),
addrStr, sizeof(addrStr),
servStr, sizeof(servStr),
NI_NUMERICHOST);
Shin, Ed., et al. Informational [Page 22]
^L
RFC 4038 Application Aspects of IPv6 Transition March 2005
Conversions from presentation format to network address structure can
be written as follows:
struct addrinfo hints, *res;
char addrStr[INET6_ADDRSTRLEN];
int error;
/* fill addrStr buffer */
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
error = getaddrinfo(addrStr, NULL, &hints, &res);
if (error != 0) {
/* handle getaddrinfo error */
}
/* res->ai_addr contains the network address structure */
/* ... */
freeaddrinfo(res);
6.3. Iterated Jobs for Finding the Working Address
In a client code, when multiple addresses are returned from
getaddrinfo(), we should try all of them until connection succeeds.
When a failure occurs with socket(), connect(), bind(), or some other
function, the code should go on to try the next address.
In addition, if something is wrong with the socket call because the
address family is not supported (i.e., in case of section 4.4),
applications should try the next address structure.
Note: In the following examples, the socket() return value error
handling could be simplified by always continuing on with the socket
loop instead of performing special checking of specific error
numbers.
6.3.1. Example of TCP Server Application
The previous TCP server example should be written as follows:
#define MAXSOCK 2
struct addrinfo hints, *res;
int error, sockfd[MAXSOCK], nsock=0;
memset(&hints, 0, sizeof(hints));
hints.ai_flags = AI_PASSIVE;
hints.ai_family = AF_UNSPEC;
Shin, Ed., et al. Informational [Page 23]
^L
RFC 4038 Application Aspects of IPv6 Transition March 2005
hints.ai_socktype = SOCK_STREAM;
error = getaddrinfo(NULL, SERVICE, &hints, &res);
if (error != 0) {
/* handle getaddrinfo error */
}
for (aip=res; aip && nsock < MAXSOCK; aip=aip->ai_next) {
sockfd[nsock] = socket(aip->ai_family,
aip->ai_socktype,
aip->ai_protocol);
if (sockfd[nsock] < 0) {
switch errno {
case EAFNOSUPPORT:
case EPROTONOSUPPORT:
/*
* e.g., skip the errors until
* the last address family,
* see section 4.4.
*/
if (aip->ai_next)
continue;
else {
/* handle unknown protocol errors */
break;
}
default:
/* handle other socket errors */
;
}
} else {
int on = 1;
/* optional: works better if dual-binding to wildcard
address */
if (aip->ai_family == AF_INET6) {
setsockopt(sockfd[nsock], IPPROTO_IPV6, IPV6_V6ONLY,
(char *)&on, sizeof(on));
/* errors are ignored */
}
if (bind(sockfd[nsock], aip->ai_addr,
aip->ai_addrlen) < 0 ) {
/* handle bind error */
close(sockfd[nsock]);
continue;
}
Shin, Ed., et al. Informational [Page 24]
^L
RFC 4038 Application Aspects of IPv6 Transition March 2005
if (listen(sockfd[nsock], SOMAXCONN) < 0) {
/* handle listen errors */
close(sockfd[nsock]);
continue;
}
}
nsock++;
}
freeaddrinfo(res);
/* check that we were able to obtain the sockets */
6.3.2. Example of TCP Client Application
The previous TCP client example should be written as follows:
struct addrinfo hints, *res, *aip;
int sockfd, error;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
error = getaddrinfo(SERVER_NODE, SERVICE, &hints, &res);
if (error != 0) {
/* handle getaddrinfo error */
}
for (aip=res; aip; aip=aip->ai_next) {
sockfd = socket(aip->ai_family,
aip->ai_socktype,
aip->ai_protocol);
if (sockfd < 0) {
switch errno {
case EAFNOSUPPORT:
case EPROTONOSUPPORT:
/*
* e.g., skip the errors until
* the last address family,
* see section 4.4.
*/
if (aip->ai_next)
continue;
else {
/* handle unknown protocol errors */
break;
Shin, Ed., et al. Informational [Page 25]
^L
RFC 4038 Application Aspects of IPv6 Transition March 2005
}
default:
/* handle other socket errors */
;
}
} else {
if (connect(sockfd, aip->ai_addr, aip->ai_addrlen) == 0)
break;
/* handle connect errors */
close(sockfd);
sockfd=-1;
}
}
if (sockfd > 0) {
/* socket connected to server address */
/* ... */
}
freeaddrinfo(res);
7. Transition Mechanism Considerations
The mechanism [NAT-PT] introduces a special set of addresses, formed
of an NAT-PT prefix and an IPv4 address these refer to IPv4 addresses
translated by NAT-PT DNS-ALG. In some cases, one might be tempted to
handle these differently.
However, IPv6 applications must not be required to distinguish
"normal" and "NAT-PT translated" addresses (or any other kind of
special addresses, including the IPv4-mapped IPv6 addresses): This
would be completely impractical, and if the distinction must be made,
it must be done elsewhere (e.g., kernel, system libraries).
8. Security Considerations
There are a number of security considerations for IPv6 transition,
but those are outside the scope of this memo.
To ensure the availability and robustness of the service even when
transitioning to IPv6, this memo describes a number of ways to make
applications more resistant to failures by cycling through addresses
until a working one is found. Doing this properly is critical to
maintain availability and to avoid loss of service.
Shin, Ed., et al. Informational [Page 26]
^L
RFC 4038 Application Aspects of IPv6 Transition March 2005
A special consideration about application transition is how IPv4-
mapped IPv6 addresses are handled. The use in the API can be seen
both as a merit (easier application transition) and as a burden
(difficulty in ensuring whether the use was legitimate). Note that
some systems will disable (by default) support for internal IPv4-
mapped IPv6 addresses. The security concerns regarding these on the
wire are legitimate, but disabling it internally breaks one
transition mechanism for server applications originally written to
bind() and listen() to a single socket by using a wildcard address
[V6MAPPED]. This should be considered in more detail when
applications are designed.
9. Acknowledgments
Some of guidelines for development of IP version-independent
applications (section 6) were first brought up by [AF-APP]. Other
work to document application porting guidelines has also been in
progress; for example, [IP-GGF] and [PRT]. We would like to thank
the members of the v6ops working group and the application area for
helpful comments. Special thanks are due to Brian E. Carpenter,
Antonio Querubin, Stig Venaas, Chirayu Patel, Jordi Palet, and Jason
Lin for extensive review of this document. We acknowledge Ron Pike
for proofreading the document.
10. References
10.1. Normative References
[RFC3493] Gilligan, R., Thomson, S., Bound, J., McCann, J., and W.
Stevens, "Basic Socket Interface Extensions for IPv6",
RFC 3493, February 2003.
[RFC3542] Stevens, W., Thomas, M., Nordmark, E., and T. Jinmei,
"Advanced Sockets Application Program Interface (API) for
IPv6", RFC 3542, May 2003.
[BIS] Tsuchiya, K., Higuchi, H., and Y. Atarashi, "Dual Stack
Hosts using the "Bump-In-the-Stack" Technique (BIS)", RFC
2767, February 2000.
[BIA] Lee, S., Shin, M-K., Kim, Y-J., Nordmark, E., and A.
Durand, "Dual Stack Hosts Using "Bump-in-the-API" (BIA)",
RFC 3338, October 2002.
[RFC2460] Deering, S. and R. Hinden, "Internet Protocol, Version 6
(IPv6) Specification", RFC 2460, December 1998.
Shin, Ed., et al. Informational [Page 27]
^L
RFC 4038 Application Aspects of IPv6 Transition March 2005
[RFC3484] Draves, R., "Default Address Selection for Internet
Protocol version 6 (IPv6)", RFC 3484, February 2003.
[RFC3513] Hinden, R. and S. Deering, "Internet Protocol Version 6
(IPv6) Addressing Architecture", RFC 3513, April 2003.
10.2. Informative References
[2893BIS] Nordmark, E. and R. E. Gilligan, "Basic Transition
Mechanisms for IPv6 Hosts and Routers", Work in Progress,
June 2004.
[RFC2133] Gilligan, R., Thomson, S., Bound, J., and W. Stevens,
"Basic Socket Interface Extensions for IPv6", RFC 2133,
April 1997.
[RFC2732] Hinden, R., Carpenter, B., and L. Masinter, "Format for
Literal IPv6 Addresses in URL's", RFC 2732, December
1999.
[RFC2821] Klensin, J., "Simple Mail Transfer Protocol", RFC 2821,
April 2001.
[TextRep] Main, A., "Textual Representation of IPv4 and IPv6
Addresses", Work in Progress, October 2003.
[NAT-PT] Tsirtsis, G. and P. Srisuresh, "Network Address
Translation - Protocol Translation (NAT-PT)", RFC 2766,
February 2000.
[DNSTRANS] Durand, A. and J. Ihren, "DNS IPv6 Transport Operational
Guidelines", BCP 91, RFC 3901, September 2004.
[DNSOPV6] Durand, A., Ihren, J. and P. Savola, "Operational
Considerations and Issues with IPv6 DNS", Work in
Progress, May 2004.
[AF-APP] Hagino, J., "Implementing AF-independent application",
http://www.kame.net/newsletter/19980604/, 2001.
[V6MAPPED] Hagino, J., "IPv4 mapped address considered harmful",
Work in Progress, April 2002.
[IP-GGF] Chown, T., Bound, J., Jiang, S. and P. O'Hanlon,
"Guidelines for IP version independence in GGF
specifications", Global Grid Forum(GGF) Documentation,
work in Progress, September 2003.
Shin, Ed., et al. Informational [Page 28]
^L
RFC 4038 Application Aspects of IPv6 Transition March 2005
[Embed-RP] Savola, P. and B. Haberman, "Embedding the Rendezvous
Point (RP) Address in an IPv6 Multicast Address", RFC
3956, November 2004.
[RFC3306] Haberman, B. and D. Thaler, "Unicast-Prefix-based IPv6
Multicast Addresses", RFC 3306, August 2002.
[RFC3678] Thaler, D., Fenner, B., and B. Quinn, "Socket Interface
Extensions for Multicast Source Filters, RFC 3678,
January 2004.
[MUL-GW] Venaas, S., "An IPv4 - IPv6 multicast gateway", Work in
Progress, February 2003.
[PRT] Castro, E. M., "Programming guidelines on transition to
IPv6 LONG project", Work in Progress, January 2003.
Shin, Ed., et al. Informational [Page 29]
^L
RFC 4038 Application Aspects of IPv6 Transition March 2005
Appendix A. Other Binary/Presentation Format Conversions
Section 6.2.3 describes the preferred way to perform
binary/presentation format conversions; these can also be done by
using inet_pton() and inet_ntop() and by writing protocol-dependent
code. This approach is not recommended, but it is provided here for
reference and comparison.
Note that inet_ntop()/inet_pton() lose the scope identifier (if used,
e.g., with link-local addresses) in the conversions, contrary to the
getaddrinfo()/getnameinfo() functions.
A.1. Binary to Presentation Using inet_ntop()
Conversions from network address structure to presentation format can
be written as follows:
struct sockaddr_storage ss;
char addrStr[INET6_ADDRSTRLEN];
/* fill ss structure */
switch (ss.ss_family) {
case AF_INET:
inet_ntop(ss.ss_family,
&((struct sockaddr_in *)&ss)->sin_addr,
addrStr,
sizeof(addrStr));
break;
case AF_INET6:
inet_ntop(ss.ss_family,
&((struct sockaddr_in6 *)&ss)->sin6_addr,
addrStr,
sizeof(addrStr));
break;
default:
/* handle unknown family */
}
Note that, the destination buffer addrStr should be long enough to
contain the presentation address format: INET_ADDRSTRLEN for IPv4 and
INET6_ADDRSTRLEN for IPv6. As INET6_ADDRSTRLEN is longer than
INET_ADDRSTRLEN, the first one is used as the destination buffer
length.
Shin, Ed., et al. Informational [Page 30]
^L
RFC 4038 Application Aspects of IPv6 Transition March 2005
A.2. Presentation to Binary Using inet_pton()
Conversions from presentation format to network address structure can
be written as follows:
struct sockaddr_storage ss;
struct sockaddr_in *sin;
struct sockaddr_in6 *sin6;
char addrStr[INET6_ADDRSTRLEN];
/* fill addrStr buffer and ss.ss_family */
switch (ss.ss_family) {
case AF_INET:
sin = (struct sockaddr_in *)&ss;
inet_pton(ss.ss_family,
addrStr,
(sockaddr *)&sin->sin_addr));
break;
case AF_INET6:
sin6 = (struct sockaddr_in6 *)&ss;
inet_pton(ss.ss_family,
addrStr,
(sockaddr *)&sin6->sin6_addr);
break;
default:
/* handle unknown family */
}
Note that, the address family of the presentation format must be
known.
Shin, Ed., et al. Informational [Page 31]
^L
RFC 4038 Application Aspects of IPv6 Transition March 2005
Authors' Addresses
Myung-Ki Shin
ETRI/NIST
820 West Diamond Avenue
Gaithersburg, MD 20899, USA
Phone: +1 301 975-3613
Fax: +1 301 590-0932
EMail: mshin@nist.gov
Yong-Guen Hong
ETRI PEC
161 Gajeong-Dong, Yuseong-Gu, Daejeon 305-350, Korea
Phone: +82 42 860 6447
Fax: +82 42 861 5404
EMail: yghong@pec.etri.re.kr
Jun-ichiro itojun HAGINO
Research Laboratory, Internet Initiative Japan Inc.
Takebashi Yasuda Bldg.,
3-13 Kanda Nishiki-cho,
Chiyoda-ku,Tokyo 101-0054, JAPAN
Phone: +81-3-5259-6350
Fax: +81-3-5259-6351
EMail: itojun@iijlab.net
Pekka Savola
CSC/FUNET
Espoo, Finland
EMail: psavola@funet.fi
Eva M. Castro
Rey Juan Carlos University (URJC)
Departamento de Informatica, Estadistica y Telematica
C/Tulipan s/n
28933 Madrid - SPAIN
EMail: eva@gsyc.escet.urjc.es
Shin, Ed., et al. Informational [Page 32]
^L
RFC 4038 Application Aspects of IPv6 Transition March 2005
Full Copyright Statement
Copyright (C) The Internet Society (2005).
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 currently provided by the
Internet Society.
Shin, Ed., et al. Informational [Page 33]
^L
|