应用和 IPv6

前言

在数据中心网络IPv6协议改造时,我们通常更关注路由交换的部分。对于应用系统适配IPv6 网络确缺少关注,本文旨在更多的讨论应用和IPv6 的关系,帮助个人、公司和组织能够更改好的将他们的应用程序迁移至IPv6 网络。

第一章、用户和IPv6

IPv6(Internet Protocol Version 6)是网络层协议的第二代标准协议,也被称为IPng(IP Next Generation),它所在的网络层提供了无连接的数据传输服务。IPv6是IETF设计的一套规范,是IPv4的升级版本。它解决了目前IPv4存在的许多不足之处,IPv6和IPv4之间最显著的区别就是IP地址长度从原来的32位升级为128位。IPv6以其简化的报文头格式、充足的地址空间、层次化的地址结构、灵活的扩展头、增强的邻居发现机制将在未来的市场竞争中充满活力。

对于应用程序开发人员可能需要修改应用套接字接口(socket)以支持ipv6 功能,但是对于绝大多数应用来说他们所依赖的框架、系统、web 服务都已对IPv6 有良好的支持,只需要在配置文件中开启对应功能即可。

IPv6地址由网络前缀和接口标识两个部分组成。网络前缀有n位,相当于IPv4地址中的网络ID;接口标识有(128-n)比特,相当于IPv4地址中的主机ID。

  • 地址2001:A304:6101:1::E0:F726:4E58的构成示意图*

输入输出

IPv6 直观来看最大的变化是从IPv4 的点分十进制四个固定的地址块,变成了IPv6 冒号分隔8个大小不一的16进制地址快。

IPv4 address:  192.168.1.1

 

    IPv6 address:
2001:A304:6101:1::E0:F726:4E58

当我们的应用系统需要输入输出IPv6 地址时,需要考虑显示区域是否能容纳IPv6
地址,功能组件是否能够同时处理IPv4 地址和IPv6 地址。还是使用单独控件(例如单选按钮) 来进行切换。

可变长IPv6 地址

第二大变化是 IP 地址长度的可变性。使用 IPv4,地址具有四组十进制数的固定格式。但是,在 IPv6 中,地址可以是用冒号分隔的完整八个十六进制数字块 - 或可以使用双冒号 (“::”) 表示法压缩全0的块,得到一个更短的地址。下列其中任何一个都是完全有效的 IPv6 地址:

2001:db8::1

 

2001:db8:10ff::ae:44f2

 

2001:db8:1212:3434:1212:5454:1afc:4001

您的应用程序能否应对地址格式的可变性?

 现在不能再将 IP 地址视为四个十进制数字的情况进行处理,您必须能够处理使用分隔符解析文本字符串-

基于冒号的情况。

考虑这些其他示例:

• 在 IPv4 中,本地环回地址为 127.0.0.1。在 IPv6 中它是 ::1。

• IPv4 地址198.51.20.1
内嵌IPv6 采用 ::198:51:20:1 形式。

您的应用程序是否能够处理这些变化?

端口号冒号问题

在 IPv4 中,您添加的 TCP 或 UDP 端口使用冒号将端口号添加到 IPv4 地址。例如,如果您想访问某个系统端口 8000 上运行的 Web 服务器,您将使用类似如下URL:

• http://198.51.100.22:8000/

您看到这将在 IPv6 中引起的问题吗?如果在 IPv6 地址中使用冒号作为分隔符,如何表示端口数字?这是一个普遍的问题。你需要考虑一下。

 解决端口号冒号问题的主要方法是在RFC 3986中规定的IPv6地址周围使用方括号。考虑到在IPv4下,如果你想连接到一个系统上运行的服务,很常见的做法是直接在URL中输入IPv4地址。例如,在一个网络浏览器中,你可以输入这些IP地址中的任何一个:

• http://198.51.100.22/

• http://198.51.100.22:8000/

使用 IPv6访问 URL 可能如下所示:

• http://[2001:db8:10ff::ae:44f2]/

• http://[2001:db8:10ff::ae:44f2]:8000/

请注意,在第二种情况下,端口号在方括号之外,因此才能解决端口号冒号问题。

这种方括号表示法不仅适用于 Web URL。它可以也可用于其他协议的 URI。例如,URI 与IP 语音的会话发起协议 (SIP) 可能看起来像这个:

• sip:admin@[2001:db8:34a5::1]

• sip:admin@[2001:db8:34a5::1]:5060

当然,理想情况下,您使用的是域名并且只需键入这些地址用于测试目的。如果您的应用程序需要使用 URL 或 URI,您需要考虑是否可以解析方括号。

(CIDR)
表示法与子网掩码

IPv6 的另一个变化是区分网络部分和主机部分的。使用 IPv4,如果您要向某人提供您的 IP地址,你通常会像下面这样给他们:

• IP 地址 198.51.100.22,子网掩码为
255.255.255.0

从应用程序的角度来看,您通常有两个单独的字段来输入 IPv4 地址和相应的子网。IPv4 使用中一些人会使用无类域间路由 (CIDR) RFC 4632 中指定的表示法。您可能还听说过这种称为斜线表示法或类似的东西。这个想法是,您无需提供特定的子网掩码,而是指定对地址的网络部分重要的位数。在上例中,子网掩码 255.255.255.0 表示前 24 位(三个 8 位的块)地址代表网络部分和后面 8 位代表主机部分。这用 CIDR 表示法写成:

• IP 地址 198.51.100.22/24

IPv4 通常使用这种表示法 ,但是对于 IPv6 此表示法是强制性的。所有地址都使用斜线符号。 IPv6 地址可以写成:

• IP 地址 2001:db8:1234:5a:f3a3::22/48

前 48 位(地址的前三个块)表示网络部分。同样, 如果给定一个 IPv6 地址块,它通常会写成:

• 2001:db8:1234:56::/64

前 64 位(或地址的前四个块)代表网络部分。从应用程序开发人员的角度来看,这里的主要问题是:

• 如何显示 IPv6 地址和网络掩码?在IPv4 中您使用使用两个输入框那么在IPv6 中您需要合并。

• 同样,您需要考虑如何处理 IPv6 地址和相应的输入。

大小写敏感问题

在IPv6 网络中下面两种地址写法都是相同的。

2001:db8:10ff::ae:44f2

2001:DB8:10FF::AE:44F2

与IPv4 相比,在应用程序中需要考虑大小写问题,或者大小写混和的问题。应用代码是否对大小写敏感。

RFC 5952建议所有的IPv6地址都应该用小写书写,RFC 5952还包含其他一些关于IPv6地址书写方式的建议。例如,它建议使用"::
"对IPv6地址中连续的零字符串进行压缩,可以作为参考。

输入字段的有效性检查

当考虑到地址格式的变化时,你需要考虑表格标签输入内容的有效性检查。通常情况下,你要对任何形式的输入进行某种格式的有效性检查,以确保输入的IP地址是正确的并防止安全问题,如跨站脚本、注入攻击等。诸如此类的问题。

对于IPv4,这是相对简单的。一个IPv4地址有一个固定的格式,并且只使用十进制数字。

IPv6地址可以是一个可变的格式,并使用十六进制数字,开发人员需要考虑如何处理这种情况。

第二章、DNS 和IPv6

理想情况下我们使用域名而不是IPv6地址访问业务系统,如果使用域名访问那么就需要正确的域名配置。以便用户能够正确的查询到对应的地址。

在IPv4中,将主机名www指向IP地址的DNS记录是一个A记录,在DNS区域文件中是这样的

www 3600 A 198.168.1.1

在IPv6中,新的DNS记录是AAAA(也被称为 "四A")记录,例如

www 3600 AAAA
2001:abcd:12af::53

通常情况下为了同时满足IPv4 和IPv6 的使用我们需要同时配置如下记录

www 3600 A 198.168.1.1

www 3600 AAAA 2001:abcd:12af::53

应用如何处理AAAA 记录

假如您的应用是一个APP ,您的客户端需要考虑如何处理响应的AAAA 记录,当您能获取到AAAA 记录时也并不代表您具备访问IPv6 业务的条件。

“dig”是 BIND 开发的一个强大的命令行工具,用于查询
DNS 名称服务器。它可以识别 IP 地址记录,从权威名称服务器获得响应时记录查询路由,诊断其他 DNS 问题。在您的IPv4 网络终端中可以进行如下测试:

AAAA和A记录的优先级

一个更大的问题是,当你的应用程序与主机通信时,会默认使用哪个地址?主机时默认使用哪个地址?AAAA记录所提供的IPv6地址?还是A记录提供的IPv4地址?当有A 记录和AAAA 记录时如何选择合适的访问地址,以及当其中一个记录响应的地址无法访问时,如何切换至另一个记录。这是一个很关键的问题,也是导致业务IPv6 部署缓慢的因素之一。

在一些早期的实验中,网站同时列出A和AAAA记录对应的服务地址,浏览器会在不具备IPv6 通信条件的终端上优先和IPv6地址的服务器通信。最终它将超时并切换到使用IPv4地址,但超时的时间太长,以至于用户体验很差。由于这个原因,一些网站已经转向拥有一个IPv6标签的网站版本。例如:

ipv6.google.com

www.v6.facebook.com

显然网站使用独立的IPv4和IPv6的DNS名称并不理想,应用程序能够同时正确处理这两种类型的记录才是最理想的方式。

Happy Eyeballs

Happy Eyeballs(也称为 Fast Fallback)是 IETF 发布的一种算法,它通过尝试同时使用
IPv4 和 IPv6 进行连接(更喜欢 IPv6 ),从而最大限度地减少 IPv6 连接或设置不完善的用户遇到的常见问题。 “快乐的眼球”这个名字来源于术语“眼球”来描述代表互联网最终用户的端点,而不是服务器。

Happy Eyeballs 旨在解决许多 IPv6 网络无法从 Internet 的某些区域访问的问题。 Happy Eyeballs 通过并行尝试访问IPv4/IPv6 来确定哪种传输更适合从而解决了这个问题。 使用 Happy Eyeballs 算法的应用程序会检查 IPv4 和 IPv6 连接(首选 IPv6)并使用返回的第一个连接。这些地址通常是使用循环算法从 DNS 中选择的。

图片来源:http://www.makikiweb.com/ipv6/_images/happy_eyeballs.png

Happy Eyeballs 是2011年世界IPv6日的一部分。

Happy Eyeballs算法还可以用于在其他类型的传输协议之间进行选择,例如在TCP和SCTP之间进行选择。

来自:https://en.wikipedia.org/wiki/Happy_Eyeballs

RFC:https://tools.ietf.org/html/rfc6724#section-6

第三章、Application Programming Interfaces
(APIs)

在当前世界API 纷繁多样的情况下您需要考虑您的应用程序是否开放了需要关注IP 地址格式的API,对于IP地址是否有依赖关系。还需要考虑相关的功能、模块、库的支持。

API 通信

当通过IPv6 访问您的API 时,您需要确保您的系统、apache、nginx、数据库、SLB、应用能够进行IPv6 通信。

apache 举例:

Listen
[2400:6180:0:d0::1f33:d001]:80

nginx 举例:

服务监听

listen [::]:8000;

listen [::1];

ipv6only=on|off

参考:http://nginx.org/en/docs/http/ngx_http_core_module.html

第四章、IP 地址存储

对于需要通过对源IP地址进行分析展示的模块,您需要考虑在双栈情况下如何存储对应的地址。

数据库

针对下面两种写法,您需要在数据库中选择合适的数据类型和长度。

::1

 

2001:db8:3f4d:ccdd:4179:880a:f00d:5511

文件

当在文件中写入IPv6 地址时一定请不要忘记添加[] .以及注意文件大小写及使用[::] 进行压缩。

第五章、传输

Path MTU Discovery

在互联网数据传输中,通常我们认为数据是由路由器一跳一跳进行数据转发,而路由器之间通过物理链路进行连接。而在物理链路中传输的数据报都被编码在数据链路层帧中进行传输。

为了使数据报成功地沿路径传送,它的大小必须足够小,以适应沿途每一跳的较小帧传输。最大传输单元 (MTU) 定义了物理网络的大小限制。如果一个数据报超过 MTU ,它必须被分成多个片,这个过程称为分片,然后在目标设备上重新组合这些片段。这是自 IPv4 的一项机制。

在 IPv4 中,路由器和物理链路需要处理的最小 MTU
为 576 字节。在 IPv6 中,所有链路必须能够处理至少 1280 字节的数据报文,不允许数据进行分片。通过增加最大有效载荷与报头长度的比率,这种传输速率对于IPv4几乎由一倍的提升,并降低了需要分段的频率。以上内容对于业务出现缓慢问题提供参考。

RFC: https://www.rfc-editor.org/rfc/rfc2460#section-5

RFC: https://www.rfc-editor.org/rfc/rfc1981

第六章、测试及说明

在您对应用系统能否支持IPv6 进行评估时您需要考虑下面这些问题:

部署场景

网络环境是否支持IPv6 ,如果不支持是否由其它的过渡机制来实现,例如NAT64 或者tunnel

  1. 仅使用 IPv4 网络:一些网络仍然仅使用 IPv4,并且会在很长一段时间内保持这种状态。您需要确认应用程序能否正常工作。
  2. 仅使用 IPv6 网络:未来IPv6 绝对会完全替代IPv4,为啥?猜的。您需要考虑是否只支持IPv6.
  3. 双栈网络: 这是目前使用最多、最广泛的技术。配合其它过渡机制可以灵活部署。对于双栈的选择您可以参考前面的Happy Eyeballs
  4. ISP和DNS: 当使用IPv6 时我建议您尽可能的让整个系统的通信使用域名,可以避免很多配置查看的错误。还有很重要的一点是您需要向您的网关咨询数据中心的ISP 是否接入了IPv6 ,这是业务IPv6 发布的关键。

日志文件、数据库、正则表达式和操作系统

对于 Web 服务器,例如 IIS、nginx、Apache 等…… 您将开始在日志文件、referrers、源 IP 等中看到 IPv6 地址的打印输出。对于常见业务统计和问题排查您需要对过滤脚本进行修改以支持IPv6 地址,建议您更多的使用各种库.例如 .NET 中的 IPAddress 和 Java 中的 InetAddress。还需要确认您的数据库能否支持IPv6.

Libraries

IPv6 地址与 IPv4 地址的不同之处在于它们的长度是不可预测的。对于您引入的处理IP地址的库您需要确认是否支持IPv6.

URLs

在WWW上,每一信息资源都有统一的且在网上唯一的地址,该地址就叫URLUniform Resource Locator,统一资源定位符),它是WWW的统一资源定位标志,就是网络资源位置。

简单来说就是你打开一个浏览器,地址栏上显示的网址,例如:

对于IPv6 地址访问如下:

https://[2001:500:4:13::125]:443/

同样也适用与curl 命令。

DNS

在前面我们已经说了DNS 对于IPv6 的重要性。您需要让您的网络部门确认DNS 对于IPv6 的支持情况。并学会适用dig 和nslookup 来辅助进行日常的问题排查。

IP Geolocation

应用程序根据客户端的位置定制服务是很常见的,其中一种使用的方法是使用客户端的 IP 地址(IP 地理定位)在地理上定位客户端。在这种情况下,将地址类型从 IPv4 更改为 IPv6 可能会产生一些影响。

IP 地理定位的工作原理是获取客户端所在地理位置的 IP 地址并在数据库中查找。数据库的创建方式和准确性取决于数据库的提供者。根据数据库进行 IP 地理位置定位,您需要问下能否支持IPv6 ,还有IPv6 的地址信息是否准确。

IP Geolocation 根据我日常的工作在SLB、DNS 、NGINX 中都有相关的功能,并且我们也有使用。通常IP
Geolocation 根据我的了解都是购买的专业服务商的信息。

Loopback and localhost

一些客户端应用程序使用 IP 套接字专门向同一终端上的其他进程发送数据或创建连接。一些应用程序具有特殊的处理规则,例如授权策略,如果软件识别出连接来自同一终端上的另一个进程,这些规则就会发生变化。通常称为回环地址通信。

在 IPv4 中,回环地址可以是 127.0.0.0 和 127.255.255.255 之间的任何地址,尽管 127.0.0.1 默认使用的地址。对于 IPv6,只有一个回环地址 ::1。对于客户端,解决本地进程通信最好的方法是解析 localhost 主机名,而不是使用 IP 地址。

测试

下面是我平时收集整理的IPv6 测试工具:

IPv6
地址计算:http://www.gestioip.net/cgi-bin/subnet_calculator.cgi

上海交通大学IPv6 网站测试:https://ipv6.ustc.edu.cn/onlinecheck.php?hostname=&cmd=%E9%87%8D%E6%96%B0%E6%B5%8B%E8%AF%95 (推荐使用速度很快)

注意事项:当我们的域名使用CNAME 后,测试一般无法进行。具体原因在于测试工具对于DNS 的查询处理逻辑。

DNS
在线测试:https://www.gdnspc.com/dns-propagation-checker/cn.html#MX&cge.cl

API
测试: https://www.postman.com/ (postman 支持ipv6 请求,如果测试报错,请选择官方支持版本)


作者: zy

2022年8月22号

遵循CC 4.0 BY-SA版权协议

应用和 IPv6的更多相关文章

  1. App 审核由于 IPv6 网络问题被拒

    昨天 提交App Store 的时候被拒了 We discovered one or more bugs in your app when reviewed on iPhone running iOS ...

  2. iOS 支持 IPv6

    苹果的规定:2016年6月1日提交到App Store必须支持IPv6-only网络. 官方文档:https://developer.apple.com/library/mac/documentati ...

  3. 中大东校小米路由器mini实现inode上网,ipv6 wifi【中大】【东校】【inode】【ipv6】

    还有不到4个月就要毕业了,前几天半夜没事捣鼓小米路由没想到竟然实现了wifi的ipv6. 正好又安利了同学一台小米路由mini,从刷机到inode到ipv6全搞了一遍. 这里将教程写出来,服务学弟妹. ...

  4. IPv6进阶

    IPV6报文部分字段介绍 1.没有校验和字段:优点:当TTL减少时,不需要重新处理,相对于IPV4能减少处理的时间:缺点:必须在上层包含校验和2.下一个报文:可指向扩展报文:(大部分节点不处理和查看大 ...

  5. iOS-不用网线搭建IPv6网络测试环境

    前言 从6月1日开始苹果要求之后审核的项目必须支持iPv6,如果不支持将被拒绝,掘金最近一次审核被就被拒绝了....理由为下: Apps are reviewed on an IPv6 network ...

  6. 通过ipv6访问 g o o g l e

    Google.Youtube.Facebook等均支持IPv6访问,IPv4网络的用户大部分都无法访问,比如Gmail,Google Docs等等各种相关服务.而该类网站大部分均已接入IPv6网络,因 ...

  7. CentOS7中禁用IPV6

    helps from: https://linux.cn/article-4935-1.html vi /etc/sysctl.conf net.ipv6.conf.all.disable_ipv6 ...

  8. IPV6入门篇

    引言 由于互联网的快速发展与普及,原有的IPV4地址已不能满足网络用户的需求,虽然NAT可以缓解IPV4地址的耗尽,但NAT破坏了网络环境的开放.透明以及端到端的特性,因此IPV6地址协议应运而生.I ...

  9. 【ipv6惹的祸】curl 超时

    偶然发现 最近在公司日志平台 总是可以看到很多关于php curl的错误信息 Operation timed out after 0 milliseconds with 0 out of 0 byte ...

  10. 在Linux下禁用IPv6的方法小结

    在Linux下禁用IPv6的方法小结--http://www.jb51.net/LINUXjishu/335724.html 这篇文章主要介绍了在Linux下禁用IPv6的方法小结,禁用IPv6的操作 ...

随机推荐

  1. view 相关代码片段笔记

    代码中动态创建view,并把AttributeSet加入到当前自定义的view中,动态创建属性相关 //https://blog.csdn.net/chenhuakang/article/detail ...

  2. MySQL_demo_50道习题

    title: MySQL_demo_50道习题 author: 杨晓东 permalink: MySQL_demo date: 2021-10-02 11:27:04 categories: - 投篮 ...

  3. JDK、JRE、JVM和i++

    JRE:运行环境(包含JVM和JAVA核心类库) JDK:JAVA开发工具包(包含JRE和开发工具)----开发工具:指编译工具javac和运行工具java JVM:虚拟机,保证了跨平台 ++i:先运 ...

  4. QFramework UI 笔记(后续不断 直到UKitI篇结束)

    1.所有的UIElement  传消息给 UIPanel 时,必须先注册 SendEvent();      RegisterEvent(); 2.注意Unity直接生成控件的名称,命名带(1)之类的 ...

  5. Excel—时间函数

    时间函数,学习之前先普及一个尝试,微软采用的是1900年纪念方式(数字1,代表的是1900年1月1日,数字1.5  代表的是1900年的1月1日的中午12:00,因为1.5正好是1天半的时间,而一天2 ...

  6. CSS边框(实线、虚线、破折号)

    1.CSS边框 border:1px solid red; /*实线*/ border:1px dotted red; /*虚线*/ border:1px dashed red; /*破折号*/

  7. Linux系统安装&VMware安装二

    第八步: 完成后,选择刚刚创建好的系统

  8. 关于decimal与double数据类型

    关于double和decimal类型, double类型能表示的精度不如decimal,但是其数据范围比decimal的大. 对于double类型的字段,用sum函数会出现多位小数的情况,比如a+b+ ...

  9. 【flask】建站经验随笔

    [前端] 1.前端table标签中每行使用template中 {%for i in rows%} {% endfor %}来生成之后,如果想对每行进行一个button处理,此时如果使用jquery的$ ...

  10. PVE设置硬盘休眠并解决经常唤醒问题

    查询硬盘编号: ls -l /dev/disk/by-id/ 查询硬盘状态: smartctl -i -n standby /dev/sda |grep "mode"|awk '{ ...