计算机网络课程总结 --IPV6

本文主要讲述 IPV6 的一些基础知识,包括 IPV6 的术语,地址,一些基本协议以及从 IPV4 过渡到 IPV6 的的一些技术等。

IPV6 的出现最主要的原因是因为 IPV4 存在着一些不足,主要有

  • 地址不足
  • 端到端模式无法实施 (NAT)
  • Qos 和性能问题
  • 配置复杂
  • 安全问题
  • 路由表的膨胀
  • 移动性支持不足

其中最主要的就是地址不足。

在介绍 IPV6 的具体知识前,首先了解 IPV6 中的一些基本术语

IPV6基本属于

从上图可知,IPV6 中有以下术语

  • 领节点:不跨越网段的两台主机
  • 局域网段:交换机某个端口下的网络
  • 链路:路由器某个端口下的网络
  • 子网 (site):一个机构管辖的所有网络(不同于 IPV4 中的子网)

IPV6 地址

IPV4 地址

讲述 IPV6 地址前,首先回顾一下 IPV4 地址,IPV4 的地址长度为 32 位,通过点分十进制表示,点分十进制的规则如下

  • 将 32 位 IP 地址分为 4 个 8 位组
  • 每个 8 位组之间用圆点 “.” 分隔
  • 每个 8 位组转化为对应的十进制数

每个地址被划分为网路地址和主机地址两部分。地址可分为 ABCD 四类,每一类的地址范围如下图所示

IPV4地址

IPV6 地址表示

IPV6 地址长度是 128 位,通过冒分 16 进制表示,冒分 16 进制将 128 位划分为 8 组,组与组之间通过冒号隔开,每一组 16 位,用四个 16 进制数表示,如下所示

IPV6 地址

但是这样表示出来的地址往往在 8 各组中有很多组是全 0 的,为了书写的简便,定义了以下的规则: 1)忽略前导 0, 2)忽略全 0,用双冒号代替,注意一个地址最多只能有一个双冒号

如下是运用了这两条规则的一个简单例子

IPV6简便书写的规则

除此之外,IPV6 中通过 /XX 表示地址前缀,替代了 IPV4 中子网掩码的概念。

IPV6 中的地址根据其作用域可以分为单播地址 (Unicast Address),组播地址 (Multicast Address) 和任播地址 (Anycast Address) 三大类。IPV6 中没有广播地址的概念。

单播地址

IPV6 单播地址用于唯一标识支持 IPV6 的设备上的接口,与 IPV4 类似,源 IPV6 地址必须是单播地址。在 IPV6 中,单播地址分为六类

  1. 链路本地地址 (Link Local Address)
  2. 环回地址 (Loopback Address)
  3. 未指定地址 (Unspecified Address)
  4. 站点本地地址 (Site Local Address)
  5. IPV4 兼容地址 (IPV4 Compatible Address)
  6. 可聚合全球单播地址 (Aggregate Global Unicast Address)

链路本地地址

IPV4 也有链路本地地址 (169.254.0.0/16), 但是在 IPV4 中,该地址的主要被用于地址自动配置:当主机不能从 DHCP 服务器处获得 IP 地址时,它会使用链路本地地址作为自己的地址

但是在 IPV6 中,链路本地地址用于与同一链路(同一个路由器端口下的网络)中的其他设备通信,而且也只能用于同一链路中,因此,路由器不会转发具有本地链路源地址或目的地址的数据包。需要注意的是,每个支持 IPV6 的网络接口均需要有链路本地地址。有了链路本地地址,就可以与与同一子网中的其他支持 IPV6 的设备通信,包括与默认网关(路由器)通信。所以假如只需要在局域网内通信,可以不需要全局单播地址。

支持 IPV6 的主机在启动时自动创建 IPV6 链路本地地址。链路本地地址格式为 FE80::/64 ,如下图所示

链路本地地址

链路本地地址前 64 位为 FE80:0:0:0,后 64 位为 EUI-64 地址,EUI-64 地址通过 mac 地址变换过来,变换规则如下所示

EUI-64地址变换过程

注意上图中前 24 位 mac 地址中用 u 标记的位表示要对原来的位取反。如下为一个简单的例子 本地链路地址的生成

链路本地地址的用途包括: 1)主机使用本地路由器的链路本地地址作为默认网关 IPV6 地址。 2)路由器使用链路本地地址交换动态路由协议消息。 3)转发 IPV6 数据包时,路由器的路由表使用链路本地地址确定下一跳路由器。

环回地址

与 IPV4 的 127.0.0.1 类似,在 IPV6 中对应为::1/128 或简单的 ::1

通过环回地址启用 ping 命令,从而测试本地主机的 IP 协议是否正确安装。

未指定地址

未指定地址是全 0 地址,使用压缩格式表示为 ::/128::

未指定地址不能分配给接口,仅可作为 IPV6 数据包的源地址。 未指定地址的作用在于当设备尚无永久 IPV6 地址时或数据包的源地址与目的地址不相关时,使用未指定地址用作源地址。

站点本地地址

站点本地地址是 IPV6 的私网地址,就像 IPV4 中的私网保留地址(10.0.0.0/8, 172.16.0.0/12,192.168.0.0/16)一样。站点本地地址的前缀范围为 FC00::/10

最初的 IPV6 规范定义了用于特定用途的本地站点地址,但是因为站点本地地址规范中有很多不明之处,因此,IETF 已经弃用本地站点地址,开始倾向于唯一本地地址。

IPV4 兼容地址

兼容 IPV4 的 IPV6 地址,用于过渡时期在 IPV4 网络上建立自动隧道,以传输 IPV6 数据包。其中高 96 位设为 0,后面的 32 位的 IPV4 地址,即地址为::IPV4.

可聚合全球单播地址

可聚合全球单播地址是由 IANA 分配的可在全球路由的公网 IP,地址由格式前缀 001 标识,设计目标是聚合或汇总该地址以便产生有效的路由基础结构

可聚合全球单播地址

从上图可知,ISP 商分配的前缀位为前 48 位,Site 部分则是由 ISP 下一级的组织机构用于划分子网,最后是 64 位的接口 ID。

接口 ID 的产生方式有三种 1. EUI-64 (前面讲述过,通过 mac 生成) 2. 随机生成 3. 手工配置

组播地址

IPV6 中没有广播的概念,IPV6 中通过组播代替广播。

IPV6 中组播地址前八位均为 1,因此组播地址总是以 ff 开头,具体的组播地址格式如下

IPV6组播格式

其中

  • Flags: 用来表示 permanent (0000) 或 transient (0001) 组播组

  • Scope: 表示组播组的范围 >0:预留 1:节点本地范围 2:链路本地范围 5:站点本地范围

  • Group ID: 组播组 ID

一些众所周知的组播地址如下图所示

众所周知的组播地址

除此之外还有有一种特殊的组播地址:Solicited-node 节点地址(被请求节点组播地址),主要用于重复地址检测和获取邻居节点的链路层地址。

地址构成为 前 104 位FF02::1:FF/104(64 个零) 后 24 位:单播地址的后 24 位

凡是单播地址后 24 位相同的接口会自动加入相应的请求节点组播组,如下为一个实例

请求组播组地址实例

关于组播更详细的信息可参考这篇文章

任播地址

在 IP 网络上通过一个任播地址标识一组提供特定服务的主机,同时服务访问方并不关心提供服务的具体是哪一台主机 (比如 DNS 或者镜像服务),访问该地址的报文可以被 IP 网络路由到这一组目标中的任何一台主机上,一般来说,目标地址为任播地址的数据报将发送给最近的一个服务主机。

综合上面提到的地址,可以知道一个接口上可以具有的 IPV6 地址如下所示

地址类型具体地址
链路本地地址FE80::/10
环回地址::1/128
所有节点组播地址FF01::1,FF02::1
可聚合全球单播地址2000::/3
被请求节点组播地址FF02::1:FF00:/104
主机所属组播地址FF00::/8

IPV6 地址配置

IPV6 中地址配置方式有三种 1. 手工配置 2. 无状态地址自动配置(ND 协议) 3. 有状态地址自动配置(DHCPv6)

手动配置一般不常用,各系统均有自己的配置方式,这里不详细展开。下面主要讨论自动配置的两种方式。

无状态地址自动配置(ND 协议)

无状态地址自动配置指的是无须任何配置即可和外界通信,达到了真正的即插即用。 无状态地址自动配置通过 ND (Neighbor Discovery, 邻居发现) 协议实现,主要包括如何自动获取地址以及实现重复地址检测 (DAD)

RS 和 RA

ND 协议中有两种重要的消息:RS 和 RA。其中,RS (Router Solicitation) 由主机发出,作用是促使路由器发送 RA (Router advertisment) 消息,RA 消息中包含了路由器前缀等信息,主机会利用路由器的前缀加上自己的 EUI-64 地址作为自己的 IPV6 地址。这两种消息都是以 ICMPv6 报文的形式出现,也是 5 种 ND 协议消息中的两种。具体过程如下图所示

RS和RA消息

注意 RS 消息的目的地址是 FF02::2, 也就是主机先整个链路的路由器请求 RA 消息,RA 消息的目的地址是 FF01::1,也就是路由器向整个链路的主机发送 RS 消息。

因此为了避免 RS 泛滥,节点启动时最多只能发送 3 个 RS,而路由器也会主动周期性地发送 RA(默认值 200 秒)。主机在收到路由器的 RA 之后,自动设置默认路由器,建立默认路由器列表、前缀列表及其它参数。

需要注意的是,自动配置的 IPV6 地址在系统中有一个生存周期,跟优先时间和有效时间有关,对应着以下 4 种状态

IPV6地址生存时间

在使用的时候需要遵循以下规则

1. 在 Preferred Lifetime 周期内的前缀生成的地址,任何上层应用都可不受限制地使用 2. 在超过 Preferred Lifetime 但未超过 Valid Lifetime 周期内的前缀生成的地址,正在使用该地址的上层应用可继续使用,但任何新的上层应用不能使用这个地址 3. 在超过 Valid Lifetime 周期内的前缀构造的地址,任何上层应用都不能使用该地址 一个链路本地地址的优先时间和有效时间是无限的,即永不超时!

NS 和 NA

在自动配置地址后需要检测该地址在链路上是否与其他地址重复 (链路上的主机的 mac 地址可能重复,从而 EUI-64 重复),该过程称为 DAD (Duplicate Address Detection), 所有的 IPV6 单播地址,不管是自动配置还是手动配置,都必须要通过 DAD

结合上面地址的生存周期,一个地址在分配给一个接口之后且通过重复地址检测之前称为 tentative 地址,即试验地址。

DAD 机制是 ND 协议的一部分,因此通过 ND 协议中的 NS/NA 两种消息实现。DAD 的基本流程: 1. 节点组播发送 NS (Neighbor Solicitation) 消息 2. 如果收到 NA (Neighbor Advertisment) 消息,就证明地址重复 3. 如果尝试若干次发送请求,都没有收到邻居通告,即可启用该地址

过程如下所示

NS和NA

注意上面的 NS 消息的目的地址是被请求节点的组播地址,就是单播地址最后 24 位相同的主机都会加入的一个组播。而 NA 消息的目的地址是 FF02::1, 原因是 NS 消息中的源地址是未指定地址,发出 NA 的主机并不知道 NS 是由那一台主机发出的。

当其他主机收到 NS 后,会有以下两种情形 1)NS 接收者如果发现其中的目标地址对它而言是 tentative 的,则主动放弃使用这个地址; 2)NS 接收者如果发现其中的目标地址是一个它正在使用的地址,则发送 NA 消息,请求发起者 将放弃使用这个试验地址

结合上面的 RS 和 RA,4 中 ND 消息交互入下

四种ND消息交互
前缀重新编制

前缀重新编制允许网络从以前的前缀平稳地过渡到新的前缀,提供对用户透明的网络重新编址能力。

在前缀重新编址时,路由器会继续通告当前前缀,只是优先时间和有效时间被减小到接近 0,同时,路由器开始通告新的前缀,这样,链路中至少有两个前缀共存

节点收到优先时间和有效时间被减小到接近 0 的 RA 时,会发现当前前缀的生命周期较短,停止使用;同时开始用新的前缀配置接口,并进行 DAD,通过后,获得新的地址使用。

在转换期间,节点有两个单播地址使用,旧的地址基于旧的前缀,用以维持以前已经建立的连接;新的地址,基于新的前缀,用来建立新的连接。当旧的前缀的有效时间递减为 0 时,旧的前缀完全废止,此时,RA 中只包含新的前缀

有状态地址自动配置(DHCPv6)

有状态的自动配置依赖于 DHCPv6 实现,DHCPv6 是 DHCP 的升级版本。

但是既然有了无状态自动配置,为什么还需要 DHCPv6 呢?主要有以下几个原因

  • 需要动态指定 DNS 服务时
  • 当不希望 MAC 地址成为 IPV6 地址的一部分时 (安全性)
  • 当需要良好的扩展性时

在讲述 DHCPv6 前,先介绍一下原始的 DHCP 协议

DHCP 的过程非常自然,主要包括下面三步 1)DHCP 客户发送广播请求 2)DHCP 服务器单播应答 3)DHCP 客户接收应答,获取 IP 等信息

具体过程使用四种 package 来实现这个过程 1)DHCP 客户机在本地发送 DHCP DISCOVER 广播包; 2)DHCP 服务器单播发送携带租约信息的 DHCP OFFER 包; 3)DHCP 客户机确认租约信息并发送 DHCP REQUEST 广播包; 4)DHCP 服务器单播送回 DHCP ACK 確认完成 IP 地址租用

DHCP 有三种地址分配机制: 1)自动分配方式-由 DHCP 分配一个永久的 IP 2)手动分配方式-网络管理员预先安排分配,由 DHCP 转达 3)动态分配方式-由 DHCP 分配具有租约期的 IP

相比于 DHCP,DHCPv6 有了以下的改变 1. 使用 UDP 来交换报文,端口 546/547(V4:67/68) 2. 使用本地链路地址或其它机制获得的地址来发送和接收 DHCPv6 报文 3. 没有了广播,客户机只需发送给保留的链路范围组播地址(FF02::1:2,all dhcp relay agents and servers ) 4. DHCP 中使用的四种 package 在 DHCPv6 中依次变为 DHCP Solicit, DHCP Advertis, DHCP Request, DHCP Relay.

其过程如下所示: DHCPv6

当客户端已经记录了地址和其他配置信息,只需要 DNS server、NTP server 等信息的时候,可以通过 DHCPv6 快速配置来快速获得所需地址。这个过程只需要两个消息的交互,过程如下所示: DHCPv6快速配置

IPV6 报文

IPV6 的报文主要由三部分组成 1. 基本头(固定 40 字节,v4 不固定,为 20~60 字节范围内) 2. 拓展头(可选,0~n 字节,v4 中没有) 3. 有效负载(即上层传输数据)

基本头 (与 v4 对比)

v4 与 v6 的报文对比如下所示

v4与v6报文对比

且 v4 的报文的具体字段如下所示

v4报文具体字段

v6 的报文的具体字段如下所示 v6报文具体字段

v6 在 v4 字段的基础上有删除,也有修正的项,其中

修正的项

  • 服务类型→业务等级
  • TTL→跳数限制
  • 数据总长度→净荷长度 (因为头部固定长度为 40 个字节)
  • 地址 32 位→128 位
  • 协议→下一个头 (next header, 也是指示具体的协议的,不要被名称误导)

删除的项

  • 报头长
  • 标志和分段偏移量 (与分片相关)
  • 报头校验和

增加的项

  • 流标记

下图是一个抓取到的 ICMPv6 的具体 package ICMPv6 package

拓展头

除此之外,IPV6 将一些 IP 层的可选功能实现在上层封装和 IPV6 基本头部之后的扩展头部中,主要的扩展报头有:

  • 逐跳选项
  • 路由报头
  • 分段报头
  • 认证报头
  • 封装安全有效载荷报头
  • 目标选项

每一种扩展报头其实也有自己特定的协议号,例如:路由报头为 43,AH 报头为 51。上图中抓到的 ICMPv6 包的协议号为 58 (0x3a 转为 10 进制),其他一些常见的协议号如下所示

协议号含义
0逐跳扩展头
1ICMPv4
6TCP
17UDP
43路由扩展头 (使数据分组经过指定的中间节点)
58ICMPv6
89OSPF

每一个基本报头和扩展报头的 NextHeader 字段标识后面紧接的内容,如下图所示

拓展报头

ICMPv6 协议

ICMPv6 协议与回声请求、抑制消息、重定向、参数错误等功能相关,相关的命令为 pingtraceroute

ICMP 报文格式为 Type+Code+CheckSum, 其报文的格式以及在整个分组的位置如下所示

ICMPv6分组格式和位置

ICMPv6 报文类型可分为两种 (1) 差错报文 (Type=0~127):通告 IPV6 分组传输中出现的错误。如目标不可达、数据包超长、超时、参数问题 (2) 信息报文 (Type=128~255):提供诊断和附加的主机功能。如回声请求 (Type=128) 和应答 (Type=129),ND 协议等

ICMPv6 的三个实际应用为

  • ping

  • tracert (HopLim 与 v4 中的 TTL 意思相同) > 第一个请求:HopLim=1 第一跳路由器收到,发送超时 (HopLim=0) 消息 得到第一跳路由器的信息 第二个请求:HopLim=2 第二跳路由器收到,发送超时消息 得到第二跳路由器的信息 注意:HopLim 的最大值为 30,且为了让每一个请求都返回超时信息,通常设置 ICMPv6 报文的端口不可达。

  • PMTU 发现:通过试探的方式发现路径允许的最大的 MTU, 如下为一个简单的过程。

1) 源机向目的机发送 MTU=1500 字节的 IPV6 数据包 2) 路由器 B 向源发送超长消息,指定 MTU=1400 字节 3) 源机向目的机发送 MTU=1400 字节的 IPV6 数据包 4) 路由器 C 向源发送超长消息,指定 MTU=1300 字节 5) 源机向目的机发送 MTU=1300 字节的 IPV6 数据包 6) 此后,该路径的 MTU 都使用 1300 字节

PMTU发现

IPV6 路由

在讲述 IPV6 的路由之前先回顾 IPV4 的路由,IPV4 的路由可以分为两大类:同一网络的路由和不同网络的路由。

同一网络间主机的通信主要依赖于 ARP 协议,根据目标 IP 查询其对应的 mac 地址,然后两者便可通信,中间可以不经过路由器。

不同网络间的通信则需要借助路由器,其过程如下所示 IPV4路由过程

而对于 IPV6 的路由也可分为两种情况: on-link:源机和目的机在同一链路的数据转发 off-link:源机和目的机不在同链路的数据转发

通过地址前缀判断源和目的是否在同一链路。

处于同一链路的两条主机要通信就要知道对方的 mac 地址,在 IPV4 中通过 ARP 实现,ARP 是通过广播实现的,但是 IPV6 中并没有广播的概念。在 IPV6 中,通过 ND 协议来完成这个地址解析的工作。

ND 协议在我们介绍无状态地址自动配置的时候已经介绍过,但是除了无状态地址自动配置外,ND 协议还被用于地址解析和路由重定向

ND 协议共有五种报文,五种报文都是以 ICMPv6 报文的形式出现,如下图所示

NS五种报文

其地址解析过程如下:

1)首先查找邻居缓存表(IPV6 nc),没有则进行地址解析 (类似于查找 ARP 表) 2)源主机发送组播 NS 报文,该报文的目的地址为目标 IPV6 地址所对应的被请求节点组播地址(Solicited-node),在其中也包含了自己的链路层地址 3)目标主机收到 NS 报文后,就会了解到发送主机的 IPV6 地址和相应链路层地址;同时由于目标主机正在使用报文内的目标地址,所以会目标主机向源主机单播发一个邻接点公告报文(NA),该报文中包含自己的链路层地址。

这里需要注意的是最后的 NA 报文是单播的,而在无状态地址自动配置中 NA 报文是组播,原因在于无状态地址自动配置的时候发送 NS 的主机还没有有效的地址,而这里的主机已经有了,只是要找到另外一台主机的 mac 地址而已。

下图便是上面提的地址解析过程 IPV6地址解析

当源和目的不在同一链路的时候,需要考虑两个问题

1. 主机发给哪个路由器?(主机 - 路由器) 2. 路由器发给哪个路由器?(路由器 - 路由器)

对于第一个问题,支持 IPV6 的主机有一个数据结构 DestinationCache,要发送数据到某个目的地址的时候,首先查询这个数据结构,如果查不到,就查路由表,让后将查到的信息记录在这个数据结构中。

如果查询到的目的地址是 on-link 的,将目的地址本身加入 DC 表的 nexthop 域;如果目的地址是 off-link 的,将路由表中的下一跳加入 DC 的 nexthop 域。

在这个过程中,会涉及到重定向的问题,重定向的作用其实就是给主机发送更好的路由。下图为一个简单的例子

路由重定向

当 PC1 要与 PC2 通信时,首先会先向 RT1 查询,RT1 查询后发现 RT2 可以直接提供这个路由,于是 RT1 告诉 PC1 以后如果要与 PC2 通信直接找 RT2 就好了,效率会更高,这就是路由重定向。

实际中,RT1 发现报文的出口和入口相同或者源地址跟报文下一跳同属一个网段,则发出重定向报文,重定向报文就是 ND 报文中的最后一种报文 (其他四种是 RS,RA,NS,NA)

对于问题 2,也就是路由器与路由器之间的传输,就需要依靠路由表了。路由表中的路由根据是否需要人工配置而分为静态路由和动态路由,其中静态路由需要人工配置,动态路由则通过协议学习,在 IPV6 中的动态路由协议主要有 RIPngOSPFv3BGP4+

RIPng 保留了 RIP 的主要特点

  • 距离矢量采用跳数,16 跳为不可达
  • 工作机制不变;
  • 仍然采用水平分割、毒性逆转、触发更新等技术减少路由环的发生

主要改变的地方:

  • 组播代替广播:主机不再受骚扰
  • 下一跳信息由单独的 R Table Entry 表示 (RTE)
  • 安全考虑:不单独设置验证,由 IPV6 本身保证
  • 只用于 IP 网络:不再支持其他网络协议

同样,OSPFv3 保留了 OSPFv2 的主要工作机理

  • 采用链路状态数据库
  • 与邻接路由器同步
  • DR 选举、SPF 算法、area 区域支持

主要改变的地方

  • 地址信息从 LSA 中移除;(LSU 载荷中包含地址信息)
  • RouterID 仍然采用 32 位,但不再跟地址有关
  • 重新定义了 LSA(如增加了 link-LSA、Intra-Area-Prefix-LAS 等,即 LSDB 的内容发生了变化)
  • 不再支持认证

过渡技术

从 IPV4 到 IPV6 的过渡被认为要经过三个阶段

v4到v6的过渡

过渡的技术共分为三类

  • 双栈:网络设备上运行 IPV6/IPV4 双协议栈
  • 隧道:IPV6 网络上承载 IPV4 分组,或相反
  • 翻译 / 转换:地址、分组、端口的转换

双栈

一般基础设施设备,如路由器、交换机、公用服务器等,需要运行和支持双栈,非基础设置则可运行单协议或双协议。

隧道

根据创建方式可以大致分为两类 1)手动隧道:事前配置 2)自动隧道:创建和拆除都依赖当前网络条件

根据实际的网络环境又可以分为两类隧道

  • IPV6 分组通过 IPV4 网络的隧道
  • IPV4 分组通过 IPV6 网络的隧道

IPV6 分组通过 IPV4 网络时,IPV6 分组作为数据部分搭载到 IPV4 分组中,在这种情形下,IPV4 分组头部的 protocol=41,如下图所示。

v6 over v4

根据 IPV4 网络位置的不同,在不同的位置建立

隧道1
隧道2
隧道3
隧道4

IPV4 分组通过 IPV6 网络的情况跟上面一样。

翻译 / 转换

翻译 / 转换就是从 IPV4 转换到 IPV6,或反过来,不仅发生在网络层,还有传输层和应用层。如下图所示是一个翻译 / 转换的例子。

翻译/转换

注意:当双栈和隧道都无法使用的时候,才使用翻译 / 转换技术;适用纯 IPV4 节点和纯 IPV6 节点间的通信。