RFC 5880 双向转发检测 (Bidirectional Forwarding Detection)
- 状态: Proposed Standard
- 发布日期: 2010年6月
- Stream: IETF
- 勘误: 无勘误
文档信息
- RFC 编号: 5880
- 标题: Bidirectional Forwarding Detection (BFD)
- 作者: D. Katz, D. Ward (Juniper Networks)
- 发布日期: 2010年6月
- 类别: Standards Track (标准跟踪)
- ISSN: 2070-1721
Abstract (摘要)
本文档描述了一个用于检测两个转发引擎之间双向路径故障的协议, 包括接口, 数据链路, 以及在可能的范围内转发引擎本身, 并具有潜在的极低延迟.它独立于媒体, 数据协议和路由协议运行.
Status of This Memo (本备忘录的状态)
这是一份互联网标准跟踪文档.
本文档是互联网工程任务组 (IETF, Internet Engineering Task Force) 的产品.它代表了 IETF 社区的共识.它已经接受了公众审查, 并已被互联网工程指导组 (IESG, Internet Engineering Steering Group) 批准发布.有关互联网标准的更多信息可在 RFC 5741 的第 2 节中找到.
有关本文档当前状态, 任何勘误表以及如何提供反馈的信息可在 http://www.rfc-editor.org/info/rfc5880 获得.
Copyright Notice (版权声明)
Copyright (c) 2010 IETF Trust 及确定为本文档作者的人员.保留所有权利.
本文档受 BCP 78 和 IETF Trust 与 IETF 文档相关的法律规定 (http://trustee.ietf.org/license-info) 的约束, 这些规定在本文档发布之日有效.请仔细阅读这些文档, 因为它们描述了您对本文档的权利和限制.从本文档中提取的代码组件必须包含信托法律规定第 4.e 节中所述的简化 BSD 许可证文本, 并按简化 BSD 许可证中所述提供且不提供担保.
6.7. Authentication (认证)
BFD 控制包中可能存在可选的认证段 (Authentication Section).在其通用形式中, 认证段的目的是基于所使用的认证类型携带所有必要的信息, 以允许接收系统确定接收到的数据包的有效性.确切的机制取决于所使用的认证类型, 但通常发送系统将在认证段中放置为数据包有效性担保的信息, 接收系统将检查认证段并接受数据包进行进一步处理或丢弃它.
两个系统显然必须使用相同的认证类型以及任何密钥或其他必要的信息.认证类型的协商, 密钥交换等都超出了本规范的范围, 预期通过协议之外的方式执行.
请注意, 在下面的小节中, "接受" 数据包仅意味着数据包已通过认证; 实际上它可能因第 6.8.6 节中描述的一般数据包接收规则所述的其他原因而被丢弃.
支持认证的实现必须支持两种类型的 SHA1 认证.其他形式的认证是可选的.
6.7.1. Enabling and Disabling Authentication (启用和禁用认证)
可能需要在会话上启用或禁用认证而不干扰会话状态.这样做的确切机制超出了本规范的范围.然而, 指出支持此机制的一些问题是有用的.
在简单的实现中, 当认证被打开或关闭时, BFD 会话将失败, 因为数据包接受规则基本上要求本地和远程机器以或多或少同步的方式这样做 (在检测时间内)——只有在认证 "正在使用" 时才会接受带有认证的数据包 (同样没有认证的数据包).
一种可能的方法是构建一个实现, 使得认证被配置, 但直到接收到包含匹配认证段的第一个数据包 (提供必要的同步) 才被认为 "正在使用".同样, 认证可以被配置为关闭, 但仍被认为 "正在使用", 直到接收到没有认证段的第一个数据包.
为了避免安全风险, 使用此方法的实现应该只允许认证状态最多更改一次, 而无需某种形式的干预 (这样认证就不能仅根据从远程系统接收到的 BFD 控制包而反复打开和关闭).除非期望启用或禁用认证, 否则实现不应允许认证状态基于 BFD 控制包的接收而改变.
6.7.2. Simple Password Authentication (简单密码认证)
最直接 (也是最弱) 的认证形式是简单密码认证 (Simple Password Authentication).在这种认证方法中, 在每个系统中配置一个或多个密码 (带有相应的密钥 ID), 并且这些密码/ID 对中的一个被携带在每个 BFD 控制包中.如果密码和密钥 ID 与该系统中配置的密码/ID 对之一匹配, 则接收系统接受数据包.
使用简单密码认证的传输
会话当前选择的密码和密钥 ID 必须存储在每个传出 BFD 控制包的认证段中.Auth Type 字段必须设置为 1 (简单密码).Auth Len 字段必须设置为适当的长度 (4 到 19 字节).
密码是二进制字符串, 必须长度为 1 到 16 字节.为了互操作性, 配置密码的管理接口必须接受 ASCII 字符串, 并且还应该允许以十六进制形式配置任何任意二进制字符串.可以支持其他配置方法.
使用简单密码认证的接收
如果接收到的 BFD 控制包不包含认证段, 或者 Auth Type 不是 1 (简单密码), 则必须丢弃接收到的数据包.
如果 Auth Key ID 字段与配置的密码的 ID 不匹配, 则必须丢弃接收到的数据包.
如果 Auth Len 字段不等于密钥 ID 选择的密码长度加三, 则必须丢弃数据包.
如果 Password 字段与密钥 ID 选择的密码不匹配, 则必须丢弃数据包.
否则, 必须接受数据包.
6.7.3. Keyed MD5 密钥 MD5 和严格密钥 MD5 认证 (and Meticulous Keyed MD5 Authentication)
密钥 MD5 和严格密钥 MD5 认证机制与其他协议中使用的机制非常相似.在这些认证方法中, 在每个系统中配置一个或多个秘密密钥 (带有相应的密钥 ID).其中一个密钥包含在对传出 BFD 控制包计算的 MD5 [MD5] 摘要中, 但密钥本身不在数据包中携带.为了帮助避免重放攻击, 每个数据包中还携带一个序列号.对于密钥 MD5, 序列号偶尔递增.对于严格密钥 MD5, 序列号在每个数据包上递增.
如果密钥 ID 与配置的密钥之一匹配, 包括所选密钥的 MD5 摘要与数据包中携带的摘要匹配, 并且序列号大于或等于最后接收的序列号 (对于密钥 MD5) 或严格大于最后接收的序列号 (对于严格密钥 MD5), 则接收系统接受数据包.
使用密钥 MD5 和严格密钥 MD5 认证的传输
Auth Type 字段必须设置为 2 (密钥 MD5) 或 3 (严格密钥 MD5).Auth Len 字段必须设置为 24.Auth Key ID 字段必须设置为当前认证密钥的 ID.Sequence Number 字段必须设置为 bfd.XmitAuthSeq.
认证密钥值是最多 16 字节的二进制字符串, 并且必须放入 Auth Key/Digest 字段中, 根据需要用尾随零字节填充.为了互操作性, 配置密钥的管理接口必须接受 ASCII 字符串, 并且还应该允许以十六进制形式配置任何任意二进制字符串.可以支持其他配置方法.
必须在整个 BFD 控制包上计算 MD5 摘要.生成的摘要必须在传输之前存储在 Auth Key/Digest 字段中 (替换秘密密钥, 秘密密钥不能在数据包中携带).
对于密钥 MD5, bfd.XmitAuthSeq 可以以循环方式递增 (当被视为无符号 32 位值时).bfd.XmitAuthSeq 应该在会话状态改变时递增, 或者当传输的 BFD 控制包携带与先前传输的数据包不同的内容时递增.何时递增 bfd.XmitAuthSeq 的决定超出了本规范的范围.请参阅下面标题为 "安全注意事项" 的部分进行讨论.
对于严格密钥 MD5, bfd.XmitAuthSeq 必须以循环方式递增 (当被视为无符号 32 位值时).
使用密钥 MD5 和严格密钥 MD5 认证的接收
如果接收到的 BFD 控制包不包含认证段, 或者 Auth Type 不正确 (密钥 MD5 为 2 或严格密钥 MD5 为 3), 则必须丢弃接收到的数据包.
如果 Auth Key ID 字段与配置的认证密钥的 ID 不匹配, 则必须丢弃接收到的数据包.
如果 Auth Len 字段不等于 24, 则必须丢弃数据包.
如果 bfd.AuthSeqKnown 为 1, 则检查 Sequence Number 字段.对于密钥 MD5, 如果序列号位于 bfd.RcvAuthSeq 到 bfd.RcvAuthSeq+(3Detect Mult) 包含的范围之外 (当被视为无符号 32 位循环数空间时), 则必须丢弃接收到的数据包.对于严格密钥 MD5, 如果序列号位于 bfd.RcvAuthSeq+1 到 bfd.RcvAuthSeq+(3Detect Mult) 包含的范围之外 (当被视为无符号 32 位循环数空间时), 则必须丢弃接收到的数据包.
否则 (bfd.AuthSeqKnown 为 0), bfd.AuthSeqKnown 必须设置为 1, 并且 bfd.RcvAuthSeq 必须设置为接收到的 Sequence Number 字段的值.
用接收到的 Auth Key ID 字段选择的认证密钥替换 Auth Key/Digest 字段的内容.如果整个 BFD 控制包的 MD5 摘要等于 Auth Key/Digest 字段的接收值, 则必须接受接收到的数据包.否则 (摘要与 Auth Key/Digest 字段不匹配), 必须丢弃接收到的数据包.
6.7.4. Keyed SHA1 密钥 SHA1 和严格密钥 SHA1 认证 (and Meticulous Keyed SHA1 Authentication)
密钥 SHA1 和严格密钥 SHA1 认证机制与其他协议中使用的机制非常相似.在这些认证方法中, 在每个系统中配置一个或多个秘密密钥 (带有相应的密钥 ID).其中一个密钥包含在对传出 BFD 控制包计算的 SHA1 [SHA1] 哈希中, 但密钥本身不在数据包中携带.为了帮助避免重放攻击, 每个数据包中还携带一个序列号.对于密钥 SHA1, 序列号偶尔递增.对于严格密钥 SHA1, 序列号在每个数据包上递增.
如果密钥 ID 与配置的密钥之一匹配, 包括所选密钥的 SHA1 哈希与数据包中携带的哈希匹配, 并且序列号大于或等于最后接收的序列号 (对于密钥 SHA1) 或严格大于最后接收的序列号 (对于严格密钥 SHA1), 则接收系统接受数据包.
使用密钥 SHA1 和严格密钥 SHA1 认证的传输
Auth Type 字段必须设置为 4 (密钥 SHA1) 或 5 (严格密钥 SHA1).Auth Len 字段必须设置为 28.Auth Key ID 字段必须设置为当前认证密钥的 ID.Sequence Number 字段必须设置为 bfd.XmitAuthSeq.
认证密钥值是最多 20 字节的二进制字符串, 并且必须放入 Auth Key/Hash 字段中, 根据需要用尾随零字节填充.为了互操作性, 配置密钥的管理接口必须接受 ASCII 字符串, 并且还应该允许以十六进制形式配置任何任意二进制字符串.可以支持其他配置方法.
必须在整个 BFD 控制包上计算 SHA1 哈希.生成的哈希必须在传输之前存储在 Auth Key/Hash 字段中 (替换秘密密钥, 秘密密钥不能在数据包中携带).
对于密钥 SHA1, bfd.XmitAuthSeq 可以以循环方式递增 (当被视为无符号 32 位值时).bfd.XmitAuthSeq 应该在会话状态改变时递增, 或者当传输的 BFD 控制包携带与先前传输的数据包不同的内容时递增.何时递增 bfd.XmitAuthSeq 的决定超出了本规范的范围.请参阅下面标题为 "安全注意事项" 的部分进行讨论.
对于严格密钥 SHA1, bfd.XmitAuthSeq 必须以循环方式递增 (当被视为无符号 32 位值时).
使用密钥 SHA1 和严格密钥 SHA1 认证的接收
如果接收到的 BFD 控制包不包含认证段, 或者 Auth Type 不正确 (密钥 SHA1 为 4 或严格密钥 SHA1 为 5), 则必须丢弃接收到的数据包.
如果 Auth Key ID 字段与配置的认证密钥的 ID 不匹配, 则必须丢弃接收到的数据包.
如果 Auth Len 字段不等于 28, 则必须丢弃数据包.
如果 bfd.AuthSeqKnown 为 1, 则检查 Sequence Number 字段.对于密钥 SHA1, 如果序列号位于 bfd.RcvAuthSeq 到 bfd.RcvAuthSeq+(3Detect Mult) 包含的范围之外 (当被视为无符号 32 位循环数空间时), 则必须丢弃接收到的数据包.对于严格密钥 SHA1, 如果序列号位于 bfd.RcvAuthSeq+1 到 bfd.RcvAuthSeq+(3Detect Mult) 包含的范围之外 (当被视为无符号 32 位循环数空间时), 则必须丢弃接收到的数据包.
否则 (bfd.AuthSeqKnown 为 0), bfd.AuthSeqKnown 必须设置为 1, bfd.RcvAuthSeq 必须设置为接收到的 Sequence Number 字段的值, 并且必须接受接收到的数据包.
用接收到的 Auth Key ID 字段选择的认证密钥替换 Auth Key/Hash 字段的内容.如果整个 BFD 控制包的 SHA1 哈希等于 Auth Key/Hash 字段的接收值, 则必须接受接收到的数据包.否则 (哈希与 Auth Key/Hash 字段不匹配), 必须丢弃接收到的数据包.
6.8. Functional Specifics (功能细节)
本规范的以下部分是规范性的.实现此规范的方法超出了本规范的范围.
当一个系统被说成 "回显功能激活" 时, 意味着该系统正在发送 BFD 回显包, 这暗示会话处于 Up 状态, 并且另一个系统已发出信号表示愿意回环回显包.
当本地系统被说成 "按需模式激活" 时, 意味着本地系统中的 bfd.DemandMode 为 1 (参见第 6.8.1 节), 会话处于 Up 状态, 并且远程系统发出信号表示会话处于 Up 状态.
当远程系统被说成 "按需模式激活" 时, 意味着 bfd.RemoteDemandMode 为 1 (远程系统在最后接收到的 BFD 控制包中设置了 Demand (D) 位), 会话处于 Up 状态, 并且远程系统发出信号表示会话处于 Up 状态.
6.8.2. Timer Negotiation (定时器协商)
用于确定 BFD 数据包传输间隔和会话检测时间的时间值是持续协商的, 因此可以随时更改.每个会话的每个方向的协商和时间值是独立的.
每个系统在 BFD 控制包中报告它希望多快地传输 BFD 数据包, 以及它准备多快地接收它们.这允许任一系统单方面确定两个方向上的最大数据包速率 (最小间隔).
有关数据包传输时序和协商的详细信息, 请参见第 6.8.7 节.
6.8.3. Timer Manipulation (定时器操作)
用于确定 BFD 数据包传输间隔和会话检测时间的时间值可以随时修改而不影响会话状态.当定时器参数因任何原因更改时, 本节的要求适用.
如果 bfd.DesiredMinTxInterval 更改或 bfd.RequiredMinRxInterval 更改, 则必须启动轮询序列 (参见第 6.5 节).如果接收轮询序列的系统希望更改本段中描述的参数, 则新参数值可以在设置了 Final (F) 位的数据包中携带, 即使尚未发送轮询序列.
如果增加 bfd.DesiredMinTxInterval 并且 bfd.SessionState 为 Up, 则在上述轮询序列终止之前, 使用的实际传输间隔不能更改.这是为了确保远程系统在传输间隔增加之前更新其检测时间.
如果减少 bfd.RequiredMinRxInterval 并且 bfd.SessionState 为 Up, 则在计算远程系统的检测时间时, 必须使用 bfd.RequiredMinRxInterval 的先前值, 直到上述轮询序列终止.这是为了确保在检测时间减少之前, 远程系统以更高的速率传输数据包 (并且正在接收这些数据包).
当 bfd.SessionState 不是 Up 时, 系统必须将 bfd.DesiredMinTxInterval 设置为不少于一秒 (1,000,000 微秒) 的值.这旨在确保不是 Up 的 BFD 会话消耗的带宽可以忽略不计, 特别是在邻居可能未运行 BFD 的情况下.
如果本地系统由于 bfd.RemoteMinRxInterval 减少 (远程系统在 Required Min RX Interval 中宣传了减少的值) 而减少其传输间隔, 并且远程系统不处于按需模式, 则本地系统必须立即遵守新的间隔.换句话说, 本地系统在上一次数据包传输和下一次数据包传输之间不能等待超过新间隔.如果自上次传输以来此间隔已经过去 (因为新间隔明显较短), 则本地系统必须尽快发送下一个周期性 BFD 控制包.
当回显功能激活时, 系统应该将 bfd.RequiredMinRxInterval 设置为不少于一秒 (1,000,000 微秒) 的值.这旨在将接收到的 BFD 控制流量保持在可忽略的水平, 因为实际的检测功能正在使用 BFD 回显包执行.
在除上述明确指出的情况之外的任何情况下, 必须立即实施时序参数更改 (更改传输速率和/或检测时间).
请注意, 如果进行了多个参数更改, 这些参数更改需要使用轮询序列机制, 并且这些多个更改分布在多个数据包中, 则轮询序列机制是模糊的 (因为返回的 Final 的语义不清楚).因此, 如果进行了需要使用轮询序列的多个更改, 则有三种选择: 1) 它们必须在单个 BFD 控制包中通信 (以便 Final 回复的语义清楚), 或 2) 必须在轮询序列完成后经过足够的时间以消除歧义 (自上次传输 Poll 以来至少一个往返时间) 后才能启动另一个轮询序列, 或 3) 在启动另一个轮询序列之前, 必须在轮询序列完成后接收到一个 Final (F) 位清除的附加 BFD 控制包 (当按需模式激活时, 此选项不可用).
6.8.4. Calculating the Detection Time (计算检测时间)
检测时间 (没有接收到 BFD 数据包后会话被确定失败的时间段) 不在协议中明确携带.相反, 它在每个方向上由接收系统根据协商的传输间隔和检测乘数独立计算.请注意, 每个方向上可能有不同的检测时间.
当处于按需模式与异步模式时, 检测时间的计算略有不同.
在异步模式下, 本地系统计算的检测时间等于从远程系统接收的 Detect Mult 值, 乘以远程系统的商定传输间隔 (bfd.RequiredMinRxInterval 和最后接收的 Desired Min TX Interval 中的较大值).Detect Mult 值是 (粗略地说, 由于抖动) 必须连续丢失的数据包数量才能声明会话关闭.
如果按需模式未激活, 并且等于检测时间的时间段内未从远程系统接收到 BFD 控制包, 并且 bfd.SessionState 为 Init 或 Up, 则会话已关闭——本地系统必须将 bfd.SessionState 设置为 Down, 并将 bfd.LocalDiag 设置为 1 (控制检测时间到期, Control Detection Time Expired).
在按需模式下, 本地系统计算的检测时间等于 bfd.DetectMult 乘以本地系统的商定传输间隔 (bfd.DesiredMinTxInterval 和 bfd.RemoteMinRxInterval 中的较大值).bfd.DetectMult 是 (粗略地说, 由于抖动) 必须连续丢失的数据包数量才能声明会话关闭.
如果按需模式激活, 并且在启动轮询序列 (传输设置了 Poll 位的第一个 BFD 控制包) 后, 等于检测时间的时间段过去了, 则会话已关闭——本地系统必须将 bfd.SessionState 设置为 Down, 并将 bfd.LocalDiag 设置为 1 (控制检测时间到期).
(请注意, 对于检测时间到期的目的, 只有在根据第 6.8.6 节的规则未被 "丢弃" 的情况下, 才认为数据包已被接收).
6.8.5. Detecting Failures with the Echo Function (使用回显功能检测故障)
当回显功能激活并且足够数量的回显包没有按预期到达时, 会话已关闭——本地系统必须将 bfd.SessionState 设置为 Down, 并将 bfd.LocalDiag 设置为 2 (回显功能失败, Echo Function Failed).
检测回显功能故障的方法超出了本规范的范围.任何能够检测通信故障的方法都是可以接受的.
6.8.6. Reception of BFD Control Packets (接收 BFD 控制包)
当接收到 BFD 控制包时, 必须按照指定的顺序遵循以下过程.如果根据这些规则丢弃数据包, 则必须在该点停止处理数据包.
如果版本号不正确 (1), 则必须丢弃数据包.
如果 Length 字段小于最小正确值 (如果 A 位清除则为 24, 如果 A 位设置则为 26), 则必须丢弃数据包.
如果 Length 字段大于封装协议的有效载荷, 则必须丢弃数据包.
如果 Detect Mult 字段为零, 则必须丢弃数据包.
如果 Multipoint (M) 位非零, 则必须丢弃数据包.
如果 My Discriminator 字段为零, 则必须丢弃数据包.
如果 Your Discriminator 字段非零, 则必须使用它来选择与此 BFD 数据包关联的会话.如果未找到会话, 则必须丢弃数据包.
如果 Your Discriminator 字段为零并且 State 字段不是 Down 或 AdminDown, 则必须丢弃数据包.
如果 Your Discriminator 字段为零, 则必须根据其他字段的某种组合来选择会话, 可能包括源地址信息, My Discriminator 字段, 以及接收数据包的接口.确切的选择方法是应用特定的, 因此超出了本规范的范围.如果未找到匹配的会话, 则可以创建新会话, 或者可以丢弃数据包.此选择超出了本规范的范围.
如果设置了 A 位并且没有使用认证 (bfd.AuthType 为零), 则必须丢弃数据包.
如果清除了 A 位并且正在使用认证 (bfd.AuthType 非零), 则必须丢弃数据包.
如果设置了 A 位, 则必须根据第 6.7 节的规则, 基于正在使用的认证类型 (bfd.AuthType) 对数据包进行认证.这可能导致数据包被丢弃.
将 bfd.RemoteDiscr 设置为 My Discriminator 的值.
将 bfd.RemoteState 设置为 State (Sta) 字段的值.
将 bfd.RemoteDemandMode 设置为 Demand (D) 位的值.
将 bfd.RemoteMinRxInterval 设置为 Required Min RX Interval 的值.
如果 Required Min Echo RX Interval 字段为零, 则必须停止传输回显包 (如果有).
如果本地系统正在传输轮询序列并且接收到的数据包中设置了 Final (F) 位, 则必须终止轮询序列.
按第 6.8.2 节中的描述更新传输间隔.
按第 6.8.4 节中的描述更新检测时间.
如果 bfd.SessionState 为 AdminDown
丢弃数据包
如果接收到的 state 为 AdminDown
如果 bfd.SessionState 不是 Down
将 bfd.LocalDiag 设置为 3 (邻居发出会话关闭信号, Neighbor signaled session down)
将 bfd.SessionState 设置为 Down
否则
如果 bfd.SessionState 为 Down
如果接收到的 State 为 Down
将 bfd.SessionState 设置为 Init
否则如果接收到的 State 为 Init
将 bfd.SessionState 设置为 Up
否则如果 bfd.SessionState 为 Init
如果接收到的 State 为 Init 或 Up
将 bfd.SessionState 设置为 Up
否则 (bfd.SessionState 为 Up)
如果接收到的 State 为 Down
将 bfd.LocalDiag 设置为 3 (邻居发出会话关闭信号)
将 bfd.SessionState 设置为 Down
检查是否应激活按需模式 (参见第 6.6 节).
如果 bfd.RemoteDemandMode 为 1, bfd.SessionState 为 Up, 并且 bfd.RemoteSessionState 为 Up, 则远程系统上激活按需模式, 并且本地系统必须停止 BFD 控制包的周期性传输 (参见第 6.8.7 节).
如果 bfd.RemoteDemandMode 为 0, 或 bfd.SessionState 不是 Up, 或 bfd.RemoteSessionState 不是 Up, 则远程系统上未激活按需模式, 并且本地系统必须发送周期性 BFD 控制包 (参见第 6.8.7 节).
如果设置了 Poll (P) 位, 则向远程系统发送清除 Poll (P) 位并设置 Final (F) 位的 BFD 控制包 (参见第 6.8.7 节).
如果数据包未被丢弃, 则就第 6.8.4 节中的检测时间到期规则而言, 它已被接收.
6.8.7. Transmitting BFD Control Packets (发送 BFD 控制包)
除本节其余部分列出的例外情况外, 系统不能以小于 bfd.DesiredMinTxInterval 和 bfd.RemoteMinRxInterval 中较大者的间隔传输 BFD 控制包, 减去应用的抖动 (见下文).换句话说, 报告较慢速率的系统决定传输速率.
BFD 控制包的周期性传输必须在每个数据包的基础上进行抖动, 最多 25%, 即间隔必须减少 0 到 25% 的随机值, 以避免与同一子网上的其他系统自同步.因此, 数据包之间的平均间隔将比协商的间隔少约 12.5%.
如果 bfd.DetectMult 等于 1, 则传输的 BFD 控制包之间的间隔必须不超过协商的传输间隔的 90%, 并且必须不少于协商的传输间隔的 75%.这是为了确保在远程系统上, 计算的检测时间不会在接收到下一个 BFD 控制包之前过期.
每当 bfd.DesiredMinTxInterval 更改时, 或每当 bfd.RemoteMinRxInterval 更改时, 都必须重新计算传输间隔, 并且等于这两个值中的较大者.有关传输定时器的详细信息, 请参见第 6.8.2 和 6.8.3 节.
如果 bfd.RemoteDiscr 为零并且系统采取被动角色, 则系统不能传输 BFD 控制包.
如果 bfd.RemoteMinRxInterval 为零, 则系统不能周期性地传输 BFD 控制包.
如果按需模式在远程系统上激活 (bfd.RemoteDemandMode 为 1, bfd.SessionState 为 Up, 并且 bfd.RemoteSessionState 为 Up) 并且没有传输轮询序列, 则系统不能周期性地传输 BFD 控制包.
如果接收到设置了 Poll (P) 位为 1 的 BFD 控制包, 则接收系统必须尽快传输清除 Poll (P) 位并设置 Final (F) 位的 BFD 控制包, 而不考虑传输定时器或任何其他传输限制, 不考虑会话状态, 并且不考虑任一系统上是否激活按需模式.系统可以限制传输此类数据包的速率.如果速率限制生效, Desired Min TX Interval 的宣传值必须大于或等于速率限制功能强加的传输数据包之间的间隔.
除非 bfd.DemandMode 为 1, bfd.SessionState 为 Up, 并且 bfd.RemoteSessionState 为 Up, 否则系统不能设置 Demand (D) 位.
当该数据包的内容与先前传输的数据包 (Poll 和 Final 位除外) 的内容不同时, 应该在周期性控制包传输之间的间隔期间传输 BFD 控制包, 以更快速地传达状态变化.
传输的 BFD 控制包的内容必须设置如下:
Version
设置为当前版本号 (1).
Diagnostic (Diag)
设置为 bfd.LocalDiag.
State (Sta)
设置为 bfd.SessionState 指示的值.
Poll (P)
如果本地系统正在发送轮询序列, 则设置为 1, 否则设置为 0.
Final (F)
如果本地系统正在响应设置了 Poll (P) 位的接收到的控制包, 则设置为 1, 否则设置为 0.
Control Plane Independent (C)
如果本地系统的 BFD 实现独立于控制平面 (它可以在控制平面中断的情况下继续运行), 则设置为 1.
Authentication Present (A)
如果此会话上正在使用认证 (bfd.AuthType 非零), 则设置为 1, 否则设置为 0.
Demand (D)
如果 bfd.SessionState 为 Up 并且 bfd.RemoteSessionState 为 Up, 则设置为 bfd.DemandMode.否则, 设置为 0.
Multipoint (M)
设置为 0.
Detect Mult
设置为 bfd.DetectMult.
Length
设置为适当的长度, 基于固定头部长度 (24) 加上任何认证段.
My Discriminator
设置为 bfd.LocalDiscr.
Your Discriminator
设置为 bfd.RemoteDiscr.
Desired Min TX Interval
设置为 bfd.DesiredMinTxInterval.
Required Min RX Interval
设置为 bfd.RequiredMinRxInterval.
Required Min Echo RX Interval
设置为此会话所需的最小回显包接收间隔.如果此字段设置为零, 则本地系统不愿意或无法将 BFD 回显包回环到远程系统, 并且远程系统将不发送回显包.
Authentication Section
如果正在使用认证 (bfd.AuthType 非零), 则根据第 6.7 节中的规则包含并设置.否则, 此段不存在.
6.8.8. Reception of BFD Echo Packets (接收 BFD 回显包)
接收到的 BFD 回显包必须解复用到适当的会话进行处理.必须实现检测丢失的回显包的方法, 这很可能涉及对接收到的回显包的处理.接收到的回显包的处理在其他方面超出了本规范的范围.
6.8.9. Transmission of BFD Echo Packets (发送 BFD 回显包)
当 bfd.SessionState 不是 Up 时, 不能传输 BFD 回显包.除非从远程系统接收到的最后一个 BFD 控制包在 Required Min Echo RX Interval 中包含非零值, 否则不能传输 BFD 回显包.
当 bfd.SessionState 为 Up 时, 可以传输 BFD 回显包.传输的 BFD 回显包之间的间隔不能小于远程系统在 Required Min Echo RX Interval 中宣传的值, 除非如下:
可以对传输速率应用 25% 的抖动, 使得实际间隔可以在宣传值的 75% 到 100% 之间.可以在正常计划的回显传输间隔之间传输单个 BFD 回显包.
BFD 回显包的传输在其他方面超出了本规范的范围.