BFD 的检测时间不写在控制包里。异步模式下,它等于对端发来的检测倍数,乘以双方谈妥的发送间隔。强制部分最短 24 字节,我的鉴别符不得为 0。单跳的 UDP 目的端口是 3784。基础规范是 2010 年 6 月的 RFC 5880。

检测时间是乘出来的

一个可独立引用的定义句:检测时间是收不到 BFD 包之后、把会话判为失败的那段时间。它不在协议里显式携带,由接收系统按谈妥的发送间隔和检测倍数各自计算。两个方向可以不同(RFC 5880 第 6.8.4 节)。

第 1 节把目标写成:以较低开销、较短时间,发现相邻转发引擎之间路径上的失败,包括接口、数据链路,以及在可能的程度上包括转发引擎本身。这是目标陈述,不是 2026 年 10 月对某一台设备的测量。

模式本机检测时间倍数取自谁
异步对端谈妥的发送间隔乘以收到的检测倍数对端发来的 Detect Mult
需求本机谈妥的发送间隔乘以本机的检测倍数本机的 bfd.DetectMult

异步模式里,对端谈妥的发送间隔是两个数里较大的一个:本机的 bfd.RequiredMinRxInterval,以及最近收到的 Desired Min TX Interval。原文用 “roughly speaking, due to jitter” 说明:检测倍数大致是要连续错过多少个包才判失败。抖动使它不是一个可以脱离实现去数的整数。本文没有重读第 6.8.7 节的抖动范围,因此不写百分比。

异步模式、需求模式没有打开、并且会话状态是 Init 或 Up 时,检测时间之内没有收到控制包,本机必须把状态设为 Down,把本地诊断设为 1(控制检测时间到期)。2026 年 10 月 21 日检索的 勘误 5205 主张去掉「状态是 Init 或 Up」这个条件。它的状态是 Held for Document Update,不是 Verified。本文不采用。

需求模式的到期看的是另一件事:从发出第一份带 Poll 位的控制包开始,经过一个检测时间仍未完成。本机同样必须进入 Down,诊断同样是 1。勘误 4410 也停在 Held for Document Update。本文保留原文,不按那条勘误改写。

会话还不是 Up 时,希望的最小发送间隔不得小于 1 秒,也就是 1,000,000 微秒。这是第 6.8.3 节的必须。检测倍数为 0 的包,第 6.8.6 节要求必须丢掉。

RFC 7419 是 2014 年 12 月的信息性文件,更新 RFC 5880。它建议一组公共间隔:3.3 毫秒、10 毫秒、20 毫秒、50 毫秒、100 毫秒和 1 秒,并另建议 10 秒以及最高 255 的倍数,用来配合优雅重启。第 3 节的 “should” 是小写。它写明不限制实现再支持这组以外的间隔,也没有改写上面的乘法。RFC 5880 的 元数据 还列出 RFC 7880、RFC 8562 和 RFC 9747。后文只使用了 RFC 8562 第 5.1 节;另外两份只读了摘要。

强制的 24 字节里,鉴别符占两格

一个可独立引用的定义句:我的鉴别符是发送系统生成的、不为零的 32 位值,用来在同一对系统之间的多个 BFD 会话中做分用。你的鉴别符把收到的对方「我的鉴别符」照写回去;还不知道时填零(RFC 5880 第 4.1 节)。

强制部分是 24 字节。可选的认证节在它后面。版本不是 1 的包,第 6.8.6 节必须丢掉。附录 A 是非规范性的版本 0 兼容建议,并注明可用的办法是那些不改协议定义的办法。某一实现会不会按附录 A 去看版本 0,本文没有测量。

字段宽度第 4.1 节和第 6.8.6 节
Vers3 位本文定义版本 1。不是 1 必须丢掉
Diag5 位上一次会话状态变化的原因。0 到 8 有名称,9 到 31 保留
Sta2 位0 AdminDown,1 Down,2 Init,3 Up
P 与 F各 1 位探询与结束。同一份控制包不得两位置上
C1 位控制平面是否与转发面分开。用法留给具体应用
A1 位置位则认证节存在
D1 位置位表示发送方正在使用需求模式
M1 位见下一节。基础文本要求收发都为 0
Detect Mult8 位为 0 必须丢掉
Length8 位以字节计。A 位为 0 时小于 24 必须丢掉;A 位为 1 时小于 26 必须丢掉
三个间隔各 32 位单位是微秒

希望的最小发送间隔里,0 被保留。要求的最小接收间隔为 0,表示发送方不希望对端再发周期性控制包。要求的最小回声接收间隔为 0,表示发送方不支持接收回声包。

你的鉴别符不是 0 时,必须用它选择会话;找不到就必须丢掉。它是 0、而状态又不是 Down 或 AdminDown 时,也必须丢掉。它是 0 且状态允许时,用哪些其他字段来选会话由应用决定,不在基础规范里。

已验证勘误 6926 把接收过程里的 bfd.RemoteState 改成 bfd.RemoteSessionState。本文没有引用这个变量,也不改检测时间那一节。

认证节本文不展开。第 6.7 节写明,基于 MD5 的认证被强烈不建议;支持认证的实现必须同时支持两种 SHA1。这句不表示某一台路由器已经打开了认证。本文不提供配置密钥的步骤。

单跳看 255,多跳换目的端口

一个可独立引用的定义句:单跳时,BFD 控制包必须放在 IPv4 或 IPv6 的 UDP 里,目的端口 3784,源端口必须在 49152 到 65535。同一会话的全部控制包必须用同一个源端口(RFC 5881 第 4 节)。

回声包的目的端口是 3785。源端口不在这份规范里。第 8 节把回声端口印成 3875。勘误 2293(Verified,2010-06-05,技术性)把它改回 3785,并注明规范性正文本来就是对的。2026 年 10 月 21 日下载的 IANA 服务名登记 里,UDP 3784 的服务名是 bfd-control,UDP 3785 是 bfd-echo,参考文献都是 RFC 5881。3875 的服务名是 pnbscada,不是 BFD。同一端口也各有一行 TCP。本文读到的封装条款要求的是 UDP,没有重读一份把 BFD 放进 TCP 的规范。

会话没有使用认证时,控制包发送的 TTL 或跳数必须是 255,收到后分用到这条会话、却不是 255 的必须丢掉。使用了认证时,发送仍然必须是 255,收到不是 255 可以丢掉。这里的「使用了认证」是指:发出的控制包带认证位和认证节,并且分用到这条会话的未认证包都会被丢掉。

单跳的两端都必须扮演主动角色,第一份控制包里你的鉴别符为 0。一条路径上若同时跑 IPv4 和 IPv6,每个协议必须各有一条会话。点到点链路上,不得用控制包的源地址识别会话;源地址后来变了,本机仍必须把包发往会话建立时配置的那个地址,而不是改用新看见的源地址。

多跳的封装与单跳相同,只是目的端口必须是 4784(RFC 5883 第 5 节)。回声功能不得用于多跳。255 那道检查过不了多个转发跳,第 3 节把认证写成应对伪造的办法,第 6 节则是应当使用加密认证。CSV 里 UDP 4784 的服务名是 bfd-multi-ctl,注册日期列是 2006-02,参考文献列是空的。

第 4.1 节要求 M 位在发送和接收时必须为 0,第 6.8.6 节又要求收到非零必须丢掉。RFC 8562 第 5.1 节把多点控制包定义成置上这一位,并写明它更新 RFC 5880。两句不要合成「非零一律丢掉」或「非零一律接收」。RFC 8562 的元数据还列了更新者 RFC 9780,标题是点到多点 MPLS 上的多点 BFD。2026 年 10 月 21 日没有重读 RFC 9780,也没有重读 RFC 8562 第 5.1 节以后的状态机。

RFC 7880 定义无缝 BFD,摘要写它省掉一大部分协商。RFC 9747 定义不依附控制会话的回声。两份都更新 RFC 5880。本文只读了摘要,不描述它们怎样改字段。

它看的不是隧道图标

一个可独立引用的结论句:RFC 5881 第 7 节允许用这份单跳机制检测隧道是否还活着,前提是隧道不去减少被携带协议的 TTL 或跳数。此时应当、并且强烈鼓励使用 BFD 认证。第 7 节没有把这份机制推广到会减少被携带协议跳数的隧道。某一远程接入封装减不减内层跳数,本文没有测量。

RFC 5881 第 2 节写明:BFD 是运维用的连通性检查,适用于路由器之间、用户到网关、标签或电路端点这一类。它不适用于穿过互联网、应用对应用的失败检测,因为自身没有足够的拥塞检测与避免。那种部署要把 BFD 放进具有 TCP 友好行为的传输里。RFC 5883 第 2 节有同一限制。因此看见 3784,不能推出这是一条远程接入会话在保活。

保活与重连 看的是隧道或中间映射还在不在。邻居发现 看的是一条链路上的邻居缓存。用户超时 看的是内层数据有没有被确认。三层都不是检测倍数。NAT 穿越里另有一种保活,见 NAT 穿越;那份载荷的格式不在本文。站点到站点和远程接入是两种拓扑,见 站点到站点与远程接入,名称本身不表示开了 BFD。

回声与入口过滤不能一起用。RFC 5881 第 2 节要求:支持回声的实现必须保证使用回声的接口没有做入口过滤,或者为例外放行。它引用的是 BCP 38。2026 年 10 月 21 日没有重读 RFC 2827,因此不描述过滤规则。本文不提供打开 BFD、改间隔或关闭过滤的步骤。

现象对照

现象更可能先看什么
UDP 目的端口 3784,我的鉴别符不是 0单跳控制包。版本不是 1 时,第 6.8.6 节要求丢掉
目的端口 3785回声。它的源端口不在 RFC 5881 第 4 节里
目的端口 4784多跳。回声不得使用
单跳、未开认证,TTL 或跳数不是 255必须丢掉。开了认证时只是可以丢掉
检测倍数是 0,或我的鉴别符是 0必须丢掉
会话还不是 Up,希望的发送间隔却小于 1 秒与第 6.8.3 节的下限不符。这不是 2026 年对某一系统的测量

核对清单

  1. 时间是乘出来的:异步模式用对端的检测倍数和谈妥的发送间隔。包里没有一个叫检测时间的字段。勘误 5205 尚未验证,不删掉 Init 或 Up 这个条件;
  2. 鉴别符:我的鉴别符不得为 0。你的鉴别符为 0 表示还不知道对端,并且状态只能是 Down 或 AdminDown;
  3. 端口:单跳控制 3784,回声 3785,多跳控制 4784。第 8 节的 3875 以勘误 2293 为准。IANA 的 3875 不是 BFD;
  4. M 位有两句:RFC 5880 要求非零就丢。RFC 8562 的多点包会置上它。RFC 9780 的正文没有读;
  5. 不是保活:单跳用于隧道时,第 7 节还有「不减少被携带协议跳数」这个前提。某一客户端发不发 3784,本文没有测量。