了解 EUI-64

网络工程 IPv6 MAC地址 IP地址 奥西
2022-02-08 12:52:58

我在读福鲁赞的书它说如下:

在 IPv4 寻址中,hostid(在 IP 级别)和链路层地址(在数据链路层)之间没有特定的关系,因为链路层地址通常比 hostid 长得多。IPv6 寻址允许这种关系。长度小于 64 位的链路层地址可以作为接口标识符的全部或部分嵌入,省去了映射过程。为此可以考虑两种常见的链路层寻址方案:IEEE 定义的 64 位扩展唯一标识符 (EUI-64) 和以太网定义的 48 位链路层地址。

映射 EUI-64
要映射一个 64 位的物理地址,需要将这种格式的 global/local 位从 0 改为 1(local to global)来定义一个接口地址,如下图所示: 在此处输入图像描述

映射以太网 MAC 地址
我们需要将本地/全局位更改为 1 并插入额外的 16 位。额外的 16 位定义为 15 个 1 后跟 1 个零,即 FFFE16。 在此处输入图像描述

我有些疑惑:

  1. MAC 地址由制造商分配。现在制造商是否也分配 EUI-64 地址?(我有这个疑问,因为我ipconfig -all在 PC 上运行时从未遇到过 64 位物理地址。我错过了吗?)

  2. 如果对 1 的回答是否定的,那么 EUI-64 是否只是合乎逻辑的并且总是从 48 位 MAC 地址产生?

  3. 然而,对第一个疑问的回答不应该是“否”,因为否则给出第一个图表给出的第一个映射是没有意义的。

1个回答
  1. MAC 地址由制造商分配。现在制造商是否也分配 EUI-64 地址?

IEEE 协议使用 MAC 寻址。一些 IEEE 协议使用 48 位 MAC 地址(MAC-48 或 EUI-48),一些使用 64 位 MAC 地址(EUI-64)。

  1. 如果对 1 的回答是否定的,那么 EUI-64 是否只是合乎逻辑的并且总是从 48 位 MAC 地址产生?

对于某些协议,1 的答案实际上是肯定的。

  1. 然而,第一个疑问的答案不应该是“否”,因为否则给出第一个图给出的第一个映射是没有意义的

你混淆了一些东西,那本书已经过时了。最初的 IPv6 SLAAC 使用 MAC 寻址或其他唯一主机标识符来创建 64 位 IPv6 IID,称为修改后的EUI-64 格式接口标识符。大多数操作系统不再这样做,而是使用带有隐私扩展的随机寻址。大多数 IPv6 网络将是/64,这意味着 IID 将是 64 位,并且大多数 IEEE 协议使用 48 位 MAC 地址,因此原始 SLAAC 需要将 48 位 MAC 地址转换为 64 位 IID 的标准方法。

创建修改后的 EUI-64 格式接口标识符的规范在RFC 4291,IP 版本 6 寻址体系结构,附录 A:创建修改的 EUI-64 格式接口标识符中进行了详细说明。请注意,它涵盖了 48 位和 64 位 MAC 地址,以及其他可能不使用 MAC 寻址的协议:

附录 A:创建修改后的 EUI-64 格式接口标识符

根据特定链路或节点的特性,有多种方法可用于创建修改后的 EUI-64 格式接口标识符。本附录描述了其中一些方法。

带有 IEEE EUI-64 标识符的链接或节点

将 IEEE EUI-64 标识符转换为接口标识符所需的唯一更改是反转“u”(通用/本地)位。一个示例是全球唯一的 IEEE EUI-64 标识符,其形式为:

|0              1|1              3|3              4|4              6|
|0              5|6              1|2              7|8              3|
+----------------+----------------+----------------+----------------+
|cccccc0gcccccccc|ccccccccmmmmmmmm|mmmmmmmmmmmmmmmm|mmmmmmmmmmmmmmmm|
+----------------+----------------+----------------+----------------+

其中“c”是分配的 company_id 的位,“0”是表示通用范围的通用/本地位的值,“g”是单个/组位,“m”是制造商选择的位扩展标识符。IPv6 接口标识符将采用以下形式:

|0              1|1              3|3              4|4              6|
|0              5|6              1|2              7|8              3|
+----------------+----------------+----------------+----------------+
|cccccc1gcccccccc|ccccccccmmmmmmmm|mmmmmmmmmmmmmmmm|mmmmmmmmmmmmmmmm|
+----------------+----------------+----------------+----------------+

唯一的变化是反转通用/本地位的值。

具有 IEEE 802 48 位 MAC 的链路或节点

[EUI64] 定义了一种从 IEEE 48 位 MAC 标识符创建 IEEE EUI-64 标识符的方法。这是在 48 位 MAC 中间(company_id 和供应商提供的 id 之间)插入两个八位字节,十六进制值为 0xFF 和 0xFE(参见附录末尾的注释)。一个示例是具有全局范围的 48 位 IEEE MAC:

|0              1|1              3|3              4|
|0              5|6              1|2              7|
+----------------+----------------+----------------+
|cccccc0gcccccccc|ccccccccmmmmmmmm|mmmmmmmmmmmmmmmm|
+----------------+----------------+----------------+

其中“c”是分配的 company_id 的位,“0”是表示全局范围的通用/本地位的值,“g”是单个/组位,“m”是制造商选择的位扩展标识符。接口标识符将采用以下形式:

|0              1|1              3|3              4|4              6|
|0              5|6              1|2              7|8              3|
+----------------+----------------+----------------+----------------+
|cccccc1gcccccccc|cccccccc11111111|11111110mmmmmmmm|mmmmmmmmmmmmmmmm|
+----------------+----------------+----------------+----------------+

当 IEEE 802 48 位 MAC 地址可用(在接口或节点上)时,由于它们的可用性和唯一性属性,实现可以使用它们来创建接口标识符。

与其他类型标识符的链接

除了 IEEE EUI-64 或 IEEE 802 48 位 MAC,还有许多类型的链路具有链路层接口标识符。示例包括 LocalTalk 和 Arcnet。创建Modified EUI-64 格式标识符的方法是取链路标识符(例如LocalTalk 8 位节点标识符)并将其填零到左边。例如,十六进制值为 0x4F 的 LocalTalk 8 位节点标识符会产生以下接口标识符:

|0              1|1              3|3              4|4              6|
|0              5|6              1|2              7|8              3|
+----------------+----------------+----------------+----------------+
|0000000000000000|0000000000000000|0000000000000000|0000000001001111|
+----------------+----------------+----------------+----------------+

请注意,这会导致通用/本地位设置为“0”以指示本地范围。

没有标识符的链接

有许多链接没有任何类型的内置标识符。其中最常见的是串行链路和配置的隧道。必须选择在子网前缀中唯一的接口标识符。

当链路上没有可用的内置标识符时,首选方法是使用来自另一个接口或分配给节点本身的通用接口标识符。使用这种方法时,将同一节点连接到同一子网前缀的任何其他接口都不能使用相同的标识符。

如果链接上没有可用的通用接口标识符,则实现需要创建一个本地范围的接口标识符。唯一的要求是它在子网前缀中是唯一的。有许多可能的方法来选择子网前缀唯一的接口标识符。其中包括:

  Manual Configuration  
  Node Serial Number  
  Other Node-Specific Token  

子网前缀唯一接口标识符的生成方式应使其在重新启动节点或从节点添加或删除接口后不会更改。

适当算法的选择取决于链接和实现。形成接口标识符的细节在适当的“IPv6 over”规范中定义。强烈建议将碰撞检测算法实现为任何自动算法的一部分。

注意:[EUI-64] 实际上将 0xFF 和 0xFF 定义为要插入的位,以从 IEEE MAC-48 标识符创建 IEEE EUI-64 标识符。以 IEEE EUI-48 标识符开头时使用 0xFF 和 0xFE 值。由于对 IEEE MAC-48 和 EUI-48 标识符之间的差异的误解,在规范的早期版本中使用了不正确的值。

本文档有意继续使用 0xFF 和 0xFE,因为它满足 IPv6 接口标识符的要求(即它们在链路上必须是唯一的),IEEE EUI-48 和 MAC-48 标识符在语法上是等效的,并且它不在实践中不会引起任何问题。