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)
在整个互联网范围上可以使用
虽然 IPv4 也支持这个特性,但通常不会使用
一个 IPv6 节点需要用到的地址还包括组播地址(见第 2.5.2 节),由 [RFC4291] 提出
另一个被称为站点本地(site-local)的 scope,使用前缀 fec0::/10链路本地 IPv6 地址(以及一些全局 IPv6 地址)使用接口标识符(interface identifier (IID))作为单播 IPv6 地址的基础
最初 IPv6 支持这个 scope,但后来 [RFC3879] 禁止了其在单播地址上的使用
主要的问题包括:如何处理可能在超过一个站点上重用的地址,以及对 “ 站点 ” 没有准确的定义
除了以 000 开头的 IPv6 地址以外,其它情况下 IID 都位于地址的低位(即右边),在同一个网络前缀下,IID 必须是唯一的
IID 最初为 64 位,有两种构成方式:
- 由链路层网络接口的 MAC 地址经过修改的 EUI-64 格式(modified EUI-64 format) [EUI64] 格式化后得到
- 为了提供一定程度的私有性,防止地址追踪,使用随机值(见第 6 章)
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)
文章图片
图 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 转化而来,具体的:
- 复制 EUI-48 前 24 位的 OUI 值到 EUI-64 地址
- 将 EUI-64 的第 4 和第 5 字节的值设置为 1111111111111110 (十六进制:FFFE)
- 将剩下的组织分配的位复制过去
这个映射过程是 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 地址:
- 将 00:30:48:2A:19:89 转化为 EUI-64 的 00:30:48:ff:fe:2a:19:89
- 对 u 位求反得到 IID 值 02:30:48:ff:fe:2a:19:89
- 使用保留的链路本地前缀 fe80::/10(见第 2.5 节)得到链路本地 IPv6 地址 fe80::230:48ff:fe2a:1989
另一个例子来自 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 地址与接口标识符】目录
推荐阅读
- CVE-2020-16898|CVE-2020-16898 TCP/IP远程代码执行漏洞
- EffectiveObjective-C2.0|EffectiveObjective-C2.0 笔记 - 第二部分
- 以读攻“毒”唤新活动曹彦斌打卡第二天
- Java|Java OpenCV图像处理之SIFT角点检测详解
- C语言浮点函数中的modf和fmod详解
- 《格列佛游记》第二卷第五章概括
- [青春]翔(五)
- 《卓有成效的管理者》第二十二堂课(创造英雄)
- 17|17 关山松 第二课作业#公众号项目# D20
- 成都之行第二天