计算机网络课程总结--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 逐跳扩展头
1 ICMPv4
6 TCP
17 UDP
43 路由扩展头(使数据分组经过指定的中间节点)
58 ICMPv6
89 OSPF

每一个基本报头和扩展报头的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节点间的通信。