许多不熟悉IPv6的IT人员认为,IPv6部署的责任落在网络团队身上。然而,那些了解IPv6的人意识到,迁移到IPv6将涉及到使用IP地址的任何系统。当网络团队为IPv6的加入准备基础设施时,我们应该提醒我们的应用程序开发人员,确保他们准备好迎接即将到来的挑战。本文包含应用程序开发人员在多协议环境下使其应用程序正常运行时需要了解的一些关键问题。
即使网络工程师高度重视网络,我们也需要保持正确的观点。我们网络工程师认识到,网络的作用是支持运行应用程序的计算机之间的端到端通信。应用程序、操作系统和计算机与网络的接口方式往往属于系统管理员和应用程序开发人员的领域。随着我们对IPv6越来越熟悉,我们应该与组织中的其他人分享我们的知识。这意味着几乎IT组织中的每个人都将参与到IPv6的部署中。我们应该与我们的应用程序开发人员分享以下概念,这样他们就能意识到创建将在当前IPv4网络上运行的应用程序以及在不久的将来添加IPv6时运行的应用程序的细微差别。
1.评估IPv6能力的当前代码
当为Y2K准备的应用程序开发人员时,他们在只有2个字符/数字中持有的任何地方都努力了解他们的代码。然后,Y2K编程代码评估实用程序研究了查找包含2位数或4位数年份的数据结构的代码行。随着IPv6的添加,我们需要查看可以输入,存储,访问或使用的IP地址的任何地方的TCP / IP应用程序代码。如果我们使用的数据结构仅分配32位,则需要修改代码以保持128位地址。
我们可以查看应用程序代码文件逐个文件和模块,查找此类数据结构,或者我们可以使用自动化软件应用程序。值得庆幸的是,有几种用于IPv4 / V6呼叫的应用程序源代码的自动评估工具。对于我们可以使用的微软平台上写的主机Checkv4.exe来识别源代码是否为ipv6就绪。有一种SourceForge工具叫做Porttoipv6.。还有另外两个程序可以帮助您评估IPv6代码,它们都可以与C、Java、Perl和Python一起工作。EUChinaGrid项目创造了一个IPv6代码检查器EGEE(电子科学使能网格)小组已经创建了他们的IPv6护理效用。倒退的选择是使用Grep或其他解析工具来查看源代码。
2.创建代码是地址 - 家庭(AF)与IPv4独立和向后兼容
当我们部署IPv6时,应用程序必须保持向后兼容IPv4。创建两个版本的应用程序是不可行的。例如,创建为IPv4和IPv6的一个版本创建一个版本的应用程序并不谨慎(例如,program4.exe&program6.exe)。此外,最终用户不应知道正在使用哪个IP版本,然后选择正确的应用程序。但是,高级用户可能希望控制如何进行连接。因此,应制作申请家庭地址(AF)独立。这意味着无论使用哪个地址系列(IPv4或IPv6),相同的应用程序都可以在所有情况下工作。
3.具有与IPv4的应用程序工作相同的应用程序,双协议和仅具有这些连接方法的IPv6的Poperating系统
沿着那些相同的线,自动对自动对自动对自动对自动对自动对自动对自动对自动对自动对自动取款的应用程序应处理任何类型的操作系统,这些操作系统在计算机上运行,该操作系统可以连接到仅使用IPv4,双协议或IPv6的连接运行。单个程序应处理任一协议的DNS查询,并能够使用任一协议版本进行通信。应用程序应该能够执行适当的DNS查询并接收A或AAAA响应并基于任一协议创建连接。如果无法实现IPv6连接,则应用程序应自动返回IPv4。
4.在内存中存储128位IPv6地址和32位IPv4地址的兼容性
32位IPv4地址字符串以Quad-Dotted-十进制格式显示,可以是16个字符(4个十进制数字+ 3个周期的4个部分+一个空字符)。一个128位IPv6地址字符串显示为4个由“:”s(最多46个字符)分隔的4个十六进制字符的8个部分。应用程序必须使用可以接受IPv4地址,IPv6地址,主机名和完全合格主机名的数据输入字段。必须选中界限以验证输入,并且必须存储地址在适当大小的正确数据结构中。就像登上飞机时,有些人经常试图将10磅的东西推入5磅磅的开销隔间。您也不应该尝试将128位IPv6地址挤压为32位内存空间。
5.使用IPv6或IPv4传输进行IPv6和IPv4的DNS查询
如前所述,应用程序应适当地处理DNS查询,因为使用128位IPv6地址,我们需要更多地依赖DNS直接保持IP地址。IETF.RFC 4074.对IPv6地址的DNS查询的常见不当行为为如何正确做到这一点。当AAAA资源记录查询时,DNS权威服务器存在一些已知的不当行为。此类行为可以阻止应实际可用的IPv4通信,导致名称分辨率的显着延迟,甚至会拒绝服务攻击。“这意味着有能力的IPv6的节点应该首先执行AAAA查询,然后是一个查询。此外,如果不存在AAAA,则权威名称服务器应返回rcode = 0,然后返回记录响应。
应用程序可以对具有IPv4或IPv6网络连接的DNS服务器执行DNS查询。在必要时,应用程序还应正确执行前进和反向DNS查找。许多人中很多根域名服务器有IPv6地址。去年“我”根名称服务器收到AAAA记录,因此您的DNS服务器应该使用最新更新的记录named.root文件。在必要时,应用程序还应正确执行前进和反向DNS查找。
6.处理输入的FQDN主机名或IPv4/IPv6地址和输出使用正确的格式
此外,IPv4和IPv6地址可以直接用于URL。我们都知道我们应该利用DNS并使用FQDN,但有时我们无法帮助它。在URL中,IPv6地址可以括在括号中:http://[2001:db8:1001:beef]:8080/index.html。对于用户来说,这可能是麻烦的,并且是一种根据需要进行诊断目的的技术。无论如何,应用程序应遵循更新RFC 3986.统一资源标识符(URI):通用语法。当将IP地址从其存储器转换为在内存中以输出为字符串时,您的应用程序还应适当地处理IPv4和IPv6。如果您的代码是使用ineT_ATON(),INET_ADDR()或INET_NOTA()的函数编写的。那么您将遇到问题。只要有可能在所有情况下都要使用INET_PTON()和INET_NTOP()即可使用inet_pton()和inet_ntop()。
7.使用IPv6和IPv4制作套接字连接
使用双协议的计算机和操作系统的应用程序能够在具有IP版本地址的网络上,应尽可能喜欢IPv6。应用程序应尝试使用IPv6进行连接,然后如果不存在IPv6连接,则返回到IPv4。IETF.RFC 4038.IPv6过渡的应用方面提供了创建双协议应用程序的指导。这个RFC告诉我们,实际上只有4种情况需要考虑。
案例1:双堆栈节点中仅IPv4的应用程序。IPv6协议在节点中引入,但应用程序尚未移植以支持IPv6。
案例2:IPv4-only应用程序和仅在双堆栈节点中的IPv6应用程序。仅适用于IPv6的应用程序。因此,存在两个类似的应用,一个用于每个协议版本(例如,ping和ping6)。
案例3:在双堆栈节点中同时支持IPv4和IPv6的应用程序。应用程序被移植为IPv4和IPv6支持。因此,可以删除现有的IPv4应用程序。
案例4:在IPv4节点中支持IPv4和IPv6的应用程序。应用程序被移植到IPv4和IPv6支持,但在未使用IPv6时,相同的应用程序也可能必须工作(例如,从OS禁用)。前两种病例在长期内并不有趣;只有很少的应用程序都是固有的IPv4-或IPv6特定的,并且应该与两个协议一起使用,而无需关心哪一个被使用。因此,焦点应该是创建可以在使用任一协议的网络上运行的双协议应用程序,或者可以在仅当今的IPv4网络上运行。
8.利用IPv6功能的更高级别API:BSD套接字API,Perl Socket6,IO ::套接字:: INET6,Python套接字模块,Java套接字
IETF已经创建了几个rfc来指导c语言IPv6套接字编程。
RFC 3493.- IPv6的基本套接字接口扩展RFC 3542.-先进的套接字应用程序接口(API)为IPv6RFC 4038.- IPv6过渡的应用方面RFC 5014- 用于源地址选择的IPv6套接字API
perl是如何做到这一点的典型例子错误道。Perl Core中没有IPv6支持。您可以使用Socket6和IO :: socket :: Inet6或套接字和IO ::套接字:: INET。没有单个API将为仅适用于IPv4,双协议,而IPv6,并且由于此事实,创建自动自动自动对自动的代码并不容易。因此,您必须重新编写代码以获取IPv6-支持。您可以轻松检查使用以下命令是否具有IPv6支持。
$ perl -msocket6 -e1 $ perl -mio :: socket :: Inet6 -e1
如果您正在编写Java代码,那么您已经祝福IPv6 - 支持多年。在J2SDK / JRE 1.4中添加了IPv6支持。Java支持地址类型Inet4Address和Inet6Address和地址系列独立套接字。但是,有些东西需要了解。使用Java,默认情况下首选IPv6堆栈,但Java更喜欢DNS返回的IPv4地址。以下两个设置控制Java如何使用IP版本。
java.net.preferipv4stack =
如果您正在使用Python,那么您是幸运的。在Python版本2.3和2.6中有很好的IPv6支持。Python 2.7.1的最新版本修正了一些bug,这可能会使您的工作变得更轻松。Python有许多独立于地址族的函数,比如:socket。AF_INET,插座。AF_INET6,插座。getaddrinfo,插座。getnameinfo,插座。套接字([family[, type[, proto]]])和套接字。inet_pton socket.inet_ntop。有一种简单的方法可以检查您版本的Python是否具有IPv6能力。只需输入以下行。
# python >>>导入插槽>>>插槽。has_ipv6真实
9.与路径MTU发现(PMTUD)良好工作
要记住IPv6网络的另一件事是IPv6路由器不会执行IPv6数据包的碎片。所有IPv6网络接口都具有1280字节的最小IPv6链接MTU。当被要求转发路由器时,对于链接MTU太大的数据包它将丢弃数据包并发送回源ICMPv6数据包过大消息(类型2)。因此,结束节点必须执行路径MTU发现(PMTUD),并且源必须创建正确大小的数据包。IP版本6的Path MTU发现已定义RFC 1981.。碎片扩展报头将被添加到碎片包中(下一个报头44)(RFC 2460)。
现在许多应用程序不能正确地执行PMTUD,这将需要随着IPv6的引入而改变。隧道在IPv6中非常普遍,所以PMTUD比IPv4更有必要。防火墙也不应该过滤PMTUD消息(供参考,ICMPv6使用IPv6扩展头#58 (RFC 2463))。
10.对您的应用程序进行大量测试
应用软件的测试永远不会过分。在创建了独立于地址家族的应用程序之后,应该使用各种操作系统对其进行测试。这些计算机应该只使用ipv4、双协议和ipv6进行网络连接。您还应该在IPv4和IPv6上的TCP和UDP端口53上使用A和AAAA记录测试DNS,并执行反向查找。你应该测试,测试,测试,然后再做一些测试。相信我,这将带来回报,支持呼叫更少,您可以依赖的应用程序。
其他资源和参考资料