IPv6学习笔记——RFC4291

IPv6 地址结构
 
1、简介
本标准定义了 IPv6 协议的寻址结构。包括各种类型 IPv6 (单播、任播和多播)地址的基本格式。
 
2、IPv6 地址
IPv6 地址是接口和接口组的 128 bit标识符。
有三种地址类型:
单播地址:是单一接口的标识符。发送到单播地址的分组被交付给由该地址标识的接口。
任播地址:一组接口(典型属于不同节点)的标识符。发送到任播地址的分组被交付给由该地址标识的一组接口之一(“最近的”一个,按照路由协议的测量距离)。
多播地址:一组接口的标识符(典型属于不同节点)。发送到多播地址的分组被交付给由该地址标识的所有接口。
IPv6 不使用广播地址,广播地址的功能由多播地址代替。
 
本文中,地址中的字段被给予了特定的名称,例如“子网(subnet)”。当这样的名称在前,表示标识符的术语“ID”紧随其后一起使用(例如,子网 ID(subnet ID))时,二者的组合指该名称字段的内容。当这样的名称与术语“前缀(prefix)”一起使用(例如,子网前缀(subnet prefix))时,二者的组合指从左边开始直到包括这个字段在内的全部地址。
在 IPv6 中,对于任何字段,全 0 和全 1 是合法的,除非特殊规定。更准确地说,前缀可以包括 0 值字段,或前缀可以以 0 值字段结束。
 
2.1、寻址模式
  所有类型 IPv6 地址都是分配给接口的,不是分配给节点的。IPv6 单播地址指单一接口。由于每个接口都属于单一节点,任何节点的接口单播地址都可以用作该节点的标识符。
要求所有接口至少有一个链路本地单播地址(参阅第 2-8 节,额外需要的地址)。单个接口也可以有多个任何类型(单播、任播和多播),或任何范围的 IPv6 地址。不用作任何 IPv6 分组(该分组是发送到或来自于非邻居)的源或目的地的接口,不需要范围大于链路范围的单播地址。这在某些情况对点对点接口较为方便。此寻址模式有一个例外:
  如果实现中将此多个物理接口当作在网络层上出现的一个接口,一个单播地址或一组单播地址可以分配给多个物理接口。这样做有利于多个物理接口上的负载均衡。
  目前,在子网前缀与一条链路关联上,IPv6 继承了 IPv4 模式。多个子网前缀可以分配给同一链路。
 
2.2、地址的文本表示
有三种将 IPv6 地址表示为文本串的约定格式:
1、优先选用格式为 x:x:x:x:x:x:x:x,这里“x”是地址的 8 个 16 位地址片中每个 16 位片的 1到 4 个 16 进制数字。例如:
ABCD:EF01:2345:6789:ABCD:EF01:2345:6789
2001:DB8:0:0:8:800:200C:417A
注意,可以不写单个字段中开始的 0,但是每个字段中至少要有 1 个数字(除了下面 2、中介绍的情况以外。)。
2、由于需要分配特定类型 IPv6 地址,地址中会包括长 0 位串。为简化包含长 0 位地址的书写,采用特殊句法压缩 0 的个数。即用“::”表示 1 个或多个 0 值 16 位组。“::”在地址中仅可以出现一次。“::”也用于压缩地址中开始位置和结束位置的多个 0。
例如,下述地址
2001:DB8:0:0:8:800:200C:417 单播地址
FF01:0:0:0:0:0:0:101 多播地址
0:0:0:0:0:0:0:1 环回地址
0:0:0:0:0:0:0:0 未指定地址
可以表示为:
2001:DB8::8:800:200C:417 单播地址
FF01::101 多播地址
::1 环回地址
:: 未指定地址
3、在混用 IPv4 节点和 IPv6 节点环境,一种替代地址格式有时更为方便,这种地址格式是x:x:x:x:x:x:d.d.d.d。这里“x”是地址的 6 个高阶 16 位地址片的 16 进制值,“d”是地址的4 个低阶 8 位地址片的 10 进制值(标准的 IPv4 地址表示)。例如:
0:0:0:0:0:0:13.1.68.3
0:0:0:0:0:FFFF:129.144.52.38
或压缩形式:
::13.1.68.3
::FFFF:129.144.52.38

  

2.3、地址前缀的文本表示
IPv6 地址前缀的文本表示类似采用无分类域间路由(Classless Inter-Domain Routing,CIDR)斜线表示法[CIDR]书写的 IPv4 地址前缀。IPv6 地址前缀表示为:
ipv6 地址/前缀长度
这里
ipv6 地址 是用第 2.2 节列出的任何一种符号表示法表示的 IPv6 地址。
前缀长度 是十进制值,规定地址中最左边多少个连续位构成前缀。
例如,下述是 60 比特前缀 20010DB80000CD3(16 进制)的合法表示:
2001:0DB8:0000:CD30:0000:0000:0000:0000/60
2001:0DB8::CD30:0:0:0:0/60
2001:0DB8:0:CD30::/60
下述不是上述前缀的合法表示:
2001:0DB8:0:CD3/60   在任何 16 比特地址块中,可以抛弃起始的 0,但是不能抛弃尾部的 0。
2001:0DB8::CD30/60   “/”左边的地址扩展为2001:0DB8:0000:0000:0000:0000:0000:CD30
2001:0DB8::CD3/60   “/”左边的地址扩展为2001:0DB8:0000:0000:0000:0000:0000:0CD3
当书写节点地址和该节点地址的前缀(例如,节点的子网前缀)时,二者合并写法如下:
节点地址 2001:0DB8:0:CD30:123:4567:89AB:CDEF
和它的子网号 2001:0DB8:0:CD30::/60
二者能够缩写为 2001:0DB8:0:CD30:123:4567:89AB:CDEF/60
 
2.4、地址类型标识
IPv6 地址类型由地址的高阶位标识,即:
地址类型  二进制前缀      IPv6 符号表示法  所在章节
未指定   00...0 (128 bits)   ::/128     第 2.5.2 节
环回    00...1 (128 bits)   ::1/128    第 2.5.3 节
多播    11111111        FF00::/8     第 2.7 节
链路本地单播 1111111010     FE80::/64     第 2.5.6 节
全球单播 (别的每一种)
  任播地址取自(具有任何范围的)单播地址空间,在句法上任播地址与单播地址难以区分。全球单播地址一般格式如第 2.5.4 节所述。一些特定目的全球单播地址子类型,包含了嵌入的 IPv4 地址(出于 IPv4-IPv6 互操作目的),在第 2.5.5 节介绍。
  出于其他考虑,将来的标准可以为全球单播空间重新定义细分的一种或多种子空间,但是,除非出现这种重新定义和直到这种重新定义发生,实现中必须把没有以上述列出的任何一种前缀开始的所有地址,当作是全球单播地址。

2.5、单播地址
IPv6 单播地址是与任意比特长度的前缀聚合在一起的,类似 IPv4 的无分类域间路由(CIDR)地址。
在 IPv6 中有几类单播地址:全球单播、站点本地单播(已过时,参阅第 2-5-7 节)和链路本地单播。全球单播还有一些特定目的子类型,例如带有嵌入 IPv4 地址的 IPv6 地址。将来可以定义新增的地址类型或子类型。
IPv6 节点可能非常了解,也可能很少了解 IPv6地址内部结构,取决于节点担当的角色(例如,主机还是路由器)。最简单情况,节点或许认为单播地址(包括它自己的)没有内部结构,仅是图 1 所示的 128 位地址。
node address    ——128bit
图 1 节点眼中的最简单单播地址结构
稍微完善些的主机(仍然相当简单)或许多少意识到它附着的链路的子网前缀,在子网前缀中不同的地址有不同的 n 值(子网前缀比特值。译者),参见图 2。
子网前缀(subnet prefix)     ——n bits
接口ID(interface ID)    ——128-n bits
图2 稍微完善些主机眼中的单播地址格式
虽然非常简单的路由器或许不知道 IPv6 单播地址内部结构,通常情况下路由器有一种或多种路由协议运行分层边界知识。这些已知边界因路由器的不同而不同,取决于该路由器在路由等级结构中的位置。除了上一段讨论的子网边界知识以外,节点不会对 IPv6 地址结构做任何假设。
 
2.5.1 接口标识符
  IPv6 单播地址中的接口标识符(interface ID)用于标识链路上的接口。子网中接口标识符应该是唯一的。建议同一接口标识符不分配给链路上的不同节点。在更宽范围上接口标识符或许也是唯一的。有些情况,接口的标识符直接来源于该接口的链路层地址。同一接口标识符可用在单一节点的多个接口上,只要它们附着到不同子网。
  注意,接口标识符的唯一性独立于 IPv6 地址的唯一性。例如,全球单播地址可以用本地范围接口标识符生成,链路本地地址可以用全球范围接口标识符生成。
  对于所有单播地址,除了以二进制值 000 开始的以外,要求接口 IDs 为 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 个字节如图 3 所示。
cccc ccug cccc cccc cccc cccc
图3 二进制形式IEEE EUI-64标识符的前3个字节格式
图 3 中用互联网标准比特顺序书写。“u”是 universal/local 位,“g”是 individual/group 位,“c”是公司 ID 位。附录 A“生成改进的 EUI-64 格式接口标识符”,举例说明了任何生成基于改进的 EUI-64 格式接口标识符。
形成接口标识符时插入“u”比特是为了便于系统管理者,使其在不能得到硬件标记时,也能配置非全球标识符。例如,针对串联链路和隧道端点情况。对这些情况的替代方案或许是 0200:0:0:1,0200:0:0:2 格式等,代替更简单的 0:0:0:1,0:0:0:2 等。
不要求 IPv6 节点证实由改进的 EUI-64 标记(该标记的“u”比特设置为全球范围)生成的接口标识符是唯一的。
在改进的 EUI-64 格式标识符中使用 universal/local 比特将引起新技术研发,这些新技术能够利用具有全球范围的接口标识符。
形成接口标识符的细节在相应的“相关链路的 IPv6”规范中定义,例如“以太网上的IPv6” [ETHER],和“FDDI 上的 IPv6” [FDDI]。
 
2.5.2 未指定地址
地址 0:0:0:0:0:0:0:0 称作未指定地址。它必须不分配给任何节点。它表示没有这个地址。
使用未指定地址的例子如:正在初始化的主机还没有学习到它自己的地址之前,它发送的任何 IPv6 分组中 Source Address 字段的内容。
未指定地址必须不用作 IPv6 分组的目的地地址,也必须不在 IPv6 的 Routing 首部中使用。IPv6 路由器必须不转发含未指定的源地址的 IPv6 分组。
 
2.5.3 环回地址
单播地址 0:0:0:0:0:0:0:1 称为环回地址。节点用其发送返回到自己的 IPv6 分组。它必须不分配给任何物理接口。它被看作属于链路本地范围,可以被当作是虚拟接口(典型称作“环回接口”)的链路本地单播地址,该虚拟接口通向一个假想的链路,该链路和谁也不连通。
环回地址必须不用作 IPv6 分组(这些分组是从单个节点发送到该节点外面的)中的源地址。以环回地址为目的地地址的 IPv6 分组决不能发送到单一节点以外,并且决不能经由 IPv6路由器转发。接口收到目的地为环回地址的分组必须将其抛弃。
 
2.5.4 全球单播地址
IPv6 全球单播地址一般格式如图 4 所示。
全球路由前缀(global routing prefix)    ——n bits
接口ID(interface ID)        ——m bits
子网ID(subnet ID)     ——128-n-m bits
图4 全球单播地址一般格式
图 4 中,全球路由前缀是一个(典型等级结构)值,该值分配给站点(一群子网/链路),子网 ID是该站点内链路的标识符,接口 ID 如第 2.5.1 节定义。
除了以二进制 000 开始的全球单播地址外,所有全球单播地址有一个 64 位的接口 ID字段(即,n + m = 64),格式如第 2.5.1 节所述。以二进制 000 开始的全球单播地址,在大小上或接口 ID 字段结构上没有这类限制。
以二进制 000 开始的全球单播地址的例子是具有嵌入的 IPv4 地址的 IPv6 地址,如第2.5.5 节所述。使用除了 000 外的二进制值开始的全球地址的例子(因此有一个 64 比特接口ID 字段)参阅[GLOBAL]。
 
2.5.5 带有嵌入的 IPv4 地址的 IPv6 地址
定义了两类携带 IPv4 地址的 IPv6 地址,它们均在地址的低阶 32 比特中携带 IPv4 地址。
它们是“IPv4 兼容的 IPv6 地址”和“IPv4 映射的 IPv6 地址”。
 
2.5.6 链路本地 IPv6 单播地址
fe80::/64

 

2.5.7 站点本地 IPv6 单播地址(已废除)

 
2.6、 任播地址
IPv6 任播地址分配给多于一个接口(典型属于不同节点)。任播地址具有这样的性质:发送到任播地址的分组,被按照路由协议的测量距离,路由到有该任播地址的“最近的”接口。
任播地址是根据单播地址空间分配的,使用任何已定义的单播地址格式。因此,任播地址在句法上不能与单播地址相互区别。于是,当单播地址分配给多于一个接口时,该单播地址转化为任播地址。分得该地址的节点必须被显示配置,以便知道该地址是任播地址。
 
2.7、多播地址
 
ff00::/8

预定义的多播地址:

1)所有节点地址:
FF01:0:0:0:0:0:0:1
FF02:0:0:0:0:0:0:1
上述多播地址标识范围 1(接口本地)或范围 2(链路本地)内的所有 IPv6 节点组。
 
2)所有路由器地址:
FF01:0:0:0:0:0:0:2
FF02:0:0:0:0:0:0:2
上述多播地址标识范围1(接口本地)、范围 2(链路本地)内的所有 IPv6路由器组。
 
3)Solicited-Node 地址:
FF02:0:0:0:0:1:FFXX:XXXX
Solicited-Node 多播地址(被请求的节点多播地址)是作为节点的单播地址和任播地址的函数,通告计算得出的。
Solicited-Node 多播地址按如下方法形成:
取地址(单播或任播)的低阶 24 位,把这些位挂到前缀 FF02:0:0:0:0:1:FF00::/104 上,产生从
FF02:0:0:0:0:1:FF00:0000
FF02:0:0:0:0:1:FFFF:FFFF
范围内的多播地址。
 
posted @ 2019-05-22 16:53  懒懒的小猪  阅读(866)  评论(0编辑  收藏  举报