计算机网络课程总结 --IPV6
本文主要讲述 IPV6 的一些基础知识,包括 IPV6 的术语,地址,一些基本协议以及从 IPV4 过渡到 IPV6 的的一些技术等。
IPV6 的出现最主要的原因是因为 IPV4 存在着一些不足,主要有
- 地址不足
- 端到端模式无法实施 (NAT)
- Qos 和性能问题
- 配置复杂
- 安全问题
- 路由表的膨胀
- 移动性支持不足
其中最主要的就是地址不足。
在介绍 IPV6 的具体知识前,首先了解 IPV6 中的一些基本术语
从上图可知,IPV6 中有以下术语
- 领节点:不跨越网段的两台主机
- 局域网段:交换机某个端口下的网络
- 链路:路由器某个端口下的网络
- 子网 (site):一个机构管辖的所有网络(不同于 IPV4 中的子网)
IPV6 地址
IPV4 地址
讲述 IPV6 地址前,首先回顾一下 IPV4 地址,IPV4 的地址长度为 32 位,通过点分十进制表示,点分十进制的规则如下
- 将 32 位 IP 地址分为 4 个 8 位组
- 每个 8 位组之间用圆点 “.” 分隔
- 每个 8 位组转化为对应的十进制数
每个地址被划分为网路地址和主机地址两部分。地址可分为 ABCD 四类,每一类的地址范围如下图所示
IPV6 地址表示
IPV6 地址长度是 128 位,通过冒分 16 进制表示,冒分 16 进制将 128 位划分为 8 组,组与组之间通过冒号隔开,每一组 16 位,用四个 16 进制数表示,如下所示
但是这样表示出来的地址往往在 8 各组中有很多组是全 0 的,为了书写的简便,定义了以下的规则: 1)忽略前导 0, 2)忽略全 0,用双冒号代替,注意一个地址最多只能有一个双冒号
如下是运用了这两条规则的一个简单例子
除此之外,IPV6 中通过 /XX
表示地址前缀,替代了 IPV4 中子网掩码的概念。
IPV6 中的地址根据其作用域可以分为单播地址 (Unicast Address),组播地址 (Multicast Address) 和任播地址 (Anycast Address) 三大类。IPV6 中没有广播地址的概念。
单播地址
IPV6 单播地址用于唯一标识支持 IPV6 的设备上的接口,与 IPV4 类似,源 IPV6 地址必须是单播地址。在 IPV6 中,单播地址分为六类
- 链路本地地址 (Link Local Address)
- 环回地址 (Loopback Address)
- 未指定地址 (Unspecified Address)
- 站点本地地址 (Site Local Address)
- IPV4 兼容地址 (IPV4 Compatible Address)
- 可聚合全球单播地址 (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 地址变换过来,变换规则如下所示
注意上图中前 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
开头,具体的组播地址格式如下
其中
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 消息的目的地址是 FF02::2
, 也就是主机先整个链路的路由器请求 RA 消息,RA 消息的目的地址是 FF01::1
,也就是路由器向整个链路的主机发送 RS 消息。
因此为了避免 RS 泛滥,节点启动时最多只能发送 3 个 RS,而路由器也会主动周期性地发送 RA(默认值 200 秒)。主机在收到路由器的 RA 之后,自动设置默认路由器,建立默认路由器列表、前缀列表及其它参数。
需要注意的是,自动配置的 IPV6 地址在系统中有一个生存周期,跟优先时间和有效时间有关,对应着以下 4 种状态
在使用的时候需要遵循以下规则
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 消息的目的地址是被请求节点的组播地址,就是单播地址最后 24 位相同的主机都会加入的一个组播。而 NA 消息的目的地址是 FF02::1
, 原因是 NS 消息中的源地址是未指定地址,发出 NA 的主机并不知道 NS 是由那一台主机发出的。
当其他主机收到 NS 后,会有以下两种情形 1)NS 接收者如果发现其中的目标地址对它而言是 tentative 的,则主动放弃使用这个地址; 2)NS 接收者如果发现其中的目标地址是一个它正在使用的地址,则发送 NA 消息,请求发起者 将放弃使用这个试验地址
结合上面的 RS 和 RA,4 中 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
.
其过程如下所示:
当客户端已经记录了地址和其他配置信息,只需要 DNS server、NTP server 等信息的时候,可以通过 DHCPv6 快速配置来快速获得所需地址。这个过程只需要两个消息的交互,过程如下所示:
IPV6 报文
IPV6 的报文主要由三部分组成 1. 基本头(固定 40 字节,v4 不固定,为 20~60 字节范围内) 2. 拓展头(可选,0~n 字节,v4 中没有) 3. 有效负载(即上层传输数据)
基本头 (与 v4 对比)
v4 与 v6 的报文对比如下所示
且 v4 的报文的具体字段如下所示
v6 的报文的具体字段如下所示
v6 在 v4 字段的基础上有删除,也有修正的项,其中
修正的项有
- 服务类型→业务等级
- TTL→跳数限制
- 数据总长度→净荷长度 (因为头部固定长度为 40 个字节)
- 地址 32 位→128 位
- 协议→下一个头 (next header, 也是指示具体的协议的,不要被名称误导)
删除的项有
- 报头长
- 标志和分段偏移量 (与分片相关)
- 报头校验和
增加的项为
- 流标记
下图是一个抓取到的 ICMPv6 的具体 package
拓展头
除此之外,IPV6 将一些 IP 层的可选功能实现在上层封装和 IPV6 基本头部之后的扩展头部中,主要的扩展报头有:
- 逐跳选项
- 路由报头
- 分段报头
- 认证报头
- 封装安全有效载荷报头
- 目标选项
每一种扩展报头其实也有自己特定的协议号,例如:路由报头为 43,AH 报头为 51。上图中抓到的 ICMPv6 包的协议号为 58 (0x3a 转为 10 进制),其他一些常见的协议号如下所示
协议号 | 含义 |
---|---|
0 | 逐跳扩展头 |
1 | ICMPv4 |
6 | TCP |
17 | UDP |
43 | 路由扩展头 (使数据分组经过指定的中间节点) |
58 | ICMPv6 |
89 | OSPF |
每一个基本报头和扩展报头的 NextHeader
字段标识后面紧接的内容,如下图所示
ICMPv6 协议
ICMPv6 协议与回声请求、抑制消息、重定向、参数错误等功能相关,相关的命令为 ping
、traceroute
ICMP 报文格式为 Type+Code+CheckSum
, 其报文的格式以及在整个分组的位置如下所示
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 字节
IPV6 路由
在讲述 IPV6 的路由之前先回顾 IPV4 的路由,IPV4 的路由可以分为两大类:同一网络的路由和不同网络的路由。
同一网络间主机的通信主要依赖于 ARP 协议,根据目标 IP 查询其对应的 mac 地址,然后两者便可通信,中间可以不经过路由器。
不同网络间的通信则需要借助路由器,其过程如下所示
而对于 IPV6 的路由也可分为两种情况: on-link:源机和目的机在同一链路的数据转发 off-link:源机和目的机不在同链路的数据转发
通过地址前缀判断源和目的是否在同一链路。
on-link
处于同一链路的两条主机要通信就要知道对方的 mac 地址,在 IPV4 中通过 ARP 实现,ARP 是通过广播实现的,但是 IPV6 中并没有广播的概念。在 IPV6 中,通过 ND 协议来完成这个地址解析的工作。
ND 协议在我们介绍无状态地址自动配置的时候已经介绍过,但是除了无状态地址自动配置外,ND 协议还被用于地址解析和路由重定向。
ND 协议共有五种报文,五种报文都是以 ICMPv6 报文的形式出现,如下图所示
其地址解析过程如下:
1)首先查找邻居缓存表(IPV6 nc),没有则进行地址解析 (类似于查找 ARP 表) 2)源主机发送组播 NS 报文,该报文的目的地址为目标 IPV6 地址所对应的被请求节点组播地址(Solicited-node),在其中也包含了自己的链路层地址 3)目标主机收到 NS 报文后,就会了解到发送主机的 IPV6 地址和相应链路层地址;同时由于目标主机正在使用报文内的目标地址,所以会目标主机向源主机单播发一个邻接点公告报文(NA),该报文中包含自己的链路层地址。
这里需要注意的是最后的 NA 报文是单播的,而在无状态地址自动配置中 NA 报文是组播,原因在于无状态地址自动配置的时候发送 NS 的主机还没有有效的地址,而这里的主机已经有了,只是要找到另外一台主机的 mac 地址而已。
下图便是上面提的地址解析过程
off-link
当源和目的不在同一链路的时候,需要考虑两个问题
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 中的动态路由协议主要有 RIPng
,OSPFv3
和 BGP4+
。
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 的过渡被认为要经过三个阶段
过渡的技术共分为三类
- 双栈:网络设备上运行 IPV6/IPV4 双协议栈
- 隧道:IPV6 网络上承载 IPV4 分组,或相反
- 翻译 / 转换:地址、分组、端口的转换
双栈
一般基础设施设备,如路由器、交换机、公用服务器等,需要运行和支持双栈,非基础设置则可运行单协议或双协议。
隧道
根据创建方式可以大致分为两类 1)手动隧道:事前配置 2)自动隧道:创建和拆除都依赖当前网络条件
根据实际的网络环境又可以分为两类隧道
- IPV6 分组通过 IPV4 网络的隧道
- IPV4 分组通过 IPV6 网络的隧道
IPV6 分组通过 IPV4 网络时,IPV6 分组作为数据部分搭载到 IPV4 分组中,在这种情形下,IPV4 分组头部的 protocol=41
,如下图所示。
根据 IPV4 网络位置的不同,在不同的位置建立
IPV4 分组通过 IPV6 网络的情况跟上面一样。
翻译 / 转换
翻译 / 转换就是从 IPV4 转换到 IPV6,或反过来,不仅发生在网络层,还有传输层和应用层。如下图所示是一个翻译 / 转换的例子。
注意:当双栈和隧道都无法使用的时候,才使用翻译 / 转换技术;适用纯 IPV4 节点和纯 IPV6 节点间的通信。