IPv6: Unicast 单播地址的组成与分类

作者: lesca 分类: FAQ,IPv6,Tutorials 发布时间: 2012-06-06 15:18

一、Unicast地址的组成

Unicast地址译为“单播地址”,可以理解为“点对点”的网络通信,Wikipedia中是这样解释的“每次只有两个实体相互通信,发送端和接收端都是唯一确定的”。一个Unicast地址通常代表一个网络接口(网卡)。单播地址由前缀(Prefix)和Interface ID组成,如下图:

Unicast address
|            64 bits            |             64 bits            |
+-------------------------------+--------------------------------+
|             Prefix            |          Interface ID          |
+-------------------------------+--------------------------------+

前缀决定了不同类型的单播地址,主要有五种类型:

这些类型的地址在Interface ID确定的情况下就被唯一确定,对应地,它们唯一确定一个网络接口或者主机(但是有时候可以让几块网卡得到相同的IPv6地址)。

二、自动获取Interface ID的方法

1.根据网卡的MAC地址生成Interface ID

Windows XP, Windows Server 2003及大多数Linux发行版都采用这种方式生成Interface ID。Lesca将详细介绍这种方法。
大家知道MAC地址共48位,前24位表示厂商代号,后24位为网卡编号。要转成IPv6 Interface ID,首先将这两个24位断开,插入0xFF, 0xFE两个字节,这样也就转成EUI-64地址,然后将EUI-64地址的第7bit换成1(具体步骤请参看下图)。这是因为由于在标准的IEEE 802网卡中,如果该位为0,则表示该地址受IEEE管辖。

EUI-64 Interface ID from MAC address
        |           24 bits          |           24 bits          |
        +----------------------------+----------------------------+
 Mac    |   Organization Unique ID   |        NIC Specific        |
        +----------------------------+----------------------------+
 Mac    | xxxxxx00 xxxxxxxx xxxxxxxx | xxxxxxxx xxxxxxxx xxxxxxxx |
        +----------------------------+----------------------------+
        /                            /\                            \
       /                            /  \                            \
      /                            /    \                            \
     /                            /      \                            \
    /                            /        \                            \
   /                            /          \                            \
  /                            /            \                            \
 /                            /              \                            \
/                            /                \                            \
|                            |    0xFF 0xFE    |                            |
+----------------------------+-----------------+----------------------------+
|          24 bits           |     16 bits     |           24 bits          |
+----------------------------+-----------------+----------------------------+
| xxxxxx00 xxxxxxxx xxxxxxxx |11111111 11111110| xxxxxxxx xxxxxxxx xxxxxxxx |
+-------|--------------------+-----------------+----------------------------+
        ↓ (bit7 to 1)
| xxxxxx10 xxxxxxxx xxxxxxxx |11111111 11111110| xxxxxxxx xxxxxxxx xxxxxxxx |
+----------------------------+-----------------+----------------------------+

例如,假设有一网卡MAC地址为00-15-C5-52-CA-9E,现将其转换成Interface ID:

Example: EUI-64 Interface ID from MAC address
         |           24 bits          |           24 bits          |
         +----------------------------+----------------------------+
 Mac     |   Organization Unique ID   |        NIC Specific        |
         +----------------------------+----------------------------+
 Mac     | 00000000 00010101 11000101 | 01010010 11001010 10011110 |
         +----------------------------+----------------------------+
         /                            /\                            \
        /                            /  \                            \
       /                            /    \                            \
      /                            /      \                            \
     /                            /        \                            \
    /                            /          \                            \
   /                            /            \                            \
  /                            /              \                            \
 /                            /                \                            \
|                            |    0xFF 0xFE    |                            |
+----------------------------+-----------------+----------------------------+
|          24 bits           |     16 bits     |           24 bits          |
+----------------------------+-----------------+----------------------------+
| 00000000 00010101 11000101 |11111111 11111110| 01010010 11001010 10011110 |
+-------|--------------------+-----------------+----------------------------+
        ↓ (bit7 to 1)
| 00000010 00010101 11000101 |11111111 11111110| 01010010 11001010 10011110 |
+----------------------------+-----------------+----------------------------+

IPv6 Interface ID Hex String: 0215:C5FF:FE52:CA9E

容易发现,和原MAC地址相比,中间两字节是0xFF, 0xFE

2.随机生成Interface ID

出于安全考虑,Windows Vista及之后的Windows系统都默认采用随机生成方式产生Interface ID,而不是用EUI-64,你可以通过以下命令禁用随机数生成Interface ID:

netsh interface ipv6 set global randomizeidentifiers=disabled

你还可以通过以下命令查看当前系统是以何方式生成的:

netsh interface ipv6 show global

由于Global unicast地址、Link-local地址、Site-local地址以及Unique-local地址这四种类型的IPv6地址由Interface ID决定地址的唯一性,我们将首先讨论这三类IPv6地址:

三、Unicast地址(单播地址)的分类

1.Global unicast地址(全局单点广播地址)

Global unicast address
|       48 bits         |  16 bits  |          64 bits           |
+---+-------------------+-----------+----------------------------+
| 3 |     45 bits       |  16 bits  |          64 bits           |
+---+-------------------+-----------+----------------------------+
|001| Global Routing ID | Subnet ID |        Interface ID        |
+---+-------------------+-----------+----------------------------+
  • Global unicast地址相当于IPv4的Public IP
  • Global unicast地址可以接入Internet,并可以被路由
  • Global unicast地址具有4个字段:
    • 001:Global unicast地址的前缀(2000::/3)
    • Global Routing ID:站点(Site)路由前缀(相当于IPv4的Network ID),站点可以是一个网络公司
    • Subnet ID:表示站点内的子网,最多可以有2^16=65536个子网
    • Interface ID:表示子网内的网络接口(相当于IPv4的Host ID)
Link local address
|  10 bits   |     54 bits      |             64 bits            |
+------------+------------------+--------------------------------+
|1111 1110 10|   000 ... 000    |          Interface ID          |
+------------+------------------+--------------------------------+
  • 拥有Link-local地址的节点可以与同一链路(link)上的相邻节点通信
  • Link-local地址以FE80开头,前缀为FE80::/64
  • Link-local地址只能在本地链路使用,不能在子网间路由
  • IPv6协议下,每个网络接口都需要分配一个Link-local地址,即使该接口已经分配了可路由的IPv6地址

3.Site-local地址(FEC0::/10)【已弃用】

2004年9月的RFC 3879已经不建议在新建的IPv6网络中使用Site-local地址,但是现有的IPv6环境仍可继续使用。Site-local由Unique-local地址取代,见下一节。

Site local address
|  10 bits   | 38  bits |  16 bits  |           64 bits          |
+------------+----------+-----------+----------------------------+
|1111 1110 11| 00 .. 00 | Subnet ID |        Interface ID        |
+------------+----------+-----------+----------------------------+

  • Link-local地址以FEC0开头,前缀为FEC0::/10
  • Site-local地址(相当于IPv4的Private IP)
  • Site-local地址用于与同一站点内的其他节点进行通信
  • IPv6路由器根据Subnet ID判断如何处理数据包
  • 含有Site-local地址的数据包不能在站点间路由,仅能在子网间路由
  • Site-local地址必须由DHCPv6服务器进行配置

4. Unique-local地址(FC00::/7)

2005年10月,RFC 4193发布,保留地址块fc00::/7用作IPv6专用网络(Private Network),并定义其为unique local addresses(唯一区域地址, ULA)。fc00::/7被划分为两个/8组:

  • fc00::/8 – 尚未定义
  • fd00::/8
  • Unique local address: fd00::/8 group
    |  8  bits  |   40 bits   |  16 bits  |         64 bits          |
    +-----------+-------------+-----------+--------------------------+
    | 1111 1101 | Random bits | Subnet ID |       Interface ID       |
    +-----------+-------------+-----------+--------------------------+
    |  48-bit routing prefix  |   65536   |
    
    • 地址格式 fd00::/8
    • 特点:随机生成40位随机二进制,与fd00::/8组合成fd??:????:????::/48

5.特殊地址(Special IPv6 Address)

在Unicast单播框架下,有以下两个特殊地址:

  • 未分配地址(Unspecified address)
    • 地址格式 ::或者0:0:0:0:0:0:0:0
    • 特点:Interface ID全为0
  • 环回地址(Loopback Address)
    • 地址格式 ::1或者0:0:0:0:0:0:0:1
    • 特点:Interface ID为1

另外,还有一些特殊地址是不在Unicast范围中的,如:

在此指出这些地址,希望读者能够事先区分,以免混淆!

6.兼容地址(Compatibility Address)

为了从IPv4时代向IPv6时代过渡,产生了很多IPv6向IPv4网络兼容的过渡地址。这些地址也符合Unicast的特性,即可以确定唯一网卡或主机。这会在Lesca博客中的另一篇探讨:请参看《IPv6兼容地址》一文。

References:

[1] 戴友炜,Windows Server 2008 R2安装于管理,清华大学出版社
[2] Link-local address
[3] IPv6(English Version)
[4] IPv6(中文版)
[5] Unicast
[6] Unique local address

版权声明

本文出自 Lesca 技术宅,转载时请注明出处及相应链接。

本文永久链接: https://www.lesca.cn/archives/ipv6-unicast-address.html

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!