关键词:IPv6 Dual-Stack Tunnel NAT-PT
摘 要:本文档在全面分析IPv6基本技术的基础上,阐述了H3C的IPv6解决方案。
缩略语清单:
缩略语 | 英文全名 | 中文解释 |
ND | Neighbour Discovery Protocol | 邻居发现协议 |
PMTU | Path Maximum Transmission Unit | 路径最大传输单元 |
ISATAP | Intra-Site Automatic Tunnel Addressing Protocol | 域内自动隧道寻址协议 |
NAT-PT | Network Address Translation-Protocol Translation | 网络地址转换-协议转换 |
6PE | IPv6 Provider Edge | IPv6 供应商边缘路由器技术 |
RIPng | Route Information Protocol Next Generation | 下一代RIP协议 |
OSPFv3 | Open Short Path First Prtocol Version 3 | 开放最短路径优先协议版本3 |
BGP4+ | Boarder Gateway Protocol 4+ | 边界网关协议版本4+ |
MLD | Multicast Listener Discovery | 组播侦听协议 |
PIM-SM | Protocol Indepent Multicast-Sparse Mode | 协议无关组播-稀疏模式 |
PIM-DM | Protocol Indepent Multicast-Dense Mode | 协议无关组播-密集模式 |
EGP | Exterior Gateway Protocol | 外部网关协议 |
IGP | Interior Gateway Protocol | 内部网关协议 |
|
|
|
从1992年标准创立至今,IPv6的标准体系已经基本完善,推动了IPv6从实验室走向实际网络。对于IPv6的研究已经从理论层面转向了IPv6应用的探索当中,从而进一步促进了IPv6技术的发展。
IPv6是IPv4的未来替代协议。
IPv4协议是目前广泛部署的因特网协议,从1981年最初定义(RFC791)到现在已经有20多年的时间。IPv4协议简单、易于实现、互操作性好,IPv4网络规模也从最初的单个网络扩展为全球范围的众多网络。
然而,随着因特网的迅猛发展,IPv4设计的不足也日益明显,主要有以下几点:
? IPv4地址空间不足
IPv4地址采用32比特标识,理论上能够提供的地址数量是43亿。但由于地址分配的原因,实际可使用的数量不到43亿。另外,IPv4地址的分配也很不均衡:美国占全球地址空间的一半左右,而欧洲则相对匮乏;亚太地区则更加匮乏(有些国家分配的地址还不到256个)。随着因特网发展,IPv4地址空间不足问题日益严重。
? 骨干路由器维护的路由表表项数量过大
由于IPv4发展初期的分配规划的问题,造成许多IPv4地址块分配不连续,不能有效聚合路由。针对这一问题,采用CIDR以及回收并再分配IPv4地址,有效抑制了全球IPv4 BGP路由表的线性增长。但目前全球IPv4 BGP路由表仍在不断增长,已经达到17万多条,经过CIDR聚合以后的BGP也将近10万条。日益庞大的路由表耗用内存较多,对设备成本和转发效率都有一定的影响,这一问题促使设备制造商不断升级其路由器产品,提高其路由寻址和转发的性能。
? 不易进行自动配置和重新编址
由于IPv4地址只有32比特,地址分配也不均衡,经常在需要在网络扩容或重新部署时,需要重新分配IP地址,因此需要能够进行自动配置和重新编址以减少维护工作量。
? 不能解决日益突出的安全问题
随着因特网的发展,安全问题越来越突出。IPv4协议制定时并没有仔细针对安全性进行设计,因此固有的框架结构并不能支持端到端安全。因此,安全问题也是促使新的IP协议出现的一到动因。
针对IPv4地址短缺问题,也出现了多种解决方案。比较有代表性的是CIDR和NAT。
? CIDR
CIDR是无类域间路由的简称。IPv4设计之初是层次化的结构,分为A类(掩码长度为8)、B类(掩码长度为16)、C类地址(掩码长度为24),地址利用效率不高。CIDR支持任意长度的地址掩码,使ISP能够按需分配地址空间,提高了地址空间利用率。
CIDR的出现大大缓解了地址紧张问题,但由于各种网络设备、主机的不断出现,对IP地址的需求也越来越多,CIDR还是无法解决IPv4地址空间过小问题(32比特)。
? NAT
NAT也是针对IPv4地址短缺问题提出的一种解决方案。其基本原理是在网络内部使用私有地址,在NAT设备处完成私有地址和外部公有地址的翻译,达到减少公有地址使用的目的。
NAT也是一种广泛部署的地址短缺问题解决方案。但NAT有以下缺点:
? NAT破坏的IP的端到端模型
如果没有NAT,则使用IPv4只需要连接的端点负责维护连接,下层不需要处理任何连接,整个网络模型清晰、简洁。使用NAT则NAT设备需要关心每条连接的状态,增加了网络复杂性。
? NAT存在单点失效问题
NAT必须进行地址和端口翻译、保存连接状态,当NAT设备失效或NAT设备附近链路失效时,由于NAT中维护了状态,因此很难进行快速重路由,降低了网络的可靠性。
? 非NAT友好应用支持问题
对于非NAT友好的应用,仅仅进行地址和端口号转换是不够的。这些应用中所有和地址或端口号或安全关联等相关的数据都必须进行 NAT转换才能正常运行。因此每当新出现这样的应用时都需要升级NAT设备。
? 不支持端到端的安全
NAT需要对IP报文头进行修改,有时甚至需要修改应用相关数据。端到端安全中IP头的完整性通过加密函保证,报文的发出者负责保护报文头的完整性,在接收端检查收到报文的完整性,在转发过程中任何对报文头的修改都会破坏完整性检查。因此在部署NAT的情况下无法支持端到端的安全。
? 网络扩容或重新部署困难
不同的网络有可能使用相同的私有地址空间,如192.168.0.1/24,则当这些网络合并或连在一起时,就会出现地址空间冲突。这时就需要重新编址或使用二次NAT来解决问题,但这些解决方案增加了网络管理的复杂性。
? NAT不能解决所有地址短缺问题
NAT采用内部私有地址和外部地址(或端口)进行映射的方法解决地址短缺问题,但这种解决方法只有在内部地址和外部地址比例很大时才能有效节约地址。不过许多服务器部署在内部网络种,同一协议使用的外部地址不能复用与同一端口。内部地址和外部地址的比率大的时候才能体现出NAT的有效性。然而,许多服务器部署在内部网络中时,同一协议使用NAT外部地址不能复用在同一端口上。例如:两个使用相同端口(如HTTP)的内部服务器。
从上可见,推动IPv6发展的主要问题是IPv4地址空间即将耗尽。IPv6也提供了一些新的特性和和改善措施:
? 设计回归简洁、透明,提高实现效率,减少复杂性
? 为新出现的无线业务提供支持
? 重新引入端到端安全和QoS
? 128位地址结构,提供充足的地址空间
近乎无限的IP地址空间是部署IPv6网络最大的优势。和IPv4相比,IPv6的地址比特数是IPv4的4倍(从32位扩充到128位)。128位地址可包含约43亿×43亿×43亿×43亿个地址节点,足已满足任何可预计的地址空间分配(IPv4理论上能够提供的上限是43亿个,而IPv6理论上地址空间的上限是43亿×43亿×43亿×43亿个)。

? 层次化的网络结构,提高了路由效率
IPv6地址长度为128位,可提供远大于IPv4的地址空间和网络前缀,因此可以方便地进行网络的层次化部署。同一组织机构在其网络中可以只使用一个前缀。对于ISP,则可获得更大的地址空间。这样ISP可以把所有客户聚合形成一个前缀并发布出去。分层聚合使全局路由表项数量很少,转发效率更高。另外,由于地址空间巨大,同一客户使用多个ISP接入时可以同时使用不同的前缀,这样不会对全局路由表的聚合造成影响。
? IPv6报文头简洁、灵活,效率更高,易于扩展

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

? 支持自动配置,即插即用
IPv6协议内置支持通过地址自动配置方式使主机自动发现网络并获取IPv6地址,大大提高了内部网络的可管理性。使用自动配置,用户设备(如移动电话、无线设备)可以即插即用而无需手工配置或使用专用服务器(如DHCP Server)。本地链路上的路由器在路由器通告报文中发送网络相关信息(如本地链路的前缀、缺省路由等),主机收到后会根据本地接口自身的接口标识符组合成主机地址,从而完成自动配置。
? 支持端到端的安全
IPv4中也支持IP层安全特性(IPSec),但只是通过选项支持,实际部署中多数节点都不支持。IPSec是IPv6协议基本定义中的一部分,任何部署的节点都必须能够支持。
因此,在IPv6中支持端到端的安全要容易的多。IPv6中支持为I P 定义的安全目标:保密性(只有预期接收者能读数据)、完整性(数据在传输过程中没有被篡改)、验证性(发送数据的实体和所宣称的实体完全一致)。
? 支持移动特性
IPv6协议规定必须支持移动特性,任何IPv6节点都可以使用移动IP移动功能。和移动IPv4相比,移动IPv6使用邻居发现功能可直接实现外地网络的发现并得到转交地址,而不必使用外地代理。同时,利用路由扩展头和目的地址扩展头移动节点和对等节点之间可以直接通信,解决了移动IPv4的三角路由、源地址过滤问题,移动通信处理效率更高且对应用层透明。
? 新增流标签功能,更利于支持QoS
IPv6报文头中新增了流标签域,源节点可以使用这个域标识特定的数据流。转发路由器和目的节点都可根据此标签域进行特殊处理,如视频会议和VOIP等数据流。

Version:
4比特。值为6表示IPv6报文。
Traffic Class:
8比特。类似于IPv4中的TOS域。
Flow Label:
20比特。IPv6中新增。流标签可用来标记特定流的报文,以便在网络层区分不同的报文。转发路径上的路由器可以根据流标签来区分流并进行处理。由于流标签在IPv6报文头中携带,转发路由器可以不必根据报文内容来识别不同的流,目的节点也同样可以根据流标签识别流,同时由于流标签在报文头中,因此使用IPSec后仍然可以根据流标签进行QoS处理。
Payload Length:
16比特。以字节为单位的IPv6载荷长度,也就是IPv6报文基本头以后部分的长度(包括所有扩展头部分)。
Next Header:
8比特。用来标识当前头(基本头或扩展头)后下一个头的类型。此域内定义的类型与IPv4中的协议域值相同。IPv6定义的扩展头由基本头或扩展头中的扩展头域链接成一条链。这一机制下处理扩展头更高效,转发路由器只处理必须处理的选项头,提高了转发效率。
Hop Limit:
8比特。和IPv4中的TTL字段类似。每个转发此报文的节点把此域减1,如果此域值减到0则丢弃。
Source Address:
128比特。报文的源地址。
Destination Address:
128比特。报文的目的地址。

IPv6选项字段是通过形成链式结构的扩展头支持的。IPv6基本头后面可以有0到多个扩展头。
IPv6扩展头排列顺序如下:
逐跳选项头(Hop-by-Hop Options Header)
值为0(在IPv6基本头中定义)。用于路由告警(RSVP和MLDv1)与Jumbo帧。此扩展头被转发路径所有节点处理。
目的选项头(Destination Options Header)
值为60。只可能出现在两个位置:
? 路由头前
这时此选项头被目的节点和路由头中指定的节点处理。
? 上层头前(任何ESP选项后)
此时只能被目的节点处理。Mobile IPv6中使用了目的选项头。
路由头(Routing Header)
值为43。用于源路由选项和Mobile IPv6。
分片头(Fragment Header)
值为44。此选项头在源节点发送的报文超过Path MTU(源和目的之间传输路径的MTU)时对报文分片时使用。
验证头(Authentication Header)
值为51。用于IPSec,提供报文验证、完整性检查。定义和IPv4中相同。
封装安全载荷头(ESP Header)
值为50。用于IPSec,提供报文验证、完整性检查和加密。定义和IPv4中相同。
目的选项头(Destination Options Header)
值为60。只可能出现在两个位置:
? 路由头前
这时此选项头被目的节点和路由头中指定的节点处理。
? 上层头前(任何ESP选项后)
此时只能被目的节点处理。Mobile IPv6中使用了目的选项头。
上层头(Upper-layer Header)
上层协议头,如TCP/UDP/ICMP等。
目的选项头最多出现两次(一次在路由头前,一次在上层协议头前),其它选项头最多出现一次。
但IPv6节点必须能够处理选项头(逐跳选项头除外,它固定只能紧随基本头之后)的任意出现位置和任意出现次数,以保证互通性。

ICMPv6功能与ICMPv4类似。ICMPv6用于IPv6节点报告报文处理过程中发生的错误以及完成其它层的功能,例如诊断功能(ICMPv6 “ping”)。ICMPv6是IPv6的一部分,每个IPv6节点都必须实现。
ICMPv6报文主要分两类:
? 差错报文
? 目的地不可达报文
? 报文长度超大报文(用于路径MTU发现协议)
? 传输超时报文(相当于IPv4 TTL等于0时触发的ICMP报文)
? 报文参数错误报文
? 信息报文
? 回显请求报文
? 回显应答报文
1. IPv6地址表示
IPv6地址包括128比特,由使用由冒号分隔的16比特的十六进制数表示。16比特的十六进制数对大小写不敏感。如:FEDC:BA98:7654:3210:FEDC:BA98:7654:3210。
另外,对于中间比特连续为0的情况,还提供了简易表示方法。例如:
1080:0:0:0:8:800:200C:417A 等价于1080::8:800:200C:417A
FF01:0:0:0:0:0:0:101 等价于FF01::101
0:0:0:0:0:0:0:1 等价于::1
0:0:0:0:0:0:0:0 等价于::
2. IPv6地址前缀表示
和IPv4类似,IPv6的子网前缀和一条链路关联。多个子网前缀可分配给同一链路。IPv6地址前缀表示如下:
ipv6-address/prefix-length
其中:
ipv6-address
16进制表示的128比特地址
prefix-length
10进制表示的地址前缀长度
RFC2373中定义了多种IPv6地址类型:
Allocation Prefix Fraction of
(binary) Address Space
----------------------------------- --------- -------------
Reserved 0000 0000 1/256
Unassigned 0000 0001 1/256
Reserved for NSAP Allocation 0000 001 1/128
Reserved for IPX Allocation 0000 010 1/128
Unassigned 0000 011 1/128
Unassigned 0000 1 1/32
Unassigned 0001 1/16
Aggregatable Global Unicast Addresses 001 1/8
Unassigned 010 1/8
Unassigned 011 1/8
Unassigned 100 1/8
Unassigned 101 1/8
Unassigned 110 1/8
Unassigned 1110 1/16
Unassigned 1111 0 1/32
Unassigned 1111 10 1/64
Unassigned 1111 110 1/128
Unassigned 1111 1110 0 1/512
Link-Local Unicast Addresses 1111 1110 10 1/1024
Site-Local Unicast Addresses 1111 1110 11 1/1024
Multicast Addresses 1111 1111 1/256
注:
1、“未指定的地址”(全0)、环回地址(::1)和嵌入IPv4地址的IPv6地址从0000 0000格式前缀中分配。
2、除组播地址(格式前缀1111 1111)外,格式前缀从001到111的地址都必须有64比特的EUI-64格式的接口标识符。
IPv6地址分为单播地址、任播地址、组播地址。和IPv4相比,取消了广播地址类型,以更丰富的组播地址代替,同时增加了任播地址类型。
1. IPv6单播地址(Unicast Address)
IPv6单播地址标识了一个接口,由于每个接口属于一个节点,因此每个节点的任何接口上的单播地址都可以标识这个节点。发往发往单播地址的报文,由此地址标识的接口接收。每个接口上至少要有一个链路本地单播地址,另外还可分配任何类型(单播、任播和组播)或范围的IPv6地址。
所有格式前缀不是组播格式前缀(1111 1111)的IPv6地址都是IPv6单播格式(任播和IPv6单播格式相同)。IPv6单播地址和IPv4单播地址一样可聚合。目前定义了多种IPv6单播地址格式,包括可聚合全球单播地址、NSAP地址、IPX层次地址、站点本地地址、链路本地地址和具有IPv4能力的主机地址。目前广泛使用的是可聚合全球单播地址、站点本地地址和链路本地地址。

IPv6单播地址由子网前缀和接口ID两部分组成。
2. IPv6任播地址(Anycast Address)
IPv6任播地址格式和IPv6单播地址相同,用来标识一组接口的地址。一般这些接口属于不同的节点。发往任播地址的报文被送到这组接口中与其最近的接口(由使用的路由协议判断哪个是最近的)。
IPv6任播地址的用途之一是用来标识属于同一提供因特网服务的组织的一组路由器。这些地址可在IPv6路由头中作为中间地址,以使报文能够通过特定聚合或聚合顺序发送。另一个用途就是标识特定子网的一组路由器。
其中有些任播地址是已经定义好的:
? 子网路由器任播地址

子网路由器器任播地址中“subnet prefix”域用来标识特定链路。发送到子网路由器任播地址的报文会被送到子网中的一个路由器。所有路由器都必须支持子网任播地址
子网路由器任播地址用于节点需要和远端子网上所有路由器中的一个(不关心具体是哪一个)通信时使用。例如,一个移动节点需要和它的“家乡”子网上的所有移动代理中的一个进行通信。
3. IPv6组播地址(Multicast Address)
? IPv6组播地址格式定义
IPv6组播地址用来标识一组接口,一般这些接口属于不同的节点。一个节点可能属于0到多个组播组。发往组播地址的报文被组播地址标识的所有接口接收。
注意:IPv6组播中不使用Hop Limit域(相当于IPv4的TTL)

其中:
11111111
8比特。标识此地址为组播地址
flags
4比特。flag域中定义如下:
![]()
目前只使用了最后一位:
T = 0表示是Internet地址分配机构永久分配的“熟知”组播地址
T = 1表示是临时使用的组播地址
该字段的前3比特标记为保留域,必须被初始化为0
scope
4比特。用来标记此组播组的应用范围。可能的值有:
0 reserved
1 node-local scope
2 link-local scope
3 (unassigned)
4 (unassigned)
5 site-local scope
6 (unassigned)
7 (unassigned)
8 organization-local scope
9 (unassigned)
A (unassigned)
B (unassigned)
C (unassigned)
D (unassigned)
E global scope
F reserved
group ID
标识组播组(可能是永久的,也可能是临时的,范围由scope定义)
? IPv6永久分配的组播地址
目前的永久分配的“熟知”组播组如下:
2 保留的组播地址:
FF00:0:0:0:0:0:0:0
FF01:0:0:0:0:0:0:0
FF02:0:0:0:0:0:0:0
FF03:0:0:0:0:0:0:0
FF04:0:0:0:0:0:0:0
FF05:0:0:0:0:0:0:0
FF06:0:0:0:0:0:0:0
FF07:0:0:0:0:0:0:0
FF08:0:0:0:0:0:0:0
FF09:0:0:0:0:0:0:0
FF0A:0:0:0:0:0:0:0
FF0B:0:0:0:0:0:0:0
FF0C:0:0:0:0:0:0:0
FF0D:0:0:0:0:0:0:0
FF0E:0:0:0:0:0:0:0
FF0F:0:0:0:0:0:0:0
2 所有节点的地址
FF01:0:0:0:0:0:0:1 (节点本地)
FF02:0:0:0:0:0:0:1 (链路本地)
2 所有路由器地址
FF01:0:0:0:0:0:0:2 (节点本地)
FF02:0:0:0:0:0:0:2 (链路本地)
FF05:0:0:0:0:0:0:2 (站点本地)
2 被请求节点的地址
FF02:0:0:0:0:1:FFXX:XXXX
上述地址由被请求节点的单播或任播地址形成:取被请求节点单播或任播地址的低24比特,在前面增加前缀FF02:0:0:0:0:1:FF00::/104构成。
例如,和IPv6地址4037::01:800:200E:8C6C 对应的被请求节点组播地址是FF02::1:FF0E:8C6C。
4. 嵌入IPv4地址的IPv6