IPv4 用 32 位整数描述地址,最多只能支持 43 亿设备,显然是不够用的,这也被称作 IP 地址耗尽问题。为了解决这个问题,有一种可行的方法是拆分子网。拆分子网,会带来很多问题,比如说内外网数据交互,需要网络地址转换协议(NAT 协议),增加传输成本。再比如说,多级网络会增加数据的路由和传输链路,降低网络的速度。理想的状态当然是所有设备在一个网络中,互相可以通过地址访问。为了解决这个问题,1998 年互联网工程工作小组推出了全新款的 IP 协议——IPv6 协议。但是目前 IPv6 的普及程度还不够高,2019 年据中国互联网络信息中心(CNNIC)统计,IPv6
协议目前在我国普及率为 60%,已经位居世界首位。
IPv4 和 IPv6 相似点
IPv6 的工作原理和 IPv4 类似,分成切片(Segmentation)、增加封包头、路由(寻址)这样几个阶段去工作。IPv6 同样接收上方主机到主机(Host-to-Host)协议传递来的数据,比如一个 TCP 段(Segment),然后将 TCP 段再次切片做成一个个的 IPv6 封包(Datagramor 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简写为: ::只能出现一次,相当于省略了若干组0000。比如说1111::2222相当于中间省略了 6 组0000。为什么不能出现两个::呢?因为如果有两个::,就会对省略的0000的位置产生歧义。比如1111::2222:3333,你就不知道究竟0000在1111::2222和2222::3333是怎么分布的。开头的 0 也可以简写,就变成如下的样子:还有一种情况我们想要后面部分都填0,比如说3c4d::/16,这个代表只有前16位有数据,后面是0;1234:5878:abcd/64代表只有左边64位有数据,后面是 0;再比如ff00/8,只有左边 8 位是有数据的。
IPv6 和 IPv4 的兼容
目前 IPv6 还没有完全普及,大部分知名的网站都是同时支持 IPv6 和 IPv4。这个时候我们可以分成 2 种情况讨论:
1.
一个 IPv4 的网络和一个 IPv6 的网络通信;
2.
一个 IPv6 的网络和一个 IPv6 的网络通信,但是中间需要经过一个 IPv4 的网络。
下面我们具体分析一下。
情况 1:IPv4 网络和 IPv6 网络通信
例如一个 IPv6 的客户端,想要访问 IPv4 的服务器,步骤如下图所示:
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 网络中建立一条隧道。如下图所示:
IPv6 解决的是地址耗尽的问题。因为解决了地址耗尽的问题,所以很多其他问题也得到了解决,比如说减少了子网,更小的封包头部体积,最终提升了性能等。
Tunnel 就是隧道,这和现实中的隧道是很相似的。隧道不是只有一辆车通过,而是每天都有大量的车辆来来往往。两个网络,用隧道连接,位于两个网络中的设备通信,都可以使用这个隧道。隧道是两个网络间用程序定义的一种通道。具体来说,如果两个 IPv6 网络被IPv4 分隔开,那么两个 IPv6 网络的出口处(和 IPv4 网络的网关处)就可以用程序(或硬件)实现一个隧道,方便两个网络中设备的通信。