大师兄

07 | IPv6 协议:Tunnel 技术是什么?

IPv4 用 32 位整数描述地址,最多只能支持 43 亿设备,显然是不够用的,这也被称作 IP 地址耗尽问题。

为了解决这个问题,有一种可行的方法是拆分子网。拆分子网,会带来很多问题,比如说内外网数据交互,需要网络地址转换协议(NAT 协议),增加传输成本。再比如说,多级网络会增加数据的路由和传输链路,降低网络的速度。理想的状态当然是所有设备在一个网络中,互相可以通过地址访问。

为了解决这个问题,1998 年互联网工程工作小组推出了全新款的 IP 协议——IPv6 协议。但是目前 IPv6 的普及程度还不够高,2019 年据中国互联网络信息中心(CNNIC)统计,IPv6 协议目前在我国普及率为 60%,已经位居世界首位。

既然不能做到完全普及,也就引出了本讲关联的一道面试题目:什么是 Tunnel 技术?下面请你带着这个问题,开启今天的学习吧!

IPv4 和 IPv6 相似点

IPv6 的工作原理和 IPv4 类似,分成切片(Segmentation)、增加封包头、路由(寻址)这样几个阶段去工作。IPv6 同样接收上方主机到主机(Host-to-Host)协议传递来的数据,比如一个 TCP 段(Segment),然后将 TCP 段再次切片做成一个个的 IPv6 封包(Datagram or Packet),再调用底层局域网能力(数据链路层)传输数据。具体的过程如下图所示:

Drawing 1.png

作为网络层协议的 IPv6,最核心的能力是确保数据可以从发送主机到达接收主机。因此,和 IPv4 类似,IPv6同样需要定义地址的格式,以及路由算法如何工作。

IPv6 地址

接下来我们重点说说地址格式的区别。

IPv4 的地址是 4 个 8 位(octet),总共 32 位。 IPv6 的地址是 8 个 16 位(hextet),总共 128 位。从这个设计来看,IPv6 可以支持的地址数量是 IPv4 的很多倍。就算将 IPv6 的地址分给每个人,每个人拥有的地址数量,依旧是今天总地址数量的很多倍。

格式上,IPv4 的地址用.分割,如103.28.7.35。每一个是 8 位,用 0-255 的数字表示。

IPv6 的地址用:分割,如0123:4567:89ab:cdef:0123:4567:89ab:cdef,总共 8 个 16 位的数字,通常用 16 进制表示。

#图片需要重绘,并参考下方中英翻译,在图中标出对应中文

  • Hexadecimal notation:十六进制表示

  • Quartet:16 位

  • Most significant:最高有效位

  • Binary notation:二进制表示

Drawing 3.png

上图中的地址是一个 IPv6 地址的完全态,其实也有简写的方式。比如:

0123:4567:0000:0000:0123:4567:0000:cdef

可以省略前 64 字节的0000:0000简写为:

0123:4567::0123:4567:0000:cdef

::只能出现一次,相当于省略了若干组0000。比如说1111::2222相当于中间省略了 6 组0000。为什么不能出现两个::呢?因为如果有两个::,就会对省略的0000的位置产生歧义。比如说1111::2222:3333,你就不知道究竟00001111::22222222::3333是怎么分布的。

开头的 0 也可以简写,就变成如下的样子:

123:4567::123:4567:0:cdef

还有一种情况我们想要后面部分都填0,比如说3c4d::/16,这个代表只有前16位有数据,后面是01234:5878:abcd/64代表只有左边64位有数据,后面是 0;再比如ff00/8,只有左边 8 位是有数据的。

IPv6 的寻址

接下来我们讨论下寻址,和 IPv4 相同,寻址的目的是找到设备,以及规划到设备途经的路径。和 IPv4 相同,IPv6寻址最核心的内容就是要对网络进行划分。IPv6 地址很充裕,因此对网络的划分和 IPv4 有很显著的差异。

IPv6 的寻址分成了几种类型:

  • 全局单播寻址(和 IPv4 地址作用差不多,在互联网中通过地址查找一个设备,简单来说,单播就是 1 对 1);

  • 本地单播(类似 IPv4 里的一个内部网络,要求地址必须以fe80开头,类似我们 IPv4 中127开头的地址);

  • 分组多播(Group Multicast),类似今天我们说的广播,将消息发送给多个接收者;

  • 任意播(Anycast),这个方式比较特殊,接下来我们会详细讲解。

全局单播

Drawing 5.png

全局单播,就是将消息从一个设备传到另一个设备,这和 IPv4 发送/接收消息大同小异。而全局单播地址,目标就是定位网络中的设备,这个地址和 IPv4 的地址作用相同,只不过格式略有差异。总的来说,IPv6 地址太多,因此不再需要子网掩码,而是直接将 IPv6 的地址分区即可

在实现全局单播时,IPv6 地址通常分成 3 个部分:

  • 站点前缀(Site Prefix)48bit,一般是由 ISP(Internet Service Providor,运营商)或者RIR(Regional Internet Registry, 地区性互联网注册机构),RIR 将 IP 地址分配给运营商;

  • 子网号(Subnet ID),16bit,用于站点内部区分子网;

  • 接口号(Interface ID), 64bit,用于站点内部区分设备。

因此 IPv6 也是一个树状结构,站点前缀需要一定资质,子网号和接口号内部定义。IPv6 的寻址过程就是先通过站点前缀找到站点,然后追踪子网,再找到接口(也就是设备的网卡)。

从上面全局单播的分区,我们可以看出,IPv6 分给站点的地址非常多。一个站点,有 16bit 的子网,相当于 65535 个子网;每个子网中,还可以用 64 位整数表示设备。

本地单播

理论上,虽然 IPv6 可以将所有的设备都连入一个网络。但在实际场景中,很多公司还是需要一个内部网络的。这种情况在 IPv6 的设计中属于局域网络。

在局域网络中,实现设备到设备的通信,就是本地单播。IPv6 的本地单播地址组成如下图所示:

Drawing 7.png

这种协议比较简单,本地单播地址必须以fe80开头,后面 64 位的 0,然后接上 54 位的设备编号。上图中的 Interface 可以理解成网络接口,其实就是网卡。

分组多播

有时候,我们需要实现广播。所谓广播,就是将消息同时发送给多个接收者。

IPv6 中设计了分组多播,来实现广播的能力。当 IP 地址以 8 个 1 开头,也就是ff00开头,后面会跟上一个分组的编号时,就是在进行分组多播。

这个时候,我们需要一个广播设备,在这个设备中已经定义了这些分组编号,并且拥有分组下所有设备的清单,这个广播设备会帮助我们将消息发送给对应分组下的所有设备。

任意播(Anycast)

任意播,本质是将消息发送给多个接收方,并选择一条最优的路径。这样说有点抽象,接下来我具体解释一下。

比如说在一个网络中有多个授时服务,这些授时服务都共享了一个任播地址。当一个客户端想要获取时间,就可以将请求发送到这个任播地址。客户端的请求扩散出去后,可能会找到授时服务中的一个或者多个,但是距离最近的往往会先被发现。这个时候,客户端就使用它第一次收到的授时信息修正自己的时间。

IPv6 和 IPv4 的兼容

目前 IPv6 还没有完全普及,大部分知名的网站都是同时支持 IPv6 和 IPv4。这个时候我们可以分成 2 种情况讨论:

  1. 一个 IPv4 的网络和一个 IPv6 的网络通信;

  2. 一个 IPv6 的网络和一个 IPv6 的网络通信,但是中间需要经过一个 IPv4 的网络。

下面我们具体分析一下。

情况 1:IPv4 网络和 IPv6 网络通信

例如一个 IPv6 的客户端,想要访问 IPv4 的服务器,步骤如下图所示:

Drawing 9.png

  1. 客户端通过 DNS64 服务器查询 AAAA 记录。DNS64 是国际互联网工程任务组(IETF)提供的一种解决 IPv4 和 IPv6 兼容问题的 DNS 服务。这个 DNS 查询服务会把 IPv4 地址和 IPv6 地址同时返回。

  2. DNS64 服务器返回含 IPv4 地址的 AAAA 记录。

  3. 客户端将对应的 IPv4 地址请求发送给一个 NAT64 路由器

  4. 由这个 NAT64 路由器将 IPv6 地址转换为 IPv4 地址,从而访问 IPv4 网络,并收集结果。

  5. 消息返回到客户端。

情况 2:两个 IPv6 网络被 IPv4 隔离

这种情况在普及 IPv6 的过程中比较常见,IPv6 的网络一开始是一个个孤岛,IPv6 网络需要通信,就需要一些特别的手段。

不知道你有没有联想到坐火车穿越隧道的感觉,连接两个孤岛 IPv6 网络,其实就是在 IPv4 网络中建立一条隧道。如下图所示:

Drawing 11.png

隧道的本质就是在两个 IPv6 的网络出口网关处,实现一段地址转换的程序

总结

总结下,IPv6 解决的是地址耗尽的问题。因为解决了地址耗尽的问题,所以很多其他问题也得到了解决,比如说减少了子网,更小的封包头部体积,最终提升了性能等。

除了本讲介绍的内容,下一讲你还会从局域网络中看到更多对 NAT 技术的解读、对路由器的作用的探讨。随着 IPv6 彻底普及,你可以想象一下,运营商可以给到每个家庭一大批固定的 IP 地址,发布网页似乎可以利用家庭服务器……总之,林䭽也不知道最终会发生什么,我也对未来充满了期待,让我们拭目以待吧。

那么,通过这一讲的学习,你可以尝试回答本讲关联的面试题目:Tunnel 技术是什么了吗?

解析】Tunnel 就是隧道,这和现实中的隧道是很相似的。隧道不是只有一辆车通过,而是每天都有大量的车辆来来往往。两个网络,用隧道连接,位于两个网络中的设备通信,都可以使用这个隧道。隧道是两个网络间用程序定义的一种通道。具体来说,如果两个 IPv6 网络被 IPv4 分隔开,那么两个 IPv6 网络的出口处(和 IPv4 网络的网关处)就可以用程序(或硬件)实现一个隧道,方便两个网络中设备的通信。

思考题

最后,我再给你出一道需要查资料的思考题:请你总结下 IPv6 和 IPv4 究竟有哪些区别

我建议你拿出几分钟的时间,把这两者的区别写在留言区。这个输出的过程不仅能够帮助你产生更多的思考,也是构建知识体系的根基。如果你对本次课程有什么建议和疑问,可以在评论区留言。如果你有所收获,也可以推荐给你的朋友。

这一讲就到这里。发现求知的乐趣,我是林䭽,感谢你学习本次课程。下一讲我们将学习“08 | 局域网:NAT 是如何工作的?”再见!