11.2 过渡机制
为了与IPv4设施共存并最终过渡到纯IPv6设施,IPv6过渡标准规定了下列机制:
- 同时使用IPv4和IPv6;
- IPv6-over-IPv4隧道;
- DNS设施;
- IPv6和IPv4之间的流量转换(请参见本章的“流量转换”部分)。
11.2.1 同时使用IPv4和IPv6
在路由设施从纯IPv4过渡到IPv6/IPv4并最终过渡到纯IPv6的这个过程中,无论使用IPv4还是使用IPv6节点必须都能够到达目的。例如,在过渡中,某些服务器中的服务在未来可以使用IPv6可达。然而,对于未升级成同时支持IPv4和IPv6的服务,目前只能使用IPv4到达。所以,主机必须能够同时使用IPv4和IPv6。要在同一节点上同时使用IPv4和IPv6互联网层,这个IPv6/IPv4节点必须包含如下体系结构:
- 双IP层体系;
- 双栈体系。
- 双IP层体系
双IP层体系同时包含IPv4和IPv6的互联网层,但传输层协议(如TCP和UDP)的使用则是单一的。图11-1所示为双IP层体系。
运行Windows Server 2012、Windows Server 2008 R2、Windows Server 2008、Windows 8、Windows 7和Windows Vista的双IP层体系的TCP/IP协议栈中同时包含IPv4和IPv6,如图11-1所示。Tcpip.sys这个Windows驱动程序包含了IPv4和IPv6的实现。运行Windows的节点能创建出下列类型的数据包。
- IPv4包。
- IPv6包。
- IPv6-over-IPv4包(以上这些是用IPv4头部封装了的IPv6包。如需进一步了解相关内容,请参阅本章的“IPv6-over-IPv4隧道”一节)。
图11-2所示为使用了双IP层体系的数据包的类型。
Windows Server 2012、Windows Server 2008 R2、Windows Server 2008、Windows 8、Windows 7和Windows Vista支持双栈套接字(能处理IPv6和IPv4流量),这样双IP层体系就简化了应用程序的开发。而对于Windows Server 2003和Windows XP,支持IPv6的应用程序必须开启两个不同的套接字,一个用于IPv4,另一个用于IPv6。
双栈体系
双栈体系同时包含IPv4和IPv6的互联网层,但是它们处于不同的协议栈中,这些协议栈可以分别实现传输层协议(如TCP和UDP)。图11-3所示为双栈体系。
Windows Server 2003和Windows XP具有双栈体系。IPv4协议驱动文件tcpip.sys包含了IPv4、TCP和UDP(在其他协议中)。IPv6协议驱动文件tcpip6.sys则包含了IPv6和分别实现的TCP和UDP。在安装了IPv4和IPv6协议栈后,运行Windows Server 2003或Windows XP的主机便能够创建出下列类型的数据包:
- IPv4数据包;
- IPv6数据包;
- IPv6-over-IPv4数据包。
图11-4所示为双栈体系的包类型。
https://yqfile.alicdn.com/de745eb6f85380f34550b318a3b83994b717d30e.png" >
尽管Windows Server 2003和Windows XP的IPv6协议不是双IP层的,但它的作用和双IP层的一样,都实现了IPv6的过渡功能。
11.2.2 IPv6-over-IPv4隧道
IPv6-over-IPv4隧道是指使用IPv4头部来封装IPv6数据包,使IPv6数据包能够在纯IPv4架构中传送。在IPv4头部中字段的设置如下。
- IPv4协议字段设置为41,表示其中封装了IPv6数据包。
- 源和目的字段设置为IPv6-over-IPv4隧道端点的IPv4地址。本地隧道端点是分配给发送方的IPv4地址。远程隧道端点是分配给目的路由器或中间路由器的IPv4地址。隧道端点是作为隧道接口的一部分手动配置上的,或者是基于目的IPv6地址的下一跳地址和隧道接口自动生成的。
- 图11-5所示为IPv6穿越IPv4的隧道。
隧道IPv6流量存在如下问题。
- 执行数据包过滤的防火墙和路由器必须经过配置,使它们可以接收和转发IPv4协议41流量。否则,设备就会丢弃这类流量。丢弃IPv4协议41流量对于IPv4内联网边缘路由器来说也许正是期望的结果,这可以避免隧道IPv6流量离开内联网。
- 大部分NAT只能转换TCP或UDP流量,或者必须安装NAT编辑器以处理其他IPv4协议的转换。因为“IPv4协议41转换”并不是NAT的常见功能,因此以IPv4封装的IPv6流量无法流过一般的NAT。
对于IPv6而言,IPv6-over-IPv4的隧道只不过是另一种链路层封装,将只支持IPv4的架构当作链路层,并用类似以太网段的方式处理。因此,整个只支持IPv4的架构可被当作单个逻辑IPv6子网来处理,并且IPv6-over-IPv4的隧道在源和目的之间的路径上充当了一跳。
对于IPv6-over-IPv4的隧道,目的IPv6路径最大传输单元(PMTU)通常比目的的IPv4的PMTU小20。但是,如果没有为每个隧道保存IPv4 PMTU,那么IPv4数据包在中间IPv4路由器中就有可能需要进行拆分。在这种情况下,IPv6-over-IPv4的隧道数据包在发送时必须将IPv4头部中的不可拆分(Don't Fragment[DF])标记设置为0。
注释
IPv6-over-IPv4隧道描述的只是一种使用IPv4头部的IPv6数据包封装,它的作用是让数据包能够穿越支持IPv4的架构。因此,它不同于点对点隧道协议(PPTP)和二层隧道协议(L2TP)虚拟专用网络(VPN)协议的隧道,并不存在用于隧道安装、维护或终止的隧道维护协议。
抓包软件捕获的信息
下面是封装了IPv4头部的ICMPv6 Echo请求消息的路由消息。
Frame:
+ Ethernet: Etype = Internet IP (IPv4)
- Ipv4: Next Protocol = IPv6 over IPv4, Packet ID = 65372,
Total IP Length = 100
+ Versions: IPv4, Internet Protocol; Header Length = 20
+ DifferentiatedServicesField: DSCP: 0, ECN: 0
TotalLength: 100 (0x64)
Identification: 65372 (0xFF5C)
+ FragmentFlags: 0 (0x0)
TimeToLive: 128 (0x80)
NextProtocol: IPv6 over IPv4, 41 (0x29)
Checksum: 60987 (0xEE3B)
SourceAddress: 157.54.138.19
DestinationAddress: 157.60.136.82
- Ipv6: Next Protocol = ICMPv6, Payload Length = 40
+ Versions: IPv6, Internet Protocol, DSCP 0
PayloadLength: 40 (0x28)
NextProtocol: ICMPv6, 58(0x3a)
HopLimit: 128 (0x80)
SourceAddress: FE80:0:0:0:0:5EFE:9D36:8A13
DestinationAddress: FE80:0:0:0:0:5EFE:9D3C:8852
+ Icmpv6: Echo request, ID = 0x0, Seq = 0x11
注意,IPv4头部的协议字段表示了这是IPv6数据包。在这个例子中,IPv6数据包通过链路本地ISATAP地址寻址,使ICMPv6回送请求消息通过隧道穿越只支持IPv4的基础结构。
11.2.3 DNS架构
由于当前人们往往使用域名而不是非地址来调用网络资源,因此实现成功的共存需要借助DNS架构。对于IPv6而言,由于绝大多数计算机用户并不熟悉IPv6地址的格式,它的长度也十分不便于日常使用,因此将域名解析成IPv6地址是非常必要的。为IPv6升级DNS架构,包括向DNS服务器中添加用于执行从域名到IPv6地址解析的AAAA记录和用于执行IPv6地址到域名解析的PTR记录。在主机通过DNS域名查询获得了一组地址后,它必须选择使用哪对源目的地址来进行通信。
地址记录
为了将完全限定域名(FQDN)成功解析为地址,DNS架构中必须包括如下资源记录(手工添加或动态配置皆可):
- 纯IPv4节点和IPv6/IPv4节点的A记录;
- 纯IPv6节点和IPv6/IPv4节点的AAAA记录。
指针记录
为了将地址成功解析为FQDN,DNS架构必须包括如下资源记录(手工添加或动态配置皆可):
- 纯IPv4节点和IPv6/IPv4节点的IN-ADDR.ARPA域中的PTR记录;
- 纯IPv6节点和IPv6/IPv4节点的IP6.ARPA域中的PTR记录。
地址选择规则
IPv6主机可以分配多个IPv6地址,也可以从DNS名称查询中获取到多个IPv6地址。基于这两组地址,IPv6主机必须判断出每个可能的目的地址所使用的最佳源地址,并得出一个按优先级顺序的目的地址列表。这就是定义在RFC 3484中的源和目的地址选择的目的。
默认地址选择规则是通过前缀策略表来确定的,对于Windows中的IPv6协议而言,这个表可以通过Windows PowerShell中的命令Get-NetPrefixPolicy(仅适用于Windows Server 2012和Windows 8)或netsh interface ipv6 show prefixpolicies 命令来进行查看。可以使用netsh interface ipv6 add|set|delete prefixpolicy命令以修改前缀策略表中的条目。