路由器通告回答的是:一台 IPv6 主机在某一条链路上,从谁那里学到默认路由器和前缀。它是类型 134 的 ICMPv6 报文,源地址必须是链路本地地址,跳数限制必须是 255。截至 2026 年 10 月,隧道接口不继承物理链路上已经收到的通告。

通告只在发出它的那条链路上有效

一个可独立引用的定义句:IPv6 路由器通告是邻居发现里的 ICMPv6 报文,类型 134、代码 0。路由器周期性发送,或在收到路由器请求后发送。源地址必须是发出接口的链路本地地址,IP 跳数限制为 255(RFC 4861 第 4.2 节)。

路由器请求是类型 133,通常发往全路由器多播地址 FF02::2。通告的目的地址通常是触发它的那次请求的源地址,或全节点多播地址 FF02::1。这两个多播地址都是链路本地范围(RFC 4861 第 2.3 节)。

接收方的校验写在第 6.1.2 节:源地址不是链路本地,或跳数不是 255,节点必须静默丢弃。第 11.2 节说明原因:路由器转发时会把跳数减一,收到时仍是 255,就说明报文来自这条链路上的邻居,而不是被另一台路由器转进来的。

因此通告安装的是「这条链路的状态」。它不会因为另一张接口上的隧道图标而自动撤销。

寿命为零就不是默认路由器

Router Lifetime 以秒计。0 表示这台路由器不应当出现在默认路由器列表里。这个字段只表示它作为默认路由器是否有用,不约束报文里其他选项自己的寿命。发送时使用的变量 AdvDefaultLifetime 必须是 0,或者落在 MaxRtrAdvInterval 与 9000 秒之间;描述特定链路的文档可以改写这个范围,点对点链路就是 RFC 4861 举出的例子。字段本身可以表示到 65535,接收方应能处理任何值(第 4.2 节与第 6 节)。

Cur Hop Limit 是另一项:建议主机发出数据包时使用的跳数,0 表示这条通告没有指定。它和通告自身必须携带的 255 不是同一个字段。

字段管什么为零或未置位时
Router Lifetime能否进入默认路由器列表0 表示不要当作默认路由器
Cur Hop Limit建议的出站跳数0 表示未指定
前缀的 A 位能否做无状态地址配置未置位则该前缀不用于自动配置
前缀的 L 位能否用于在链判定未置位时不得据此断定前缀在链外

前缀选项决定能不能自己配地址

前缀信息选项的类型是 3。L 置位表示此前缀可用于在链判定。L 未置位时,主机不得据此断定由该前缀生成的地址在链外,也不得推翻先前「在链上」的结论。A 置位表示此前缀可用于无状态地址配置。有效寿命和首选寿命都是相对报文发送时刻的秒数,全 1 表示无限。首选寿命不得超过有效寿命(RFC 4861 第 4.6.2 节)。

一个可独立引用的定义句:无状态地址配置把前缀和接口标识拼成地址。接口标识的长度和生成方式由具体链路的文档规定,不在 RFC 4862 里写死成某一种算法。

配到接口之前,重复地址检测必须做,除非该接口把 DupAddrDetectTransmits 设为 0(RFC 4862 第 5.4 节)。链路本地地址的首选寿命和有效寿命是无限的,不会因通告里的前缀寿命到期而失效。

A 与 M 可以同时有意义。M 置位表示地址可由 DHCPv6 获得;O 置位表示其他配置,例如 DNS,可由 DHCPv6 获得。RFC 4861 写明:M 置位时 O 是多余的,可以忽略,因为 DHCPv6 会返回全部可用的配置信息;M 与 O 都不置位,表示没有经 DHCPv6 提供的信息。RFC 4862 同时写明,主机可以并用无状态配置和 DHCPv6。某一系统是否严格照 M、O 去启动 DHCPv6,本文没有测量。

本文不把「用 MAC 地址改成修改的 EUI-64」写成现行唯一做法。那是特定链路文档里的一种历史算法,不是 RFC 4862 对所有链路的要求。

优先级不在 RFC 4861 的图里

RFC 4191 定义了可选扩展:默认路由器优先级,以及更具体的路由。优先级是两位有符号整数:01 为高,00 为中(默认),11 为低,10 保留且不得发送。收到 10 时,默认路由器优先级必须按 00 处理;路由信息选项若带 10,则整个选项必须忽略。Router Lifetime 为 0 时,发送方必须把报头里的优先级置为 00,接收方必须忽略它。

路由信息选项的类型是 24,携带经这台路由器可达的前缀和自己的寿命。同一条通告里,不得出现前缀与前缀长度都相同的两个该选项。RFC 4191 写明这些优先级不是路由度量。

文档关系需要分开看。RFC 4191 更新的是 RFC 2461。RFC 4861 取代了 RFC 2461,第 4.2 节的图仍把 M、O 之后画成保留位,没有画上优先级。RFC 4861 也没有废止 RFC 4191,只在附录 A 把多接口主机如何选择路由器列为尚待研究的问题,并指向 RFC 4191。因此,不能把优先级说成 RFC 4861 正文图里已经画上的字段。某一主机在 2026 年 10 月是否按 RFC 4191 解释那几位,本文没有测量。

解析器地址也可以放在通告里

RFC 8106 取代 RFC 6106,规定两种选项。RDNSS 的类型是 25,给出一个或多个递归解析器的 IPv6 地址,这些地址共用一个寿命。DNSSL 的类型是 31,给出 DNS 搜索后缀。寿命是相对收到报文时刻的最长使用秒数,和前缀寿命「相对发送时刻」不是同一个计时起点。全 1 表示无限。0 表示这些地址或后缀不得再使用。

RDNSS 地址可以是链路本地地址。RFC 8106 要求:用这种地址发查询时,必须从收到该选项的那条链路发出。短名字如何被搜索列表补全,见 DNS 搜索列表。通告只负责把列表送到这条链路上。

隧道接口不继承另一条链路上的通告

三层隧道和物理网卡是两张接口。物理接口上 Router Lifetime 非零的通告,可以让一台默认路由器留在那张接口上。隧道里出现的地址和路由,来自隧道实现写进这张接口的状态,不一定是类型 134。二层虚拟网卡才有以太网这一层,见 TUN 与 TAP。链路本地多播是否被交到某一张三层接口上,取决于实现。本文没有测量哪一个客户端会在隧道接口上发送类型 134。

RFC 4861 附录 A 写明:多接口主机如何处理从每张接口学到的邻居发现,正文没有给出完整规则。物理接口和隧道接口同时有默认路由时,哪一条被选中,不能只从「隧道已连接」推出来。IPv6 包因此可能仍从物理接口离开。这种现象如何对照检测页,见 IPv6 泄漏。本文不提供关闭 IPv6 或删除路由的步骤。

无状态配置生成的地址,要等路由选定出接口之后才进入源地址挑选,见 源地址选择。双栈下先连哪一个地址,见 Happy Eyeballs。

一个可独立引用的结论句:隧道图标不取消物理链路上已经收到的路由器通告,也不表示隧道接口上发生过无状态地址配置。

现象对照

现象更可能先看什么
物理接口上有一台默认路由器这张接口收到过 Router Lifetime 非零的通告
有前缀地址,但没有默认路由器前缀寿命独立;默认路由器寿命可以已经是 0
通告的跳数不是 255RFC 4861 要求静默丢弃,状态不应按这份通告安装
隧道里有地址,物理接口仍有默认路由两张接口各学各的;优先级见附录 A 所说的未决问题
解析器地址是链路本地RFC 8106 要求查询从收到 RDNSS 的那条链路发出

核对清单

  1. 先看接口:通告只安装收到它的那条链路的状态;
  2. 跳数必须是 255,源地址必须是链路本地:否则必须丢弃;
  3. 默认路由器寿命和前缀寿命分开读:0 只取消默认路由器身份;
  4. A 位置位才做无状态配置:接口标识的算法不在 RFC 4862 里写死;
  5. 优先级属于 RFC 4191:不要把它说成 RFC 4861 第 4.2 节图中的字段。