HCRSE103-IPv6基础

HCRSE103-IPv6基础

IPv6 知识点:
IPv6 地址长度,报文组成,基本报头分段和长度,IPv6 地址分类,单播地址分类,EUI-64 原理,ICMPv6 协议,NDP 邻居发现协议,IPv6 过渡技术

EUI-64 (64-bit Extended Unique Identifier) 64位扩展唯一标识符

IPv6 地址包括 128 比特,由冒号分隔的 32 位十六进制数表示
IPv6特点:
 1 地址空间巨大
地址空间,IPv6地址采用128比特标识。128位的地址结构使IPv6理论上可以拥有(43亿×43亿×43亿×43亿)个地址。近乎无限的地址空间是IPv6的最大优势。
2  精简报文结构
报文结构,IPv6使用了新的协议头格式,也就是说IPv6数据包有全新的报文头,而并不是仅仅简单地将IPv4报文头中的地址部分增加到128bits而已。在IPv6中,报文头包括固定头部和扩展头部,一些非根本性的和可选择的字段被移到了IPv6协议头之后的扩展协议头中。这使得网络中的中间路由器在处理IPv6协议头时,有更高的效率。
 3 实现自动配置和重新编址
实现自动配置和重新编址,IPv6协议内置支持通过地址自动配置方式使主机自动发现网络并获取IPv6地址,大大提高了内部网络的可管理性。
 4 支持层次化网络编址
支持层次化网络结构,巨大的地址空间使得IPv6可以方便的进行层次化网络部署。层次化的网络结构可以方便的进行路由聚合,提高了路由转发效率。
 5 支持端对端安全
支持端对端安全,IPv6中,网络层支持IPSec的认证和加密,支持端到端的安全。
 6 更好的支持QoS
更好的支持QoS,IPv6在包头中新定义了一个叫做流标签的特殊字段。IPv6的流标签字段使得网络中的路由器可以对属于一个流的数据包进行识别并提供特殊处理。用这个标签,路由器可以不打开传送的内层数据包就可以识别流,这就使得即使数据包有效载荷已经进行了加密,仍然可以实现对QoS的支持。
 7 支持移动特性
支持移动特性,由于采用了Routing header和Destination option header等扩展报头,使得IPv6提供了内置的移动性。

IPv6报文格式

IPv6报文由IPv6基本报头、IPv6扩展报头以及上层协议数据单元三部分组成。

上层协议数据单元一般由上层协议报头和它的有效载荷构成,有效载荷可以是一个ICMPv6报文、一个TCP报文或一个UDP报文。
 
IPv6基本报头有8个字段,固定大小为40字节,每一个IPv6数据报都必须报含报头。

1 Version:版本号,长度为4bit。对于IPv6,该值为6。
2 Traffic Class:流类别,长度为8bit。等同于IPv4中的TOS字段,表示IPv6数据报的类或优先级,主要   
    应用于QoS。
3 Flow Label:流标签,长度为20bit。IPv6中的新增字段,用于区分实时流量,不同的流标签+源地址  
   可以唯一确定一条数据流,中间网络设备可以根据这些信息更加高效率的区分数据流。
4 Payload Length:有效载荷长度,长度为16bit。有效载荷是指紧跟IPv6报头的数据报的其它部分  
 (即扩展报头和上层协议数据单元)。
5 Next Header:下一个报头,长度为8bit。该字段定义紧跟在IPv6报头后面的第一个扩展报头(如果
     存在)的类型,或者上层协议数据单元中的协议类型。
6 Hop Limit:跳数限制,长度为8bit。该字段类似于IPv4中的Time to Live字段,它定义了IP数据报所
    能经过的最大跳数。
7 Source Address:源地址,长度为128bit。表示发送方的地址。
8 Destination Address:目的地址,长度为128bit。表示接收方的地址。

IPv6和IPv4相比,去除了IHL、identifiers、Flags、Fragment Offset、Header Checksum、 Options、Paddiing域,只增了流标签域,因此IPv6报文头的处理较IPv4大大简化,提高了处理效率。另外,IPv6为了更好支持各种选项处理,提出了扩展头的概念,新增选项时不必修改现有结构就能做到,理论上可以无限扩展,体现了优异的灵活性。

IPv4 头部
 

IPv6将这些Options从IPv6基本报头中剥离,放到了扩展报头中,扩展报头被置于IPv6报头和上层协议数据单元之间。
一个IPv6报文可以包含0个、1个或多个扩展报头,仅当需要路由器或目的节点做某些特殊处理时,才由发送方添加一个或多个扩展头。与IPv4不同,IPv6扩展头长度任意,不受40字节限制,这样便于日后扩充新增选项,这一特征加上选项的处理方式使得IPv6选项能得以真正的利用。但是为了提高处理选项头和传输层协议的性能,扩展报头总是8字节长度的整数倍。

当使用多个扩展报头时,前面报头的Next Header字段指明下一个扩展报头的类型,这样就形成了链状的报头列表。

 
1 Next Header:下一个报头,长度为8bit。与基本报头的Next Header的作用相同。指明下一个扩展报头(如果存在)或上层协议的类型。
2 Extension Header Len:报头扩展长度,长度为8bit。表示扩展报头的长度(不包含Next Header字段)。
3 Extension Head Data:扩展报头数据,长度可变。扩展报头的内容,为一系列选项字段和填充字段的组合。

==========
IPv6 地址的结构

一个IPv6地址可以分为如下两部分:
 1网络前缀:n比特,相当于IPv4地址中的网络ID
 2接口标识:128-n比特,相当于IPv4地址中的主机ID

IPv6 地址的表示方法
              2031:0000:130F:0000:0000:09C0:876A:130B,这是 IPv6 地址的首选格式。
简写为:2031:0:130F::9C0:876A:130B

为了书写方便,IPv6 还提供了压缩格式,具体压缩规则为:
 1 每组中的前导“0”都可以省略
 2 地址中包含的连续两个或多个均为 0   的组,可以用双冒号“::”来代替,双冒号只能有一个

接口标识可通过三种方法生成:
手工配置、系统通过软件自动生成或IEEE EUI-64规范生成。其中,EUI-64规范自动生成最为常用。
==========

IPv6地址分为单播地址、任播地址(Anycast Address)、组播地址三种类型。

单播地址
IPv6定义了多种单播地址,目前常用的单播地址有:未指定地址、环回地址、全球单播地址、链路本地地址、唯一本地地址ULA(Unique Local Address)。
未指定地址:  即 0:0:0:0:0:0:0:0/128 或者::/128。
环回地址 : 即 0:0:0:0:0:0:0:1/128 或者::1/128。环回与IPv4中的127.0.0.1作用相同,主要用于设备给自己发送报文。
全球单播地址 : 是带有全球单播前缀的IPv6地址,其作用类似于IPv4中的公网地址。
全球路由前缀(Global routing prefix)、子网ID(subnet ID)和接口标识(Interface ID)组成,
 
目前已经分配的全球路由前缀的前3bit均为001。因此前缀为2000::/3。

链路本地地址  :  link-local  前缀FE80::/10
是IPv6中的应用范围受限制的地址类型,只能在连接到同一本地链路的节点之间使用。它使用了特定的本地链路前缀FE80::/10(最高10位值为1111111010),同时将接口标识添加在后面作为地址的低64比特。

当一个节点启动IPv6协议栈时,启动时节点的每个接口会自动配置一个链路本地地址(其固定的前缀+EUI-64规则形成的接口标识)。这种机制使得两个连接到同一链路的IPv6节点不需要做任何配置就可以通信。所以链路本地地址广泛应用于邻居发现,无状态地址配置等应用。

类似于IPv4 的 169.254.0.0/16 是一个本地链接地址段

唯一本地地址  :  site-local FC00::/7
是另一种应用范围受限的地址,它仅能在一个站点内使用。它的作用类似于IPv4中的私网地址,任何没有申请到提供商分配的全球单播地址的组织机构都可以使用唯一本地地址。唯一本地地址只能在本地网络内部被路由转发而不会在全球网络中被路由转发。

类似于 IPv4 的私有地址
A 类 10.0.0.0 -10.255.255.255
B 类 172.16.0.0-172.31.255.255
C 类 192.168.0.0-192.168.255.255

唯一本地地址具有如下特点:
具有全球唯一的前缀(虽然随机方式产生,但是冲突概率很低)。
可以进行网络之间的私有连接,而不必担心地址冲突等问题。
具有知名前缀(FC00::/7),方便边缘路由器进行路由过滤。
如果出现路由泄漏,该地址不会和其他地址冲突,不会造成Internet路由冲突。
应用中,上层应用程序将这些地址看作全球单播地址对待。
独立于互联网服务提供商ISP(Internet Service Provider)。

组播地址
IPv6的组播与IPv4相同,用来标识一组接口,一般这些接口属于不同的节点。一个节点可能属于0到多个组播组。发往组播地址的报文被组播地址标识的所有接口接收。
一个IPv6组播地址由前缀,标志(Flag)字段、范围(Scope)字段以及组播组ID(Global ID)4个部分组成:
前缀:IPv6组播地址的前缀是FF00::/8(1111 1111)类似于 224.0.0.0
标志字段(Flag):长度4bit,只用最后一比特(前三位必须置0),
            当该位值为0时,表示当前的组播地址是由IANA所分配的一个永久分配地址;
            当该值为1时,表示当前的组播地址是一个临时组播地址(非永久分配地址)。
范围字段(Scop):长度4bit,用来限制组播数据流在网络中发送的范围
组播组ID(Global ID):长度112bit,用以标识组播组。目前,并没有将所有的112位都定义成组标识,而是建议仅使用该112位的最低32位作为组播组ID,将剩余的80位都置0。这样每个组播组ID都映射到一个唯一的以太网组播MAC地址

0:预留
1:节点本地范围
2:链路本地范围,例如FF02::1
5:站点本地范围
8:组织本地范围
E:全球范围
F:预留

 
 被请求节点组播地址
被请求节点组播地址(Solicited-Node Multicast Address)通过节点的单播或任播地址生成。当一个节点具有了单播或任播地址,就会对应生成一个被请求节点组播地址,并且加入这个组播组。一个单播地址或任播地址对应一个被请求节点组播地址。该地址主要用于邻居发现机制和地址重复检测功能。

IPv6中没有广播地址,也不使用ARP。但是仍然需要从IP地址解析到MAC地址的功能。在IPv6中,这个功能通过邻居请求NS(Neighbor Solicitation)报文完成。当一个节点需要解析某个IPv6地址对应的MAC地址时,会发送NS报文,该报文的目的IP就是需要解析的IPv6地址对应的被请求节点组播地址;只有具有该组播地址的节点会检查处理。
被请求节点组播地址由前缀FF02::1:FF00:0/104和单播地址的最后24位组成。

任播地址
任播地址标识一组网络接口(通常属于不同的节点)。目标地址是任播地址的数据包将发送给其中路由意义上最近的一个网络接口。适合于“One-to-One-of-Many”(一对组中的一个)的通讯场合。

IPv6任播地址仅可用被分配给路由设备,不能应用于主机。任播地址不能作为IPv6报文的源地址。

int g0/0/1
ipv6 enable
ipv6 address 2000::1 /3 anycast

任播地址设计用来在给多个主机或者节点提供相同服务时提供冗余功能和负载分担功能。目前,任播地址的使用通过共享单播地址方式来完成。将一个单播地址分配给多个节点或者主机,这样在网络中如果存在多条该地址路由,当发送者发送以任播地址为目的IP的数据报文时,发送者无法控制哪台设备能够收到,这取决于整个网络中路由协议计算的结果。这种方式可以适用于一些无状态的应用,例如DNS等。
IPv6中没有为任播规定单独的地址空间,任播地址和单播地址使用相同的地址空间。目前IPv6中任播主要应用于移动IPv6。在6to4中继中也使用了任播前缀(2002:c058:6301::)。
==========

接口ID

关于接口ID:接口ID为64bit,用于标识链路上的接口,在每条链路上接口ID必须唯一。
接口ID可通过3种方法生成:

手工配置:建议在服务器和重要网络设备上配置。
系统通过软件自动生成:保护主机的私密性。
IEEE EUI-64规范自动生成:最常用的方法。
EUI-64 (64-bit Extended Unique Identifier) 64位扩展唯一标识符

 
将48bit的MAC地址对半劈开,然后插入“FFFE”,
再对从左数起的第7位,也就是U/L位取反,即可得到对应的接口ID。

==========

ICMPv6

ICMPv6(Internet Control Message Protocol for the IPv6)是IPv6的基础协议之一。
ICMPv6的协议类型号(即IPv6报文中的Next Header字段的值)为58 ,除了提供ICMPv4常用的功能之外,还是其它一些功能的基础,如邻接点发现、无状态地址配置(包括重复地址检测)、PMTU发现等。

路径MTU
路径MTU是指一条因特网传输路径中,从源地址到目的地址所经过的“路径”上的所有IP跳的最大传输单元的最小值。或者从另外一个角度来看,就是无需进行分片处理就能穿过这条“路径”的最大传输单元的最大值。


 

ICMPv6协议报文
(1)目的不可达错误报文:type=1
(2)数据包过大错误报文:type=2
(3)时间超时错误报文: type=3
(4)参数错误报文: type=4
(5)信息报文: type=128、type=129
(7)RS type=133
(8)RA type=134
(9)NS type=135
(10)NA type=136
(11)redirect type=137

地址解析:NS组播请求FF02::1:FFXX:XXXX,NA单播响应
重复地址:NS组播请求FF02::1:FFXX.XXXX,NA组播响应FF02::1
路由发现:RS组播请求FF02::2,RA组播响应FF02::1


NDP

NDP(Neighbor Discovery Protocol,邻居发现协议)替代了IPv4的ARP(Address Resolution Protocol)和ICMP路由器发现(Router Discovery),它定义了使用ICMPv6报文实现地址解析,跟踪邻居状态,重复地址检测,路由器发现以及重定向等功能。

NDP的7个作用
1路由器发现
2无状态自动配置
3重复地址检测
4地址解析
5邻居的状态跟踪
6前缀重编址:
7路由器重定向

RS(Router Solicitation):路由器请求报文
RA(Router Advertisement):路由器通告报文
NS(Neighbor Solicitation):邻居请求报文
NA(Neighbor Advertisement):邻居通告报文

地址解析
IPv6的地址解析不再使用ARP,也不再使用广播方式。
地址解析在三层完成,针对不同的链路层协议可以采用相同的地址解析协议
通过ICMPv6(类型135的NS及类型136的NA报文)来实现地址解析。
NS报文发送使用组播的方式,报文的目的IPv6地址为被请求的IPv6地址对应的“被请求节点组播地址”,报文的目的MAC为组播MAC。
采用组播的方式发送NS消息相比于广播的方式更加的高效,也减少了对其他节点的影响和对二层网络的性能压力。可以使用三层的安全机制(例如IPSec)避免地址解析攻击。

地址解析过程中使用了两种ICMPv6报文:
邻居请求(Neighbor Solicitation)Type=135,Code=0
邻居通告(Neighbor Advertisement)Type=136,Code=0

display ipv6 neighbors
邻居状态种类
定义了5种邻居状态,分别是:未完成(INCOMPLETE)、可达(REACHABLE)、陈旧(STALE)、延迟(DELAY)、探查(PROBE)

INCOMPLETE 未完成,邻居请求已经发送到目标节点的请求组播地址,但没有收到邻居的通告;
REACHABLE 可达,收到确认,不续再发包确认;
STALE 陈旧,从收到上一次可达性确认后过了超过30s;
DELAY 延迟,在stale状态后发送过一个报文,并且5s内没有可达性确认;
PROBE 探查,每隔1s重传邻居请求来主动请求可达性确认,直到收到确认。
 

重复地址检测
重复地址检测DAD(Duplicate Address Detect)是在接口使用某个IPv6单播地址之前进行的,主要是为了探测是否有其它的节点使用了该地址。

IPv6重复地址检测技术和IPv4中的免费ARP类似:节点向一个自己将使用的试验地址所在的Solicited-Node组播组发送一个以该实验地址为请求的目标地址的NS报文,如果收到某个其他站点回应的NA报文,就证明该地址已被网络上使用,节点将不能使用该实验地址通讯。

无状态自动配置
无状态自动配置即自动生成链路本地地址,主机根据RA报文的前缀信息,自动配置全球单播地址等,并获得其他相关信息。

RS 路由器请求(Router Solicitation) type=133
RA 路由器通告(Router Advertisement)type=134

 
IPv6主机无状态自动配置过程:
1. 根据接口标识产生链路本地地址。
2. 发出邻居请求,进行重复地址检测。
3. 如地址冲突,则停止自动配置,需要手工配置。
4. 如不冲突,链路本地地址生效,节点具备本地链路通信能力。
5. 主机会发送RS报文(或接收到路由器定期发送的RA报文)。
6. 根据RA报文中的前缀信息和通过EUI-64规范生成的接口标识得到IPv6地址。

重定向
当网关路由器发现报文从其它网关路由器转发更好,它就会发送重定向报文告知报文的发送者,让报文发送者选择另一个网关路由器。重定向报文也承载在ICMPv6报文中,其Type字段值为137,报文中会携带更好的路径下一跳地址和需要重定向转发的报文的目的地址等信息。
 
RTA接收到A发送的报文以后会发现实际上主机A直接发送给路由器R2更好,它将发送一个ICMPv6重定向报文给主机A,其中Target Address为RTB,Destination Address为主机B。
主机A接收到了重定向报文之后,会在默认路由表中添加一个主机路由,以后发往主机B的报文就直接给RB。
有个问题:RTA如何知道去往主机B的路径通过RTB更好呢?其实这个很简单,因为RTA会发现报文进入的接口就是报文路由得出接口,也就是说发往主机B的路由实际上只是在RTA上转了一圈出来了,然后转发到RTB,据此,RTA能判断出直接给RTB是更好的路径。

==========

Path MTU

PMTU就是路径上的最小接口MTU。
在IPv4中,报文如果过大,必须要分片进行发送,所以在每个节点发送报文之前,设备都会根据发送接口的最大传输单元MTU(Maximum Transmission Unit)来对报文进行分片。但是在IPv6中,为了减少中间转发设备的处理压力,中间转发设备不对IPv6报文进行分片,报文的分片将在源节点进行。

 
PMTU协议是通过ICMPv6的Packet Too Big报文来完成的。首先源节点假设PMTU就是其出接口的MTU,发出一个试探性的报文,当转发路径上存在一个小于当前假设的PMTU时,转发设备就会向源节点发送Packet Too Big报文,并且携带自己的MTU值,此后源节点将PMTU的假设值更改为新收到的MTU值继续发送报文。如此反复,直到报文到达目的地之后,源节点就能知道到达目的地的PMTU了。

==========

IPv6过渡技术
现在是IPv4 网络,IPv6 现在部署的话需要做些什么?
答:现在是IPv4 网络,没有必要也不可能所有节点同时升级成IPv6。在部署IPv6 的时候可以逐步过渡,并且尽量使用一些技术使得网络升级变得比较平滑。

 
IPv6与IPv4共存技术:
双协议栈: IPv6节点同时支持IPv6和IPv4协议栈。
隧道: IPv6报文作为IPv4的载荷,由IPv4 Internet中连接多个IPv6孤岛。

IPv6与IPv4互通技术:
提供IPv6与IPv4互相访问。适用于IPv6 Internet与IPv4 Internet共存,而两者又有互相通讯的需求。

(1)双栈技术:即设备或者终端同时支持IPv4和IPv6的协议栈,使得设备能在ipv4和ipv6环境下都正常工作(所有设备都需要支持双栈)
特点:支持多种链路类型
缺点:当两个栈比较远时需要在通过的设备开启双栈技术

(2)隧道:解决ipv6“孤岛”问题
1 手工隧道:需要手工指定隧道的终点
a)IPv6 over IPv4手动隧道:
直接把IPv6报文封装在IPv4报文中。边界设备必须是支持双栈的设备,中间的IPv4设备按照正常包转发进行处理
b)GRE隧道:
不仅可传递ipv6的数据还可以传递ipse等其他数据。GRE相对ipv6 over ipv4隧道多了4byte的GRE头部,封装和解封带来的开销相对来说比较大

2 自动隧道:可以自动获得隧道终点的IPv4地址

6to4是使用IPv4地址做为网络前缀,而ISATAP用IPv4地址做为接口标识。
ISATAP(Intra-Site Automatic Tunnel Addressing Protocol)

a)ipv4兼容ipv6自动隧道:ISATAP
IPv4兼容IPv6地址的前96位全部为0,后32位为IPv4地址。(ipv6 address ::2.2.2.2/96 )
作用:只能实现两台主机之间的互访;
b)6to4:
把终点放在IPv6地址的第2、3块tunnel地址的格式:2002:32bit ipv4 address ::x/64
写两条静态路由:2002::/16 tunnel0/0/0 (去往某个ipv6网段,只写出接口为tunnel接口,不写下一跳,因为下一跳是不确定的)引入到site的IPV6动态路由协议中;
作用:可以实现两个ipv6站点之间的互访;
6to4自动隧道支持Router到Router、Host到Router、Router到Host、 Host到Host。

(3)NAT-PT:实现IPv6网络的主机和IPv4主机的互访
1 静态映射的NAT-PT机制
2 动态映射的NAT-PT机制:需要建立地址池
3 NAPT-PT机制:不同的IPv6地址转换时,可以对应同一个IPv4地址,通过端口号来区分不同的IPv6主机,从而使多个IPv6主机能共享一个IPv4地址完成转换

双栈 Dual Stack

双栈技术是IPv4向IPv6过渡的一种有效的技术。网络中的节点同时支持IPv4和IPv6协议栈,源节点根据目的节点的不同选用不同的协议栈,而网络设备根据报文的协议类型选择不同的协议栈进行处理和转发。
 
6over4手动隧道
隧道(Tunnel)是一种封装技术。
它利用一种网络协议来传输另一种网络协议,即利用一种网络传输协议,将其他协议产生的数据报文封装在自身的报文中,然后在网络中传输。隧道是一个虚拟的点对点的连接。一个Tunnel提供了一条使封装的数据报文能够传输的通路,并且在一个Tunnel的两端可以分别对数据报文进行封装及解封装。
 
6over4手动隧道优缺点
优点:可以用于任何IPv6穿越IPv4的环境,通用性好。
缺点:必须手工配置。

6over4 GRE隧道
GRE(Generic Routing Encapsulation)通用路由封装协议
 

使用标准的GRE隧道技术提供了点到点连接服务,需要手工指定隧道的端点地址。GRE隧道本身并不限制被封装的协议和传输协议,一个GRE隧道中被封装的协议可以是协议中允许的任意协议(可以是IPv4、IPv6、OSI、MPLS等)。

6to4 自动隧道
6over4隧道 (一对一)
6over4隧道也属于一种自动隧道,隧道也是使用内嵌在IPv6地址中的IPv4地址建立的。与IPv4兼容自动隧道不同,6to4自动隧道支持Router到Router、Host到Router、Router到Host、 Host到Host。
采用6to4专用地址,即2002:IPv4::/48
 

6to4隧道 (多对一)
可连接多个6to4网络。
通过SLA ID区分。
 

6to4中继
实现6to4网络和IPv6普通网络互通。
普通IPv6网络需要与6to4网络通过IPv4网络互通,这可以通过6to4中继路由器方式实现。所谓6to4中继,就是通过6to4隧道转发的IPv6报文的目的地址不是6to4地址,但转发的下一跳是6to4地址,该下一跳为路由器我们称之为6to4中继。隧道的IPv4目的地址依然从下一跳的6to4地址中获得。
 

ISATAP 自动隧道
ISATAP(Intra-Site Automatic Tunnel Addressing Protocol)是另外一种自动隧道技术。ISATAP隧道同样使用了内嵌IPv4地址的特殊IPv6地址形式,只是和6to4不同的是,6to4是使用IPv4地址做为网络前缀,而ISATAP用IPv4地址做为接口标识。
6over4自动隧道的一种
支持Host到Router、Router到Host、 Host到Host
采用ISATAP隧道专用地址

ISATAP过渡机制允许在现有的IPv4网络内部部署IPv6,该技术简单而且扩展性很好,可以用于本地站点的过渡。ISATAP支持IPv6站点本地路由和全局IPv6路由域,以及自动IPv6隧道。ISATAP同时还可以与NAT结合,从而可以使用站点内部非全局唯一的IPv4地址。
 

NAT64
NAT64技术实际上是一种协议转换技术,能够将分组在V4及V6格式之间灵活转换。
IPv6过渡中的协议翻译技术就是将IPv6数据包的每个字段与IPv4数据包中的字段建立起一一映射的关系,从而在两个网络的边缘实现数据报文的转换。
 


 
 
⦁    ICANN(the Internet Corporation for Assigned Names and Numbers)是负责全球互联网上的IP地址进行编号分配的机构。
⦁    ICANN将部分IP地址和AS号码分配给大洲级的互联网注册机构RIR(Reginal Internet Registry)。
⦁    并不是所有的地址都会被分配。一些地址被预留,用于广播、测试、私有网络使用等。这些地址被称为专用地址(special-use address)。你可以查询RFC5735来了解哪些地址是专用地址。
 
⦁    实践证明IPv4是一个非常成功的协议,它本身也经受住了Internet从数目很少的计算机发展到目前上亿台计算机互联的考验。但该协议是几十年前基于当时的网络规模而设计的。在今天看来,IPv4的设计者们对于Internet的估计和预想显得很不充分。随着Internet的扩张和新应用的不断推出,IPv4越来越显示出它的局限性。
⦁    Internet规模的快速扩大是当时完全没有预料到的,特别是近十年来,更是爆炸式增长,已经走进了千家万户,人们的日常生活已经离不开它了。但也就是这种快速发展,出现了迫在眉睫的IP地址空间耗尽问题。

 
 
 
⦁    IPv6特点:
⦁    地址空间,IPv6地址采用128比特标识。128位的地址结构使IPv6理论上可以拥有(43亿×43亿×43亿×43亿)个地址。近乎无限的地址空间是IPv6的最大优势。
⦁    报文结构,IPv6使用了新的协议头格式,也就是说IPv6数据包有全新的报文头,而并不是仅仅简单地将IPv4报文头中的地址部分增加到128bits而已。在IPv6中,报文头包括固定头部和扩展头部,一些非根本性的和可选择的字段被移到了IPv6协议头之后的扩展协议头中。这使得网络中的中间路由器在处理IPv6协议头时,有更高的效率。
⦁    实现自动配置和重新编址,IPv6协议内置支持通过地址自动配置方式使主机自动发现网络并获取IPv6地址,大大提高了内部网络的可管理性。
⦁    支持层次化网络结构,巨大的地址空间使得IPv6可以方便的进行层次化网络部署。层次化的网络结构可以方便的进行路由聚合,提高了路由转发效率。
⦁    支持端对端安全,IPv6中,网络层支持IPSec的认证和加密,支持端到端的安全。
⦁    更好的支持QoS,IPv6在包头中新定义了一个叫做流标签的特殊字段。IPv6的流标签字段使得网络中的路由器可以对属于一个流的数据包进行识别并提供特殊处理。用这个标签,路由器可以不打开传送的内层数据包就可以识别流,这就使得即使数据包有效载荷已经进行了加密,仍然可以实现对QoS的支持。
⦁    支持移动特性,由于采用了Routing header和Destination option header等扩展报头,使得IPv6提供了内置的移动性。
 
⦁    IPv6数据包由一个IPv6报头、多个扩展报头和一个上层协议数据单元组成。
⦁    IPv6基本报头(IPv6 Header)
⦁    每一个IPv6数据包都必须包含报头,其长度固定为40bytes。
⦁    基本报头提供报文转发的基本信息,会被转发路径上面的所有路由器解析。
⦁    上层协议数据单元(Upper Layer Protocol Data Unit)
⦁    上层协议数据单元一般由上层协议包头和它的有效载荷构成,有效载荷可以是一个ICMPv6报文、一个TCP报文或一个UDP报文。
⦁    IPv6报头格式中主要字段解释如下:
⦁    Version:版本号,长度为4bit。对于IPv6,该值为6。
⦁    Traffic Class:流类别,长度为8bit。等同于IPv4中的ToS字段,表示IPv6数据报的类或优先级,主要应用于QoS。
⦁    Flow Label:流标签,长度为20bit。IPv6中的新增字段,用于区分实时流量,不同的流标签+源地址可以唯一确定一条数据流,中间网络设备可以根据这些信息更加高效率的区分数据流。
⦁    Payload Length:有效载荷长度,长度为16bit。有效载荷是指紧跟IPv6报头的数据报的其它部分(即扩展报头和上层协议数据单元)。
⦁    Next Header:下一个报头,长度为8bit。
⦁    Hop Limit:跳数限制,长度为8bit。该字段类似于IPv4中的Time to Live字段,它定义了IP数据报所能经过的最大跳数。每经过一个路由器,该数值减去1,当该字段的值为0时,数据报将被丢弃。
⦁    Source Address:源地址,长度为128bit。表示发送方的地址。
⦁    Destination Address:目的地址,长度为128bit。表示接收方的地址。
 
⦁    在IPv4中,IPv4报头包含可选字段Options,内容涉及security、Timestamp、Record route等,这些Options可以将IPv4报头长度从20字节扩充到60字节。在转发过程中,处理携带这些Options的IPv4报文会占用路由器很大的资源,因此实际中也很少使用。
⦁    IPv6将这些Options从IPv6基本报头中剥离,放到了扩展报头中,扩展报头被置于IPv6报头和上层协议数据单元之间。一个IPv6报文可以包含0个、1个或多个扩展报头,仅当需要路由器或目的节点做某些特殊处理时,才由发送方添加一个或多个扩展头。与IPv4不同,IPv6扩展头长度任意,不受40字节限制,这样便于日后扩充新增选项,这一特征加上选项的处理方式使得IPv6选项能得以真正的利用。但是为了提高处理选项头和传输层协议的性能,扩展报头总是8字节长度的整数倍。
⦁    当使用多个扩展报头时,前面报头的Next Header字段指明下一个扩展报头的类型,这样就形成了链状的报头列表。
 
⦁    说明:
⦁    路由设备转发时根据基本报头中Next Header值来决定是否要处理扩展头,并不是所有的扩展报头都需要被转发路由设备查看和处理的。
⦁    除了目的选项扩展报头可能在一个IPv6报文中出现一次或两次(一次在路由扩展报头之前,另一次在上层协议数据报文之前),其余扩展报头只能出现一次。
 
⦁    IPv4地址分为:单播地址、组播地址、广播地址。而IPv6中没有广播地址,增加了任播地址。也就是说IPv6地址被分为:单播地址、组播地址、任播地址。
⦁    单播地址用于标识一个接口,发往该目的地址的报文会被送到被标识的接口;
⦁    组播地址用于标识多个接口,发往该目的地址的报文会被送到被标识的所有接口;
⦁    任播地址用于标识多个接口,发往该目的地址的报文会被送到被标识的所有接口中最近的一个接口上。实际上任播地址与单播地址使用同一个地址空间,也就是说,由路由器决定数据包是做任播转发还是单播转发。

 
⦁    全球单播地址是带有全球单播前缀的IPv6地址,其作用类似于IPv4中的公网地址。这种类型的地址允许路由前缀的聚合,从而限制了全球路由表项的数量。
 
⦁    链路本地地址是IPv6中的应用范围受限制的地址类型,只能在连接到同一本地链路的节点之间使用。它使用了特定的本地链路前缀FE80::/10(最高10位值为1111111010),同时将接口标识添加在后面作为地址的低64比特。
⦁    当一个节点启动IPv6协议栈时,启动时节点的每个接口会自动配置一个链路本地地址(其固定的前缀+EUI-64规则形成的接口标识)。这种机制使得两个连接到同一链路的IPv6节点不需要做任何配置就可以通信。所以链路本地地址广泛应用于邻居发现,无状态地址配置等应用。
⦁    以链路本地地址为源地址或目的地址的IPv6报文不会被路由设备转发到其他链路。
 
⦁    唯一本地地址是另一种应用范围受限的地址,它仅能在一个站点内使用。由于本地站点地址的废除(RFC3879),唯一本地地址被用来代替本地站点地址(RFC4193)。
⦁    唯一本地地址的作用类似于IPv4中的私网地址,任何没有申请到提供商分配的全球单播地址的组织机构都可以使用唯一本地地址。唯一本地地址只能在本地网络内部被路由转发而不会在全球网络中被路由转发。
⦁    字段解释:
⦁    Prefix:前缀;固定为FC00::/7。
⦁    L:L标志位;值为1代表该地址为在本地网络范围内使用的地址;值为0被保留,用于以后扩展。
⦁    Global ID:全球唯一前缀;通过伪随机方式产生(RFC4193)。
⦁    Subnet ID:子网ID;划分子网使用。
⦁    Interface ID:接口标识。
⦁    唯一本地地址具有如下特点:
⦁    具有全球唯一的前缀(虽然随机方式产生,但是冲突概率很低)。
⦁    可以进行网络之间的私有连接,而不必担心地址冲突等问题。
⦁    具有知名前缀(FC00::/7),方便边缘路由器进行路由过滤。
⦁    如果出现路由泄漏,该地址不会和其他地址冲突,不会造成Internet路由冲突。
⦁    应用中,上层应用程序将这些地址看作全球单播地址对待。
⦁    独立于互联网服务提供商ISP(Internet Service Provider)。
 
⦁    未指定地址
⦁    IPv6中的未指定地址即 0:0:0:0:0:0:0:0/128 或者::/128。该地址可以表示某个接口或者节点还没有IP地址,可以作为某些报文的源IP地址(例如在NS报文的重复地址检测中会出现)。源IP地址是::的报文不会被路由设备转发。
⦁    环回地址
⦁    IPv6中的环回地址即 0:0:0:0:0:0:0:1/128 或者::1/128。环回与IPv4中的127.0.0.1作用相同,主要用于设备给自己发送报文。该地址通常用来作为一个虚接口的地址(如Loopback接口)。实际发送的数据包中不能使用环回地址作为源IP地址或者目的IP地址。
 
⦁    对于IPv6 单播地址来说,如果地址的前三bit不是000,则接口标识必须为64位,如果地址的前三位是000,则没有此限制。
⦁    接口ID的长度为64bit,用于标识链路上的接口。在每条链路上,接口ID必须唯一。接口ID有许多用途,最常见的用于就是黏贴在链路本地地址前缀后面,形成接口的链路本地地址。或者在无状态自动配置中,黏贴在获取到的IPv6全局单播地址前缀后面,构成接口的全局单播地址。
⦁    IEEE EUI-64规范
⦁    这种由MAC地址产生IPv6地址接口ID的方法可以减少配置的工作量,尤其是当采用无状态地址自动配置时(后面会介绍),只需要获取一个IPv6前缀就可以与接口ID形成IPv6地址。
⦁    使用这种方式最大的缺点就是某些恶意者可以通过二层MAC推算出三层IPv6地址。
 
⦁    假设一个接口的MAC地址如上图所示,那么采用EUI-64规范,接口可根据该MAC地址计算得到接口ID,由于MAC地址全局唯一,因此该接口ID也相应的具备全局唯一性。计算过程如下。
⦁    将48bit的MAC地址对半劈开,然后插入“FFFE”,再对从左数起的第7位,也就是U/L位取反,即可得到对应的接口ID。
⦁    在单播MAC地址中,第1个Byte的第7bit是U/L(Universal/Local,也称为G/L,其中G表示Global)位,用于表示MAC地址的唯一性。如果U/L=0,则该MAC地址是全局管理地址,是由拥有OUI的厂商所分配的MAC地址;如果U/L=1,则是本地管理地址,是网络管理员基于业务目的自定义的MAC地址。
⦁    而在在EUI-64接口ID中,第7bit的含义与MAC地址正好相反,0表示本地管理,1表示全球管理,所以使用EUI-64格式的接口ID,U/L位为1,则地址是全球唯一的,如果为0,则为本地唯一。这就是为什么要反转该位。

 
 
⦁    类似于IPv4,IPv6同样有一些特殊的组播地址,这些地址由特别的含义,这里举几个例子(还有很多类似的特殊地址):
⦁    FF01::1(节点本地范围组播地址)
⦁    FF02::1(链路本地范围所有节点组播地址)
⦁    FF01::2(节点本地范围所有路由器组播地址)
⦁    FF02::2(链路本地范围所有路由器组播地址)
⦁    FF05::2(站点本地范围所有路由器组播地址)

 
 
⦁    当一个节点具有了单播或任播地址,就会对应生成一个与之相对应的被请求节点组播地址,并且加入这个组播组。一个单播地址或任播地址对应一个被请求节点组播地址。该地址主要用于地址解析、邻居发现机制和地址重复检测等功能。
⦁    被请求节点组播地址由固定前缀FF02::1:FF00:0/104和对应IPv6地址的最后24bit组成。被请求节点组播地址的有效范围为本地链路范围。
⦁    被请求节点组播地址的作用究竟是什么呢?举个非常简单的例子,回顾一下IPv4中的ARP,这个协议主要用于地址解析,当设备需要解析某个IP地址对应的MAC地址时,就会发送一个广播ARP Request帧,之所以要发送广播帧,是因为它要确保广播域内所有节点都能收到。然而除了目标节点之外,该帧对于其他节点而言是个困扰,因为它们不得不去解析这个帧(一直解析到ARP载荷),这个动作将会浪费设备的资源。
⦁    在IPv6中,ARP及广播都被取消,当设备需要请求某个IPv6地址对应的MAC地址时,设备依然需要发送请求报文,但是该报文是一个组播报文,其目的IPv6地址是目标IPv6单播地址对应的被请求节点组播地址,而目的MAC地址则是该组播地址对应的组播MAC地址。由于只有目标节点才会侦听这个被请求节点组播地址,因此当其他设备收到该帧时,这些设备可以通过目的MAC地址、在网卡层面就判断出不需要处理它并将帧丢弃。

 
⦁    这是IPv6特有的地址类型,它用来标识一组网络接口(通常属于不同的节点)。目标地址是任播地址的数据包将发送给其中路由意义上最近的一个网络接口。适合于“One-to-One-of-Many”(一对组中的一个)的通讯场合。接收方只需要是一组接口中的一个即可,如移动用户上网就需要因地理位置的不同,而接入离用户最近的一个接收站,这样才可以使移动用户在地理位置上不受太多的限制。
⦁    任播地址从单播地址空间中进行分配,使用单播地址的任何格式。因而,从语法上,任播地址与单播地址没有区别。被分配具有任播地址的节点必须得到明确的配置,从而知道它是一个任播地址。目前,任播地址仅被用做目标地址,且仅分配给路由器。
⦁    在RFC3513中定义了子网路由器任播地址(Subnet-Router anycast Address),其接口ID为全0。
⦁    发往该任播地址的报文会被发送到任播地址所代表子网(子网路由器任播地址的前缀)内的某一台路由器,该路由器是离得最“近”的一台。所谓最近一般是路由的概念。

 
⦁    ICMPv6的协议类型号(即IPv6报文中的Next Header字段的值)为58。
⦁    在IPv4中,Internet控制报文协议(ICMP)向源节点报告关于向目的地传输IP数据包过程中的错误和信息。它为诊断、信息和管理目的定义了一些消息,如:目的不可达、数据包超长、超时、回应请求和回应应答等。在IPv6中,ICMPv6除了提供ICMPv4常用的功能之外,还有其它的一些机制需要ICMPv6消息,诸如邻居发现、无状态地址配置(包括重复地址检测)、路径MTU发现等等。
⦁    所以ICMPv6是一个非常重要的协议。它是理解IPv6中其它机制的基础。

⦁    报文解释:
⦁    Type:表明消息的类型,0至127表示差错报文类型,128至255表示消息报文类型。
⦁    Code:表示此消息类型细分的类型。
⦁    Checksum:表示ICMPv6报文的校验和。

 
⦁    目标不可达(Destination Unreachable)。
⦁    当数据包无法被转发到目标节点或上层协议时,路由器或目标节点发送ICMPv6目标不可达差错报文。在目标不可达报文中,类型(Type)字段值为1,代码(Code)字段值为0-4,每一个代码值都定义了具体含义(RFC2463):
⦁    0:没有到达目标的路由。
⦁    1:与目标的通信被管理策略禁止。
⦁    2:未指定。
⦁    3:地址不可达。
⦁    4:端口不可达。
⦁    数据包超长(Packet Too Big)。
⦁    如果由于出口链路的MTU小于IPv6数据包的长度而导致数据包无法转发,路由器就会发送数据包超长报文。该报文被用于IPv6路径MTU发现的处理 。数据包超长报文的类型字段值为2,代码字段值为0。
⦁    超时(Time Exceeded)。
⦁    当路由器收到一个IPv6报头中的跳限制(Hop Limit)字段值为0的数据包时,会丢弃该数据包并向源发送ICMPv6超时报文。在超时报文中,类型字段的值为3,代码字段的值为0或1:
⦁    0:在传输中超越了跳限制。
⦁    1:分片重组超时。

⦁    参数问题(Parameter Problem)。
⦁    当IPv6报头或者扩展报头出现错误,导致数据包不能进一步处理时,IPv6节点会丢弃该数据包并向源发送此报文,指明问题的位置和类型。参数问题报文中,类型字段值为4,代码字段值为0~2,32位指针字段指出错误发生的位置。其中代码字段是这样定义的:
⦁    0:遇到错误的报头字段。
⦁    1:遇到无法识别的下一个报头(Next Header)类型。
⦁    2:遇到无法识别的IPv6选项。
⦁    在RFC2463中只定义了两种信息报文:回送请求Echo Request以及回送应答Echo Reply。
⦁    回送请求报文。
⦁    回送请求报文用于发送到目标节点,以使目标节点立即发回一个回送应答报文。回送请求报文的类型字段值为128,代码字段的值为0。标志符(Identifier)和序列号(Sequence Number)字段有发送方主机设置,用于将即将收到的回送应答报文与发送的回送请求的报文进行匹配。
⦁    回送应答报文。
⦁    当收到一个回送请求报文时,ICMPv6会用回送应答报文响应。回送应答报文的类型字段的值为129,代码字段的值为0。标志符(Identifier)和序列号(Sequence Number)字段的值被指为与回送请求报文中的相应字段一样的值。

 
⦁    路由器发现:该功能帮助设备发现链路上的路由器,并获得路由器通告的信息。
⦁    无状态自动配置:无状态自动配置是IPv6的一个亮点功能,它使得IPv6主机能够非常便捷地连入到IPv6网络中,即插即用,无需手工配置繁冗的IPv6地址,无需部署应用服务器(例如DHCP服务器)为主机分发地址。无状态自动配置机制使用到了ICMPv6中的路由器请求报文(RS)及路由器通告报文(RA)。
⦁    重复地址检测:重复地址检测是一个非常重要的机制,一个IPv6地址必须经历重复地址检测并通过检测之后才能够启用。重复地址检测用于发现链路上是否存在IPv6地址冲突。
⦁    地址解析:在IPv6中,取消了IPv4中的ARP协议,使用NDP所定义的邻居请求报文(NS)及邻居通告报文(NA)来实现地址解析功能。
⦁    邻居的状态跟踪:IPv6定义了节点之间邻居的状态机,同时还维护邻居IPv6地址与二层地址如MAC的映射关系,相应的表项存储于设备的IPv6邻居表中。
⦁    前缀重编址:IPv6路由器能够通过ICMPv6的路由器通告报文(RA)向链路上通告IPv6前缀信息。通过这种方式,主机能够从RA中所包含的前缀信息自动构建自己的IPv6单播地址。当然这些自动获取的地址是有生存时间的。通过在RA中通告IPv6地址前缀,并且灵活地设定地址的生存时间,能够实现网络中IPv6新、老前缀的平滑过渡,而无需在主机终端上消耗大量的手工劳动重新配置地址。
⦁    路由器重定向:路由器向一个IPv6节点发送ICMPv6的重定向消息,通知它在相同的本地链路上有一个更好的、到达目的地的下一跳。IPv6中的重定向功能与IPv4中的是一样的。
 
 
⦁    在IPv4中,可以通过ARP就可以由IP地址解析到链路层地址,ARP协议是工作在第二层。在IPv6中在邻居发现协议(RFC2461)中定义地址解析的,其中使用了ICMPv6的报文,在三层完成地址解析,主要带来以下几个好处:
⦁    加强了介质独立性:这就意味着我们无需为每一个链路层定义一个新的地址解析协议,在每一个链路层都使用相同的地址解析协议;
⦁    可以利用三层安全机制:ARP欺骗(如伪造ARP应答以盗窃数据流)是IPv4中的一个很大的安全问题,在第三层实现地址解析,可以利用三层标准的安全认证机制(例如IPSEC)解决这个问题;
⦁    ARP请求报文使用广播,会泛滥到整个二层网络中每台主机是公认的一个IPv4性能问题。在第三层实现地址解析可以将地址解析请求仅仅发送到待解析地址所属的“Solicited-node”组播组即可。采用组播的传送方式,大大减轻了性能压力。


 
⦁    地址解析过程中使用了两种ICMPv6报文:邻居请求(Neighbor Solicitation)和邻居通告(Neighbor Advertisement)。
⦁    邻居请求 Neighbor Solicitation
⦁    ICMP的Type为135,Code为0;
⦁    Target Address是需要解析的IPv6地址,因此该处不准出现组播地址。
⦁    邻居请求发送者的链路层地址会被放在Options字段中。
⦁    邻居通告 Neighbor Advertisement
⦁    ICMP Type为136,Code为0;
⦁    R标志(Router flag)表示发送者是否为路由器,如果1则表示是;
⦁    S标志(Solicited flag)表示发送邻居通告是否是响应某个邻居请求,如果1则表示是;
⦁    O标志(Overide flag)表示邻居通告中的消息是否覆盖已有的条目信息,如果1则表示是;
⦁    Traget Address表示所携带的链路层地址对应的IPv6地址。
⦁    被请求的链路层地址被放在Options字段中,其格式仍然采用TLV格式,具体可以参考RFC2463 。


 
⦁    有了NS和NA两种报文,两台主机如何获取对方的链路层地址呢?
⦁    在上图所示的场景中,PC1要请求PC2的2001::2这个地址对应的MAC地址,PC1将发送一个NS报文达到这个目的。这个NS报文的源地址是2001::1,目的地址则是2001::2对应的被请求节点组播地址。
⦁    然后IPv6数据包又被封装上数据帧的头部,其中源MAC地址是PC1的MAC地址,目的MAC地址则是2001::2这个目标地址对应的被请求节点组播地址映射得到的MAC地址,这是一个组播MAC地址。
⦁    这样就完成了一个双向交互链路层地址的过程。


 
⦁    除R2外的其他节点也会收到这个数据帧,在读取数据帧头的时候发现目的MAC地址是一个组播MAC地址,而该组播MAC地址在本地并不侦听,因此在网卡层面就将数据帧丢弃而不再往报文里看了。
⦁    PC2收到这个数据帧后,由于本地网卡接收目的MAC地址为3333-FF00-0002的数据帧,因此在对数据帧做校验之后从帧头的类型字段得知里头是个IPv6报文,于是将帧头拆掉,把IPv6报文上送IPv6协议栈处理。IPv6协议栈从报文的IPv6头部中的目的IPv6地址得知这个数据包是发往一个被请求节点组播地址FF02::1:FF00:2,而本地网卡加入了这个组播组。接着,从IPv6包头的NextHeader字段得知IPv6包头后面封装着一个ICMPv6的报文,因此将IPv6包头拆除,将ICMPv6报文交给ICMPv6协议去处理。最后ICMPv6发现这是个NS报文,要请求自己2001::2对应的MAC地址,于是回送一个NA报文给PC1,在该报文中就包含着PC2的MAC地址。

 
⦁    在windows7操作系统里,可以使用netsh interface ipv6 show neighbors命令查看邻居缓存的内容。
 
⦁    前面简单地讲述了如何进行地址解析的,但是实际的通讯过程中不仅仅是地址解析这么简单,而是需要维护一张邻居表,每个邻居都有相应的状态,状态之间可以迁移。
⦁    RFC2461中定义了5种状态:INCOMPLETE、REACHABLE、STALE、DELAY、PROBE。

 
⦁    邻居状态的迁移是比较复杂的,此处不会做详细地介绍,下面以A、B两个节点之间相互通讯过程的A节点的邻居状态变化,假设A、B两个节点之前没有任何通讯:
⦁    A先发送NS,并生成邻居缓存条目,状态为Incomplete;
⦁    若B回复NA,则Incomplete->Reachable,否则10s后Incomplete->Empty,即删除条目;
⦁    经过ReachableTime(默认30s),条目状态Reachable->Stale;
⦁    或者在Reachable状态,收到B的非请求NA,且链路层地址不同,则马上->Stale;
⦁    在Stale状态若A需要向B发送数据,则Stale->Delay,同时发送NS请求;
⦁    在Delay_First_Probe_Time(默认5秒)后,Delay->Probe,其间若有NA应答,则Delay->Reachable;
⦁    在Probe状态,每隔RetransTimer(默认1秒)发送单播NS,发送MAX_UNICAST_SOLICIT个后再等RestransTimer,有应答则->Reachable,否则进入Empty,即删除表项。
⦁    从以上的机制可以看出IPv6的邻居关系优于IPv4的ARP,IPv6的邻居关系维护机制确保通讯发起之前邻居是可达的,而ARP本身是做不到的,仅仅通过老化机制来实现。
⦁    关于邻居状态的维护以及状态迁移可以参考RFC2461。
 
 
⦁    在上图中,R2已是在线的设备,该设备已经使用了如图所示的地址,现在我们为R1新配置IPv6的地址2001::FFFF/64,观察一下会发生什么事情。R1的接口配置2001::FFFF/64地址后,该地址立即进入tentative状态,此时仍然是不可用的,除非该地址通过DAD检测。
⦁    R1向链路上以组播的方式发送一个NS报文,该NS的源IPv6地址为“::”,目的IPv6地址为要进行DAD检测的2001::FFFF对应的被请求节点组播地址,也就是FF02::1:FF00:FFFF。这个NS里包含着要做DAD检测的目标地址2001::FFFF。
⦁    链路上的节点都会收到这个组播的NS报文,没有配置2001::FFFF的节点接口由于没有加入该地址对应的被请求节点组播组,因此在收到这个NS的时候默默丢弃。而R2在收到这个NS后,由于它的接口配置了2001::FFFF地址,因此接口会加入组播组FF02::1:FF00:FFFF,而此刻所收到的报文又是以该地址为目的地址,因此它会解析该报文,它发现对方进行DAD的目标地址与自己本地接口地址相同,于是立即回送一个NA报文,该报文的目的地址是FF02::1,也就是所有节点组播地址,同时在报文内写入目标地址2001::FFFF,以及自己接口的MAC地址。
⦁    当R1收到这个NA后,它就知道2001::FFFF在链路上已经有人在用了,因此将该地址标记为Duplicate(重复的),该地址将不能用于通信。

 
 
⦁    使用IPv6地址无状态自动配置后,设备的IPv6地址无需进行手工配置,即插即用,减轻网络管理的负担。
⦁    大致的工作过程如下:
⦁    主机根据本地接口ID自动产生网卡的链路本地地址。
⦁    主机对链路本地地址进行DAD检测, 如果该地址不存在冲突则可以启用。
⦁    主机发送RS报文尝试在链路上发现IPv6路由器,该报文的源地址为主机的链路本地地址。
⦁    路由器回复RA报文(携带IPv6前缀信息,路由器在未收到RS时也能够配置主动发出RA报文)。
⦁    主机根据路由器回应的RA报文,获得IPv6地址前缀信息,使用该地址前缀,加上本地产生的接口ID,形成单播IPv6地址。
⦁    主机对生成的IPv6地址进行DAD检测,如果没有检测到冲突,那么该地址才能够启用。

 
⦁    路由器发现功能用来发现与本地链路相连的设备,并获取与地址自动配置相关的前缀和其他配置参数。
⦁    经过前面的介绍,我们已经知道IPv6地址支持无状态自动配置,即主机通过路由器发送的RA报文获取网络前缀信息,然后主机自己生成地址的接口标识部分,并自动配置IPv6地址。

 
⦁    主机如何获知网络的前缀(实际上不仅仅前缀前缀信息,还有其它的信息)呢?主要通过两个途径:被动接收到网络上路由器通告(Router Advertisement),从通告中获得;主动发送路由器请求(Router Solicitation),路由器回应路由器通告后,主机从通告中获得。

 
 
 
 
 
 
 
 
⦁    经常网关路由器发现报文从其它网关路由器转发更好,它就会发送重定向报文告知报文的发送者,让报文发送者选择另一个网关路由器。
⦁    报文格式中Type为137,Code为0;
⦁    Target Address是更好的路径下一跳地址;
⦁    Destination Address是需要重定向转发的报文的目的地址。

 
⦁    下面是一个具体的例子,假设主机A想与主机B通讯,主机A的默认网关路由器是RTA,那么当A发送报文给B时报文会被送到RTA。
⦁    RTA接收到A发送的报文以后会发现实际上主机A直接发送给路由器R2更好,它将发送一个ICMPv6重定向报文给主机A,其中Target Address为RTB,Destination Address为主机B。
⦁    主机A接收到了重定向报文之后,会在默认路由表中添加一个主机路由,以后发往主机B的报文就直接给R2。
⦁    这就是重定向的一个简单过程,其中会有个问题:RTA如何知道去往主机B的路径通过RTB更好呢?其实这个很简单,因为RTA会发现报文进入的接口就是报文路由得出接口,也就是说发往主机B的路由实际上只是在RTA上转了一圈出来了,然后转发到RTB,据此,RTA能判断出直接给RTB是更好的路径。
 
⦁    前面学习的关于IPv6报文转发相关知识的时候知道,IPv6报文在转发的过程中是不进行分片操作的,当然也不进行分片报文的整合工作。IPv6报文仅在源节点进行分片,在目的节点进行组装。那么这会产生一个问题,源节点将报文到底分成多大的呢?很简单,为了所有的报文都能在路径上畅通无阻,那么分片的报文大小不能超过路径上最小的MTU,也就是PMTU——路径MTU。
⦁    RFC1981中定义了PMTU发现的机制,它是通过ICMPv6的Packet Too Big报文来完成的。首先源节点假设PMTU就是其出接口的MTU,发出报文,当转发路径上存在一个小于当前假设的PMTU时,就会向源节点发送Packet Too Big报文,并且携带自己的MTU值,此后源节点将PMTU的假设值更改为新收到的MTU值。如此反复,直到报文到达目的地之后,源节点就能知道到达某个目的地的PMTU了。
⦁    假设源到目的要先后经过4条链路,链路地MTU分别是1500、1500、1400、1300,当源发送一个分片报文的时候,首先分成1500大小的片,当到达1400的出接口时,路由器就会返回Packet Too Big错误,同时携带1400的MTU值。源接收到之后就会重新分成1400大小的片,当到达1300的出接口时,同样返回Packet Too Big错误,携带1300的MTU值。之后源重新分成1300的报文,最终到达目的地,这样就找到了该路径的PMTU。

 
⦁    值得注意的是,只有数据包超过路径上的最小MTU时,PMTU发现机制才有意义,因为如果报文很小,小于路径最小的MTU,就不可能产生Packet Too Big报文。
⦁    由于IPv6要求链路层所支持的最小MTU为1280,所以PMTU的值不会小于1280。而最大的PMTU一般由链路层决定,如果链路层是一个隧道,那么支持的PMTU可能很大。

 
⦁    IPv6与IPv4共存技术:
⦁    双协议栈:
⦁    IPv6节点同时支持IPv6和IPv4协议栈。
⦁    隧道:
⦁    IPv6报文作为IPv4的载荷,由IPv4 Internet中连接多个IPv6孤岛。
⦁    IPv6与IPv4互通技术:
⦁    提供IPv6与IPv4互相访问的技术。
⦁    适用于IPv6 Internet与IPv4 Internet共存,而两者又有互相通讯的需求。

 
⦁    双栈技术是IPv4向IPv6过渡的一种有效的技术。网络中的节点同时支持IPv4和IPv6协议栈,源节点根据目的节点的不同选用不同的协议栈,而网络设备根据报文的协议类型选择不同的协议栈进行处理和转发。双栈可以在一个单一的设备上实现,也可以是一个双栈骨干网。对于双栈骨干网,其中的所有设备必须同时支持IPv4/IPv6协议栈,连接双栈网络的接口必须同时配置IPv4地址和IPv6地址。
⦁    所谓的双栈就是主机或者网络设备同时支持IPv4及IPv6双协议栈,如果节点支持双栈,那么它能够同时使用V4和V6的协议栈、同时处理IPv4及IPv6的数据。在双栈设备上,上层应用会优先选择IPv6协议栈,而不是IPv4。 比如,一个同时支持v4和v6的应用请求通过DNS请求地址,会先请求AAAA记录,如果没有,则再请求A记录。双栈是V4、V6并存及IPv6过渡技术的基础。
就拿上图来说,路由器就是一个双栈设备,默认情况下路由器本身就已经支持IPv4,接口上也配置了IPv4的地址,已经能够正常转发IPv4的报文,此刻在激活路由器的IPv6数据转发能力,再为接口分配IPv6的单播地址,那么这个接口又有了IPv6数据转发能力。当然,此时对于路由器而言,IPv4及IPv6协议栈互不干扰,独立工作。

 
⦁    如果一个边界设备要与多个设备建立手动隧道,就需要在设备上配置多个隧道,配置比较麻烦。所以手动隧道通常用于两个边界路由器之间,为两个IPv6网络提供连接。
⦁    手动隧道优缺点
⦁    优点:可以用于任何IPv6穿越IPv4的环境,通用性好。
⦁    缺点:必须手工配置。
⦁    转发机制
⦁    IPv6 over IPv4手动隧道转发机制为:当隧道边界设备的IPv6侧收到一个IPv6报文后, 根据IPv6报文的目的地址查找IPv6路由转发表,如果该报文是从此虚拟隧道接口转发出去,则根据隧道接口配置的隧道源端和目的端的IPv4地址进行封装。封装后的报文变成一个IPv4报文,交给IPv4协议栈处理。报文通过IPv4网络转发到隧道的终点。隧道终点收到一个隧道协议报文后,进行隧道解封装。并将解封装后的报文交给IPv6协议栈处理。
 
⦁    IPv6 over IPv4 GRE隧道使用标准的GRE隧道技术提供了点到点连接服务,需要手工指定隧道的端点地址。GRE隧道本身并不限制被封装的协议和传输协议,一个GRE隧道中被封装的协议可以是协议中允许的任意协议(可以是IPv4、IPv6、OSI、MPLS等)。
⦁    IPv6 over IPv4 GRE隧道在边界路由器上的传输机制和IPv6 over IPv4手动隧道相同。
 
⦁    6to4隧道也属于一种自动隧道,隧道也是使用内嵌在IPv6地址中的IPv4地址建立的。与IPv4兼容自动隧道不同,6to4自动隧道支持Router到Router、Host到Router、Router到Host、 Host到Host。
⦁    地址格式:
⦁    FP:可聚合全球单播地址的格式前缀(Format Prefix),其值为001。
⦁    TLA:顶级聚合标识符(Top Level Aggregator),有13个比特位,其二进制值为0 0000 0000 0010。
⦁    SLA:站点级聚合标识符(Site Level Aggregator)。
⦁    6to4地址可以表示为2002::/16,而一个6to4网络可以表示为2002:IPv4地址::/48。6to4地址的网络前缀长度为64bit,其中前48bit(2002: a.b.c.d)被分配给路由器上的IPv4地址决定了,用户不能改变,而后16位(SLA)是由用户自己定义的。
 
⦁    一个IPv4地址只能用于一个6to4隧道的源地址,如果一个边界路由器连接了多个6to4网络使用同样的IPv4地址做为隧道的源地址,则使用6to地址中的SLA ID来区分,但他们共用一个隧道。
 
⦁    普通IPv6网络需要与6to4网络通过IPv4网络互通,这可以通过6to4中继路由器方式实现。所谓6to4中继,就是通过6to4隧道转发的IPv6报文的目的地址不是6to4地址,但转发的下一跳是6to4地址,该下一跳为路由器我们称之为6to4中继。隧道的IPv4目的地址依然从下一跳的6to4地址中获得。
⦁    如果6to4网络2中的主机要与IPv6网络互通,在其边界路由器上配置路由指向的下一跳为6to4中继路由器的6to4地址,中继路由器的6to4地址是与中继路由器的6to4隧道的源地址相匹配的。6to4网络2中去往普通IPv6网络的报文都会按照路由表指示的下一跳发送到6to4中继路由器。6to4中继路由器再将此报文转发到纯IPv6网络中去。当报文返回时,6to4中继路由器根据返回报文的目的地址(为6to4地址)进行IPv4报文头封装,数据就能够顺利到达6to4网络中了。
 
⦁    ISATAP(Intra-Site Automatic Tunnel Addressing Protocol)是另外一种自动隧道技术。ISATAP隧道同样使用了内嵌IPv4地址的特殊IPv6地址形式,只是和6to4不同的是,6to4是使用IPv4地址做为网络前缀,而ISATAP用IPv4地址做为接口标识。
⦁    地址描述
⦁    如果IPv4地址是全局唯一的,则u位为1,否则u位为0。g位是IEEE 群体/个体标志。由于ISATAP是通过接口标识来表现的,所以,ISATAP地址有全局单播地址、链路本地地址、ULA地址、组播地址等形式。ISATAP地址的前64位是通过向ISATAP路由器发送请求来得到的,它可以进行地址自动配置。在ISATAP隧道的两端设备之间可以运行ND协议。ISATAP隧道将IPv4网络看作一个非广播的点到多点的链路(NBMA)。
⦁    转发过程描述:
⦁    在IPv4网络内部有两个双栈主机PC2和PC3,它们分别有一个私网IPv4地址。要使其具有ISATAP功能,需要进行如下操作:
⦁    首先配置ISATAP隧道接口,这时会根据IPv4地址生成ISATAP类型的接口ID。
⦁    根据接口ID生成一个ISATAP链路本地IPv6地址,生成链路本地地址以后,主机就有了在本地链路上进行IPv6通信的能力。
⦁    进行自动配置,主机获得IPv6全球单播地址、ULA地址等。
⦁    当主机与其它IPv6主机进行通讯时,从隧道接口转发,将从报文的下一跳IPv6地址中取出IPv4地址作为IPv4封装的目的地址。如果目的主机在本站点内,则下一跳就是目的主机本身,如果目的主机不在本站点内,则下一跳为ISATAP路由器的地址。
 
⦁    当IPv4网络的节点需要直接与IPv6网络的节点进行通信时,默认情况下当然是行不通的,因为两个协议栈无法兼容。但是借助一台设备,由该设备来实现IPv6与IPv4的互转,那么上述通信需求就可以实现了。
 
⦁    案例描述:
⦁    IPv6和IPv4所需地址已经给出。
 
⦁    设置对GRE报文头进行校验是一个可选的操作步骤。如果设置了对GRE报文头进行校验,则发送端根据GRE报文头和净荷信息计算校验和,然后将包含校验和的报文转发到对端。接收端收到报文后,计算接收报文的校验和,并将该校验和与报文中的校验和进行比较。如果结果一致,那么它将会继续处理此报文,否则将其丢弃。如果本端配置了校验和,但是对端没有配置校验和,那么本端不会对接收的报文进行校验和验证。
⦁    设置GRE报文头的关键字也是一个可选的操作步骤。如果设置了GRE报文头中的KEY字段,接收端将会检查接收的GRE报文头的关键字,如果与本端配置的关键字完全相同,表明验证成功,接受该报文,否则丢弃该报文。
 
⦁    命令含义:
⦁    interface tunnel命令用来创建一个Tunnel接口,并进入该Tunnel接口视图。
⦁    tunnel-protocol gre指定Tunnel为手动隧道模式。
⦁    source { ipv4-address | interface-type interface-number }指定Tunnel的源接口。
⦁    destination { ipv4-address }指定Tunnel的目的接口。
⦁    ipv6 address { ipv6-address prefix-length }设置Tunnel接口的IPv6地址。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值