TCP/IP|TCP/IP 详解(第二版) 笔记 / 2 互联网地址架构 / 2.3 基本的 IP 地址结构 / 2.3.6 IPv6 地址与接口标识符

目录
2.3.6 IPv6 地址与接口标识符
IPv6 的长度是 IPv4 的 4 倍,并且拥有一些特殊的结构
IPv6 地址使用的特殊前缀指明了地址的 scope
IPv6 地址的 scope 表示其可以被用在网络中的哪个部分
例如:

  • 节点本地(node-local
    只能在同一个计算机上通信时使用
  • 链路本地(link-local
    只能在同一个网络链路上的节点之间使用(或同一个 IPv6 前缀的地址之间)
  • 全局(global
    在整个互联网范围上可以使用
对于 IPv6,大多数节点都有超过一个的地址,通常在同一个网络接口上
虽然 IPv4 也支持这个特性,但通常不会使用
一个 IPv6 节点需要用到的地址还包括组播地址(见第 2.5.2 节),由 [RFC4291] 提出
另一个被称为站点本地(site-local)的 scope,使用前缀 fec0::/10
最初 IPv6 支持这个 scope,但后来 [RFC3879] 禁止了其在单播地址上的使用
主要的问题包括:如何处理可能在超过一个站点上重用的地址,以及对 “ 站点 ” 没有准确的定义
链路本地 IPv6 地址(以及一些全局 IPv6 地址)使用接口标识符(interface identifier (IID))作为单播 IPv6 地址的基础
除了以 000 开头的 IPv6 地址以外,其它情况下 IID 都位于地址的低位(即右边),在同一个网络前缀下,IID 必须是唯一的
IID 最初为 64 位,有两种构成方式:
  1. 由链路层网络接口的 MAC 地址经过修改的 EUI-64 格式(modified EUI-64 format) [EUI64] 格式化后得到
  2. 为了提供一定程度的私有性,防止地址追踪,使用随机值(见第 6 章)
在 IEEE 标准中,EUI 表示扩展的唯一标识符(extended unique identifier
EUI-64 标识符的前 24 位为组织唯一标识符(Organizationally Unique Identifier (OUI))
剩下的 40 位为组织分配的扩展标识符(extension identifier
OUI 由 IEEE 注册中心(IEEE registration authority)[IEEERA] 维护与分配
EUI 有 “ 统一管理(universally administered) ” 和 “ 本地管理(locally administered) ” 两种格式
在互联网中,这些地址通常是 “ 统一管理 ” 的变体
许多符合 IEEE 标准的网络接口(如:以太网)已经使用短格式(shorter-format)地址(48 位)许多年了
EUI-48 与 EUI-64 格式的最大不同就是它们的长度(见图 2-7)
TCP/IP|TCP/IP 详解(第二版) 笔记 / 2 互联网地址架构 / 2.3 基本的 IP 地址结构 / 2.3.6 IPv6 地址与接口标识符
文章图片

图 2-7
IEEE 定义的 EUI-48 与 EUI-64 格式
IPv6 要将它们用作接口标识符时,只需要对 u 位取反
OUI 长 24 位,占用 EUI-48 或 EUI-64 地址的前 3 个字节
其中,第一个字节的低 2 位分别是 u 位和 g 位
如果设置了 u 位,表示地址是本地管理的,如果设置了 g 位,表示地址代表一个组或一个组播地址
我们暂时只关心 g 位没有被设置的情况
一个 EUI-64 可以由一个 EUI-48 转化而来,具体的:
  1. 复制 EUI-48 前 24 位的 OUI 值到 EUI-64 地址
  2. 将 EUI-64 的第 4 和第 5 字节的值设置为 1111111111111110 (十六进制:FFFE)
  3. 将剩下的组织分配的位复制过去
如:EUI-48 的 00-11-22-33-44-55 可以转化为 EUI-64 的 00-11-22-FF-FE-33-44-55
这个映射过程是 IPv6 通过 EUI-48 构建接口标识符的第一步
IPv6 地址使用修改的 EUI-64 地址来构成 IID 的过程,就只是对 u 位求反
当接口没有制造商提供的 EUI-48 地址,但有其它的底层地址(如:AppleTalk)时
IPv6 会通过在这个底层地址的左侧填充 0 的方式来构建接口标识符
如果一个接口没有任何类型的底层标识符(如:隧道、串行链路)
那么在为它创建接口标识符时,可以由同一个节点上的(不在同一个子网中的)其它接口导出
或者从某些与接口所在节点相关的标识符中导出
只有在没有任何其它可选项的情况下,才应该使用人工分配的方式来指定接口标识符
2.3.6.1 例子 使用 Linux 的 ifconfig 命令,我们可以探究一个链路本地 IPv6 地址的形成:
Linux% ifconfig eth1 eth1Link encap:Ethernet HWaddr 00:30:48:2A:19:89 inet addr:12.46.129.28 Bcast:12.46.129.127 Mask:255.255.255.128 inet6 addr: fe80::230:48ff:fe2a:1989/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1359970341 errors:0 dropped:0 overruns:0 frame:0 TX packets:1472870787 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:4021555658 (3.7 GiB) TX bytes:3258456176 (3.0 GiB) Base address:0x3040 Memory:f8220000-f8240000

eth1 表示一个以太网的网络接口
我们可以看到如何将一个以太网的硬件地址 00:30:48:2A:19:89 映射为一个 IPv6 地址:
  1. 将 00:30:48:2A:19:89 转化为 EUI-64 的 00:30:48:ff:fe:2a:19:89
  2. 对 u 位求反得到 IID 值 02:30:48:ff:fe:2a:19:89
  3. 使用保留的链路本地前缀 fe80::/10(见第 2.5 节)得到链路本地 IPv6 地址 fe80::230:48ff:fe2a:1989
/64 表示划分子网/主机的位置,这里的 64 位是根据 [RFC4291] 的要求由 IDD 的长度得来的
另一个例子来自 Windows 系统的 IPv6
在这个例子中,展示了一个特殊的隧道端点(tunnel endpoint),用来携带 IPv6 流量通过只支持 IPv4 的网络:
c:\> ipconfig /all ... Tunnel adapter Automatic Tunneling Pseudo-Interface:Connection-specific DNS Suffix . : foo Description . . . . . . . . . . . : Automatic Tunneling Pseudo-Interface Physical Address. . . . . . . . . : 0A-99-8D-87 Dhcp Enabled. . . . . . . . . . . : No IP Address. . . . . . . . . . . . : fe80::5efe:10.153.141.135%2 Default Gateway . . . . . . . . . : DNS Servers . . . . . . . . . . . : fec0:0:0:ffff::1%2 fec0:0:0:ffff::2%2 fec0:0:0:ffff::3%2 NetBIOS over Tcpip. . . . . . . . : Disabled ...

在这个例子中,我们使用了一个特殊的隧道接口
应用了站内自动隧道寻址协议(Intra-Site Automatic Tunnel Addressing Protocol (ISATAP))[RFC5214]
所谓的物理地址,实际上是一个 IPv4 地址的十六进制编码:0A-99-8D-87 等于 10.153.141.135
这里的 OUI 是 00-00-5E,是分配给 IANA [IANA] 的组织唯一标识符
接口标识符的第 4 个字节为十六进制的 fe 表示当前接口标识符右侧为内嵌的 IPv4 地址
最后在前边加上标准的链路本地前缀 fe80::/10,得到 IPv6 地址:fe80::5efe:10.153.141.135
最后的 %2 在 Windows 中被称为 zone ID,表示当前计算机上的 IPv6 地址接口索引号
IPv6 地址通常由一个自动配置的进程创建,更多细节会在第 6 章中讨论
【TCP/IP|TCP/IP 详解(第二版) 笔记 / 2 互联网地址架构 / 2.3 基本的 IP 地址结构 / 2.3.6 IPv6 地址与接口标识符】目录

    推荐阅读