IPv6协议对IPv4做了诸多改进,最普及的改变就是地址数量的扩展,IP地址从IPv4的32位地址扩展到128位。
此外,IPv6改进了报文头部,IPv4的报文头部根据options不同,可以从20字节到60字节,不利于报文处理。IPv6简化了报文头部,固定为40字节长度,基本上只包含了两个16个字节的源和目的地址,余8字节存放其它信息。IPv4将options放在IPv4报文头部,而ipv6是放在扩展头部,跟在40字节的报头的后面。
IPv6附带的相关协议及RFC非常多,比如ICMPv6、DHCPv6、Stateless Address Autoconfiguration (SLAAC)机制、Layer 2对IPv6的支持、路由协议、QoS协议、安全协议、Mobile IPv6,以及各种IPv4向IPv6过渡的协议。
本文主要介绍IPv6地址的一些基础知识。
IPv6地址有128位(16字节),分为8个16位的字段,以冒号分隔。支持缩写,每个字段里的前置0可以省略,比如0ab3可以缩写为ab3。
地址中连续0可以用双冒号缩写,但是只能使用一次,因为它会被展开足够多的0来满足128位的要求,比如:2001:ab3:0:0:0:0:0:1 可以缩写为 2001:ab3::1。
与IPv4不同,对于IPv6的地址字段,全0或全1都是合法值。
地址类型和地址构成
IPv4有单播、广播和组播地址,IPv6不再使用广播地址,而是使用组播地址。IPv4已经使用的anycast地址类型可能继续在IPv6中使用。
目前IPv6地址分为下面几种类型:
- unicast 唯一标识一个IPv6 Interface。
- multicast 标识一组IPv6 Interfaces,发到multicast地址的报文会送到组内所有成员。
- anycast 标识多个Interface(一般是不同节点),发到anycast地址的报文只会发给其中一个interface,通常是最近的那个。
IPv6地址大体可分为Prefix和Host两部分,Prefix标记法沿用了IPv4的CIDR(但含义不同)。Prefix也称为Global Routing Prefix,用于地址路由。
IPv6支持地址域的概念,有全球和非全球域。IPv4使用私有地址段(如192/8,10/8,172/8等)来表示非全球域,IPv6则将地址域设计在框架里,每个IPv6地址(除未分配的地址)都有特定的域,地址域是作为地址的一部分被编码。
目前常见的Prefix如下,未列出的地址范围为保留的或未分配的(除几个特例):
2000::/3 | global unicast |
fe80::/10 | link-local unicast |
fc00::/7 | unique-local ipv6 address |
ff00::/8 | multicast |
IANA (Assigned Numbers Authority) 目前只分配001范围的地址(即global unicast),见http://www.iana.org/assignments/ipv6-address-space
有一些特殊分配的地址的Prefix为0x00,包括:未指定的地址、loopback地址、嵌入IPv4的IPv6地址。
全球唯一单播地址的高位为001。高位为ff的IPv6地址总是多播地址。
anycast地址使用单播地址范围,与global unicast地址范围相同,通过Prefix无法区分anycast和unicast。anycast地址用于提供冗余和负载均衡。
如果多个接口分配了同一个单播地址,就构成了anycast地址。需要配置接口让它们知道这是一个anycast地址。每个host都在路由表中有一项记录,发送方无法指定发送到哪个host,而是由路由协议决定。anycast不是为IPv6创造的,在IPv4就已经有rfc了。
NAT短期内缓解了地址不够的问题,但也带来了很多问题,例如端到端,IPSEC。NAT也造成了私有网络的地址重叠,在合并网络时产生问题。IPv6的地址扩展可以不再借助于NAT,从设计上也不再支持NAT。
全球单播地址
全球单播地址也即全球唯一的公网IP地址,它的地址定义如下:
n bits | 64 - n bits | 64 bits |
Global routing prefix | Subnet ID | Interface ID |
- Global routing prefix:明确分配给一个站点的地址范围,bit0-2为001。由国际注册机构和ISP分配,地址具有层级结构。
- Subnet ID: 一个站点内的link。
- Interface ID: Interface identifier,确定一个子网中的interface,在子网内唯一。子网总是64位,所以IPv6没有子网掩码的问题。
除了prefix为0b11111111的多播地址,001-111范围的prefix要求interface identifier为64位,遵循EUI-64格式,EUI-64是IEEE定义的唯一标识符。
处于IPv6环境的设备上电时,可以请求Network Prefix,它可以从路由器得到一个或多个prefix,根据prefix信息,设备可以自动配置一个或多个全球IP地址(根据自己的MAC地址或者私有的随机数)。而在IPv4环境,只能手工设置,或者通过DHCP服务。
基于IPv6的地址结构,可以选择两种类型的地址:
- 唯一稳定IP地址,通过手动配置、DHCP服务、使用EUI-64接口ID的无状态地址自动配置,或使用永久ID的其它地址类型。
- 临时短暂的IP地址,使用随机数,以均匀间隔改变。
SLAAC(Stateless Address Autoconfiguration)
设备通过IPv6的SLAAC机制自行设置地址(通过DHCPv6获取地址称为 Stateful Address Autoconfiguration)。
Interface在自动配置过程中遵循EUI-64格式。比如Interface使用自身MAC地址自动配置本地链路地址,64位Interface Identifier必须从48位的MAC地址创建:
- 将0xfffe插入到MAC地址的第三和第四字节
- Universal/Local位(bit1)取补
比如,48位的MAC地址 00:02:b3:1e:83:29 转换成EUI-64为 02:02:b3:ff:fe:1e:83:29。
Interface的link-local地址是前缀fe80::/64和64位Interface Identifier的组合,构成IPv6地址 fe80::202:b3ff:fe1e:8329。
可以登录Linux系统看看IPv6地址,都是这种规则生成的。
Link-local地址
在IPv4,组织内部常常使用私有地址范围,通过NAT连接Internet。IPv6分配了两个地址域(Scopes)用于link-local和site-local用途,由prefix标识。
link-local地址仅用于单个link,不能被路由,不需要global prefix,可用于无状态自动配置,用于近邻发现(neighbor discovery),无路由的网络,适合临时网络。
Link-local地址的前缀为fe80::/10,定义如下:
10 bits | 54 bits | 64 bits |
1111 1110 10 | 0 | Interface ID |
Site-local, Unique Local IPv6地址
site-local地址前缀为fec0::/10,由于很多潜在的问题出现,已经作废,取而代之的是Unique Local IPv6地址(ULA),简称Local IPv6地址。这些地址也是全局唯一的,但不能接入internet,它被设计为用于公司内部或有限的网络。类似于10.0.0.0/8的IPv4地址。
ULA地址的特征:
- 有全局唯一的prefix。
- 允许网络的私有联接,没有地址冲突的风险
- 独立于ISP
- 可用于无internet的内部通信
- 支持使用global unicast地址的应用
地址定义为:
Prefix 7 bits | 1 bit | 40 bits | 16 bits | 64 bits |
1111 110 | L | Global ID | Subnet ID | Interface ID |
L目前定义为1,因此也可以认为 prefix=fd00::/8
global id是随机生成的(rfc4193定义了pseudo-random global id algorithm,包含了时间,硬件标识和其它系统相关的数据)。用来确保ULA的唯一性,当合并ULA网络时不会产生冲突。
Link-local地址默认通过autoconfiguration分配,ULA需要通过配置路由器或者DHCPv6的local prefix来分配。
多播地址
多播地址的前缀是ff00::/8,定义:
8 bits | 4 bits | 4 bits | 112 bits |
1111 1111 | Flags: 0RPT | Scope | Group Identifier |
Flags标识位高位为0,其它各位分别表示:
- R: Rendezvous point embedded
- P:Multicast address based on network prefix
- T:Temporary multicast address
Scope用于限制多播地址的范围,有如下定义:
0 | 保留 |
1 | interface-local scope |
2 | link-local scope |
3 | 保留 |
4 | Admin-local scope |
5 | site-local scope |
6, 7 | 未分配 |
8 | Organizational-local scope |
9, A, B, C, D | 未分配 |
E | Global scope |
F | 保留 |
除interface-local,link-local,global之外的scope,必须由管理员定义和配置。已分配的多播地址见www.iana.org/assignments/ipv6-multicast-addresses
Anycast地址
anycast地址用于提供冗余和负载均衡。anycast不是为IPv6创造的,在IPv4就已经有RFC了。
IPv6的anycast地址与global unicast地址范围相同。每个host都在路由表中有一项记录,发送方无法指定发送到哪个host,而是由路由协议决定。
特殊地址
prefix为0000 0000的地址是保留的
未指定的地址:0:0:0:0:0:0:0:0称为全零地址,表示缺少有效地址,类似IPv4的0.0.0.0
环回地址:0:0:0:0:0:0:0:1(::1)
其它的特殊地址类型用于辅助向IPv6的迁移,这些虚拟接口也称为伪接口(Pseudo-interfaces)。这些特殊地址包括:IPv6内嵌IPv4地址、6to4地址、6rd地址、ISATAP地址、Teredo地址等等,大部分已经作废,这里就不展开了。
相关的工具
ipv6calc:地址转换工具。ipcalc也支持IPv6地址。
ping6:与ping同等。
ip6tables:用于IPv6的iptables工具。