IPv6 相关技术调研

最近,需要对系统进行 IPv6 化的改造,于是,我就假模假样的做起了调研。

IPv6 的表示方法

IPv6 地址为 128 位长,但通常写作 8 组,每组为四个十六进制数的形式。例如:

2001:0db8:85a3:08d3:1319:8a2e:0370:7344

如果四个数字都是零,可以被省略。例如:

2001:0db8:85a3:0000:1319:8a2e:0370:7344

等价于

2001:0db8:85a3::1319:8a2e:0370:7344

在某些情况下,一个 IPv6 地址中问可能包含很长的一段 0,可以把连续的一段 0 压缩为 ::

但为保证地址解析的唯一性,地址中 :: 只能出现一次,例如:

1
2
3
FF01:0:0:0:0:0:0:1101FF01::1101
0:0:0:0:0:0:0:1::1
0:0:0:0:0:0:0:0 → ::

综上:

1
2
3
4
5
2001:0DB8:0000:0000:0000:0000:1428:57ab
2001:0DB8:0000:0000:0000::1428:57ab
2001:0DB8:0:0:0:0:1428:57ab
2001:0DB8:0::0:1428:57ab
2001:0DB8::1428:57ab

都使合法的地址,并且他们是等价的。

不合法的:2001::25de::cade,零压缩出现了两次。

同时前导的零可以省略,因此:

2001:0DB8:02de::0e13 等价于 2001:DB8:2de::e13

IPv6 和 IPv4

由于 IPv4 到 IPv6 之间有一个漫长的过渡过程,因此,需要将 IPv6 兼容 IPv4 或者 IPv6 映射为 IPv4。

兼容 IPv4 的地址(IPv4-compatible address)

在兼容情况下:如果 IPv4 表示为 X.X.X.X,那么对应的 IPv6 即为 ::X.X.X.X高位补零,同时进行零压缩);

这里的 X.X.X.X 是 IPv4 公共地址的十进制点号表示法,用于 IPv6/IPv4 节点们(同时支持)在使用仅支持 IPv4 的网络上用 IPv6 的协议进行通信

但是事实证明这种技术不是个好主意,RFC4291中废弃了对这类地址的使用,大家知道有这么一回事就可以了。

IPv4 映射地址(IPv4-mapped address)

形如 ::FFFF:X.X.X.X(33-128 位为 ::FFFF),这里的 X.X.X.X 是 IPv4 公共地址的十进制点号表示法,,用于 IPv6 地址表示 IPv4 地址。

主要用于某些场景下 IPv6 节点与 IPv4 节点通信,Linux 内核对这类地址很好地支持。

如何 ping 一个 IPv6 的地址?

在 Linux 发行版中,使用 ping6 命令 ping IPv6 主机或者地址。

在浏览器中使用 IPv6 的地址访问 web 资源,IPv6 的地址必须要使用中括号 [] 包起来。

fe80::6e92:bfff:fe04:663c

IPv6 的过渡技术

IPv4 升级到 IPv6 肯定不会是一蹴而就的,是需要经历一个十分漫长的过渡阶段,要数十年的时间都不为过。现阶段,就出现了 IPv4 慢慢过渡到 IPv6 的技术。过渡技术要解决最重要的问题就是,如何利用现在大规模的 IPv4 网络进行 IPv6 的通信。

要解决上面的问题,这里主要介绍 3 种过渡技术:

1、双栈技术
2、隧道技术
3、转换技术(有一些文献叫做翻译技术)

本章节会对以上的过渡技术,选取几个典型的、我们未来最有机会接触到的具体的过渡技术结合实验观察过渡技术的具体实现和数据包的表现形式。

双栈技术

通信节点同时支持 IPv4 和 IPv6。

例如在同一个交换机下面有 2 个 Linux 的节点,2 个节点都是 IPv4/IPv6 双栈,节点间原来使用 IPv4 上的 UDP 协议通信传输,现在需要升级为 IPv6 上的 UDP 传输。

由于 2 个节点都支持 IPv6,那只要修改应用程序为 IPv6 的 socket 通信基本达到目的了。

上面的例子在局域网通信的改造是很容易的。但在广域网,问题就变得十分复杂了。

因为主要问题是在广域网上的 2 个节点间往往经过多个路由器,按照双栈技术的部署要求,之间的所有节点都要支持 IPv4/IPv6 双栈,并且连接双栈网络的接口必须同时配置 IPv4 公网 地址和 IPv6 地址,才能正常工作,这里就无法解决I Pv4 公网地址匮乏的问题。

双协议栈典型应用场景

双协议栈典型应用场景

如图所示,主机向 DNS 服务器发送 DNS 请求报文,请求域名 www.example.com 对应的 IP 地址。DNS 服务器将回复该域名对应的 IP 地址。

该 IP 地址可能是 10.1.1.1 或 3ffe:yyyy::1。

主机系统发送 A 类查询,则向 DNS 服务器请求对应的 IPv4 地址;系统发送 AAAA 查询,则向 DNS 服务器请求对应的 IPv6 地址。

图中 Router 支持双协议栈功能。如果主机访问 IPv4 地址为 10.1.1.1 的网络服务器,则可以通过 Router 的 IPv4 协议栈访问目标节点。如果主机访问 IPv6 地址为 3ffe:yyyy::1 的网络服务器,则可以通过 Router 的IPv6协议栈访问目标节点。

因此,双栈技术一般不会直接部署到网络中,而是配合其他过渡技术一起使用,例如在隧道技术中,在隧道的边界路由器就是双栈的,其他参与通信的节点不要求是双栈的。

隧道技术

当前的网络仍然是 IPv4 为主,因此尽可能地充分利用 IPv4 网络进行 IPv6 通信是十分好的手段之一。隧道技术就是这样子的一种过渡技术。

隧道将 IPv6 的数据报文封装在 IPv4 的报文头部后面(IPv6 的数据报文是 IPv4 的载荷部分),IPv6 通信节点之间传输的 IPv6 数据包就可以穿越 IPv4 网络进行传输。

隧道技术的一个很重要的优点是透明性,通过隧道进行通信的两个 IPv6 节点(或者节点上的应用程序)几乎感觉不到隧道的存在。

IPv6典型的隧道

根据隧道的出口入口的构成,隧道可以分为路由器-路由器,主机-路由器隧道、路由器-主机、主机-主机隧道等类型。

上图是一种典型的隧道技术:路由器-路由器隧道,两个 IPv6 网络中的主机通过隧道方式穿越了 IPv4 进行通信。

其中 C 节点和 D 节点被称为边界路由器,边界路由器必须要支持 IPv4-IPv6 双栈。当 IPv6 网络 1 的主机 A 将 IPv6 数据包发给边界路由器 C,C 对 IPv6 数据包进行 IPv4 封装,然后在 IPv4 网络上进行传输,发送到边界路由器 D,D 收到 IPv4 的数据包后剥掉 IPv4 的包头,还原 IPv6 的数据包,发送到 IPv6 网络 2 的主机 B。

转换技术

有一些文献叫做:翻译技术。

隧道技术是比较好地解决了在很长期一段时间内还是 IPv4 网络是主流的情况下 IPv6 节点(或者双栈节点)间的通信问题。但是由于 IPv4 到 IPv6 的过渡是十分漫长的,因此也需要解决 IPv6 节点与 IPv4 节点通信的问题。协议转换技术可以用来解决这个问题。

协议转换技术根据协议在网络中位置的不同,分为网络层协议转换、传输层协议转换和应用层协议转换等。

协议转换技术的核心思路就是在 IPv4 和 IPv6 通信节点之间部署中间层,将 IPv4 和 IPv6 相互映射转换

我们非常熟悉的 NAT 也是一种典型的协议转换技术,是将私网 IPv4 地址映射转换为公网 IPv4 地址,这种转换技术又称为 NAT44。

参考:

http://t.cn/RmdLf6P
http://t.cn/EU9ejDN
http://t.cn/EU9dCvF

hoxis wechat
一个脱离了高级趣味的程序员,关注回复1024有惊喜~
赞赏一杯咖啡
  • 本文作者: hoxis | 微信公众号【不正经程序员】
  • 本文链接: https://hoxis.github.io/little-about-ipv6.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!
  • 并保留本声明和上方二维码。感谢您的阅读和支持!
0%