ipv6转换ipv4在线工具_IPv6应用开发者的十大工作

本文探讨了IPv6应用开发者面临的挑战,包括双栈节点中仅使用IPv4的应用、IPv4-Only和IPv6-Only应用程序的共存,以及如何创建支持双协议的应用。此外,还提到了检查系统是否支持IPv6的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

7aaed6ab522a67a627b2aa04a9c3c4fd.gif

点击蓝字关注我吧

02be8be7bd0e0720b7d9423fcb9ccb7d.png

来源 | Network World

作者 | Scott Hogg

整理编辑 | 路由

以下为译文: 许多不熟悉IPv6的IT人员认为IPv6部署的责任落在网络团队身上。然而,了解IPv6的人明白迁移到IPV6将涉及到任何使用IP地址的系统。当网络团队为添加IPv6准备基础设施时,我们应该提醒我们的应用程序开发人员,确保他们准备好迎接等待的挑战。本文包含了一些开发人员在多协议环境中使其应用程序正常运行时需要知道的一些关键问题。   尽管网络工程师对网络的重视程度很高,但我们需要保持正确的观点。很多网络工程师意识到网络的作用是支持应用程序之间端到端的通信。应用程序、操作系统和计算机与网络的接口方式往往属于系统管理员和应用程序开发人员的范畴。随着我们对IPv6的熟悉,我们应该与我们公司的其他人分享我们的知识。这意味着几乎IT部门中的每个人都将参与到IPv6的部署中。我们应该与我们的应用程序开发人员共享以下观点,以便他们了解创建应用程序的细微差别,这些应用程序将在当前的IPv4网络和不久的将来在IPv6网络下运行。

1

评估当前代码的IPv6能力 当应用程序开发人员为千年虫做准备时,他们仔细查看了他们任何一年只有2个字符/数字地方的代码。那时,Y2K编程代码评估工具研究代码行,寻找包含两位数或四位数年份的数据结构。随着IPv6的加入,我们需要查看我们的TCP/IP应用程序代码,寻找任何可以输入、存储、访问或使用IP地址的地方。如果我们使用一个仅分配32位的数据结构,那么需要修改代码以保存128位地址。 我们可以逐个文件、逐个模块地查看应用程序代码,寻找这样的数据结构,或者我们可以使用自动化的软件应用程序。值得庆幸的是,有一些工具可以自动评估IPv4/v6调用的应用程序源代码。对于在Microsoft平台上编写的主机,我们可以使用Checkv4.exe来确定源代码是否为IPv4就绪。有一个SourceForge工具叫做PortToIPv6。还有另外两个程序可以帮助您进行IPv6代码评估,这两个程序都可以使用C、Java、Perl和Python。EUChinaGrid项目已经创建了一个IPv6代码检查器,EGEE小组已经创建了他们的IPv6-care实用程序。其它备用选项是使用grep或其他解析工具来查看源代码。

2

创建独立于Address-Family (AF)并向后兼容IPv4的代码 当我们部署IPv6时,应用程序必须与IPv4保持向后兼容。创建两个版本的应用程序是不可行的。例如,创建一个适用于IPv4的应用程序版本和一个适用于IPv6的应用程序版本(例如program4.exe和program6.exe)是不明智的。此外,终端用户不需要知道使用的是哪个IP版本,然后选择正确的应用程序。但是,高级用户可能希望控制如何建立连接。因此,应用程序应该是地址族(AF)独立的。这意味着无论使用哪个地址系列(IPv4或IPv6),在所有情况下都可以使用相同的应用程序。

3

使用这些连接方法在IPv4-Only、双栈协议和IPv6-Only操作系统上运行相同的应用程序 按照同样的思路,地址族独立的应用程序应该可以在任何类型的操作系统上运行,这些操作系统可以连接到IPv4-Only、双栈协议或IPv6-Only连接的网络。单个程序应该能够处理任意协议的DNS查询,并且能够使用任意协议版本进行通信。应用程序应该能够执行正确的DNS查询并接收A或AAAA响应,并基于任何协议创建连接。如果IPv6无法连接,那么应用程序应该自动退回到IPv4。

4

在内存中存储128位IPv6地址并与32位IPv4地址兼容 一个32位的IPv4地址字符串以四点十进制格式显示,可以是16个字符(3个十进制数字的4部分+ 3个句点+ 1个空字符)。一个128位的IPv6地址字符串显示为4个十六进制字符的8个部分,由“:”分隔(最多46个字符)。应用程序必须使用可以接受IPv4地址、IPv6地址、主机名和完全限定主机名的数据输入字段。必须检查边界以验证输入,地址必须存储在适当大小的适当数据结构中。就像登机时,有些人总是试图把10磅的东西塞进一个5磅重的行李架里。您也不应该尝试将128位IPv6地址压缩到32位内存空间中。

5

使用IPv6或IPv4传输对IPv6和IPv4进行DNS查询 正如前面提到的,应用程序应该正确处理DNS查询,因为对于128位IPv6地址,我们将需要更多地依赖DNS来保持IP地址的正确性。IETFRFC 4074针对IPv6地址的DNS查询的常见错误行为提供了如何正确执行此操作的指导。“在查询DNS权威服务器的AAAA资源记录时,存在一些已知的错误行为。这种行为可能会阻塞IPv4通信,而实际上IPv4应该是可用的,这会导致名称解析的严重延迟,甚至会导致拒绝服务攻击。”这意味着支持IPv6的节点应该首先执行AAAA查询,然后执行A查询。此外,如果不存在AAAA,权威名称服务器应该返回RCODE=0,然后返回A记录响应。 应用程序可以对具有IPv4或IPv6网络连接的DNS服务器执行DNS查询。应用程序还应该在必要时正确地执行正向和反向DNS查找。许多根域名服务器都有IPv6地址。2010年“I”根名称服务器收到了AAAA记录,因此您的DNS服务器应该使用最新更新的命名。根文件。应用程序还应该在必要时正确地执行正向和反向DNS查找。

6

处理输入的FQDN主机名或IPv4/IPv6地址和输出使用正确的格式 此外,IPv4和IPv6地址可以直接在URL中使用。我们都知道我们应该利用DNS和FQDNs,但有时我们就是无能为力。在URL中,IPv6地址可以括在括号中,如:http://[2001:DB8:1001::BEEF]:8080/index.html。这对用户来说可能很麻烦,而且是一种主要用于必要诊断目的的技术。无论如何,应用程序应该遵循最新的RFC 3986统一资源标识符(URI):通用语法。当将IP地址从内存存储转换为字符串输出时,您的应用程序也应该正确地处理IPv4和IPv6。如果您的代码是使用inet_aton()、inet_addr()或inet_ntoa()函数编写的,那么就会出现问题。您的代码应该尽可能使用inet_pton()和inet_ntop(),使您的代码在所有情况下都能工作,并具有正确的输出格式。

7

与IPv6和IPv4进行Socket连接 如果应用程序使用的计算机和操作系统具有双协议功能,并且位于同时具有两个IP版本地址的网络上,则应尽可能首选IPv6。应用程序应首先尝试使用IPv6建立连接,如果IPv6连接不存在,则应返回到IPv4。IETF RFC 4038 IPv6转换的应用方面为创建双协议应用程序提供了指导。这个RFC告诉我们实际上只有4个案例需要考虑。

案例1:双堆栈节点中仅使用IPv4的应用程序。IPv6协议是在一个节点中引入的,但应用程序还没有移植到支持IPv6。

案例2:双栈节点中IPv4-Only的应用程序和IPv6-Only的应用程序。应用程序只针对IPv6进行移植。因此,有两个类似的应用程序,针对不同的协议版本ping和ping6)。

案例3:双栈节点中支持IPv4和IPv6的应用程序。被移植的应用程序支持IPv4和IPv6。因此,现有的IPv4应用程序可以被移除。

案例4:在IPv4-Only节点同时支持IPv4和IPv6的应用程序。被移植的应用程序支持IPv4和IPv6,但当不使用IPv6时,相同的应用程序可能也必须工作。从长远来看,前两个案例并不有趣。只有少数应用程序本身是特定于IPv4和IPv6,应该同时使用这两个协议,而不必关心是用哪种协议。因此,重点应该放在创建双协议应用程序上,这些应用程序可以在任意协议的网络上运行,也可以在IPv4-Only的网络上运行(目前大多数网络都是这样)。

8

利用支持IPv6的更高级别API:BSD Socket API, Perl Socket6, IO::Socket::INET6, Python Socket 模块, Java Sockets IETF已经创建了几个rfc来指导c语言IPv6套接字编程。 IPv6的基本套接字接口扩展RFC 3542 - IPv6的高级套接字应用程序接口(API) RFC 4038 - IPv6转换的应用方面RFC 5014 - IPv6源地址选择的套接字API。 Perl是一个典型的用错误的方式实现此目的的例子。在Perl内核中不支持IPv6。可以使用Socket6和IO::Socket::INET6,也可以使用Socket和IO::Socket::INET。没有一个API只适用于ipv4、双协议和ipv4,因此,创建独立于af的代码并不容易。因此,您必须重新编写代码以获得对ipv6的支持。您可以使用以下命令轻松地检查您的Perl版本是否支持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= < true|false > #false by default

java.net.preferIPv6Addresses= < true|false> # false by default

因此,您需要将这些行添加到您的java选项中。 -Djava.net.preferIPv4Stack=false -Djava.net.preferIPv6Addresses=true 如果你使用Python,那么你是幸运的。在Python版本2.3和2.6中有很好的IPv6支持。最新版本的Python 2.7.1修复了一些bug,可能会使您的工作更轻松。Python有许多地址族独立的函数,如 :socket.AF_INET, socket.AF_INET6, socket.getaddrinfo, socket.getnameinfo,socket.socket([family[, type[, proto]]]), and socket.inet_pton,socket.inet_ntop.  有一个简单的方法可以检查您的Python版本是否具有IPv6功能。只需输入以下行。

# python >>> import socket >>>socket.has_ipv6 True

9

与Path MTU Discovery (PMTUD)协同工作 关于IPv6网络需要记住的另一件事是IPv6路由器不会执行IPv6数据包的分段。所有的IPv6网络接口都有一个最小的IPv6链路MTU 为1280字节。当路由器被要求提出一个包太大的链接MTU会将数据包并发送回源ICMPv6包太大消息(Type 2)。因此,结束节点必须执行路径传输MTU的发现 (PMTUD)并且源必须创建合适的大小的包。IPv 6的路径MTU发现是在RFC1981中定义的。碎片扩展报头将被添加到碎片包中(next-header 44)(RFC 2460)。   今天的许多应用程序不能正确地执行PMTUD,这需要随着IPv6的引入而改变。隧道在IPv6中无处不在,所以对PMTUD的需求甚至超过了IPv4。防火墙也不应该过滤PMTUD消息(仅供参考,ICMPv6使用IPv6扩展头#58 (RFC 2463))。

10

对应用程序进行大量的测试 应用软件的测试永远不会过量。创建了独立于address-family的应用程序之后,应该使用各种操作系统对其进行测试。这些计算机应该IPv4-Only、双栈协议和IPv6-Only进行网络连接。您还应该在IPv4和IPv6上使用TCP和UDP53号端口上的A和AAAA记录测试DNS,并执行反向查找。你应该测试,测试,再测试。

【End】

4d1283679ff1b5d51e2b2c7796595321.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值