CCIE 学习 基础篇 (二) IPv6 基础

一、概述

延缓IPv4地址耗尽的短期方案之一为NAT(Network Access Translation)。NAT技术在延缓IPv4地址耗尽问题方面非常成功,在大多数网络设计中已经成为一个标准部分。

NAT技术的缺陷:把原来具有开放、透明、对等特点的Internet变成了看上去更像一个具有客户-服务器(Client-Server)结构的网络的巨大集合。而用户则只在外围连接到Internet的”边缘层“,Internet向它们提供服务。用户很少对Internet的整体资源做出贡献。更多的从某种经济的角度看,Internet的用户仅仅成为了消费者,而不是生产者。


推动IPv6发展的两个基本动力:1、 诸如移动IP协议(Mobile IP)、服务质量保证(QoS)、端到端的安全、网格计算(Grid Computing)、点到点网络互连等核心概念的新型应用。NAT技术遏制了这些领域的创新,因而摒弃NAT技术的惟一手段是提供充足的并且易用使用的公共IP地址。 2、拥有众多人口的国家的快速的现代化发展,例如中国和印度。有些国家不得不继续保留一个具有4~5层NAT技术的网络层次架构,以支持对IPv4地址的需求。


二、IPv6地址

IPv6地址与IPv4的地址区别不仅表现于地址长度不同,更重要的是表示格式和功能组织差别非常大。

不像IPv4地址前缀可以通过点分十进制、十六进制地址掩码或位计数方式来表示,IPv6协议的前缀始终通过位计数的方式来标识。一个有全0组成的IPv6地址可以被简写为一个双冒号。有两种实例使用了全0地址。第一是缺省地址,是全0的形式,并且长度也是0,即, ::0/0。第二个全0的IPv6地址的实例是未指定地址(unspecified address),未指定地址使用在某些邻居发现协议中。与缺失地址的区别在于长度不同: ::0/128.

IPv6的地址类型:单播(Unicast)、任意播(Anycast)和多播(Multicast)。

IPv6通用的单播地址格式:

全球路由前缀(48)

子网ID (16)

接口ID (64)

地址的主机部分成为接口ID(interface ID)。除了长度不同之外,IPv6地址与IPv4地址之间最显著的不同在于子网标识符的位置不同。使用地址的网络部分作为IPv6子网ID的一个直接的好处在于所有IPv6地址的接口ID都有大小一致的位数,这就大大简化了地址的解析复杂度;且使用地址的网络部分作为子网ID,会产生一个更加清楚的分工,功能更加清晰:网络部分提供了一台设备到下行专用数据链路的定位,而主机部分提供这条数据链路上该设备的标识。

多播地址:

多播地址标识一组设备——一个多播组(multicast group)。在一个数据包中,多播地址只能作为目的地址,从来不会出现在源地址中。多播传送实际是IPv6的一个基本的操作,尤其是对于即插即用特性的一些功能,如路由器发现和地址自动配置等,这些功能是邻居发现协议的一部分。

多播地址格式如下图所示:

多播前缀

(0xFF)

标记(4)

范围(4)

组ID(112)

多播地址的起始地址总是全是1,而后的4位是标记位,前3位目前没有使用,总是0.第4位用来指出这个地址是一个永久的、公认的地址(设为0),还是一个临时性的地址(设为1)。接下来4位表示该地址的范围。后面的112位作为组ID(group ID),标识各个不同的多播组。目前的用法是设置前面的80位为0,而只是用后面的32位。

0x0

保留

0x1

节点本地

0x2

链路本地

0x5

地区本地

0x8

组织本地

0xE

全球

0xF

保留


三、IPv6包头格式

版本(4)

流量类别(8)

流标签(20)

有效载荷长度(16)

下一报头(8)

跳数限制(8)

源地址

目的地址

 版本(version):4位的字段,用来指出IP协议的版本

流量类别(Traffic Class): 8位的字段,相当于ToS字段

流标签(Flow Lable):IPv6独有的字段,长度为20位,这个字段的目的是允许位特定的业务流打上标签。数据包不仅始发于相同的源和达到相同的目的地,而且在源和目的地都属于相同的应用。区分不同的流可以带来几方面的优点:可以提供更精细的服务类别区分的颗粒,在平衡业务流通过多条路径时可以确保属于同一个流的数据包能够总是转发到相同的路径上,以便避免对数据包进行重新排序。流(微分流,microflows)可以用源地址、目的地址加上源和目的端口的组合来确定。但是为了识别源和目的端口,Router必须能够看到IP报头的上层——TCP或UDP报头——增加了转发处理的复杂性,并可能影响Router的性能。到目前为止,如何使用流标签目前还存在争论,因此目前Router总是忽略此字段。

有效载荷长度(Playload Length):不包含报头的长度,因为报头长度固定为40字节

下一包头(Next Header):指出了跟随该IPv6报头后面的报头,与IPv4中的协议报头类似

跳数限制(Hop Limit):与IPv4协议中的生存时间(TTL)类似

在IPv6报头中,很明显缺少的一个字段是IPv4报头中包含的校验和字段。在现代传输介质的可靠性全面提高的今天(无线介质除外)——由于上层协议通常携带字节的错误校验和恢复机制,IPv6报头本身的校验和就体现不出太多的价值,因此被去掉。


四、IPv6扩展报头

与IPv4报头相比,IPv6报头更加简洁和高效,把不常用的选项字段放到了扩展报头中,这样做可以在2个方面提高效率:

1)数据包仅仅需要传送各自数据包所需要的信息,不需要传送用不着的字段

2)可以定义新的扩展报头来增加新的可选功能。

目前有以下几个扩展报头:

1)逐条可选项(Hop-by-Hop Options)——传送必须被转发路径中的每一个节点都检验处理的信息,目前有2个选项:路由器警告和超大包有效载荷选项。

2)路由选择(Routing):类似于IPv4中的源路由选项,列出在达到目的地路径中数据包所要经过的节点列表来提供源路由选择的功能

3)分段(Fragment):与IPv4不同,IPv6只有在发起该数据包的节点能够对数据包进行分段,中间节点对报文不分段。因此源节点要么使用路径MTU发现(Path MTU Discovery,PMD),要么不发出大于1280的数据包。IPv6协议规定所有链路必须能够支持最小1280的数据包

4)封装安全载荷(Encapsulating Security Payload, ESP)——用于有效载荷的加密封装

5)认证报头(Authentication Header,AH)——用于数据包必须在源于目的节点之间进行认证的情况

6)目的地可选项(Destination Options)——用于传送仅仅被目的节点,或者可能是路由选择报头中列出的节点检验处理的信息。

建议的扩张报头顺序如下:

1.IPv6 报头, 1)逐条可选项 2)目的地可选项(只有在路由选择报头中指定的中间路由器才必须处理这个报头)3)路由选择 4)分段 5)认证 6)ESP 7)目的地可选项 8)上层报头


五、ICMPv6

如IPv4类似,IPv6也需要一个控制协议来交换与处理错误和信息的消息。IPv6也使用ICMP来实现这个功能。在IPv4中ICMP使用的协议号是1,而在IPv6中协议中ICMPv6使用的下一报头值为58.

如ICMPv4,ICMPv6也使用一组类型与代码值得组合来标识一般的类型和子类型。

类型(8)

代码(8)

校验和(16)

可变字段(依赖于ICMPv6的类型)

1

 

目的不可达

0

没有到达目的地的路由

1

和目的地通信被管理员禁止

2

不是邻居

3

地址不可达

4

端口不可达

2

0

数据包长度太大

3

 

超时

0

传输中超出跳数限制

1

分片的重组时间超时

4

 

参数问题

0

遇到错误的报头字段

1

遇到不可识别的下一报头类型

2

遇到不可识别的IPv6选项

128

0

ECHO请求

129

0

ECHO回复

130

0

组成员请求

131

0

组成员报告

132

0

组成员减少

ICMPv6除了基本的错误和信息消息外,还使用了一组单独的由基本的IPv6协议ICMPv6消息邻居发现协议

六、邻居发现协议(Neighbor Discovery Protocol, NDP)

IPv6协议除了显著的增加了地址空间之外,另一个显著的特征即是其即插即用特性。邻居发现协议(NDP)就是使用以下的功能来实现这些即插即用特性:

1)路由器发现(Router Discovery)——当一个节点连接到一个IPv6的链路时,它能够发现本地的路由器,而不必借助于DHCP

2)前缀发现(Prefix Discovery)——当一个节点连接到IPv6的链路时,能够发现分配给该链路的前缀

3)参数发现(Parameter Discovery)——节点能够发现它所连接的链路的参数,例如链路的MTU和条数限制等。

4)地址自动配置(Address Autoconfiguration)——节点能够确定它的完整地址,同样不需要DHCP

5)地址解析(Address Resolution)——不需要地址解析协议(ARP)就能够发现所连接链路上其他节点的链路层地址

6)下一跳确定(Next-hop Determination)——一条链路上的节点能够确定到达目的节点的下一跳链路层节点,或者是本地目的地节点,或者是到达目的地节点的路由器

7)邻居不可达检测(Neighbor Unreachable Detection)——节点能够检测到链路上的邻居何时不再可达,邻居可能其他主机也可能是一台路由器。

8)地址冲突检测(Duplicate Address Detection)——节点能够检测到它所要使用的地址是否已经被所在链路上的其他节点占用

9)重定向(Redirect)

NDP消息通常应该在链路本地的范围内收发,因此,封装NDP消息的数据包也始终使用IPv6链路本地地址,或者使用链路本地范围内的多播地址。为了增加更进一步的安全性,承载所有NDP消息的IPv6数据包的跳数限制为255,如果所受到的数据包中有跳数限制的值小于255,说明至少经过了一台路由器,因而该数据包将被丢弃。这样可以阻止NDP受到不与本地链路相连的源节点的攻击或欺骗。

NDP消息

NDP使用ICMPv6协议来交换一些必要的消息,RFC2461中详细说明了以下5个新的ICMPv6消息:

1)路由器通告(Router Advertisement,RA)消息——有Router发起,用了通告这些Router的存在和链路细节的参数,如链路前缀、链路MTU,以及跳数限制等。可以周期的发生,也可用于答复路由器请求消息。

2)路由器请求(Router Solicitation, RS)消息——由主机发起,用了请求Router发送一个RA

3)邻居请求(Neighbor Solicitation,NS)消息——邻居请求消息由节点主机发起,用来请求另一台逐句的链路层地址,也用来实现诸如地址冲突检测和邻居不可达检测的功能

4)邻居通告(Neighbor Advertisement,NA)消息——节点发送一个邻居通告消息来响应邻居请求消息。如果一个节点改变了它的链路层地址,那么它能够通过发送一个位请求的邻居通告消息来通告这个地址。

5)重定向(Redirect)消息——重定向消息的使用和IPv4小相同,只不过从基本的ICMPv6协议中抽取了一部分移到了NDP中。

NDP RA消息格式:

类型(8bit)

代码(8bit)

校验和(16bit)

跳数限制

M

O

保留

路由器生存时间

可达时间

重传时间

可选项

 类型是134,代码是0.源地址总是始发这个数据包的接口的IPv6链路本地地址。如果是周期发送,则目的地址是所有节点的多播地址(FF02::1),如果是应当一个RS消息,则目的地址是发起请求的节点的链路本地地址。

跳数限制(Hop Limit)——如果该值被设定,那么链路上的节点将再它始发到链路上的所有数据包都设置该值。如果没有跳数限制,则为0

M——管理地址的配置标记,如果设置了该值,则始发路由器就会利用DHCPv6协议来告诉链路上的主机使用有状态地址自动配置。否则,链路上的地址使用无状态地址自动配置。

O——其他的有状态配置标记。当设置该位,始发Router告诉所在链路上的主机使用DHCPv6来获取其他的链路信息。M和O可以一起使用

路由器生存时间——当是一台缺省路由器时,该字段才设置为非0的值。再这种情况下,该字段指定为该缺省路由器的存活时间,以秒为单位

可达时间——(Reachable Time)用于实现NDP中邻居不可达检测功能的字段。当一个节点确认它的邻居是可达后,可达时间会指定一个时间值,在该时间内,这个节点假定它的邻居是可达的,以毫秒为单位

重传时间——(Retransmit Timer)——用于实现NDP协议里有关地址解析和邻居不可达功能的字段,它指定了重传邻居请求的最小时间。

Ra的可选项可以包括以下内容:

1)发送RA的Router接口的链路层地址

2)所在链路的MTU说明

3)分配给链路的一个或多个前缀,是无状态地址自动配置的基本信息,告诉链路上的主机该链路的前缀信息

NDP RS消息格式:

类型(8bit)

代码(8bit)

校验和(16bit)

保留

可选项

 类型是133,代码值为0.封装RS的IPv6数据包的源地址,要么是始发该消息的接口所分配的IPv6地址,要么是一个用::0表示的未指定地址(在没有分配地址的情况下)。目的地址是所有路由器多播地址(FF02::2).

可选字段包括了始发该消息接口的链路层地址。但如果封装数据包的源地址是未指定的,则不一定包括源链路层地址。

NDP NS消息格式:

类型(8bit)

代码(8bit)

校验和(16bit)

保留

目标地址

可选项

类型值为135,代码是0.源地址要么是始发该消息的接口所分配的IPv6地址,要么是::表示的未指定地址(为地址冲突检测而发送的邻居请求消息的时候)。目的地址是对应于目标地址的一个被请求节点的多播地址,或者就是目标地址。

目标地址(target Address)——指请求目标的IPv6地址。目标地址永远不可能是一个多播地址。

可选项包括始发该请求消息的接口的链路层地址。


NDP NA消息格式:

类型(8bit)

代码(8bit)

校验和(16bit)

R

S

O

保留

目标地址

可选项

类型是136,代码值为0.源地址是封装该数据包的接口所分配的IPv6地址,目的地址要么是包含该通告消息所要答复的NS数据包的源地址,要么是所有节点的多播地址(FF02::1)

R——Router标记,如果设置了该位,则表示始发该消息的节点是一台路由器。这一字段用于在邻居可达性检测期间已经变为主机的Router

S——是一个请求标记

O——过载标记。当设置该位时,表示邻居通告消息中的信息超出了任何现有邻居的缓冲条目,需要更新所缓存的链路层地址。没有被置位时,说明邻居通告消息没有超出现有邻居的缓存条目。

目标地址——如果是为响应一个NS而发的NA,则目标地址就是NS中的目标地址。否则就是始发节点的地址。

可选项可包含目标链路层地址。即始发NA节点的链路层地址。

NDP Redirect消息格式:

类型(8bit)

代码(8bit)

校验和(16bit)

保留

目标地址

目的地地址

可选项

类型是137,代码值为0.源地址始终是始发该消息接口的IPv6链路本地地址。目的地址总是触发重定向的数据包的源地址。

目标地址——更好的第一条地址——通常是链路上的另一台路由器的链路本地地址

目的地址——被重定向到目标地址的IPv6目的地址。

可选项包括目标地址的链路层地址。

可选项的TLV: type:1.源链路层地址 2.目标链路层地址 3.前缀信息 4.重定向的报头 5.MTU


1)、路由器发现(Router Discovery)

Router 通过在相连的链路上周期性地发送路由器通告消息(RA),表明它的存在,并通过RA通告所配置的所有参数。大概用到RA消息最多的链路就是广播链路了,例如以太网,链路上的主机可以收到RA,因而可以学到有关链路的必要消息。

RA发送的周期是4~1800S,缺省为600S。同时规定了RA消息通告的最小周期是200S,这些通告将在最大值和最小值之间波动以防止链路上的同步。未经请求的RA消息的源地址是发送该消息的路由器接口的链路本地IPv6地址,而目的是所有节点的多播地址(FF02::1)。

Cisco Router上,只要使用IPv6 Unicast-routing使IPv6有效,就可以再以太网和FDDI接口上自动地发送RA消息。缺省的间隔是200s,并可通过命令IPv6 ND ra-interval进行更改,缺省条件下,所传送的路由器通告消息的路由器生存时间是1800S,并可以通过ipv6 nd ra-lifetime进行改变。如果不希望将链路上的某台路由器作为缺省路由器,可以使用该命令将该路由器的生存时间设置为0.可达时间缺省为0(未指定),并可以通过IPv6 nd reachable-time进行改变。重传计时字段设置为0(未指定),并可以通过ipv6 nd ns-interval进行改变。M标记和O标记可以分别通过命令ipv6 nd managed-config-flag和ipv6 nd other-config-flag来设定。如果禁止某个接口传送RA消息,可以通过ipv6 nd suppress-ra来使其无效。

新加入链路的主机可以发送RS消息去请求链路参数,而不必等待200S,RS的目的地址是路由器的多播地址(FF02::2)。当一台路由器收到一条RS时,它即会发送(有一个5s的延时)一条RA消息作为回应。当

当主机收到RA时,将这个Router添加到它的缺省Router列表中(除非这个Router将生存时间设置为0,而不能作为缺省路由器)

2)地址自动配置(Stateless Address Autoconfiguration)

接口ID加上FE80::即可组成一个链路本地地址,可以再链路本地进行通信,而想在更大范围内进行通信,需要一个全局地址,可以通过2种途径进行获取:有状态或者无状态的地址自动配置。有状态配置需要借助于DHCPv6服务器,无状态接口ID加上RA消息中的前缀信息即可组成一个IPv6地址。

3)地址冲突检测(Duplicate Address Detection)

无论一台设备如何获取这个地址,在使用之前都应进行地址冲突检测以保证唯一性。

已经获取一个新地址的节点会把这个新的地址归类为临时状态的地址。在DAD完成之前不能使用此地址。这个节点会发生一个把目标地址字段设置为该地址的NS消息来验证。NS消息的源地址是未指定地址,而它的目的地址是被请求节点的多播地址。

一个被请求节点的多播地址由前缀FF02:0:0:0:0:1:FF00::/104前导,加上目标地址的最后24位组成。

4)邻居地址解析(Neighbor Address Resolution)

IPv4节点希望和本地链路上的另一个IPv4节点通信时,必须首先发现目的节点的链路层地址。IPv4通过ARP来获得此地址,而IPv6则使用NDP获取MAC地址。

当一个节点获得目的节点的IPv6地址时,通过其前缀即可判断目的节点是否是本地链路上的邻居,还是本地链路以外的节点并因此需要通过缺省路由器才能到达。如果是后一种情况,这个节点应该已经学习到缺省路由器的链路层地址。但如果是本地链路上,则首先查找邻居缓存是否已经学到次地址。IPv6中的邻居缓存与IPv4协议中的ARP缓存非常类似,记录了网络层的地址和与之关联的链路层地址。

如果一个地址不在邻居缓存中,它也显示在表中但被标记为不完全的(Incomplete),这表示正在进行该地址的地址解析处理。这样,主机会发送一个NS消息到目标节点相关联的被请求节点的多播地址。NS消息中应包含源链路层可选项(类型1),这样被请求的节点就会了解到请求节点的链路层地址,并由此知道发送作为答复的NA消息发送到哪个节点。如果RA包含了重传计时器不为0的值,那么根据指定的时间间隔可以发送多个邻居请求。如果未指定,则NS将会每1000ms重传一次,直到收到一个NA为止。如果发送了3个NS后,仍为收到NA,则解析失败。

假如被请求的节点存在并且NS消息有效,则回复一个NA消息。直到收到相应的NA消息,发送请求的节点才能够将目标节点的链路层地址添加到邻居缓存的条目中,并把不完全(Incomplete)状态更改为可达的(Reachable)状态。

在Cisco Router上,可以通过Show IPv6neighbors来查看邻居缓存,

5)私有地址(Privacy Address)

无状态地址自动配置可能会产生安全问题:即使一台设备从一个子网移到另一个子网,它的接口ID也始终保持不变,那么它就能够被追踪,至少这是一个私密的问题。更为严重的是,他们可以利用浙西追踪以及保存有关你的活动和位置的记录,来进行犯罪交易。

在RFC3041中,通过定义IPv6私有地址来解决该安全问题。私有地址就是通过伪随机数字算法生成的接口ID。接口ID大约一天变化一次,也会在节点获取一个新的IPv6地址时改变。

但一个经常变化的地址对于可达性是不实际的。希望与你通信的节点,以及DNS服务器必须通过一个或一些静态地址了解你所在位置。因此,标准的无状态配置的IPv6地址保留了你的公共地址;任何一个需要向你发送数据包的节点都是用这个地址作为目的地址,但当你发送返回的数据包时,却使用的私有地址。

6)邻居不可到达性的检测

事实上一个邻居缓存条目可以具有一下5种状态:

1.Incomplete——该状态说明正在进行邻居地址的解析处理。一个NS消息已经为该条目发送被请求节点的多播地址,但还没有收到相应的邻居通告消息

2.Reachable——该状态说明地址已经被确认是可到达的。“目前被确认”的意思是在Router RA消息中的Reachable Time字段指定的时间内,已经收到了某些可达性的消息。如果RA中没有指定Reachable time,那么将使用30s作为缺省的可达时间

3.Stale——该状态说明自从收到最新的有关到达目的地的可达性肯定的确认后,已经经历了Reachable Time所指定的时间

4.Probe——该状态是指没经过Retransmit Time时间或每1000Ms(未指定Retransmit Time),节点就会通过向目的节点发送NS消息来搜索可达性的确认

5.Delay——当一个数据包发送到一个处于Stale状态的目的节点时,这个地址就进入到该状态。如果该地址在Delay状态等待了5s,在这段时间内还没收到有关可达性的确认,则邻居就转到到Probe状态。这个状态是在节点发出搜索的邻居请求消息之前,给上层协议一个确认可达性的机会的优化措施。

对于邻居可达性的确认,可通过以下两种方法来确认:

1.来自上次协议的“提示(Hint)”,例如一个TCP消息的ACK等

2.通过RA或NA得到有关目的地址的响应,这是必要的,因为某些上次协议如UDP,本身没有确认机制。

邻居步可达性检测不仅仅要确认从邻居到本地节点的一方的可达性,而且要确认从本地到邻居方向的可达性,确保双向的可达性,基于这个原因,一个未经请求的NA或RA并不能改变邻居缓存条目的状态到Reachable,因为所收到的消息仅仅说明始发节点到本地节点的单向可达性。只有收到一个传输层消息的远程响应消息(如TCP的ACK包),或者一个响应请求消息的NA或RA,才能确认双向的可达性。

你可能感兴趣的:(CISCO,网络)