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),再调用底层局域网能力(数据链路层)传输数据。具体的过程如下图所示:
作为网络层协议的 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:二进制表示
上图中的地址是一个 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,你就不知道究竟0000在1111::2222和2222::3333是怎么分布的。
开头的 0 也可以简写,就变成如下的样子:
123:4567::123:4567:0:cdef
还有一种情况我们想要后面部分都填0,比如说3c4d::/16,这个代表只有前16位有数据,后面是0;1234: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),这个方式比较特殊,接下来我们会详细讲解。
全局单播
全局单播,就是将消息从一个设备传到另一个设备,这和 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 的本地单播地址组成如下图所示:
这种协议比较简单,本地单播地址必须以fe80开头,后面 64 位的 0,然后接上 54 位的设备编号。上图中的 Interface 可以理解成网络接口,其实就是网卡。
分组多播
有时候,我们需要实现广播。所谓广播,就是将消息同时发送给多个接收者。
IPv6 中设计了分组多播,来实现广播的能力。当 IP 地址以 8 个 1 开头,也就是ff00开头,后面会跟上一个分组的编号时,就是在进行分组多播。
这个时候,我们需要一个广播设备,在这个设备中已经定义了这些分组编号,并且拥有分组下所有设备的清单,这个广播设备会帮助我们将消息发送给对应分组下的所有设备。
任意播(Anycast)
任意播,本质是将消息发送给多个接收方,并选择一条最优的路径。这样说有点抽象,接下来我具体解释一下。
比如说在一个网络中有多个授时服务,这些授时服务都共享了一个任播地址。当一个客户端想要获取时间,就可以将请求发送到这个任播地址。客户端的请求扩散出去后,可能会找到授时服务中的一个或者多个,但是距离最近的往往会先被发现。这个时候,客户端就使用它第一次收到的授时信息修正自己的时间。
IPv6 和 IPv4 的兼容
目前 IPv6 还没有完全普及,大部分知名的网站都是同时支持 IPv6 和 IPv4。这个时候我们可以分成 2 种情况讨论:
- 一个 IPv4 的网络和一个 IPv6 的网络通信;
- 一个 IPv6 的网络和一个 IPv6 的网络通信,但是中间需要经过一个 IPv4 的网络。
下面我们具体分析一下。
情况 1:IPv4 网络和 IPv6 网络通信
例如一个 IPv6 的客户端,想要访问 IPv4 的服务器,步骤如下图所示:
- 客户端通过 DNS64 服务器查询 AAAA 记录。DNS64 是国际互联网工程任务组(IETF)提供的一种解决 IPv4 和 IPv6 兼容问题的 DNS 服务。这个 DNS 查询服务会把 IPv4 地址和 IPv6 地址同时返回。
- DNS64 服务器返回含 IPv4 地址的 AAAA 记录。
- 客户端将对应的 IPv4 地址请求发送给一个 NAT64 路由器
- 由这个 NAT64 路由器将 IPv6 地址转换为 IPv4 地址,从而访问 IPv4 网络,并收集结果。
- 消息返回到客户端。
情况 2:两个 IPv6 网络被 IPv4 隔离
这种情况在普及 IPv6 的过程中比较常见,IPv6 的网络一开始是一个个孤岛,IPv6 网络需要通信,就需要一些特别的手段。
不知道你有没有联想到坐火车穿越隧道的感觉,连接两个孤岛 IPv6 网络,其实就是在 IPv4 网络中建立一条隧道。如下图所示:
隧道的本质就是在两个 IPv6 的网络出口网关处,实现一段地址转换的程序。
总结
总结下,IPv6 解决的是地址耗尽的问题。因为解决了地址耗尽的问题,所以很多其他问题也得到了解决,比如说减少了子网,更小的封包头部体积,最终提升了性能等。
除了本讲介绍的内容,下一讲你还会从局域网络中看到更多对 NAT 技术的解读、对路由器的作用的探讨。随着 IPv6 彻底普及,你可以想象一下,运营商可以给到每个家庭一大批固定的 IP 地址,发布网页似乎可以利用家庭服务器……总之,林䭽也不知道最终会发生什么,我也对未来充满了期待,让我们拭目以待吧。
那么,通过这一讲的学习,你可以尝试回答本讲关联的面试题目:Tunnel 技术是什么了吗?
【解析】Tunnel 就是隧道,这和现实中的隧道是很相似的。隧道不是只有一辆车通过,而是每天都有大量的车辆来来往往。两个网络,用隧道连接,位于两个网络中的设备通信,都可以使用这个隧道。隧道是两个网络间用程序定义的一种通道。具体来说,如果两个 IPv6 网络被 IPv4 分隔开,那么两个 IPv6 网络的出口处(和 IPv4 网络的网关处)就可以用程序(或硬件)实现一个隧道,方便两个网络中设备的通信。
思考题
思考题:请你总结下 IPv6 和 IPv4 究竟有哪些区别?