一、IPv6 的特点
IP 是互联网的核心协议。现在使用的 IP(即 IPv4 ) 是在 20 世纪 70 年代末期设计的。互联网经过几十年的飞速发展,到 2011 年 2 月,IPv4 的地址已经耗尽, ISP 已经不能再申请到新的 IP 地址块了。我国在 2014 年至 2015 年也逐步停止了向新用户和应用分配 IPv4 地址,同时全面开始商用部署 IPv6 。
为了解决“ IP 地址耗尽”问题,有以下三种措施:
- 采用无类别编址 CIDR,使 IP 地址的分配更加合理。
- 采用网络地址转换(NAT)方法以节省全球 IP 地址。
- 采用具有更大地址空间的新版本的 IPv6 。
前两种方法只是延长了 IPv4 使用寿命,只有第三种方法能从根本上解决 IP 地址耗尽问题。
IPv6 仍支持无连接的传送,但将协议数据单元 PDU 称为分组,而不是 IPv4 的数据报。为方便起见,以下仍采用数据报这一名词。
IPv6 的主要特点如下:
-
更大的地址空间(这是最重要的)。IPv6 将地址从 IPv4 的 32 位增大到 128 位(即增大 4 倍),IPv6 的地址空间是 IPv4 的 2128-32 = 296 倍,从长远来看,这些地址是绝对够用的。
-
扩展的地址层次结构。IPv6 由于地址空间很大,因此可以划分为更多的层次。
-
灵活的首部格式。IPv6 数据报的首部和 IPv4 的并不兼容。IPv6 定义了许多可选的扩展首部,不仅可提供比 IPv4 更多的功能,而且能提高路由器的处理效率,这是因为路由器对扩展首部不进行处理(除逐跳扩展首部外)。
-
改进的选项。IPv6 允许数据报包含有选项的控制信息,因而可以包含一些新的选项。但 IPv6 首部长度是固定的,其选项放在有效载荷中,选项是灵活可变的。而 IPv4 所规定的选项是固定不变的,其选项放在首部的可变部分。
-
允许协议继续扩充。IPv6 允许不断扩充功能,而 IPv4 的功能是固定不变的。这一点很重要,因为技术总是在不断地发展(如网络硬件的更新),而新的应用也还会出现。
-
支持即插即用(即自动配置)。因此 IPv6 不需要使用 DHCP 。
-
支持资源的预分配。IPv6 支持实时音 / 视频等要求保证一定带宽和时延的应用。
-
IPv6 只有源主机才能分片,是端到端的,不允许类似 IPv4 传输路径中的路由分片。
-
IPv6 首部长度是固定的 40B ,而 IPv4 首部长度是可变的(但必须是 4B 的整数倍)。
-
增大了安全性。身份鉴别和保密功能是 IPv6 的扩展首部。
虽然 IPv6 与 IPv4 不兼容,但总体而言它与所有其他的互联网协议兼容,包括 TCP、UDP、ICMP、IGMP 和 DNS 等,只是在少数地方做了必要的修改(大部分是为了处理长地址)。
二、IPv6 数据报的基本首部
IPv6 数据报由两部分组成:基本首部(base header)和有效载荷(payload , 也称净负荷)。有效载荷由零个或多个扩展首部(extension header)及其后面的数据部分构成。但请注意,所有的扩展首部并不属于 IPv6 数据报的首部。
下图是具有多个可选扩展首部的 IPv6 数据报的一般形式的示意图:
1. IPv6 的基本首部
下图为 IPv6 数据报的基本首部的格式:
与 IPv4 相比, IPv6 对首部中的某些字段进行了如下的更改:
-
取消了首部长度字段,因为它的首部长度是固定的(40 字节)。
-
取消了服务类型字段,因为优先级和流标号字段实现了服务类型字段的功能。
-
取消了总长度字段,改用有效载荷长度字段。
-
取消了标识、标志和片偏移字段,因为这些功能已包含在分片扩展首部中。
-
把 TTL 字段改称为跳数限制字段,但作用是一样的(名称与作用更加一致)。
-
取消了协议字段,改用下一个首部字段。
-
取消了检验和字段,这样就加快了路由器处理数据报的速度。我们知道,在数据链路层对检测出有差错的帧就丢弃。在运输层,当使用 UDP 时,若检测出有差错的用户数据报就丢弃。当使用 TCP 时,对检测出有差错的报文段就重传,直到正确传送到目的进程为止。因此在网络层的差错检测可以精简掉。
-
取消了选项字段,而用扩展首部来实现选项功能。
由于把首部中不必要的功能取消了,使得 IPv6 首部的字段数减少到只有 8 个。但由于 IPv6 地址长度为 128 位,所以 IPv6 基本首部的长度反而增大到 40B(首部长度增大了一倍)。
下面简单介绍 IPv6 基本首部中各字段的含义。下图为 40 字节长的 IPv6 基本首部:
-
版本(version)占 4 位。它指明了协议的版本,对 IPv6 该字段是 6 。
-
通信量类(traffic class)占 8 位。这是为了区分不同的 IPv6 数据报的类别或优先级。目前正在进行不同的通信量类性能的实验。
-
流标号(flow label)占 20 位。IPv6 的一个新的机制是支持资源预分配,并且允许路由器把每一个数据报与一个给定的资源分配相联系。
IPv6 提出流(flow)的抽象概念。所谓“流”就是互联网络上从特定源点到特定终点(单播或多播)的一系列数据报(如实时音频或视频传输),而在这个“流”所经过的路径上的路由器都保证指明的服务质量。所有属于同一个流的数据报都具有同样的流标号。因此,流标号对实时音频/视频数据的传送特别有用。对于传统的电子邮件或非实时数据,流标号则没有用处,把它置为 0 即可。
-
有效载荷长度(payload length)占 16 位。它指明 IPv6 数据报除基本首部以外的字节数(所有扩展首部都算在有效载荷之内)。这个字段的最大值是 64 KB( 65535 字节)。
-
下一个首部(next header)占 8 位。它相当于 IPv4 的协议字段或可选字段。
① 当 IPv6 数据报没有扩展首部时,下一个首部字段的作用和 IPv4 的协议字段一样,它的值指出了基本首部后面的数据应交付 IP 层上面的哪一个高层协议(例如: 6 或 17 分别表示应交付传输层 TCP 或 UDP )。
② 当出现扩展首部时,下一个首部字段的值就标识后面第一个扩展首部的类型。 -
跳数限制(hop limit)占 8 位。类似于 IPv4 首部的 TTL 字段,用来防止数据报在网络中无限期地存在。源点在每个数据报发出时即设定某个跳数限制(最大为 255 跳)。每个路由器在转发数据报时,要先把跳数限制字段中的值减 1 。当跳数限制的值为零时,就要把这个数据报丢弃。
-
源地址占 128 位。是数据报的发送端的 IP 地址。
-
目的地址占 128 位。是数据报的接收端的 IP 地址。
2. IPv6 的拓展首部(了解即可)
大家知道,IPv4 的数据报如果在其首部中使用了选项,那么沿着数据报传送的路径上的每一个路由器都必须对这些选项一一进行检查,这就降低了路由器处理数据报的速度。然而实际上很多的选项在途中的路由器上是不需要检查的(因为不需要使用这些选项的信息)。
IPv6 把原来 IPv4 首部中选项的功能都放在扩展首部中,并把扩展首部留给路径两端的源点和终点的主机来处理,而数据报途中经过的路由器都不处理这些扩展首部(只有一个首部例外,即逐跳选项扩展首部),这样就大大提高了路由器的处理效率。
在 RFC 2460 中定义了以下六种扩展首部:
① 逐跳选项;
② 路山选择;
③ 分片;
④ 鉴别;
⑤ 封装安全有效载荷;
⑥ 目的站选项。
每一个扩展首部都由若干个字段组成,它们的长度也各不同。但所有扩展首部的第一个字段都是 8 位的“下一个首部”字段。此字段的值指出了在该扩展首部后面的字段是什么。当使用多个扩展首部时,应按以上的先后顺序出现。高层首部总是放在最后面。
三、IPv6 的地址
1. 单播、多播与任播
一般来讲,一个 IPv6 数据报的目的地址可以是以下三种基本类型地址之一:
- 单播(unicast):单播就是传统的点对点通信。
- 多播(multicast):多播是一点对多点的通信,数据报发送到一组计算机中的每一个。IPv6 没有采用广播的术语,而是将广播看作多播的一个特例。
- 任播(anycast):这是 IPv6 增加的一种类型。任播的终点是一组计算机,但数据报只交付其中的一个,通常是距离最近的一个。
IPv6 把实现 IPv6 的主机和路由器均称为结点。由于一个结点可能会使用多条链路与其他的一些结点相连,因此一个结点可能有多个与链路相连的接口。这样,IPv6 给结点的每一个接口指派一个 IP 地址。一个结点可以有多个单播地址,而其中任何一个地址都可以当作到达该结点的目的地址。
在 IPv6 中,每个地址占 128 位,地址空间大于 3.4 × 1038 。如果整个地球表面(包括陆地和水面)都覆盖着计算机,那么 IPv6 允许每平方米拥有 7 × 1023 个 IP 地址。如果地址分配速率是每微秒分配 100 万个地址,则需要 1019 年的时间才能将所有可能的地址分配完毕。可见在想象到的将来,IPv6 的地址空间是不可能用完的。
2. 冒号十六进制记法
IPv4 地址通常使用点分十进制表示法。若 IPv6 也使用这种表示法,则地址书写起来将相当长。IPv6 标准使用冒号十六进制记法(colon hexadecimal notation, 简写为 colon hex),即把地址中的每 4 位用一个十六进制数表示,并用冒号分隔每 16 位。
如:4BF5:AA12:0216:FEBC:BASF:039A:BE9A:2170 。
当 16 位域的开头有一些 0 时,可以采用一种缩写表示法(允许把数字前面的 0 省略),但在域中必须至少有一个数字。
例如,可以把地址 4BF5:0000:0000:0000:BASF:039A:000A:2176 缩写为:4BF5:0:0:0:BA5F:39A:A:2176 。
当有相继的 0 值域时,还可以进一步缩写,也就是允许零压缩(zero compression),即一连串连续的零可以为一对冒号(::)所取代。当然,双冒号表示法在一个地址中仅能出现一次,因为 0 值域的个数没有编码,需要从指定的总的域的个数来推算。
这样一来,前述地址可被更紧凑地书写成:4BF5::BASF:39A:A:2176 。
3. IPv6 地址的分类
IPv6 地址的分类如下图所示:
对上图给出的五类地址简单解释如下:
-
未指明地址:这是 16 字节的全 0 地址,可缩写为两个冒号 “ :: ”。该地址不能用作目的地址,只能用于还未配置 IPv6 地址的主机作为源地址。这类地址仅此一个。
-
环回地址:IPv6 的环回地址是 0:0:0:0:0:0:0:1 ,可缩写为 ::1 。它的作用和 IPv4 的环回地址一样。这类地址也是仅此一个。
-
多播地址:该地址的作用和 IPv4 的一样。这类地址占 IPv6 地址空间的 1/256 。
-
本地链路单播地址(Link-Local Unicast Address):该地址的作用类似于 IPv4 的私有 IP 地址。有些单位的网络使用 TCP/IP 协议,但井没有连接到互联网上。连接在这样的网络上的主机都可以使用这种本地地址进行通信,但不能和互联网上的其他主机通信。这类地址占 IPv6 地址总数的 1/1024 。
-
全球单播地址:IPv6 的这一类单播地址是使用得最多的一类。曾提出过多种方案来进一步划分这 128 位的单播地址。根据 2006 年发布的草案标准 RFC 4291 的建议,IPv6 单播地址的划分方法非常灵活,可以如下图所示的任何一种。这就是说,可把整个的 128 比特都作为一个结点的地址。也可用 n 比特作为子网前缀,用剩下的(128 - n)比特作为接口标识符(相当于 IPv4 的主机号)。当然也可以划分为三级,用 n 比特作为全球路由选择前缀,用 m 比特作为子网前缀,而用剩下的(128 - n - m)比特作为接口标识符。
下图所示是 IPv6 全球单播地址采用三级结构的示意图。第一级为全球路由选择前缀,占 48 位,用于互联网中的路由选择,相当于 IPv4 分类地址中的网络号;第二级为子网标识符,占 16 位,用于各机构构建自己的子网;第三级为接口标识符,用于指明主机或路由器的单个网络接口,相当于 IPv4 分类地址中的主机号。
与 IPv4 不同,IPv6 地址的接口标识符有 64 位之多,足以对各种接口的硬件地址直接进行编码。这样,IPv6 就可直接从128 位地址的最后 64 位中直接提取出相应的硬件地址,而不需要使用地址解析协议(ARP)进行地址解析。
四、从 IPv4 向 IPv6 过渡
由于现在整个互联网的规模太大,因此,“规定一个日期,从这一天起所有的路由器一律都改用 IPv6”,显然是不可行的。这样,从 IPv4 向 IPv6 过渡只能采用逐步演进的办法,同时,还必须使新安装的 IPv6 系统能够向后兼容。这就是说,IPv6 系统必须能够接收和转发 IPv4 分组,并且能够为 IPv4 分组选择路由。
下面介绍两种从 IPv4 向 IPv6 过渡的策略,即使用双协议栈和使用隧道技术。
1. 双协议栈
双协议栈(dual stack),是指在完全过渡到 IPv6 之前,使一部分主机(或路由器)同时装有 IPv4 和 IPv6 两个协议栈(分别配置了一个 IPv4 地址和一个 IPv6 地址)。因此双协议栈主机(或路由器)既能够和 IPv6 的系统通信,又能够和 IPv4 的系统通信。双协议栈的主机(或路由器)记为 IPv6 / IPv4 ,表明它同时具有两种 IP 地址:一个 IPv6 地址和一个 IPv4 地址。
双协议栈主机在和 IPv6 主机通信时采用 IPv6 地址,而和 IPv4 主机通信时则采用 IPv4 地址。但双协议栈主机怎样知道目的主机是采用哪一种地址呢?它是使用应用层的域名系统 DNS 来查询的。若 DNS 返回的是 IPv4 地址,双协议栈的源主机就使用 IPv4 地址。但当 DNS 返回的是 IPv6 地址,源主机就使用 IPv6 地址。
上图所示的情况是源主机 A 和目的主机 F 都使用 IPv6 ,所以 A 向 F 发送 IPv6 数据报,路径是:A→B→C→D→E→F 。中间 B 到 E 这段路径是 IPv4 网络,路由器 B 不能向 C转发 IPv6 数据报,因为 C 只使用 IPv4 协议。B 是 IPv6 / IPv4 路由器,它把 IPv6 数据报首部转换为 IPv4 数据报首部后发送给 C 。C 再转发到 D 。当 D 转发到 IPv4 网络的出口路由器 E 时(E 也是 IPv6 / IPv4 路由器),再恢复成原来的 IPv6 数据报。
需要注意的是: IPv6 首部中的某些字段却无法恢复。例如,原来 IPv6 首部中的流标号 X 在最后恢复出的 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 数据报)。
五、ICMPv6【拓展】
和 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 协议的控制下进行发送和接收的。
六、例题
① 为了解决 IP 地址耗尽的问题,可以采用以下一些措施,其中治本的是( D )。
A. 划分子网
B. 采用无类比编址 CIDR
C. 采用网络地址转换 NAT
D. 采用 IPv6
I、最初设计的分类 IP 地址,因为每类地址所能连接的主机数大大超过一般单位的需求量,所以造成了 IP 地址的浪费。划分子网通过从网络的主机号借用若干比特作为子网号,从而使原来较大规模的网络细分为几个规模较小的网络,提高了地址的利用率。
II、CIDR 是比划分子网更为灵活的一种手段,它消除了 A、B、C 类地址及划分子网的概念。使用各种长度的网络前缀来代替分类地址中的网络号和子网号,将网络前缀都相同的 IP 地址组成“CIDR 地址块”。网络前缀越短,地址块越大。互联网服务提供者再根据客户的具体情况,分配合适大小的 CIDR 地址块,从而更加有效地利用 IPv4 的地址空间。
III、采用网络地址转换(NAT),可以使一些使用本地地址的专用网连接到互联网上,进而使得一些机构的内部主机可以使用专用地址,只需给该机构分配一个地址即可,并且这些专用地址是可重用的——其他机构也可使用,所以大大节省了地址的消耗。
尽管以上三种方法可以在一定阶段内有效缓解 IP 地址耗尽的危机,但无论是从计算机本身发展来看还是从互联网的规模和传输速率来看,现在的 IPv4 地址已很不适用,所以治本的方法还是使用 128 比特编址的 IPv6 地址。
② 下一代互联网核心协议 IPv6 的地址长度是( D )。
A. 32 比特
B. 48 比特
C. 64 比特
D. 128 比特
【IPv6 的地址用 16B(即 128 比特)表示,比 IPv4 长得多,地址空间是 IPv4 的 296 倍。】
③ 与 IPv4 相比,IPv6( D )。
A. 采用 32 位 IP 地址
B. 增加了首部字段数目
C. 不提供 QoS 保障
D. 没有提供检验和字段
【IPv6 减少了首部字段数目,仅包含 8 个字段。】
QoS(Quality of Service)即服务质量。在有限的带宽资源下,QoS 为各种业务分配带宽,为业务提供端到端的服务质量保证,以满足实时、多媒体通信的需要。例如:语音、视频和重要的数据应用在网络设备中可以通过配置 QoS 优先得到服务。
④ 以下关于 IPv6 地址 1A22:120D:0000:0000:72A2:0000:0000:00C0 的表示中,错误的是( C )。
A. 1A22:120D::72A2:0000:0000:00C0
B. 1A22:120D::72A2:0:0:C0
C. 1A22::120D::72A2::00C0
D. 1A22:120D:0:0:72A2::C0
【使用零压缩法时,双冒号 “::”(表示零压缩)在一个地址中只能出现一次。也就是说,当有多处不相邻的 0 时,只能用 “::” 代表其中的一处。】
⑤ 一个IPv6 地址的简化写法为 8::D0:123:CDEF:89A,则其完整地址应该是( D )。
A. 8000:0000:0000:0000:00D0:1230:CDEF:89A0
B. 0008:0000:0000:0000:00D0:0123:CDEF:89A0
C. 8000:0000:0000:0000:D000:1230:CDEF:89A0
D. 0008:0000:0000:0000:00D0:0123:CDEF:089A
冒号十六进制记法表示 IPv6 地址的规则:
I、多个连续区域为 0 ,可进行零压缩,但一个地址仅可出现一次零压缩。
II、每个区域开头的 0 可省略,结尾的 0 不可省略。
⑥ 下列关于 IPv6 的描述中,错误的是( D )。
A. IPv6 的首部长度是不可变的
B. IPv6 不允许分片
C. IPv6 采用了 16B 的地址,在可预见的将来不会用完
D. IPv6 使用了首部检验和来保证传输的正确性
【IPv6 的首部长度是固定的,因此不需要首部长度字段。】
因为目前网络传输介质的可靠性较高,所以出现比特错误的可能性很低,且数据链路层(会丢弃检测出差错的帧)和传输层(有相应的差错处理机制)有自己的检验,为了效率,网络层的差错检测可以精简掉(IPv6 取消了检验和字段),这样就加快了路由器处理数据报的速度。
⑦ 若一个路由器收到的 IPv6 数据报因太大而不能转发到链路上,则路由器将把该数据报( A )。
A. 丢弃
B. 暂存
C. 分片
D. 转发至能支持该数据报的链路上
【IPv6 中不允许路由器进行分片。因此,若路由器发现到来的数据报太大而不能转发到链路上,则丢弃该数据报,并向发送方发送一个指示分组太大的 ICMP 报文。】
【结论】IPv6 只有源主机才能分片,是端到端的,不允许类似 IPv4 传输路径中的路由分片。
【问】为什么 IPv6 不允许路由器进行分片?
【答】IPv6 不允许分片的主要原因是为了提高网络效率、简化路由器的处理过程,并支持更大的数据包。以下是一些具体的原因:
- 减少路由器负担:在 IPv4 中,分片是在路由器中进行的,这会增加路由器的处理负担。IPv6 要求主机在发送数据包之前进行路径 MTU(最大传输单元)发现,从而避免在路由器中进行分片。
- 提高性能:通过避免分片,IPv6 可以减少数据包在网络中传输时的延迟和开销。分片会导致数据包的重组和额外的处理时间,而 IPv6 的设计旨在减少这些不必要的步骤。
- 简化协议设计:不允许分片使得 IPv6 协议的设计更加简单和清晰。分片的处理逻辑在 IPv4 中相对复杂,而 IPv6 通过要求发送方在发送数据之前进行 MTU 发现,简化了这一过程。
- 支持更大的数据包:IPv6 支持更大的数据包(最大可达 4 GB),这使得在许多情况下不需要分片。应用程序可以根据需要调整数据包的大小,以适应网络的 MTU 。
⑧ 【2023 统考真题】下列关于 IPv4 和 IPv6 的叙述中,正确的是( D )。
I. IPv6 地址空间是 IPv4 地址空间的 96 倍
II. IPv4 首部和 IPv6 基本首部的长度均可变
III. IPv4向 IPv6 过渡可以采用双协议栈和隧道技术
IV. IPv6 首部的 Hop Limit 字段等价于 IPv4 首部的 TTL 字段
A. 仅 I、II
B. 仅 I、IV
C. 仅 II、II
D. 仅 II、IV