协议IP是互联网的核心协议。现在使用的协议IP(即IPv4)是在20世纪70年代末期设计的。互联网经过几十年的飞速发展,在2011年2月3日,IANA开始停止向地区互联网注册机构RIR分配IPv4地址,因为IPv4地址已经全部耗尽了。
解决IP地址耗尽的根本措施就是采用具有更大地址空间的新版本的IP,即IPv6。经过多年的研究和试验,2017年7月终于发布了IPv6的正式标准。
IPv6仍支持无连接的传送,但将协议数据单元PDU称为分组(packet),而不是IPv4的数据报(datagram)。
实际上,分组和数据报可以看成是同义词。
IPv6所引进的主要变化如下:
IPv6数据报由两大部分组成,即基本首部(base header)和后面的有效载荷(payload)。有效载荷也称为净负荷。有效载荷允许有零个或多个扩展首部(extension header),再后面是数据部分(如下图所示)。但请注意,所有的扩展首部并不属于IPv6数据报的基本首部。
IPv6把IPv4首部中不必要的功能取消了,所以IPv6首部的字段数减少到只有8个(虽然首部长度增大了一倍)。下面解释IPv6基本首部中各字段的作用。
版本(version):占4位。
通信量类(traffic class):占8位。
流标号(flow label):占20 位。
有效载荷长度(payload length):占16位。
下一个首部(next header):占8位。
跳数限制(hop limit):占8位。
源地址:占128位。
目的地址:占128位。
下面我们简单介绍一下IPv6的扩展首部。在RFC 8200中定义了以下六种扩展首部:
每一个扩展首部都由若干个字段组成,它们的长度也各不同。但所有扩展首部的第一个字段都是8位的“下一个首部”字段。此字段的值指出了在该扩展首部后面的扩展首部是什么。当使用多个扩展首部时,应按以上的先后顺序出现。高层首部总是放在最后面。
大家知道,IPv4的数据报若在其首部中使用了选项,则在数据报转发路径中的每一个路由器,都必须检查首部中的所有选项,看是否与本路由器相关。这必然要花费相当的时间。IPv6把原来IPv4首部中选项的功能都放在扩展首部中。IPv6数据报若使用了扩展首部,则其基本首部的“下一个首部”字段会指出,在“有效载荷”字段中使用了何种扩展首部。而所有扩展首部的第一个字段都是“下一个首部”,用来指出在后面还有何种扩展首部。这就使得路由器能够迅速判断待转发的IPv6数据报有无需要本路由器处理的选项。
一般来讲,一个IPv6数据报的目的地址可以是以下三种基本类型地址之一:
IPv6把实现IPv6的主机和路由器均称为节点。由于一个节点可能会使用多条链路与其他的一些节点相连,因此一个节点可能有多个与链路相连的接口。这样,IPv6给节点的每一个接口指派一个IPv6地址。一个具有多个接口的节点可以有多个单播地址,而其中任何一个地址都可当作到达该节点的目的地址。
有时为了方便,若不会引起误解,也常说某个节点的IPv6地址,而把某个接口省略掉。
在IPv6中,每个地址占128位,地址空间大于 3.4 × 1 0 38 3.4\times 10^{38} 3.4×1038。在可见在想象到的将来,IPv6的地址空间是不可能用完的。
巨大的地址范围还必须使维护互联网的人易于阅读和操纵这些地址。IPv4所用的点分十进制记法现在也不够方便了。例如,一个用点分十进制记法的128位的地址为:
104.230.140.100.255.255.255.255.0.0.17.128.150.10.255.255
为了使地址再稍简洁些,IPv6使用冒号十六进制记法(colon hexadecimal notation,简写为colon hex),它把每个16位的值用十六进制值表示,各值之间用冒号分隔。例如,如果前所给的点分十进制数记法的值改为冒号十六进制记法,就变成了:
68E6:8C64:FFFF:FFFF:0:1180:960A:FFFF
在十六进制记法中,允许把数字前面的0省略。上面就把0000中的前三个0省略了。冒号十六进制记法还包含两个技术使它尤其有用。
FF05:0:0:0:0:0:0:B3 ----> FF05::B3
为了保证零压缩有一个不含混的解释,规定在任一地址中只能使用一次零压缩。该技术对已建议的分配策略特别有用,因为会有许多地址包含较长连续的零串。
其次,冒号十六进制记法可结合使用点分十进制记法的后缀。我们下面会看到这种结合在IPv4向IPv6的转换阶段特别有用。例如,下面的串是一个合法的冒号十六进制记法:
0:0:0:0:0:0:128.10.2.1
请注意,在这种记法中,冒号所分隔的每个值是两个字节 (16位)的值,但点分十进制每个部分的值是一个字节(8位)的值。再使用零压缩即可得出:
::128.10.2.1
下面再给出几个使用零压缩的例子。
1080:0:0:0:8:800:200C:417A ---> 1080::8:800:200C:417A
FF01:0:0:0:0:0:0:101(多播地址) ---> FF01::101
0:0:0:0:0:0:0:1(环回地址) ---> ::1
0:0:0:0:0:0:0:0(未指明地址) ---> ::
CIDR的斜线表示法仍然可用。例如,60位的前缀12AB00000000CD3
(十六进制表示的15个字符,每个字符代表4位二进制数字)可记为:
12AB:0000:0000:CD30:0000:0000:0000:0000/60
12AB::CD30:0:0:0:0/60
12AB:0:0:CD30::/60
但是,IPv6取消了子网掩码。
斜线的意思和IPv4的情况相似。例如,CIDR记法的2001:0DB8:0:CD30:123:4567:89AB:CDEF/60
,表示IPv6的地址是:2001:0DB8:0:CD30:123:4567:89AB:CDEF
,而其子网号是:2001:0DB8:0:CD30::/60
。
IPv6的地址分类如下表所示:
::
”。这个地址不能用作目的地址,而只能将某台主机当作源地址使用,条件是这台主机还没有配置到一个标准的IP地址。这类地址仅此一个。0:0:0:0:0:0:0:1
,可缩写为::1
。它的作用和IPv4的环回地址一样。这类地址也是仅此一个。由于现在整个互联网的规模太大,因此,“规定一个日期,从这一天起所有的路由器一律都改用IPv6”,显然是不可行的。这样,向IPv6过渡只能采用逐步演进的办法,同时,还必须使新安装的IPv6系统能够向后兼容。
这就是说,IPv6系统必须能够接收和转发IPv4分组,并且能够为IPv4分组选择路由。
下面介绍两种向IPv6过渡的策略,即使用双协议栈和使用隧道技术。
(1)双协议栈
双协议栈(dual stack)是指在完全过渡到IPv6之前,使一部分主机(或路由器)同时装有IPv4和IPv6这两种协议栈。因此双协议栈主机(或路由器)既能够和IPv6的系统通信,又能够和IPv4的系统通信。双协议栈的主机(或路由器)记为IPv6/IPv4,表明它同时具有IPv6地址和IPv4地址。
双协议栈的主机在和IPv6主机通信时采用IPv6地址,而和IPv4主机通信时则采用IPv4地址。但双协议栈主机怎样知道目的主机是采用哪一种地址呢?它是使用域名系统DNS来查询的。若DNS返回的是IPv4地址,则双协议栈的源主机就使用IPv4地址。但当DNS返回的是IPv6地址,源主机就使用IPv6地址。
双协议栈需要付出的代价太大,因为要安装上两套协议。因此在过渡时期,最好采用下面的隧道技术。
(2)隧道技术
向IPv6过渡的另一种方法是隧道技术(tunneling)。下图给出了隧道技术的工作原理。
这种方法的要点就是在IPv6数据报要进入IPv4网络时,把IPv6数据报封装成为IPv4数据报。现在整个的IPv6数据报变成了IPv4数据报的数据部分。这样的IPv4数据报从路由器B经过路由器C和D,传送到E,而原来的IPv6数据报就好像在IPv4网络的隧道中传输,什么都没有变化。当IPv4数据报离开IPv4网络中的隧道时,再把数据部分(即原来的IPv6数据报)交给主机的IPv6协议栈。图中的一条粗线表示在IPv4网络中好像有一个从B到E的“IPv6隧道”,路由器B是隧道的入口而E是出口。请注意,在隧道中传送的数据报的源地址是B而目的地址是E。
要使双协议栈的主机知道IPv4数据报里面封装的数据是一个IPv6数据报,就必须把IPv4首部的协议字段的值设置为41(41表示数据报的数据部分是IPv6数据报)。
和IPv4一样,IPv6也不保证数据报的可靠交付,因为互联网中的路由器可能会丢弃数据报。因此IPv6也需要使用ICMP来反馈一些差错信息。新的版本称为ICMPv6,它比ICMPv4要复杂得多。地址解析协议ARP和网际组管理协议IGMP的功能都已被合并到ICMPv6中。
ICMPv6是面向报文的协议,它利用报文来报告差错,获取信息,探测邻站或管理多播通信。ICMPv6还增加了几个定义报文功能及含义的其他协议。
在对ICMPv6报文进行归类时,不同的文献和 RFC文档使用了不同的策略,有的把其中的一些报文定义为ICMPv6报文,而把另一些报文定义为邻站发现ND(Neighbor-Discovery)报文或多播听众交付MLD(Multicast Listener Delivery)报文。其实所有这些报文都应当是ICMPv6报文,只是功能和作用不同而已。因此我们把这些报文都列入ICMPv6的不同类别。使用这种分类方法的原因是所有这些报文都具有相同的格式,并且所有报文类型都由ICMPv6协议处理。其实,像ND和MLD这样的协议都是运行在ICMPv6协议之下的。
基于这样的考虑,可把ICMPv6报文分类,如下图所示。请注意,邻站发现报文和组成员关系报文分别是在ND协议和MLD协议的控制下进行发送和接收的。