跳转到内容

计算机网络技术与服务/IPv6

来自维基教科书,开放世界中的开放书籍
Previous page
MPLS
计算机网络技术与服务 Next page
迁移到 IPv6
IPv6

互联网协议版本 6 (IPv6) 是一种新的协议,旨在克服 IPv4 的限制:引入新协议的主要原因是相对于 IPv4 具有更大的地址空间

与 IPv4 的比较

[编辑 | 编辑源代码]

IPv6 通过集成以下协议扩展了 ICMP 协议

  • ARP:称为“邻居发现”,用于地址配置过程;
  • IGMP:称为“组播监听发现”,用于管理组播组成员资格。

对于 IPv6,一些协议只需要升级,主要是因为它们都处理地址(这些协议不是第三层独立的)

  • DNS 协议;
  • 路由协议:RIP、OSPF、BGP、IDRP;
  • 传输协议:TCP、UDP;
  • 套接字接口.

IPv6 附加功能

[编辑 | 编辑源代码]

下面列出的附加功能最初被设计为 IPv4 的附加组件,然后被移植到嵌入到 IPv6 中。

在 LAN 上部署

由于高效地使用组播和任播地址,它更高效

  • 组播:每个组播地址标识一组站点,数据包被转发到该组中的所有节点;
  • 任播:每个任播地址标识一组站点,但数据包只被转发到该组中最近的节点。
数据安全和隐私

诸如IPsec的安全机制包含在 IPv6 协议中。

策略路由

它可以使用与目标地址不同的策略转发数据包(例如,按源地址转发)。

即插即用

自动配置协议已定义

  • 无状态:无需联系任何服务器即可保证只有链路本地访问;
  • 有状态:可以通过使用 DHCP 服务器访问互联网。
流量区分

并非所有数据流都是平等的(例如,电话通话需要更少的延迟)。

移动性

它是设备在不同的网络之间移动时保持所有服务可用性的能力(例如,使用 GSM/LTE 在不同小区之间移动的移动设备)。

游牧性

它是设备在不同的网络之间移动时无需为服务授予活动性的能力→比移动性要求更低。

路由的更好可扩展性

一般来说,聚合是使路由更容易需要的,但它需要浪费地址。IPv6 路由使用与 IPv4 几乎相同的技术,但如果以高效的方式分配地址,它可以减少路由表。

地址格式

[编辑 | 编辑源代码]

每个 IPv6 地址长 128 位,前缀代替了网络掩码

前缀 接口标识符

IPv6 中的链路概念与 IPv4 中的子网概念相同

  • 在 IPv4 中,子网是一组具有相同前缀的主机;
  • 在 IPv6 中,链路是实际的物理网络。

同一子网中的所有主机都属于同一个链路,反之亦然

  • 链路内主机具有相同的前缀,因此它们可以直接通信;
  • 链路外主机具有不同的前缀,因此它们可以通过路由器通信。

地址空间组织

[编辑 | 编辑源代码]

全局单播地址

[编辑 | 编辑源代码]
可聚合全局单播地址
[编辑 | 编辑源代码]

它们等同于IPv4 公共地址,它们以三个位'001'开头

3 16 48 64 88 96 104 128
001 ID TLA ID NLA ID SLA OUI ('通用'位 = 1) FF FE 制造商选择的 MAC 部分
前缀 接口标识符(EUI 64)
  • 前缀:它必须与分配给主机连接到的链路的前缀相同。
前缀的分配标准是基于拓扑的:它们是根据服务提供商层次结构分配的
  • 顶级机构 (TLA):大型服务提供商;
  • 下一级机构 (NLA):中间服务提供商;
  • 子网级别机构 (SLA):组织。
  • 接口标识符:它标识主机接口。
它可以选择采用 EUI-64 格式:64 位 IPv6 接口标识符源自主机的 48 位 MAC 地址
24 48
OUI ('通用'位 = 0) 制造商选择的 MAC 部分
其中'通用'位是 OUI 中的第七位,它从 0 更改为 1。
用于 IPv4 互操作性的地址
[编辑 | 编辑源代码]

它们将在过渡阶段使用,它们以 80 位设置为零开头

  • IPv4 映射地址:前 80 位为零,后 16 位设置为
0000 0000 0000 0000 0000 FFFF ...
  • IPv4 兼容地址:前 80 位为零,后 16 位设置为 (例如,IPv6 地址 '::10.0.0.1' 映射 IPv4 地址 '10.0.0.1')
0000 0000 0000 0000 0000 0000 ...

本地单播地址

[编辑 | 编辑源代码]
[编辑 | 编辑源代码]

它们指的是由 自动配置 生成的 “自动” 私有地址,该过程是站点自动生成地址以连接到 IPv6 链路的过程

FExx ...
站点本地地址
[编辑 | 编辑源代码]

它们等效于 IPv4 私有 地址

FDxx ...

组播地址

[编辑 | 编辑源代码]

一个 组播地址 标识一组站点,它具有以下格式

8 12 16 128
FF 标志 (000T) 范围 组 ID

其中字段是

  • 标志 字段 (4 位):用于标记组播组
    • T = 1:组播组是 临时 的(例如,用户定义的电话会议);
    • T = 0:组播组是 永久 的(例如,网络中所有主机的地址,它不能被覆盖);
  • 范围 字段 (4 位):用于限制组播的扩散(比 IPv4 TTL 更好)
    • 1 = 节点本地:数据包不能离开主机;
    • 2 = 链路本地:数据包不能离开第 2 层网络;
    • 5 = 站点本地:数据包不能离开例如校园网络;
    • 8 = 组织本地:数据包不能离开组织网络;
    • E = 全局:数据包可以去任何地方;
  • 组 ID 字段 (112 位):标识组播组,数据包将转发到组中的所有节点。

如果主机想要加入组播组,它需要使用 ICMP 协议 请求加入;一旦它被添加到组播组中,它将收到发送到该特定组播地址的所有数据包。 重要的是要注意,将接收组播数据包的主机 不是 由源定义的,而是由目的地 “决定” 的。

请求节点组播地址
[编辑 | 编辑源代码]

默认情况下,每个运行节点都属于一个请求节点组播组,其地址来自其 IPv6 地址

96 104 128
FF02::1 FF 来自 IPv6 地址的 24 个最低有效位

同一组播组中可能有多个主机,但通常没有,因为组播地址是从 IPv6 地址生成的。

将 IPv6 映射到以太网
[编辑 | 编辑源代码]

每个组播数据包都通过一个以太网帧传递,该帧具有从 IPv6 组播地址派生的特定 MAC 地址,以便数据包仅由感兴趣的主机处理

16 48
3333 来自目标 IPv6 地址的 32 个最低有效位
[编辑 | 编辑源代码]

重新编号

[编辑 | 编辑源代码]

由于全局地址的前缀是根据服务提供商层次结构分配的,如果一家公司想要从一个服务提供商更换到另一个服务提供商,该公司网络中的所有链路都必须更改其前缀。IPv6 旨在支持主机和路由器轻松重新编号

  • 主机:路由器逐渐停止通告旧前缀(已弃用)并开始通告新前缀(首选)→ 每个主机在迁移阶段将为同一接口具有两个具有不同前缀的地址;
  • 路由器:路由器重新编号是一种标准,允许边界路由器将新前缀通知其他内部路由器。

但是,重新编号仍然存在一些未解决的问题,这些问题与如何自动更新例如 DNS 条目、防火墙过滤器、基于地址的公司策略等相关。

多宿主

[编辑 | 编辑源代码]

一家大型公司可能决定从两个不同的服务提供商处购买互联网连接,因为它希望即使其中一个服务提供商出现问题也能保持连接到互联网。

由于全局地址的前缀是根据服务提供商层次结构分配的,公司网络中的每个主机将为同一接口具有两个具有不同前缀的全局地址→ 主机将不得不选择为每个传出数据包使用哪个地址。这可能会导致一些非平凡的配置问题

  • 基于目标地址的路由:主机应该能够为传出数据包选择正确的地址,否则假设主机选择提供商 A 的前缀但目标在提供商 B 的网络中→ 边界路由器由于其路由机制将直接将数据包转发到提供商 B 的网络→ 提供商 B 将阻止该数据包,因为源地址具有不同的前缀;
  • 在 DNS 中双重注册:主机应该在 DNS 中注册两个不同的地址以供相同的别名使用;
  • 自动重新编号:重新编号机制应该动态地支持从提供商 B 更改到提供商 C。

范围地址

[编辑 | 编辑源代码]

主机可以有两个接口(例如,一个以太网接口和一个 Wi-Fi 接口),它们可以同时连接到两个不同的链路。当主机想要向链路本地目标地址发送数据包时,它不知道是让数据包退出接口 A 还是接口 B,因为两个链路具有相同的前缀;此外,由于每个链路本地地址在其链路内都是唯一的,链路 A 中的主机可能与链路 B 中的另一个主机具有相同的链路本地地址。

在 IPv6 中,主机需要在目标 IPv6 地址中指定一个名为 范围 的标识符,该标识符用于标识物理接口(例如,FE80::0237:00FF:FE02:A7FD%19)。 范围的值由操作系统根据其内部标准选择。

标准 IPv6 标头

[编辑 | 编辑源代码]

标准 IPv6 标头具有以下固定大小(40 字节)格式

4 12 16 24 32
版本 (6) 优先级 流标签
有效载荷长度 下一个标头 跳数限制
 
地址
 
 
目标
地址
 

其中最重要的字段是

  • 版本 字段 (4 位):它没有实际使用,因为数据包区分是由第 2 层完成的→ 这使得双栈方法成为可能 ( 计算机网络技术和服务/迁移到 IPv6#迁移操作系统);
  • 优先级 字段 (8 位):等效于 IPv4 的 “服务类型” 字段,它允许区分服务质量的不同类型 ( 计算机网络技术和服务/服务质量#架构);
  • 流标签 字段 (20 位):它允许区分服务质量的不同流;
  • 下一个报头 字段(8 位):它指的是报文有效载荷,即上层报头(例如 TCP/UDP)或链中的第一个扩展报头( #扩展报头)。
  • 跳数限制 字段(8 位):它等同于 IPv4 的“生存时间”字段;
  • 源地址 字段(128 位):它包含发送者的 IPv6 源地址;
  • 目的地址 字段(128 位):它包含接收者的 IPv6 目的地址。

某些 IPv4 字段已被删除。

  • 校验和 字段:错误保护已委托给第 2 层(帧校验序列);
  • 分片 字段:分片已委托给“分片”扩展报头;
  • 报头长度 字段:IPv6 报头是固定大小的,因为扩展报头可以选择性地提供附加功能。

扩展报头

[编辑 | 编辑源代码]

有六个扩展报头,仅在需要时添加,并按以下顺序处理。

  1. 逐跳选项:它包含需要由每个跳点处理的可选信息;
  2. 路由:它启用 **源路由**,即源决定报文需要走哪条路线;
  3. 分片:它管理分片;
  4. 认证报头 (AH):它允许验证发送者;
  5. 封装安全负载 (ESP):它允许加密报文内容;
  6. 目的选项:它包含仅由目的端处理的可选信息。

路由器始终只处理到“路由”扩展报头为止。

所有扩展报头都具有相同的通用格式(长度必须是 64 位的倍数)。

8 16 32
下一个报头 报头长度
扩展数据 ::

其中字段是

  • 下一个报头 字段:它指定链中接下来的扩展报头,或者如果这是最后一个扩展报头,则指定上层报头(例如 TCP/UDP);
  • 报头长度 字段:它指定当前扩展报头的长度。
随着时间的推移,新的扩展报头可能会被标准化,旧设备可能无法处理最新的扩展报头→它们可以查看“长度”字段以跳过未知的扩展报头。
某些扩展报头(如“分片”扩展报头)可能没有“报头长度”字段,因为 IPv6 标准将它们定义为固定长度。

逐跳选项和目的选项

[编辑 | 编辑源代码]

**逐跳选项** 和 **目的选项** 扩展报头可以包含多个附加选项。

  • 逐跳选项:它包含报文经过的每个路由器都必须处理的选项;
  • 目的选项:它包含只有目的端才能处理的选项。

例如,如果有两个选项的 8 位长值,则扩展报头将具有以下格式。

8 16 24 32
下一个报头 报头长度 类型 1 长度
值 1 类型 2 长度 2 值 2

其中每个选项始终具有以下三个字段。

  • 长度 字段(8 位):它指定当前选项的长度,以便无法识别选项的路由器可以跳过它;
  • 类型 字段(8 位):它标识当前选项。
前两位始终指定在无法识别选项时要执行的操作,而第三位指定选项是否可以在运行时更改。
  • 00 = 可以忽略当前选项,可以继续执行下一个选项;
  • 01 = 必须丢弃报文;
  • 10 = 必须丢弃报文,并且必须生成 ICMPv6 参数问题;
  • 11 = 必须丢弃报文,并且必须生成 ICMPv6 参数问题,除非目的地址是组播地址;
  • xx0 = 选项 不能 更改;
  • xx1 = 选项 可以 在运行时更改;
  • 字段(可变长度):它包含选项的值。

**路由** 扩展报头允许源决定报文需要走哪条路线(**源路由**),并且它具有以下格式。

8 16 24 32
下一个报头 报头长度 路由类型 剩余段数
(保留)
 
路由器
地址 1
 
...
 
路由器
地址 N
 

其中字段是

  • 路由类型 字段(8 位):它指定路由的类型(目前为“0”,代表经典源路由);
  • 剩余段数 字段(8 位):它指定到达目的地的剩余跳数;
  • 路由器地址 字段(每个字段 128 位):它们是报文应经过的路由器的 IPv6 地址列表。
“路由”扩展报头的使用示例。

在侧边图的示例中,源 S 将报文发送到目的端 D,添加一个“路由”扩展报头,该报头强制报文经过中间路由器 R1 和 R2。因此,最初报文似乎将路由器 R1 作为目的端,而实际目的端 D 作为“路由”扩展报头指定的路由器列表中的最后一步。当报文到达路由器 R1 时,它会将其识别为似乎是发往它的;实际上,它的地址出现在 IPv6 报头的“目的地址”字段中。路由器 R1 检查下一个报头,发现报文包含一个“路由”扩展报头,意识到报文的最终目的地是另一个主机(特别是“剩余段数”字段表示在到达最终目的地之前应该遍历两个跳点)。路由器 R1 找到它应该发送报文的下一个跳点的 IPv6 地址,并用自己的 IPv6 地址替换它,然后它将报文发送到目的端设置为 R2。该过程将持续进行,直到目的端 D 收到一个 IPv6 报文,其“路由”扩展报头的“剩余段数”字段设置为 0,这意味着报文已到达最终目的地。目的端 D 能够知道报文经过的所有跳点,因为它们都记录在“路由”扩展报头中,因此它可以通过指定相同的(反向)跳点列表将回复转发到源 S。

**分片** 扩展报头允许将报文发送为更小的部分,称为“分片”,并且它具有以下格式。

8 16 29 31 32
下一个报头 (保留) 分片偏移量 (保留) M
标识

其中字段是

  • 分片偏移量 字段(13 位):它指定分片在原始报文的分片部分中开始的字节编号;
  • 更多分片 (M) 标志(1 位):如果它设置为 0,则当前报文是最后一个分片;
  • 标识 字段(32 位):特定报文的所有分片都具有相同的标识符。

每个报文都包含两个部分。

  • 一个不能分片的部分,因此它在所有分片中都重复:它包含 IPv6 报头以及所有在“分片”扩展报头之前的扩展报头;
  • 一个可以分片的部分:它包含“分片”扩展报头之后的所有扩展报头以及报文有效载荷。
“分片”扩展报头的使用示例。

与 IPv4 不同,只有发送节点可以分片数据报,而 IPv6 路由器不支持分片。此外,IPv6 标准强烈建议出于性能原因使用路径 MTU 发现而不是分片: #报文过大

为 IPv6 开发的解决方案已从 IPv4-IPsec 协议套件移植过来。在 IPv6 中,IPSec 是一个集成的协议套件,它定义了两个报头。

  • 认证报头 (AH):它验证 整个报文,但验证那些在从一个跳点到另一个跳点时会发生更改的字段(例如“跳数限制”字段),以保证没有人篡改了报文的内容;
  • 封装安全负载 (ESP):它验证和加密 报文有效载荷 以保证数据隐私。

IPsec 没有定义要使用哪些算法进行加密和认证,但双方必须就用于交换 IPsec 保护的信息使用哪些算法达成一致→灵活性:根据当前需求选择算法。

安全关联 (SA) 可以定义为两个通信方 A 和 B 之间就用于 ESP 身份验证和加密以及 AH 身份验证的私钥和算法达成的一组协议。每个 SA 都由一个称为安全参数索引 (SPI) 的标识标签标识,该标签包含在 AH 和 ESP 头部中,并且它是一个单向逻辑通道:A 和 B 必须打开一个 SA 来就从 A 到 B 的消息的密钥和算法达成一致,并且他们必须打开另一个 SA 来就从 B 到 A 的消息的密钥和算法达成一致。通常,每个 TCP 端口都会打开一个 SA。

A 和 B 如何在不泄露给无关人员的情况下就密钥达成一致?主要有三种策略

  • 静态配置:密钥在 A 和 B 中手动配置 → 无需进行密钥协商;
  • Diffie-Hellman 方法:它允许在不交换密钥的情况下就密钥达成一致 → 没有人可以通过嗅探 A 和 B 之间的流量来发现密钥;
  • 互联网密钥交换 (IKE) 协议:它使用数字证书和非对称加密以安全的方式发送密钥。

IKE 协议规定必须从 A 到 B 建立 IKE SA,以就从 A 到 B 的子 SA 的密钥达成一致,反之亦然,另一个用于从 B 到 A 的子 SA。从 A 到 B 的 IKE SA 包括以下基于非对称加密的操作:[1]

  1. B 向 A 请求一个密钥,用于从 A 到 B 的子 SA;
  2. A 向一个可信的证书颁发机构请求 B 的数字证书,以确定 B 是否确实是它声称的身份;
  3. 证书颁发机构向 A 提供 B 的数字证书,该证书使用证书颁发机构的私钥加密,包含 B 的签名,即 B 与公钥之间的关联;
  4. A 使用证书颁发机构的公钥解密数字证书,并了解与 B 关联的公钥;
  5. A 将子 SA 的密钥发送给 B,使用与 B 关联的公钥加密消息,以便只有知道 B 的私钥才能解密;
  6. B 接收来自 A 的消息,使用其私钥解密它,并了解 A 为子 SA 决定的密钥;
  7. 可以使用商定的密钥从 A 到 B 打开子 SA。

一些无关人员可能会查看 A 和 B 之间交换的流量,并通过执行暴力破解攻击或分析一些推断出的统计信息来猜测密钥。互联网安全关联密钥管理协议 (ISAKMP) 是 IKE 的一个子协议,用于定期以安全的方式重新协商密钥,以便无关人员没有时间猜测它们。

身份验证头 (AH) 保证 IP 数据包的无连接完整性和数据来源身份验证:它对\ul{整个数据包}进行身份验证,但对从一个跳跃传递到另一个跳跃时发生更改的字段(例如“跳跃限制”字段)进行身份验证,以确保没有人篡改数据包的内容。

AH 在处理 NAT 时存在问题,因为它还对地址和端口进行身份验证。

关键概念: 没有人可以更改数据包,但每个人都可以读取它。

身份验证头具有以下格式

8 16 32
下一个报头 有效载荷长度 (保留)
SPI
序列号
身份验证数据 ::

其中字段是

  • 下一个头部 字段 (8 位):指定下一个封装协议;
  • 有效载荷长度 字段 (8 位):指定身份验证头的长度(以 32 位字为单位)− 2(可以清除为零);
  • 安全参数索引 (SPI) 字段 (32 位):标识此数据报的安全关联(如果清除为零,则不存在安全关联;1 到 255 范围内的值保留);
  • 序列号 字段 (32 位):它包含一个单调递增的计数器值;
  • 消息摘要 字段 (可变长度):它使用密钥对数据包的内容进行摘要:任何想要更改数据包内容的人都需要知道密钥才能重新计算消息摘要(类似于错误检测字段)。

封装安全负载 (ESP) 头部为 IP 数据包提供来源身份验证、完整性和机密性保护:它对数据包有效载荷进行身份验证和加密,以保护数据隐私。

虽然 ESP 可以进行身份验证,但它不执行与 AH 相同的功能:ESP 不会对整个 IPv6 数据包进行身份验证。

关键概念: 没有人可以读取数据包,因此没有人可以更改它。

ESP 头部始终是头部链中的最后一个,并且具有以下格式

16 24 32
SPI
已验证
序列号
有效载荷数据 ::
加密
填充 ::
有效载荷长度 下一个报头
身份验证数据 ::

其中字段是

  • 安全参数索引 (SPI) 字段 (32 位):标识此数据报的安全关联;
  • 序列号 字段 (无符号 32 位):它包含一个单调递增的计数器值。
“序列号”字段对于发送方是必需的,即使接收方没有选择为特定 SA 启用反重放服务,它也始终存在,但此字段的处理由接收方决定;
  • 有效载荷数据 字段 (可变长度):它包含“下一个头部”字段描述的数据;
  • 填充 字段 (可变长度 0 到 255 位):可能需要填充,无论加密算法的要求如何,以确保生成的密文以 4 字节边界结束;
  • 填充长度 字段 (8 位):指定“填充”字段的大小(以字节为单位);
  • 下一个头部 字段 (8 位):一个 IPv4/IPv6 协议号,描述“有效载荷数据”字段的格式;
  • 身份验证数据 字段 (可变长度):它包含对 ESP 数据包(减去“身份验证数据”字段)计算出的完整性校验值 (ICV)。
“身份验证数据”字段的长度由所选的身份验证函数指定。“身份验证数据”字段是可选的:只有在为相关 SA 选择身份验证服务时才包含它。身份验证算法规范必须指定 ICV 长度以及用于验证的比较规则和处理步骤。请注意,“身份验证数据”字段被加密。

ESP 支持两种使用模式(可选地与 AH 结合使用)

  • 传输模式:ESP 不会加密 IPv6 头部 → 中间任何人都可以查看 IPv6 头部中的源 IP 地址和目标 IP 地址
IPv6 头部 其他扩展头部 ESP 头部
(用于加密)
TCP/UDP 头部 有效载荷 ESP 身份验证
加密数据
已验证数据
  • 隧道模式:IPv6 数据包被封装到另一个具有 ESP 的 IPv6 数据包中 → 原始数据包的 IPv6 头部(包含源 IP 地址和目标 IP 地址)被加密,没有人可以看到它
IPv6 头部 ESP 头部
(用于加密)
IPv6 头部 其他扩展头部 TCP/UDP 头部 有效载荷 ESP 身份验证
加密数据
已验证数据

ICMPv6

[edit | edit source]

互联网控制消息协议版本 6 (ICMPv6) 是 IPv6 标准的组成部分,它反过来整合了 ARP 和 IGMP 协议的功能,并扩展了它们。

所有 ICMPv6 消息都放在数据包中的扩展头部之后,并且它们具有相同的通用格式

8 16 32
类型 代码 校验和
消息体 ::

其中“类型”字段标识 ICMPv6 消息的类型

  • 诊断 消息:与 ICMPv4 中一样,它们允许报告网络中的错误或问题
  • ping 命令 使用的消息
    • 128 = 回显请求
    • 129 = 回显应答
  • 组播侦听器发现 消息:它们扩展了 IGMP 功能
    • 130 = 组播侦听器查询
    • 131 = 组播侦听器报告
    • 132 = 组播侦听器完成
  • 邻居发现 消息:它们扩展了 ARP 功能
    • 133 = 路由器请求
    • 134 = 路由器通告
    • 135 = 邻居请求
    • 136 = 邻居通告
    • 137 = 重定向

数据包过大

[编辑 | 编辑源代码]

当路由器收到数据包大小过大的情况,它会执行一项称为 **路径 MTU 发现** 的技术:它会丢弃该数据包并发送一个类型为 **数据包过大** 的 ICMPv6 消息,以通知发送方允许的最大传输单元 (MTU) 大小,并强制它再次发送数据包本身(以及后续数据包),其大小不超过路由器指定 的 MTU。此技术的目的是尽可能避免碎片化。

组播监听器发现

[编辑 | 编辑源代码]

**组播监听器发现** 是 ICMPv6 中的组件,它扩展了 IPv4 IGMP 协议的功能来管理组播组成员资格

  • 组播监听器查询:
    • 通用查询:路由器询问主机是否对加入某些组播组感兴趣;
    • 组播地址特定查询:路由器询问主机是否对加入特定组播组感兴趣;
  • **组播监听器报告**:主机通知路由器它想要加入特定组播组,以接收所有发送到指定组播组对应组播地址的组播数据包;
  • **组播监听器完成**:主机通知路由器它想要停止接收针对特定组播组的组播数据包。

邻居发现

[编辑 | 编辑源代码]

**邻居发现** 是 ICMPv6 中的组件,它扩展了 IPv4 ARP 协议的功能

  • **邻居请求**:主机发送一个组播数据包,目标 IPv6 地址为与其想要了解 MAC 地址对应的所请求节点组播地址;
  • **邻居通告**:具有指定 IPv6 地址的主机发送回其 MAC 地址;
  • **路由器请求**:主机发送一个组播数据包以请求路由器发送回包含给定网络详细信息的“路由器通告”消息(如与链路关联的前缀、自动配置/DHCP 标志、默认设备);
  • **路由器通告**:路由器在链路中通告其存在,报告与链路关联的前缀以及一个标志,该标志表明主机是否应自动配置其自身或查询 DHCP 服务器。

“邻居发现”ICMPv6 消息用于自动配置连接到链路的主机的 IPv6 地址:首先,主机必须获取一个链路本地地址,以便能够与链路中的其他主机联系,然后它必须获取一个全局地址,以便能够退出链路并通过全局唯一地址访问互联网。

[编辑 | 编辑源代码]

链路本地地址通过使用“邻居请求”和“邻居通告”ICMPv6 消息自动配置

  1. 主机自行生成一个作为其链路本地地址的 IPv6 地址候选
    • 前缀:始终为“FE80::”;
    • 接口标识符:可以基于 MAC 地址(EUI-64 格式)生成,也可以出于隐私原因随机生成(可追踪性);
  2. 主机通过组播将“邻居请求”消息发送到与所选候选链路本地地址对应的组播请求节点,将目标 IPv6 地址指定为其自生成地址,并询问是否存在一个链路本地地址与指定 IPv6 地址相同的链路中的主机(**重复地址检测**);
  3. 如果链路中已经存在具有发送方链路本地地址的主机,它会将“邻居通告”消息发送回发送方,发送方将不得不随机生成另一个候选地址,并通过组播发送另一个“邻居请求”消息;
  4. 如果没有回复,则该地址在链路中是唯一的,主机能够使用其链路本地地址与同一链路中的所有其他主机通信,但它仍然无法访问互联网,因为它需要一个全局地址。

全局地址自动配置过程

[编辑 | 编辑源代码]

全局地址通过使用“路由器请求”、“路由器通告”、“邻居请求”和“邻居通告”ICMPv6 消息自动配置

  1. 主机通过组播将“路由器请求”消息发送以请求路由器发送回包含与链路关联的接口标识符的“路由器通告”消息;[2]
  2. 路由器发送回包含“管理地址配置”(M)和“其他配置”(O)两个标志的“路由器通告”消息
    • M = 1:主机必须联系 DHCP 服务器以获取链路的前缀和其他网络配置参数(如 DNS 地址),而不必理会路由器的“路由器通告”消息(**有状态配置**);
    • M = 0:主机必须查看“O”标志
      • O = 1:主机可以从“路由器通告”消息中获取链路的前缀,但它仍然必须联系 DHCP 服务器以获取其他网络配置参数(如 DNS 地址);
      • O = 0:主机可以从“路由器通告”消息中获取链路的前缀,并且 DHCP 服务器没有其他配置信息可用(**无状态配置**)→ 其他网络配置参数(如 DNS 地址)必须手动配置在主机上,或者主机可以通过 IPv4 获取 DNS 地址 ( 计算机网络技术和服务/迁移到 IPv6#迁移 DNSes);
  3. 主机自行生成一个作为其全局地址的 IPv6 地址候选
    • 前缀:等于链路的前缀,从“路由器通告”消息中获取或通过联系 DHCP 服务器获取;
    • 接口标识符:可以基于 MAC 地址(EUI-64 格式)生成,也可以出于隐私原因随机生成(可追踪性);
  4. 主机通过组播将“邻居请求”消息发送到链路中的所有主机,将目标 IPv6 地址指定为其自生成地址,并询问是否存在一个全局地址与指定 IPv6 地址相同的主机(**重复地址检测**);
  5. 如果链路中已经存在具有发送方全局地址的主机,它会将“邻居通告”消息发送回发送方,发送方将不得不随机生成另一个候选地址,并通过组播发送另一个“邻居请求”消息;
  6. 如果没有回复,则该地址是全局唯一的,主机能够使用其全局地址访问互联网。

微软提出的另一种实现是,主机可以联系 DNS 服务器,而无需知道其地址:主机将数据包发送到一个固定的任播地址,网络负责将数据包传递到 DNS 服务器。但是,这种实现并没有真正被使用

  • 任播地址管理的实现很少;
  • 这种解决方案不受 GNU/Linux 操作系统的支持。

自动配置基于 MAC 地址,因此如果网卡损坏并需要更换,主机将不得不更改其地址,但缓存(例如 DNS 缓存)无法立即更新→ 静态配置仍然是可能的,尤其是对于需要尽可能连续保持可访问性的固定机器(例如公共网站的服务器)。

参考资料

[编辑 | 编辑源代码]
  1. 为简便起见,我们假设 SA 只需要一个密钥。
  2. 如果路由器被配置为定期组播“路由器通告”消息,则此步骤不是必需的。
Previous page
MPLS
计算机网络技术与服务 Next page
迁移到 IPv6
IPv6
华夏公益教科书