一、RFC4291 IPv6寻址结构
本标准定义了IPv6协议的寻址结构。包括各种类型IPv6(单播、任播和多播)地址的基本格式。
二、RFC4862 IPV6地址自动配置
一、IPV6地址自动配置
自动配置处理包括利用无状态地址自动配置生成链路本地地址,生成全球地址,以及启动验证链路上地址唯一性的重复地址检测(Duplicate Address Detection)程序。
无状态机制允许主机,使用本地可获得信息和路由器通告信息的组合,生成它自己的地址。路由器通告前缀,前缀标识与链路关联的子网,而主机生成“接口标识符”,接口标识符唯一标识子网上的接口。组合二者形成地址。在没有路由器情况,主机仅能生成链路本地地址。然而,附着在相同链路上的节点间实现通信,链路本地地址足矣。
当站点不特别关切主机们使用的精确地址时使用无状态方法,只要这些地址是唯一的并且是可适当路由的。另一方面,当站点需要更严密控制精确地址分配时,使用DHCPv6[RFC-3315]。无状态地址自动配置和DHCPv6可以同时使用。
为确保给定链路上所有配置的地址基本上是唯一的,在地址被分配到接口前,节点在地址上运行“重复地址检测(Duplicate Address Detection)”算法。重复地址检测算法在所有地址上执行,独立于这些地址是经无状态自动配置获得,还是经DHCPv6获得。
本文件规定的自动配置处理方法仅适用主机,不适用路由器。因为主机自动配置使用由路由器通告的信息,配置路由器需要采用其他方法。然而,可以预期路由器将使用本文件描述的机制,生成链路本地地址。此外,盼望路由器在所有地址被分配到接口前,在所有地址上成功通过本文件描述的重复地址检测程序。
将接口标识符挂到熟知链路本地前缀上,形成链路本地地址[RFC-4291];然而,能够分配链路本地地址到接口并开始使用前,节点必须尝试验证链路上没有另一个节点已经在使用这个“临时”地址。如果节点判定它的临时链路本地地址不是唯一的,自动配置停止,接口需要手工配置。
一旦节点断定它的临时链路本地地址是唯一的,它分配该地址给接口。此时,节点与邻居节点有IP层(IP-level)连接。其余自动配置步骤仅由主机执行;路由器的(自动)配置超出本文件范围。自动配置下一个阶段涉及获得Router Advertisement或者判定没有路由器存在。如果存在路由器,路由器们将发送规定主机能够进行何种自动配置的Router Advertisements。注意,即使不存在路由器,仍然可以获得涉及地址配置的DHCPv6服务。
Router Advertisements也包括零个或多个PrefixInformation选项,这些选项包括生成全球地址的无状态地址自动配置使用的信息。
默认情况,出于安全考虑,所有地址在被分配到接口前,应当接受唯一性检验。对所有手工获得的,经无状态地址自动配置获得的,或经DHCPv6获得的地址,检验应当分别执行。
自动配置在每个有多播能力的接口上执行。对于多归属地主机,自动配置独立地在每个接口上执行。自动配置主要适用主机,有两个例外。期待路由器使用下面描述的程序生成链路本地地址。此外,路由器在所有地址上执行Duplicate Address Detection,在分配这些地址到接口前。
5-3链路本地地址生成
一旦开启接口,节点就形成链路本地地址。接口在下述任何事件之后可以变为开启状态:
-系统启动时接口被初始化。
-接口暂时出故障后或接口被系统管理临时关闭后接口被重新初始化。
-接口第一次附着到链路。包括由于无线网络访问点的改变导致动态改变节点所附着的链路。
-在被管理上关闭之后系统管理又开启接口。
链路本地地址由(适当长度的)熟知链路本地前缀(well-known link-local prefix)FE80::0[RFC-4291]和下述接口标识符的组合形成:
1、地址最左边那些“前缀长度”比特是链路本地前缀比特。
2、地址中到链路本地前缀右边的比特被设置为全0。
3、如果接口标识符长度为N比特,地址最右边N比特被接口标识符取代。
如果链路本地前缀长度加上N的和大于128,自动配置失败,需要手工配置。接口标识符的长度分别在特定链路类型文件中定义,它们也应当与地址架构[RFC-4291]一致。这些文件将仔细定义长度,因此链路本地地址能够在链路上自动配置。
链路本地地址有无限的优先生存期和合法生存期;它绝不会超时。
5.4唯一性检测
5.5全球地址
将接口标识符挂到适当长度前缀上即可生成全球地址。前缀从RouterAdvertisements包含的Prefix Information选项中获得的。
路由器通告,若没有收到路由器通告,认为该链路上不存在路由器。
二、IPv6地址架构
地址类型:单播(链路本地和全球单播)、多播和任意播,广播由多播代替
单播地址
链路本地地址和全球单播地址,其中,全球单播还拥有特定目的子类型,例如带有嵌入IPv4地址的IPv6地址。将来可以定义新增的地址类型或子类型。
1、未指定地址:0:0:0:0:0:0:0:0称作未指定地址。它必须不分配给任何节点。它表示没有这个地址。正在初始化的主机还没有学习到它自己的地址之前,它发送的任何IPv6分组中Source Address字段的内容。未指定地址必须不用作IPv6分组的目的地地址,也必须不在IPv6的Routing首部中使用。IPv6路由器必须不转发含未指定的源地址的IPv6分组。
2、环回地址:以环回地址为目的地地址的IPv6分组决不能发送到单一节点以外,并且决不能经由IPv6路由器转发。接口收到目的地为环回地址的分组必须将其抛弃。
3、全球单播地址
除了以二进制000开始的全球单播地址外,所有全球单播地址有一个64位的接口ID字段(即,n+m=64)。以二进制000开始的全球单播地址,在大小上或接口ID字段结构上没有这类限制。
以二进制000开始的全球单播地址的例子是具有嵌入的IPv4地址的IPv6地址:1、IPv4兼容的IPv6地址(已过时)2、IPv4映射的IPv6地址。
1、IPv4兼容的IPv6地址
2、IPv4映射的IPv6地址
4、链路本地单播地址
链路本地地址被设计用于在单一链路上寻址,在诸如自动地址配置、邻居发现,或者在
链路上没有路由器时使用。
路由器必须不转发任何具有链路本地源地址,或具有链路本地目的地地址的分组到其他
链路。
5、接口标识
对于所有单播地址,除了以二进制值000开始的以外,要求接口标示符为64比特长,由改进的EUI-64格式构建。
当源自全球标记时(例如,IEEE 802 48-bit MAC标识符或IEEE EUI-64标识符[EUI64]),基于改进的EUI-64格式的接口标识符可以有全球范围;当不能得到全球标记时(例如,串联链路,隧道端点)或者不希望使用全球标记时(例如,临时的私有标记[PRIV]),基于改进的EUI-64格式的接口标识符可以有本地范围。
当根据IEEE EUI-64标识符形成接口标识符时,通过插入“u”比特(universal/local比特,IEEE EUI-64术语),即可形成改进的EUI-64格式接口标识符。最终在改进的EUI-64格式,
“u”比特置1表示全球范围,“u”比特置0表示本地范围。二进制形式的IEEE EUI-64标识符的前3个字节如图所示。
“u”是universal/local位,“g”是individual/group位,“c”是公司ID位。形成接口标识符时插入“u”比特是为了便于系统管理者,使其在不能得到硬件标记时,也能配置非全球标识符。
1、采用 IEEE EUI-64 标识符的链路或节点
转换 IEEE EUI-64 标识符为接口标识符需要做的唯一改变是插入“u”(universal/local)位。下例是全球唯一 IEEE EUI-64 标识符格式。
全球唯一 IEEE EUI-64 标识符格式,“c”是分配的公司 ID 位,“0”是universal/local 位的值,指出全球范围,“g”是individual/group位,“m”是选定的制造商扩展标识符位。IPv6 接口标识符格式如图 13 所示。
IPv6 接口标识符格式,唯一的改变是插入 universal/local 位的值。
2、IEEE802的MAC转换为EUI-64
a、关于mac地址:
IEEE 802定义MAC地址为
|<---------24bit--------->|<---------24 bit--------->|
|ccccccug cccccccc cccccccc|xxxxxxxx xxxxxxxxxxxxxxx|
由ug控制mac地址类型:
u:0:由IEEE指定ID统一管理1:本地管理 g:0:单播1:多播
也就是12位MAC地址分为四类,由其中第二位决定第二位为
0|4|8|C:(00)统一管理的单播MAC
1|5|9|D:(01)统一管理的多播MAC
2|6|A|E:(10)本地管理的单播MAC
3|7|B|F:(11)本地管理的多播MAC
由于针对ADSL路由等这样的网络终端,一般使用的都是统一管理的单播MAC所以会判断02:10:18:01:00:01或者(11:01:18:00:00:30)为无效MAC,导致无线等功能失效,或者网络连接失败等现象。而对于00:25:5E:08:DE:43这样的MAC就被认为是有效的。
b、mac映射为EUI64
IPv6中接口标识部分也为64位,并非是为了在一个子网上支持2的64次方台主机,而是为了便于与48位的MAC地址进行映射,并为了方便今后与IEEE1394(FireWire火线)和EUI-64(未来局域网所使用的64位的MAC地址)进行映射做好准备。
[EUI64]定义一种方法,根据IEEE48-bit MAC标识符生成IEEE EUI-64标识符。具体做法是在48-bit MAC的中部(公司ID:前三个字节,即组织唯一标示符OUI:organizationally Unique Identifier,和供应商ID之间),插入两个字节,其16进制值分别是0xFF和0xFE。
“c”是分配的公司ID位,“0”是universal/local位的值,指出全球范围,“g”是individual/group位,“m”是选定的制造商扩展标识符位。
当可以得到IEEE 802 48-bit MAC地址时(在接口或节点上),基于MAC地址的可用性和唯一性特性,实现中可以使用MAC地址生成接口标识符。
【第一步】将48位的MAC地址从中间分开,插入一个固定数值FFFE(16进制)。
【第二步】将第7个比特位反转,如果原来是0就变为1,如果原来是1就变为0 。
【第三步】加上64位的网络前缀这就是一个完整的IPV6地址
【反转原因】
在MAC地址中,第7比特为1表示本地管理,为0表示全球管理。
在EUI-64格式中,第7位为1表示全球唯一,为0表示本地唯一。
(摘自xukai博客)
任意播地址
发送到任播地址的分组,被按照路由协议的测量距离,路由到有该任播地址的“最近的”接口。任播地址是根据单播地址空间分配的,使用任何已定义的单播地址格式。因此,任播地址在句法上不能与单播地址相互区别。于是,当单播地址分配给多于一个接口时,该单播地址转化为任播地址。
多播地址
1、预定义多播地址
所有节点地址:FF01:0:0:0:0:0:0:1 FF02:0:0:0:0:0:0:1
上述多播地址标识范围1(接口本地)或范围2(链路本地)内的所有IPv6节点组。
所有路由器地址:FF01:0:0:0:0:0:0:2 FF02:0:0:0:0:0:0:2 FF05:0:0:0:0:0:0:2
上述多播地址标识范围1(接口本地)、范围2(链路本地)或范围5(站点本地)内的所有IPv6路由器组。