概述
IPv6(Internet Protocol Version 6)是网络层协议的第二代标准协议,也被称为IPng(IP Next Generation)。它是Internet工程任务组IETF(Internet Engineering Task Force)设计的一套规范,是IPv4(Internet Protocol Version 4)的升级版本。
IPv6的优势
地址空间巨大
相比 IPv4的地址空间而言,IPv6可以提供2^128个地址空间,几乎不会被耗尽,可以满足未来网络的任何应用,比如物联网等新应用。
层次化的路由设计
IPv6地址规划设计时,吸取了IPv4地址分配不连续带来的问题,采用了层次化的设计方法,前3位固定,第4~16位是顶级聚合,理论上,互联网骨干设备上的IPv6路由表只有213=8192条路由信息。
效率高,扩展灵活
相对于IPv4报头大小的可变成20~60Byte,IPv6报头采用定长设计,大小固定为40Byte。相对IPv4报头中数量多达12个的选项基本头中只包含选路所需要的8个Nq据新的需求设计出新的扩展头,具有良好的扩有利于路由器的转发效率,同时可以根据新的需展性。
支持即插即用
设备连接到网络中,可以通过自动配置的方式获取网络前缀和参数,并自动结合设备自身的链路地址生成IP地址,简化了网络管理
更好的安全性保障
由于IPv6协议通过扩展头的形式支持IPSEC 协议,无需借助其他安全加密设备,可以直接为上层数据提供加密和身份验证,保障数据传输的安全。
引入了流标签的概念
使用IPv6新增加的FLOW LABEL字段,加数据包同属于某个相同的流量,比如基于流的QOS等应用,适合于对连音频或视频等实时数据传输。
IPv6地址表示
需要注意的是,在一个IPv6地址中只能使用一次双冒号“::”,否则当计算机将压缩后的地址恢复成128位时,无法确定每段中0的个数。
一个IPv6地址可以分为如下两部分
网络前缀:n比特,相当于IPv4地址中的网络ID。
接口标识:128-n比特,相当于IPv4地址中的主机ID。
注意:对于IPv6 单播地址来说,如果地址的前三bit不是000,则接口标识必须为64位,如果地址的前三位是000,则没有此限制,这里注意,只有本地回环地址和未分配地址才为128位,其他单播地址必须为64位。IPv6中没有对应的掩码了,只有前缀标识,标识多少位为前缀,ipv4中为什么有掩码?为了告诉机器网络位为多少,但是机器又无法直接识别网络位,所以只能通过掩码的方式了。
要生成一个接口IP地址,我们需要关心前缀怎么获取,接口标识怎么获取。只要这两个标识获取了,一个完整的IPv6地址也就生成了。这里我们只关系单播地址怎么生成,组播地址不能直接在接口上配置,任播地址必须全部手工配置,不能通过其他方式生成。具体配置在后面描述。
单播地址前缀生成方式
单播地址前缀可以通过四种方法生成:手工配置,无状态地址获取,DHCP获取,系统通过软件自动生成,其中无状态地址获取最为常用。
手工配置:也就是前缀完全由手工进行配置。
无状态地址获取:通过RS,RA报文与路由器进行交互获得对应的前缀。
DHCPv6获取(也称作有状态获取):通过DHCPv6服务器获取对应的前缀(接口标识可以获取,但是几乎没有这样做,很不方便)或者其他信息。
系统通过软件自动生成:设备连接一个服务器,然后从一个专门的服务器中进行分配获取相应的前缀,有点类似于DHCPv6服务器,但是一般通过系统软件自动生成还会同时生成后缀。
单播地址后缀生成方式
单播地址接口标识可通过三种方法生成:手工配置、系统通过软件自动生成或IEEE EUI-64规范生成。其中,EUI-64规范自动生成最为常用。
EUI-64:IEEE EUI-64规范是将接口的MAC地址转换为IPv6接口标识的过程(网络前缀必须自己手动配置或者通过其他方式获取,)。如图所示,MAC地址的前24位(用c表示的部分)为公司标识,后24位(用m表示的部分)为扩展标识符。从高位数,第7位是0表示了MAC地址本地唯一。转换的第一步将FFFE插入MAC地址的公司标识和扩展标识符之间,第二步将从高位数,第7位的0改为1表示此接口标识全球唯一。
这种由MAC地址产生IPv6地址接口标识的方法可以减少配置的工作量,尤其是当采用无状态地址自动配置时,只需要获取一个IPv6前缀就可以与接口标识形成IPv6地址。但是使用这种方式最大的缺点是任何人都可以通过二层MAC地址推算出三层IPv6地址,并且生成的接口标识没有规律性,管理时有一定的弊端,并且通过EUI生成的地址,前缀必须为64位,并且 EUI只能生成全球单播地址或者本地链路地址,全球单播地址和本地链路地址前缀必须要求为64位,所以肯定都支持。现在一般IPV6用户都是通过这个方式生成单播的IP地址。
手工配置:可以手工配置前缀,当然也可以接口标识都由手工进行配置了,优点是比较灵活,但是如果地址过多,配置就比较麻烦。
系统通过软件自动生成:通过去访问对应的资源池 服务器获取,一般分配的是有规律的后缀,例如01,02,03,并且带有软件的身份标识,并且能够根据IP地址来直接管理权限。
一般组合方式:全部自己手工配置,无状态/有状态前缀/手工前缀+EUI生成后缀,全部由系统生成。对于不同的应用场景或者不同类型的地址,选择适用的方式,产生对应的地址。
例如:
单播地址中,本地链路地址可以通过手工配置获取本地自动生成(也可以看作EUI的方式生成),而全局单播地址主要可以通过无状态+EUI自动生成,当然在一个企业中为了方便管理,也可以通过系统软件进行生成。注意,单播地址可以配置多个,但是同一个设备上只能配置一个同一个网段的地址。
IPv6地址分类
IPv4地址分类
单播地址、组播地址、广播地址。
而IPv6中没有广播地址(由组别代替),反而增加了任播地址。也就是说IPv6地址被分为:单播地址、组播地址、任播地址。并且一个接口上可以配置多个单播、组播、任播地址。
单播地址分类
全球单播地址
不一定需要配置,如果你想从其他链路找到这台设备,就必须配置全局单播地址,并且在IPv6中很少用NAT,在很多情况下不同节点可以直接通过全球单播地址进行通信即可,当然这些地址相当于公网地址,也是需要去申请的)一个接口可以配置多个全球单播地址,与同网段通信的时候使用对应的同一网段的作为源地址,如果是不同网段就使用最后配置的IPv6地址作为源IP地址。
全球单播地址是带有全球单播前缀的IPv6地址,其作用类似于IPv4中的公网地址。这种类型的地址允许路由前缀的聚合,从而限制了全球路由表项的数量。
全球单播地址由全球路由前缀(Global routing prefix)、子网ID(subnet ID)和接口标识(Interface ID)组成。
Global routing prefix:全球路由前缀。由提供商(Provider)指定给一个组织机构,通常全球路由前缀至少为48位,最多64位,由Subnet ID的长度决定。目前已经分配的全球路由前缀的前3bit均为001,所以第一个数字不是2就是3。
Subnet ID:子网ID。组织机构可以用子网ID来构建本地网络(Site),这个字段长度是可变的,可以将其部分分配到全球路由前缀中去。子网ID通常最多分配到第64位。子网ID和IPv4中的子网号作用相似。
Interface ID:接口标识。用来标识一个设备(Host)。
全球单播地址的地址规划:在ipv4中,因为最初始的地址规划有一定的问题,导致路由很难进行有效的汇总,所以在IPv6中一定要重视地址的规划,也就是规划Global routing prefix字段,比如一个区域规划为一类,方便汇总。其中Global routing prefix分为如下几个部分:
TLA (Top Level Aggregation)顶级聚合:13bit,IPv6的管理机构根据TLA分配不同的地址给某些骨干网的ISP,最大可以得到8192个顶级路由。
RES: 8bit,保留使用,为未来扩充TLA或者NLA预留。NLA (Next Level Aggregation)次级聚合:24bit,骨干网ISP根据NLA为各个中小ISP分配不同的地址段,中小ISP也可以针对NLA进一步分割不同地址段,分配给不同用户。
SLA (Site Level Aggregation)站点级聚合: 16bit,公司或企业内部根据SLA把同一大块地址分成不同的网段,分配给各站点使用,一般用作公司内部网络规划,最大可以有65536个子网。
链路本地地址
一个接口上必须要有一个链路本地地址,链路本地地址是不能在作为路由的目的条目的,它的用处是在同一个网段中进行通信,有点类似于MAC地址。链路本地地址也需要在同一网段中唯一。
链路本地地址是IPv6中的应用范围受限制的地址类型,只能在连接到同一本地链路的节点之间使用。它使用了特定的本地链路前缀FE80::/10(最高10位值为1111111010),这里并不是说明前缀必须为FE80,实际上因为有/10的标记,计算出本地链路地址的范围为FE80::-FEBF::都是这个链路本地地址,同时将接口标识添加在后面作为地址的低64比特。
当一个节点启动IPv6协议栈时,启动时节点的每个接口会自动配置一个链路本地地址(其固定的前缀+EUI-64规则形成的接口标识,在模拟器上需要配置了全局单播地址才会自动产生,或者自己输入相应自动产生的命令或手动自己配置)。这种机制使得两个连接到同一链路的IPv6节点不需要做任何配置就可以通信。所以链路本地地址广泛应用于邻居发现,无状态地址配置等应用。
以链路本地地址为源地址或目的地址的IPv6报文不会被路由设备转发到其他链路。
唯一本地地址
用于构建私网前缀为FC00::–FDFF:: ,用来取代已作废的RFC3879定义的站点本地地址(Site-local地址)。
唯一本地地址是另一种应用范围受限的地址,它仅能在一个站点内使用。
唯一本地地址的作用类似于IPv4中的私网地址,任何没有申请到提供商分配的全球单播地址的组织机构都可以使用唯一本地地址。唯一本地地址只能在本地网络内部被路由转发而不会在全球网络中被路由转发。如果需要的话必须做IPv6的NAT。但是我们知道,IPv6地址完全够用,为什么设计出私网地址呢?这是因为NAT可以隐藏IP地址,提高安全性,并且也不需要去申请那么多IPv6地址,虽然申请还是比较方便的。但是现在没有进行使用,因为很不方便,需要NAT技术。为了安全性我们完全可以直接使用全球单播地址进行通信(地址个数完全够用),并且将想要对方知道的网段通告进入路由器协议让对方能够于只通信,其实也对内部不想让人知道的地址有保密的作用。
端到端的特性也就是说两个设备直接可以通信(设备-设备),不需要其他NAT等技术进转换地址(这样就是先与设备-网关-设备,所以也称不上端到端了)
字段解释:
Prefix:前缀;固定为FC00::/7。
L:L标志位;值为1代表该地址为在本地网络范围内使用的地址;值为0被保留,用于以后扩展。
Global ID:全球唯一前缀;通过伪随机方式产生。
Subnet ID:子网ID;划分子网使用。
Interface ID:接口标识。
唯一本地地址具有如下特点:
具有全球唯一的前缀(虽然随机方式产生,但是冲突概率很低)。
可以进行网络之间的私有连接,而不必担心地址冲突等问题。
具有知名前缀(FC00::/7),方便边缘路由器进行路由过滤。
如果出现路由泄漏,该地址不会和其他地址冲突,不会造成Internet路由冲突。
应用中,上层应用程序将这些地址看作全球单播地址对待。
独立于互联网服务提供商ISP(Internet Service Provider)。
未指定地址和回环口地址:
未指定地址
Pv6中的未指定地址即 0:0:0:0:0:0:0:0/128 或者::/128。该地址可以表示某个接口或者节点还没有IP地址,可以作为某些报文的源IP地址(例如在NS报文的重复地址检测中会出现)。源IP地址是::的报文不会被路由设备转发。类似与IPv4中没有获取地址时的169开口的地址作为临时地址,在自己没地址时坐临时的代替。
环回地址
IPv6中的环回地址即 0:0:0:0:0:0:0:1/128 或者::1/128。环回与IPv4中的127.0.0.1作用相同,主要用于设备给自己发送报文。该地址通常用来作为一个虚接口的地址(如Loopback接口)。实际发送的数据包中不能使用环回地址作为源IP地址或者目的IP地址。
组播地址
IPv6组播地址
IPv6的组播与IPv4相同,用来标识一组接口,一般这些接口属于不同的节点。一个节点可能属于0到多个组播组。发往组播地址的报文被组播地址标识的所有接口接收。
一个IPv6组播地址由前缀,标志(Flag)字段、范围(Scope)字段以及组播组ID(Global ID)4个部分组成:
前缀:IPv6组播地址的前缀是FF00::/8(1111 1111)。
标志字段(Flag):长度4bit,目前只使用了最后一个比特(前三位必须置0),当该位值为0时,表示当前的组播地址是由IANA所分配的一个永久分配地址;当该值为1时,表示当前的组播地址是一个临时组播地址(非永久分配地址)。
范围字段(Scop):长度4bit,用来限制组播数据流在网络中发送的范围。
组播组ID(Global ID):长度112bit,用以标识组播组。目前,RFC2373并没有将所有的112位都定义成组标识,而是建议仅使用该112位的最低32位作为组播组ID,将剩余的80位都置0。
预定义组播地址
目前常用的预定义组播地址:flag字段为0,表示已经定义的地址,理解为永久生效的地址,例如IPv4中的224.0.0.0/8字段。不能自己去分配了。然后范围字段为1,表示只能在自己本设备上使用,2表示的是链路范围,表示在设备相连的链路上可以使用(一个广播域中)。还有4,5等,但是使用的很少,这里掌握链路本地和设备本地地址即可。
被请求节点组播地址(一种预定义组播地址)
被请求节点组播地址通过节点的单播或任播地址生成。当一个节点具有了单播或任播地址,就会对应生成一个被请求节点组播地址,并且加入这个组播组(一对一生成)。一个单播地址或任播地址对应一个被请求节点组播地址。该地址主要用于邻居发现机制和地址重复检测功能。
IPv6中没有广播地址,也不使用ARP。但是仍然需要从IP地址解析到MAC地址的功能。在IPv6中,这个功能通过邻居请求NS(Neighbor Solicitation)报文完成。当一个节点需要解析某个IPv6地址对应的MAC地址时,会发送NS报文,该报文的目的IP就是需要解析的IPv6地址对应的被请求节点组播地址;只有具有该组播地址的节点会检查处理。(被请求节点组播地址在后面实际运用时着重分析)
被请求节点组播地址由前缀FF02::1:FF00:0/104和单播地址的最后24位组成。
如何产生:被请求节点组播地址的前104位固定,将单播IP地址的后24位移下来填充到后面就可以了。例如:IPv6—2001::1234 :5678/64, 被请求节点组播地址—FF02::1:FF34:5678/104其中FF02::1:FF为固定部分,共104位
任播地址
任播的概念最初是在RFC1546 (Host Anycasting Service)中提出并定义的,主要为DNS和 HTTP提供服务。IPv6中没有为任播规定单独的地址空间,任播地址和单播地址使用相同的地址空间。IPv6任播地址可以同时被分配给多个设备,也就是说多台设备可以有相同的任播地址,以任播地址为目标的数据包会通过路由器的路由表被路由到离源设备最近的拥有该目标地址的设备。
如下图所示,服务器A、B和C的接口配置的是同一个任播地址,根据路径的开销,用户访问该任播地址选择的是开销为3的路径。
如图所示,任播技术的优势在于源节点不需要了解为其提供服务的其体节尽士川可以接收特定服务,当一个节点无法工作时,带有任播地址的数据包又被发往其他两个主机节点,从任播成员中选择合适的目的地节点取决于路由协议重新收敛后的路由表情况。
任播可以分为基于网络层的任播和基于应用层的任播。两者主要的区别是网络层的任播仅仅依靠网络本身(比如路由表)来选择目标服务器节点,而应用层任播是基于一定的探测手段和算法来选择性能最好的目标服务器节点。RFC2491和 RFC2526定义了一些保留的任播地址格式,如子网路由器任播地址,用来满足不同的任播应用访问需求。
参考资料:HCIE培训文档、《HCIE路由交换学习指南》