【计算机网络系列】网络层⑦:详解IPv6

IPv6

协议IP是互联网的核心协议。现在使用的协议IP(即IPv4)是在20世纪70年代末期设计的。互联网经过几十年的飞速发展,在2011年2月3日,IANA开始停止向地区互联网注册机构RIR分配IPv4地址,因为IPv4地址已经全部耗尽了。

解决IP地址耗尽的根本措施就是采用具有更大地址空间的新版本的IP,即IPv6。经过多年的研究和试验,2017年7月终于发布了IPv6的正式标准。

IPv6的基本首部

IPv6仍支持无连接的传送,但将协议数据单元PDU称为分组(packet),而不是IPv4的数据报(datagram)。

实际上,分组和数据报可以看成是同义词。

IPv6所引进的主要变化如下:

  1. 更大的地址空间。IPv6把地址从IPv4的32位增大4倍,即增大到128位,使地址空间增大了2倍。这样大的地址空间在可预见的将来是不会用完的。
  2. 扩展的地址层次结构。IPv6由于地址空间很大,因此可以划分为更多的层次。
  3. 灵活的首部格式。IPv6数据报的首部和IPv4的并不兼容。IPv6定义了许多可选的扩展首部,不仅可提供比 IPv4更多的功能,而且还可提高路由器的处理效率,这是因为路由器对扩展首部不进行处理(除逐跳扩展首部外)。
  4. 改进的选项。IPv6允许数据报包含有选项的控制信息,因而可以包含一些新的选项。但IPv6的首部长度是固定的,其选项放在有效载荷中。我们知道,IPv4所规定的选项是固定不变的,其选项放在首部的可变部分。
  5. 允许协议继续扩充。这一点很重要,因为技术总是在不断地发展的(如网络硬件的更新),而新的应用也还会出现。但我们知道,IPv4的功能是固定不变的。
  6. 支持即插即用(即自动配置)。因此IPv6不需要使用DHCP。
  7. 支持资源的预分配。IPv6支持实时视像等要求保证一定的带宽和时延的应用。
  8. IPv6首部改为8字节对齐(即首部长度必须是8字节的整数倍)。原来的IPv4首部是4字节对齐。

IPv6数据报由两大部分组成,即基本首部(base header)和后面的有效载荷(payload)。有效载荷也称为净负荷。有效载荷允许有零个或多个扩展首部(extension header),再后面是数据部分(如下图所示)。但请注意,所有的扩展首部并不属于IPv6数据报的基本首部。
image.png

IPv6把IPv4首部中不必要的功能取消了,所以IPv6首部的字段数减少到只有8个(虽然首部长度增大了一倍)。下面解释IPv6基本首部中各字段的作用。
image.png
版本(version):占4位。

  • 它指明了协议的版本,对IPv6该字段是6。

通信量类(traffic class):占8位。

  • 这是为了区分不同的IPv6数据报的类别优先级,和IPv4的区分服务字段的作用相似。
  • 目前正在进行不同的通信量类性能的实验。

流标号(flow label):占20 位。

  • IPv6的一个新的机制是支持资源预分配,并且允许路由器把每一个数据报与一个给定的资源分配相联系。
  • IPv6提出流(flow)的抽象概念。所谓“流”就是互联网络上从特定源点到特定终点(单播或多播)的一系列数据报(如实时音频或视频传输),而在这个“流”所经过的路径上的路由器都保证指明的服务质量。
  • 所有属于同一个流的数据报都具有同样的流标号。因此,流标号对实时音频或者视频数据的传送特别有用。对于传统的电子邮件或非实时数据,流标号则没有用处,把它置为0即可。

有效载荷长度(payload length):占16位。

  • 它指明IPv6数据报除基本首部以外的字节数(所有扩展首部都算在有效载荷之内)。
  • 这个字段的最大值是64KB(65535字节)。

下一个首部(next header):占8位。

  • 它相当于IPv4的协议字段可选字段
    • 当IPv6数据报没有扩展首部时,下一个首部字段的作用和IPv4的协议字段一样,它的值指出了基本首部后面的数据应交付IP层上面的哪一个高层协议(例如:6或17分别表示应交付运输层TCP或UDP)。
    • 当出现扩展首部时,下一个首部字段的值就标识后面第一个扩展首部的类型。

跳数限制(hop limit):占8位。

  • 用来防止数据报在网络中无限期地存在。和IPv4的生存时间字段相似。
  • 源点在每个数据报发出时即设定某个跳数限制(最大为255跳)。每个路由器在转发数据报时,要先把跳数限制字段中的值减1。当跳数限制的值为零时,就要把这个数据报丢弃。

源地址:占128位。

  • 是数据报的发送端的IP地址。

目的地址:占128位。

  • 是数据报的接收端的IP地址。

下面我们简单介绍一下IPv6的扩展首部。在RFC 8200中定义了以下六种扩展首部:

  1. 逐跳选项
  2. 路由选择
  3. 分片
  4. 鉴别
  5. 封装安全有效载荷
  6. 目的站选项

每一个扩展首部都由若干个字段组成,它们的长度也各不同。但所有扩展首部的第一个字段都是8位的“下一个首部”字段。此字段的值指出了在该扩展首部后面的扩展首部是什么。当使用多个扩展首部时,应按以上的先后顺序出现。高层首部总是放在最后面。

大家知道,IPv4的数据报若在其首部中使用了选项,则在数据报转发路径中的每一个路由器,都必须检查首部中的所有选项,看是否与本路由器相关。这必然要花费相当的时间。IPv6把原来IPv4首部中选项的功能都放在扩展首部中。IPv6数据报若使用了扩展首部,则其基本首部的“下一个首部”字段会指出,在“有效载荷”字段中使用了何种扩展首部。而所有扩展首部的第一个字段都是“下一个首部”,用来指出在后面还有何种扩展首部。这就使得路由器能够迅速判断待转发的IPv6数据报有无需要本路由器处理的选项。

IPv6的地址

一般来讲,一个IPv6数据报的目的地址可以是以下三种基本类型地址之一:

  • 单播(unicast):单播就是传统的点对点通信
  • 多播(multicast):多播是一点对多点的通信,数据报发送到一组计算机中的每一个。IPv6没有采用广播的术语,而是将广播看作多播的一个特例。
  • 任播(anycast):这是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省略了。冒号十六进制记法还包含两个技术使它尤其有用。

  • 首先,冒号十六进制记法可以允许零压缩(zero compression),即一连串连续的零可以为一对冒号所取代,例如:
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的地址分类如下表所示:
image.png

  • 未指明地址:这是16字节的全0地址,可缩写为两个冒号“::”。这个地址不能用作目的地址,而只能将某台主机当作源地址使用,条件是这台主机还没有配置到一个标准的IP地址。这类地址仅此一个。
  • 环回地址:IPv6 环回地址是0:0:0:0:0:0:0:1,可缩写为::1。它的作用和IPv4的环回地址一样。这类地址也是仅此一个。
  • 多播地址:功能和IPv4的一样。这类地址占IPv6地址总数的1/256。
  • 本地站点单播地址(cite-local unicast address):有些单位的内部网络使用TCP/IP协议,但并没有连接到互联网上。连接在这样的内部网络上的主机都可以使用这种本地站点地址进行通信,但不能和互联网上的其他主机通信。这类地址占IPv6地址总数的1/1024,其用途和和IPv4的专用地址是一样的。
  • 本地链路单播地址(link-local unicast address):这种地址是在单一链路上使用的。当一个节点启用IPv6时就自动生成本地链路地址。当需要把分组发往单一链路的设备而不希望该分组被转发到此链路范围以外的地方时,就可以使用这种特殊地址。这类地址占IPv6地址总数的1/1024。
  • 全球单播地址:IPv6的这一类单播地址是使用得最多的一类。IPv6单播地址的划分方法非常灵活,可以是如下图所示的任何一种。这就是说,可把整个的128位都作为一个节点的地址。也可用n位作为子网前缀,用剩下的 128 − n 128-n 128n位作为接口标识符(相当于IPv4的主机号)。当然也可以划分为三级,用n位作为全球路由选择前缀,用m位作为子网前缀,而用剩下的 128 − n − m 128 - n -m 128nm位作为接口标识符。

image.png

从IPv4向IPv6过渡

由于现在整个互联网的规模太大,因此,“规定一个日期,从这一天起所有的路由器一律都改用IPv6”,显然是不可行的。这样,向IPv6过渡只能采用逐步演进的办法,同时,还必须使新安装的IPv6系统能够向后兼容

这就是说,IPv6系统必须能够接收和转发IPv4分组,并且能够为IPv4分组选择路由。

下面介绍两种向IPv6过渡的策略,即使用双协议栈和使用隧道技术

(1)双协议栈

双协议栈(dual stack)是指在完全过渡到IPv6之前,使一部分主机(或路由器)同时装有IPv4和IPv6这两种协议栈。因此双协议栈主机(或路由器)既能够和IPv6的系统通信,又能够和IPv4的系统通信。双协议栈的主机(或路由器)记为IPv6/IPv4,表明它同时具有IPv6地址和IPv4地址。
image.png
双协议栈的主机在和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。
image.png
要使双协议栈的主机知道IPv4数据报里面封装的数据是一个IPv6数据报,就必须把IPv4首部的协议字段的值设置为41(41表示数据报的数据部分是IPv6数据报)。

ICMPv6

和IPv4一样,IPv6也不保证数据报的可靠交付,因为互联网中的路由器可能会丢弃数据报。因此IPv6也需要使用ICMP来反馈一些差错信息。新的版本称为ICMPv6,它比ICMPv4要复杂得多。地址解析协议ARP和网际组管理协议IGMP的功能都已被合并到ICMPv6中。
image.png
ICMPv6是面向报文的协议,它利用报文来报告差错获取信息探测邻站管理多播通信。ICMPv6还增加了几个定义报文功能及含义的其他协议。

在对ICMPv6报文进行归类时,不同的文献和 RFC文档使用了不同的策略,有的把其中的一些报文定义为ICMPv6报文,而把另一些报文定义为邻站发现ND(Neighbor-Discovery)报文或多播听众交付MLD(Multicast Listener Delivery)报文。其实所有这些报文都应当是ICMPv6报文,只是功能和作用不同而已。因此我们把这些报文都列入ICMPv6的不同类别。使用这种分类方法的原因是所有这些报文都具有相同的格式,并且所有报文类型都由ICMPv6协议处理。其实,像ND和MLD这样的协议都是运行在ICMPv6协议之下的。

基于这样的考虑,可把ICMPv6报文分类,如下图所示。请注意,邻站发现报文和组成员关系报文分别是在ND协议和MLD协议的控制下进行发送和接收的。
image.png

猜你喜欢

转载自blog.csdn.net/qq_37085158/article/details/128393499
今日推荐