4. 消息格式
Neighbor Discovery 消息作为 ICMPv6 [ICMPv6] type 133-137 消息发送.
4.1. Router Solicitation 消息格式
主机发送 Router Solicitation, 以提示路由器快速生成 Router Advertisement.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options ...
+-+-+-+-+-+-+-+-+-+-+-+-
IP 字段:
-
Source Address: 分配给发送接口的 IP 地址, 如果发送接口没有分配地址, 则为 unspecified address.
-
Destination Address: 通常为 all-routers multicast address.
-
Hop Limit: 255
ICMP 字段:
-
Type: 133
-
Code: 0
-
Checksum: ICMP checksum. 见 [ICMPv6].
-
Reserved: 此字段未使用. 发送方必须将其初始化为零, 接收方必须忽略它.
有效选项:
- Source link-layer address: 发送方的链路层地址, 如果已知. 如果 Source Address 是 unspecified address,不得包含此选项. 否则, 在具有地址的链路层上应该包含此选项.
此协议的未来版本可能定义新的选项类型. 接收方必须静默忽略任何无法识别的选项, 并继续处理该消息.
4.2. Router Advertisement 消息格式
路由器周期性发送 Router Advertisement 消息, 或响应 Router Solicitation 而发送.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Cur Hop Limit |M|O| Reserved | Router Lifetime |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reachable Time |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Retrans Timer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options ...
+-+-+-+-+-+-+-+-+-+-+-+-
IP 字段:
-
Source Address:必须是分配给发送此消息的接口的 link-local address.
-
Destination Address: 通常为触发该消息的 Router Solicitation 的 Source Address, 或 all-nodes multicast address.
-
Hop Limit: 255
ICMP 字段:
-
Type: 134
-
Code: 0
-
Checksum: ICMP checksum. 见 [ICMPv6].
-
Cur Hop Limit: 8-bit unsigned integer. 应放入外发 IP 分组 IP 头部 Hop Count 字段中的默认值. 值为零表示 (由该路由器) 未指定.
-
M: 1-bit "Managed address configuration" 标志. 置位时, 表示可通过 Dynamic Host Configuration Protocol [DHCPv6] 获取地址.
-
O: 1-bit "Other configuration" 标志. 置位时, 表示可通过 DHCPv6 获取其他配置信息. 这类信息的示例包括 DNS 相关信息, 或网络内其他服务器的信息.
-
Reserved: 6-bit 未使用字段. 发送方必须将其初始化为零, 接收方必须忽略它.
-
Router Lifetime: 16-bit unsigned integer. 与默认路由器关联的生命周期, 单位为秒. 该字段可以包含最高 65535 的值, 接收方应处理任何值, 而 Section 6 中的发送规则将 lifetime 限制为 9000 秒. Lifetime 为 0 表示该路由器不是默认路由器,不应该出现在 default router list 中. Router Lifetime 仅适用于该路由器作为默认路由器的可用性; 不适用于其他消息字段或选项中包含的信息. 需要为其信息设置时间限制的选项包含自身的 lifetime 字段.
-
Reachable Time: 32-bit unsigned integer. 节点在收到可达性确认后假定邻居可达的时间, 单位为毫秒. 由 Neighbor Unreachability Detection 算法使用 (见 Section 7.3). 值为零表示 (由该路由器) 未指定. 见 Section 6.2.1.
-
Retrans Timer: 32-bit unsigned integer. 重传 Neighbor Solicitation 消息之间的时间, 单位为毫秒. 由地址解析和 Neighbor Unreachability Detection 算法使用 (见 Section 7.2 和 7.3). 值为零表示 (由该路由器) 未指定.
有效选项:
-
Source link-layer address: 发送 Router Advertisement 的接口的链路层地址. 仅在具有地址的链路层上使用. 路由器可以省略此选项, 以支持跨多个链路层地址的入站负载共享.
-
MTU: 在具有可变 MTU 的链路上应该发送 (如描述如何在特定链路类型上运行 IP 的文档所规定). 在其他链路上可以发送.
-
Prefix Information: 这些选项指定链路上前缀和/或用于 stateless address autoconfiguration 的前缀. 路由器应该包含其所有链路上前缀 (link-local prefix 除外), 使多宿主主机能够获得其所连接链路上链路内目的地的完整前缀信息. 如果缺少完整信息, 具有多个接口的主机在向邻居发送流量时可能无法选择正确的外发接口.
此协议的未来版本可能定义新的选项类型. 接收方必须静默忽略任何无法识别的选项, 并继续处理该消息.
4.3. Neighbor Solicitation 消息格式
节点发送 Neighbor Solicitation, 用于请求目标节点的链路层地址, 同时向目标提供自身的链路层地址. 当节点需要解析地址时, Neighbor Solicitation 以多播方式发送; 当节点试图验证邻居可达性时, 以单播方式发送.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Target Address +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options ...
+-+-+-+-+-+-+-+-+-+-+-+-
IP 字段:
-
Source Address: 分配给发送此消息的接口的地址, 或 (如果正在执行 Duplicate Address Detection) unspecified address.
-
Destination Address: 与目标地址对应的 solicited-node multicast address, 或目标地址本身.
-
Hop Limit: 255
ICMP 字段:
-
Type: 135
-
Code: 0
-
Checksum: ICMP checksum. 见 [ICMPv6].
-
Reserved: 此字段未使用. 发送方必须将其初始化为零, 接收方必须忽略它.
-
Target Address: solicitation 目标的 IP 地址. 它不得是 multicast address.
有效选项:
- Source link-layer address: 发送方的链路层地址. 当 source IP address 是 unspecified address 时,不得包含此选项. 否则, 在具有地址的链路层上, 多播 solicitation 中必须包含此选项, 单播 solicitation 中应该包含此选项.
此协议的未来版本可能定义新的选项类型. 接收方必须静默忽略任何无法识别的选项, 并继续处理该消息.
4.4. Neighbor Advertisement 消息格式
节点响应 Neighbor Solicitation 时发送 Neighbor Advertisement, 也会发送 unsolicited Neighbor Advertisement, 以便快速 (但不可靠地) 传播新信息.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|R|S|O| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Target Address +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options ...
+-+-+-+-+-+-+-+-+-+-+-+-
IP 字段:
-
Source Address: 分配给发送此 advertisement 的接口的地址.
-
Destination Address: 对 solicited advertisement 而言, 为触发它的 Neighbor Solicitation 的 Source Address; 如果该 solicitation 的 Source Address 是 unspecified address, 则为 all-nodes multicast address.
对 unsolicited advertisement 而言, 通常为 all-nodes multicast address.
- Hop Limit: 255
ICMP 字段:
-
Type: 136
-
Code: 0
-
Checksum: ICMP checksum. 见 [ICMPv6].
-
R: Router flag. 置位时, R-bit 表示发送方是路由器. Neighbor Unreachability Detection 使用 R-bit 来检测某个路由器变为主机的情况.
-
S: Solicited flag. 置位时, S-bit 表示该 advertisement 是响应来自 Destination address 的 Neighbor Solicitation 而发送的. S-bit 被 Neighbor Unreachability Detection 用作可达性确认. 它不得在多播 advertisement 或 unsolicited unicast advertisement 中置位.
-
O: Override flag. 置位时, O-bit 表示该 advertisement 应覆盖现有缓存条目并更新缓存的链路层地址. 未置位时, 该 advertisement 不会更新缓存的链路层地址, 但会更新尚无已知链路层地址的现有 Neighbor Cache 条目. 对 anycast address 的 solicited advertisement 以及 solicited proxy advertisement, 它不应该置位. 对其他 solicited advertisement 和 unsolicited advertisement, 它应该置位.
-
Reserved: 29-bit 未使用字段. 发送方必须将其初始化为零, 接收方必须忽略它.
-
Target Address: 对 solicited advertisement 而言, 是触发该 advertisement 的 Neighbor Solicitation 消息中的 Target Address 字段. 对 unsolicited advertisement 而言, 是其链路层地址已改变的地址. Target Address 不得是 multicast address.
有效选项:
- Target link-layer address: 目标的链路层地址, 即 advertisement 发送方的链路层地址. 在具有地址的链路层上响应多播 solicitation 时,必须包含此选项. 响应单播 Neighbor Solicitation 时应该包含此选项.
此协议的未来版本可能定义新的选项类型. 接收方必须静默忽略任何无法识别的选项, 并继续处理该消息.
4.5. Redirect 消息格式
路由器发送 Redirect 分组, 通知主机到某个目的地存在更好的第一跳.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Target Address +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Destination Address +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options ...
+-+-+-+-+-+-+-+-+-+-+-+-
IP 字段:
-
Source Address:必须是分配给发送此消息的接口的 link-local address.
-
Destination Address: 触发该 redirect 的分组的 Source Address.
-
Hop Limit: 255
ICMP 字段:
-
Type: 137
-
Code: 0
-
Checksum: ICMP checksum. 见 [ICMPv6].
-
Reserved: 此字段未使用. 发送方必须将其初始化为零, 接收方必须忽略它.
-
Target Address: 对 ICMP Destination Address 而言应使用的更好第一跳的 IP 地址. 当 target 是通信的实际端点时, 即 destination 是邻居时, Target Address 字段必须包含与 ICMP Destination Address 字段相同的值. 否则, target 是更好的第一跳路由器, Target Address 必须是该路由器的 link-local address, 以便主机能够唯一识别路由器.
-
Destination Address: 被重定向到 target 的目的地 IP 地址. ICMP Destination Address 字段从触发分组的 Destination Address 字段复制.
有效选项:
-
Target link-layer address: target 的链路层地址. 如果已知,应该包含它. 注意, 在 NBMA 链路上, 主机可能依赖 Redirect 消息中 Target Link-Layer Address 选项的存在来确定邻居的链路层地址. 在这种情况下, Redirect 消息中必须包含该选项.
-
Redirected Header: 尽可能多地包含触发发送 Redirect 的 IP 分组, 但不能使 redirect 分组超过 [IPv6] 中规定的支持 IPv6 所需的最小 MTU.
此协议的未来版本可能定义新的选项类型. 接收方必须静默忽略任何无法识别的选项, 并继续处理该消息.
4.6. Option 格式
Neighbor Discovery 消息包含零个或多个选项, 其中一些选项可以在同一消息中出现多次. 必要时应对选项进行填充, 以确保它们在自身自然的 64-bit 边界处结束. 所有选项形式如下:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Length | ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
~ ... ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段:
-
Type: 选项类型的 8-bit 标识符.
-
Length: 8-bit unsigned integer. 选项长度 (包括 type 和 length 字段), 以 8 octets 为单位. 值 0 无效. 节点必须静默丢弃包含长度为零的选项的 ND 分组.
4.6.1. Source/Target Link-Layer Address
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Length | Link-Layer Address ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段:
-
Type: Source Link-layer Address 为 1; Target Link-layer Address 为 2.
-
Length: 选项长度 (包括 type 和 length 字段), 以 8 octets 为单位. 例如, IEEE 802 地址的长度为 1.
-
Link-Layer Address: 可变长度的链路层地址. 此字段的长度和格式取决于链路类型. 例如, 对 IEEE 802 地址而言, 长度为 6 octets.
描述: Source Link-Layer Address 选项包含分组发送方的链路层地址. 它用于 Neighbor Solicitation, Router Solicitation 和 Router Advertisement 分组. Target Link-Layer Address 选项包含目标的链路层地址. 它用于 Neighbor Advertisement 和 Redirect 分组.
这些选项必须在其他 Neighbor Discovery 消息中被静默忽略.
4.6.2. Prefix Information
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Length | Prefix Length |L|A| Reserved1 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Valid Lifetime |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Preferred Lifetime |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved2 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Prefix +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段:
-
Type: 3
-
Length: 4
-
Prefix Length: 8-bit unsigned integer. Prefix 中有效前导位的数量. 取值范围为 0 到 128. prefix length 字段提供 on-link determination 所需的信息 (与 prefix information option 中的 L flag 结合使用时). 它还辅助 [ADDRCONF] 中规定的 address autoconfiguration, 后者可能对 prefix length 有更多限制.
-
L: 1-bit on-link flag. 置位时, 表示此 prefix 可用于 on-link determination. 未置位时, advertisement 不对该 prefix 的 on-link 或 off-link 属性作出说明. 换言之, 如果 L flag 未置位, 主机不得得出从该 prefix 派生的地址位于链路外的结论. 也就是说, 它不得更新之前关于该地址位于链路上的指示.
-
A: 1-bit autonomous address-configuration flag. 置位时, 表示此 prefix 可用于 [ADDRCONF] 中规定的 stateless address configuration.
-
Reserved1: 6-bit 未使用字段. 发送方必须将其初始化为零, 接收方必须忽略它.
-
Valid Lifetime: 32-bit unsigned integer. 该 prefix 为 on-link determination 目的保持有效的时间长度, 单位为秒 (相对于分组发送时间). 全 1 位值 (0xffffffff) 表示无限. Valid Lifetime 也由 [ADDRCONF] 使用.
-
Preferred Lifetime: 32-bit unsigned integer. 通过 stateless address autoconfiguration 从该 prefix 生成的地址保持 preferred 的时间长度, 单位为秒 (相对于分组发送时间) [ADDRCONF]. 全 1 位值 (0xffffffff) 表示无限. 见 [ADDRCONF]. 注意, 此字段的值不得超过 Valid Lifetime 字段, 以避免优先使用不再有效的地址.
-
Reserved2: 此字段未使用. 发送方必须将其初始化为零, 接收方必须忽略它.
-
Prefix: IP 地址或 IP 地址前缀. Prefix Length 字段包含 prefix 中有效前导位的数量. prefix 中位于 prefix length 之后的位是保留位, 发送方必须将其初始化为零, 接收方必须忽略它们. 路由器不应该为 link-local prefix 发送 prefix option, 主机应该忽略这样的 prefix option.
描述: Prefix Information 选项向主机提供 on-link prefixes 以及用于 Address Autoconfiguration 的前缀. Prefix Information 选项出现在 Router Advertisement 分组中, 在其他消息中必须被静默忽略.
4.6.3. Redirected Header
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Length | Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
~ IP header + data ~
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段:
-
Type: 4
-
Length: 选项长度, 以 8 octets 为单位.
-
Reserved: 这些字段未使用. 发送方必须将其初始化为零, 接收方必须忽略它们.
-
IP header + data: 原始分组被截断后的内容, 以确保 redirect 消息大小不会超过 [IPv6] 中规定的支持 IPv6 所需的最小 MTU.
描述: Redirected Header 选项用于 Redirect 消息, 包含正在被重定向分组的全部或部分内容.
此选项必须在其他 Neighbor Discovery 消息中被静默忽略.
4.6.4. MTU
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Length | Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| MTU |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段:
-
Type: 5
-
Length: 1
-
Reserved: 此字段未使用. 发送方必须将其初始化为零, 接收方必须忽略它.
-
MTU: 32-bit unsigned integer. 建议用于该链路的 MTU.
描述: MTU 选项用于 Router Advertisement 消息, 在链路 MTU 不明确的情况下确保链路上的所有节点使用相同的 MTU 值.
此选项必须在其他 Neighbor Discovery 消息中被静默忽略.
在异构技术桥接在一起的配置中, 不同网段支持的最大 MTU 可能不同. 如果网桥不生成 ICMPv6 Packet Too Big 消息, 通信节点会错误地假定 path MTU 大于实际值. 正确实现 Performing Path MTU Discovery [PMTU] 算法将识别此问题并允许节点调整. 但是, 如果路由器在每个网段中发送正确的 MTU 选项, 该算法会收敛得快得多.
放入 MTU 选项的 MTU 值必须小于或等于从链路层信息派生出的最大 MTU 值. 节点不得在 Router Advertisement 中放入 MTU 选项, 如果该选项包含的 MTU 值大于 advertising interface 上配置的 MTU, 或大于特定链路类型 IP 运行文档所规定的该链路 maximum transmission unit.