RFC5880(BFD)中文翻译

双向转发检测(RFC5880

文天

20171110

 

 

写在前面:文档由译者根据我司BFD关心的功能将RFC5880中相应章节翻译成中文,由于水平有限,必然有理解不准确的地方,仅供参考,严格的协议标准以RFC5880文档为准。

 

 

目录

1. 简介 3

1.1 文档中的约定 3

2. 设计 3

3. 协议综述 3

3.1 定址和会话建立 3

4. BFD控制报文格式 4

4.1 一般的BFD控制报文格式 4

4.2 简单秘钥认证标准 5

4.3 keyed MD5Meticulous keyed MD5认证标准 5

4.4 Keyed SHA1Meticulous Keyed SHA1认证标准 6

5. BFD回声报文格式 6

6. 程序要素 6

6.1 综述 6

6.2 BFD状态机 6

6.3 多路分解和标志域 7

6.4 回声功能和Asymmetry 7

6.5 poll序列 7

6.6 查询模式 7

6.7 认证 8

6.7.1 开启和关闭认证 8

6.7.2 简单秘钥认证 8

6.7.3 keyed MD5Meticulous keyed MD5认证 8

6.7.4 Keyed SHA1Meticulous Keyed SHA1认证 8

6.8 功能细节 8

6.8.1 状态变量 8

6.8.2 定时器协商 9

6.8.3 定时器操作 9

6.8.4 计算检测时间 10

6.8.5 回声功能检测失败 10

6.8.6 BFD控制报文收包处理 10

6.8.7 BFD控制报文发包处理 11

6.8.8 BFD回声报文收包处理 12

6.8.9 BFD回声报文发包处理 12

6.8.10 最小收包时间间隔变化 12

6.8.11 最小发包时间间隔变化 12

6.8.12 检测倍数变化 12

6.8.13 使能或去使能回声功能 13

6.8.14 使能或去使能查询模式 13

6.8.15 转发面重置 13

6.8.16 管理控制 13

6.8.17 Concatenated Paths (串联路径?) 13

6.8.18 会话保持down状态 13

7. 运行考虑 13

8. IANA考虑 13

9. 安全考虑 13

10. 参考文献 13

附录A向后兼容 13

附录B贡献者 13

附录C致谢 14

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1. 简介

(略)

1.1 文档中的约定

(略)

2. 设计

BFD被设计用来监测转发面下一跳通信的异常。它通常运行于转发引擎和控制引擎分离的系统中转发引擎的某些组件中。这不仅是将协议更多的与转发引擎绑定而且实现了与路由协议引擎的解耦,使得这些协议可以实现“优美重启”——业务重启而检测机制不中断。BFD也可以运行在控制引擎上,虽然这会妨碍一些类型问题的检测。

BFD运行在任何数据面的顶层(网络层,链路层,隧道,等)在两个系统间被转发,多数情况下它以单播,点对点模式运行。BFD报文可以作为负载封装在任何合适的协议报文中在特定媒介或者网络中传输。在一个系统中,BFD可以同时运行在多个层面,任何特定的BFD会话运行环境都是与它的封装绑定的。

BFD可以给任何类型的链路提供故障检测,包括直连物理链路,虚拟电路,隧道,MPLS标签转发路径,多跳路由路径,单向链路。多重BFD会话可以在同样的两个系统间建立。

BFD状态机在建立会话和解除会话时都要通过三次握手机制,确保通信双方都能了解状态的变化。

概括一下BFD就是一个简单的服务,被服务业务提供目的地址和其它参数供BFD的创建、删除和更新。bfd返回给被服务业务链路的实时状态。

 

3. 协议综述

BFD在很多方面与路由协议的hello机制是一样的。两个系统之间相互交互周期性的BFD报文,如果一个系统在一定的时间内没有收到BFD报文,则认为链路故障。在一些考虑中,系统之间协商并不通过周期性的发送BFD报文以减少对带宽资源的占用。

一个路径只有在两个系统间已经建立双向通信才能够运行(BFD),虽然不排除在单向链路中的使用。

每一条通信路径都可以建立BFD会话,彼此间是相分离的。

每个系统都会估计它的BFD发包频率和收包频率并且和邻居协商以确定BFD的检测时间。这些估计值可以适时调整以适应不同的情况。这种设计允许快速系统和慢速系统共享传输媒介的时候快速系统能够快速的检测到故障且慢速系统能够分享快速系统的这种能力。

 

3.1 定址和会话建立

BFD会话根据业务需要而建立,BFD本身没有邻居发现机制,它的邻居地址需要业务来发现并通告BFD,例如ospf通过它的hello机制建立邻居,并将邻居地址通告给BFD

 

3.2 运行模式

BFD有两种运行模式和一种辅助功能。辅助功能可以与两种运行模式联合使用。

异步模式是BFD的一种主要运行模式,在这种模式下,系统向邻居周期性的发送BFD控制报文,并且如果没有收到一定数量的来自对端的BFD控制报文(检测时间内应该收到的报文数量),则宣告会话down

查询模式是BFD的另一种工作模式,在这种模式下,它假定系统有一个独立的路径来确定它与邻居之间的连通性。一旦BFD会话建立起来,系统便会询问它的邻居停止发送BFD控制报文,直到系统需要检验连通性的时候,会与邻居交互一连串的BFD控制报文,如果正常收到相应的BFD控制报文,则继续静默,否则,宣告会话down。查询模式中,两个方向会话是相互独立的。

这两种主要的工作模式有一个辅助功能就是回声功能。回声功能开启后,会发一串回声报文流并等待对端将该报文流环回回来。如果没有收到,宣告会话down。回声功能是和异步模式或查询模式一起使用的,当开启回声功能后,回声功能承担了检测任务,异步模式的发包频率可以减小,查询模式可以完全不发包。

纯异步模式可以完成一些开启回声功能后无法完成的任务。回声功能开启可以减少对带宽资源的消耗。

回声功能可以只在一个方向开启,要求对端具有环回功能。

查询模式适用于周期报文占用过多带宽资源的场景,比如配了大量的BFD会话,每一个会话都需要周期发送BFD控制报文,对链路带宽的占用会非常明显。查询模式BFD无法快速检测到突发的链路故障。

 

4. BFD控制报文格式

BFD控制报文需要封装在适当的报文中发出去,比如封装在udp中或者作为icmptlv封装在ping报文中,视环境而定。

 

4.1 一般的BFD控制报文格式

BFD控制报文分为强制部分和可选部分,强制部分24字节,可选部分最短2字节。

 RFC5880(BFD)中文翻译

 

Version (Vers)  协议版本号,本文档定义为1

Diagnostic (Diag)  诊断类型字段,记录本地系统最近一次状态变化的原因,有以下值:

     0 --

1 -- 控制检测时间超时

2 -- 回声功能失败

3 -- 邻居标记会话down

4 -- 转发面重置

5 -- 路径down

6 -- Concatenated Path Down

7 -- 管理down

8 -- Reverse Concatenated Path Down

931 -- 保留

State (Sta) 当前BFD会话状态:

0 -- 管理down

1 -- down

2 -- init

3 -- up

Poll (P)  若置位的话,系统要求检测链路状态,或者有参数变化,发送P位置位的包(下文简称P包),并期待收到F位置位的包(下文简称F包)。若复位的话,标明系统不需要检测链路状态。

Final (F)  若置位的话,标明系统在回应P包,若复位,标明系统并没有在回应P包。

Control Plane Independent (C)  若置位,标明BFD的运行独立于控制面(换句话说BFD运行于转发面,可以在控制面故障的时候继续运行),若复位,表明控制面不独立,BFD的功能受控制面状态影响。

Authentication Present (A)  若置位,标明需要认证。

Demand (D)  若置位,查询模式开启(此时两边BFD状态都为up,通知对端停止发送周期报文),若复位,查询模式关闭。

Multipoint (M)  保留,用于未来点对多点BFD实现,必须置0

Detect Mult  检测倍数,在异步模式系统中,检测倍数与协商的最小发包时间间隔乘积决定检测时间。

Length  BFD控制报文长度,单位byte

My Discriminator  本端标识符,唯一标示本端的某一个BFD会话。

Your Discriminator  远端标识符,唯一标示远端的某一个BFD会话,若不知道远端标识符,则置0

Desired Min TX Interval  期望最小发包间隔,单位ms,标明本端系统发包的最快频率。

Required Min RX Interval  要求最小收包间隔,单位ms,标明本端支持的最快收包频率。如果为0,标明本端不支持接收周期BFD控制报文。

Required Min Echo RX Interval  要求最小回声报文收包间隔,单位ms,标明本端支持的最快回声报文收包频率。如果为0,标明本端不支持接收BFD回声报文。

Auth Type  认证类型。

0 -- 保留

1 -- 简单秘钥

2 -- Keyed MD5

3 -- Meticulous Keyed MD5

4 -- Keyed SHA1

5 -- Meticulous Keyed SHA1

6 -- 255 保留做未来使用

Auth Len  认证部分长度,单位byte

 

4.2 简单秘钥认证标准

(略)

4.3 keyed MD5Meticulous keyed MD5认证标准

(略)

4.4 Keyed SHA1Meticulous Keyed SHA1认证标准

(略)

5. BFD回声报文格式

(略)

6. 程序要素

本节讨论协议规范。(略)

本节所用的"bfd.Xx" 指的是状态变量,注意与报文中的域区别。(略)

6.1 综述

BFD会话中,一个系统可能扮演主动角色或者被动角色。对一个特定的会话主动方必须要发BFD控制报文,而无论它是否收到了报文,被动方必须不发送BFD报文知道它收到了第一个BFD报文并且解析到了远端的BFD标识符。(略)

BFD会话需要慢启动,再建立会话之前交互周期性的低速控制报文,当双向通信建立以后,BFD会话建立。

BFD会话建立起来以后,系统可以根据需要选择是否开启回声功能或者发送其它系统允许的信号。如果开启了回声功能一般发送控制报文的周期就要保持在一个较长的水平。

如果回声功能并未开启,发送控制报文的频率就应该增加到满足会话检测时间的水平。

一旦会话up,系统可能标记它进入查询模式,这时候发送周期控制报文将要停止。如果系统觉得需要检测链路的连通性,可以初始化一个短系列的BFD控制报文(P包)发给对端。如果系统没有进入查询模式,而且在检测时间内没有收到来自对端的控制报文,则宣告会话down,宣告的方式是向远端发送一个state域相应标记的报文。如果开启了回声功能,足够多的回声报文被丢弃了没有收到,也会宣告会话down

如会话down了,回声报文的传送也会停止,BFD控制报文的发送恢复低速(重新回到慢协商过程)。会话down了以后无法回到up状态直到对端也down了以后两端重新通过三次握手协商。管理down也会发送报文携带管理down的信息(sta域和diagnostic域)。

 

6.2 BFD状态机

BFD的状态机非常简单。会话过程中只有三个状态:两个用来建立会话(initup),一个用来断开会话(down)。建立回话和断开会话都需要三次握手确保两端系统都感知到。另外还有一个特殊状态:管理down,使会话可以通过管理手段down,在状态机中管理down也是down状态。每个系统通过发送报文中的sta域发送本端状态,接收报文中的sta域了解对端状态,综合起来决定状态机的跳转。

Down状态意味着会话down。一个会话会维持在down状态直到收到对端的报文并且该报文的sta字段标志着对端状态不是updown或者init),如果收到的是down包,状态机将从down状态跳转到init状态,如果收到的是init包,状态机将从down状态跳转到up状态,如果收到的是up包,状态机维持down状态。(注意以上描述的down包、init包、up包只是BFD控制报文中sta域标志位downinitup的控制包,只是非正式简称,下文出现此种描述也是这个意思)。Down状态意味着转发路径不可达,BFD可以采取相应的动作。Down状态是BFD的基态,如果什么都不发生会永远维持down状态,除非由于管理操作终止了BFD

Init状态意味着远端正在通信,并且本地会话期望进入up状态,但是远端还没有意识到。一个init状态的会话会维持init状态直到收到对端的init包或者up包,就会跳转到up状态,否则等到检测时间超时以后,便会跳转到down状态,意味着与远端的通信丢失。

Up状态意味着BFD会话成功建立,并且正在确认链路的联通性,会话会一直保持在up状态直到链路故障或者管理down操作。如果收到远端的down包或者检测时间超时会话就会从up状态跳转到down状态。

管理down意味着会话是被管理操作down的,这会导致远端系统会话进入down状态,并且一直保持down状态直到本端退出管理down。管理down并不意味着转发路径的连通性问题。下图是BFD状态机。

 

 RFC5880(BFD)中文翻译

 

 

6.3 多路分解和标志域

两个系统之间可能同时运行着多个BFD会话,要有一个算法来分解收到的BFD包确认它所属的会话。

每个系统都必须确定一个唯一的会话标识符来标识一个会话,在一个系统中的有BFD会话都有它的一个唯一的标识符。本地标识符封装在BFD控制报文的my discriminator字段,在远端回应的报文中,该标识符被封装在your discriminator字段。当收到一个远端发过来的BFD报文,本端就是通过识别报文中的your discriminator字段来确认该报文属于哪个本端会话。

注意,系统是允许在不影响会话状态的时候改变会话的本地标识符的,细节部分不再本文档描述范围内。

 

6.4 回声功能和Asymmetry 

(略)

6.5 poll序列

P包是用于在本端BFD控制报文变化的时候确保远端意识到的机制,它也被用在查询模式下验证链路连通性。

P包是周期发送的BFD控制报文,只是该控制报文的P字段置位,远端收到P置位的BFD控制报文后,直接回应一个F置位(P复位)的BFD控制报文(独立于周期发送的原则,直接回应),用来通告本端远端已经意识到本端的参数变化。本端收到F包以后,就会停止发送P包,之后继续发送周期BFD控制报文。任何时候BFD控制报文都不会出现PF同时置位的情况。

停止发送P包以后,如果远端是查询模式,系统将停止发送周期BFD控制报文,如果远端不是查询模式,则继续发送BFD控制报文,远端正常回应。

 

6.6 查询模式

查询模式要求BFD会话的两个方向相互独立,BFD控制报文中的D标志位置位。系统收到D位置位的BFD控制报文后,停止周期发送BFD控制报文。如果两边系统都进入了查询模式,那么两个方向上都不会周期发送BFD控制报文。

查询模式要求用其他的方法确认链路的连通性。在两个方向上不一定要用一样的方法,详细的不在本文档的描述范围内。一种方法是通过使能回声功能。

当一个查询模式的系统需要确认链路连通性的时候,它会初始化一系列的P包发出去,如果没有收到远端回应,P包序列会一直发直到检测时间超时,之后会话宣告down

查询模式的检测时间计算与异步模式有所不同,它根据本地发包频率而不是远端发包频率来计算。

需要注意的是,如果检测时间不大于P序列在两个系统之间往返的时间的话,那用P包查询链路状态的企图一定是失败的。查询模式可以在任何时候开启或者关闭,在两个方向上相互独立,通过BFD控制报文中的D标志置位或者复位来实现,不影响BFD会话的状态。须知两端都必须进入up状态才可以使能查询模式。在D位标志状态改变时,要发一个P包序列以确保远端知悉。

(略)

 

6.7 认证

(略)

6.7.1 开启和关闭认证

(略)

6.7.2 简单秘钥认证

(略)

6.7.3 keyed MD5Meticulous keyed MD5认证

(略)

6.7.4 Keyed SHA1Meticulous Keyed SHA1认证

(略)

 

6.8 功能细节

下面的描述是一些细节规范,当我们说一个系统“回声功能开启”的时候,意味着系统正在发BFD回声报文,且会话一定是up的,而且远端具有环回回声报文的能力。

当我们说本地系统“进入查询模式”的时候,意味着本地的bfd.DemandMode置位,本地会话up,远端通告过来的BFD报文sta域标志up

当我们说远端系统“进入查询模式”的时候,意味着bfd.RemoteDemandMode置位,本地会话up,远端通告过来的BFD报文sta域标志up

 

6.8.1 状态变量

(略)

bfd.SessionState 本地会话状态,有四种,分别是downinitupadmindown。必须初始化为down

bfd.RemoteSessionState 远端会话状态,有四种,分别是downinitupadmindown。必须初始化为down

bfd.LocalDiscr 本地会话标识符,唯一标示一个会话,必须非0。为了提高安全性,它可以使用一个随机值(但必须保证是唯一的)。

bfd.RemoteDiscr 远端会话标识符,唯一标示一个远端会话,必须初始化为0。通过解析远端的BFD控制报文确定该值,在检测时间超时后,必须重新置0

bfd.LocalDiag 本地诊断标志,必须初始化为0,记录最近一次本地状态变化的原因。

bfd.DesiredMinTxInterval 期望本地最短发包时间间隔,单位微秒,这是本端期望值,实际的发包时间间隔需要两端协商得到,这个值必须初始化为不小于1s,即1000000微秒。该值的确定根据6.8.3节描述的规则。

bfd.RequiredMinRxInterval 期望本地最短收包时间间隔,如果是0的话,标识本端不希望收任何BFD控制报文。

bfd.RemoteMinRxInterval 最近一次学到的远端最小收包时间间隔,该值必须初始化为1

bfd.DemandMode 本地希望进入查询模式时置位,反之复位。

bfd.RemoteDemandMode 远端希望进入查询模式时置位,反之复位。这是最近一次收到的远端BFD控制报文的D标志位的值,该值必须初始化为0

bfd.DetectMult 本地检测倍数,必须是非0整数,该值与协商的发包时间间隔乘积决定检测时间。

bfd.AuthType (略)

bfd.RcvAuthSeq (略)

bfd.XmitAuthSeq (略)

bfd.AuthSeqKnown (略)

 

 

 

6.8.2 定时器协商

(略)

 

6.8.3 定时器操作

BFD会话的发包时间间隔和检测时间值必须随时可以改变且不影响会话的状态,本节描述定时器参数变化时的一些要求。

如果bfd.DesiredMinTxInterval bfd.RequiredMinRxInterval 都改变了,本端必须初始化一个P包序列发出,如果远端系统收到这样一个P包,就要将远端改变后的时间参数写入F包回应出去,即使远端还没有发出P包序列。

当最短发包间隔(bfd.DesiredMinTxInterval )增加时,本端发包间隔不立即变化,直到结束发P包,这是为了给对端留出调整检测时间的窗口。

当本端期望收包间隔(bfd.RequiredMinRxInterval )减小的时候,本端检测时间不立即变化,直到结束发P包,保证对端已经调整发包频率。

BFD会话还没有起来的时候(bfd.SessionState 不是up的),bfd.DesiredMinTxInterval 必须设置不小于1s。这是因为bfd需要慢启动,在未up的时候,节省带宽资源,并且给对端留出启动BFD和调整BFD状态的时间。

如果因为对端收包间隔(bfd.RemoteMinRxInterval )减小引起本地发包间隔减小,而且远端不是在查询模式,那么本地立即生效。(略)

开启回声功能的时候,最小收包间隔(bfd.RequiredMinRxInterval)设置不能小于1s,这是为了维持BFD控制报文的发送处于一个慢节奏以节省带宽资源,这时候检测功能主要由回声承担。

除了以上的描述,其他的参数改变都必须立即生效。

 

(略)

 

6.8.4 计算检测时间

检测时间(导致BFD会话down的未收到BFD报文的时间长度)并不是明确的在协议中规定好的,它是根据每个方向会话的发包时间间隔和检测倍数决定的。注意两个方向会话的检测时间可能是不一样的。

查询模式和异步模式的检测时间计算方式也是不一样的。

对于异步模式,本地计算的检测时间等于从远端收到的检测倍数乘以远端通告的发包时间间隔。检测倍数就是一个BFD会话报down丢失的包数量。

如果查询模式未开启,在检测时间内未收到远端发来的BFD控制报文,且本地状态为init或者up,则会话报downbfd.SessionState 置为downbfd.LocalDiag 置为1,标识down的原因是检测时间超时。

在查询模式下,本地系统的检测时间就是检测倍数和本地发包时间间隔的乘积,检测倍数就是一个BFD会话报down丢失的包数量。

如果查询模式开启,在发送一连串的P包后在检测时间内未收到回包,会话报downbfd.SessionState 置为downbfd.LocalDiag 置为1,标识down的原因是检测时间超时。

 

6.8.5 回声功能检测失败

当回声功能开启,在发送了回声报文后没有收到环回回来的回声报文数量足够多的时候,BFD会话宣告downbfd.SessionState 标记downbfd.LocalDiag 标记为2,标识是回声检测失败导致会话down

 

6.8.6 BFD控制报文收包处理

当收到BFD控制报文后,会进行一系列的检测判断其合法性,一旦判断不合法,将会丢弃,收包处理流程也随之结束。

当收到的BFD控制报文的version标志位不是1的时候,丢弃。

当收到的BFD控制报文长度小于最小长度的时候,丢弃。(没有开启认证功能,A位不置位的时候,最小长度是24byte,开启了认证功能,A位置位的时候,最小长度是26byte)。

当收到的BFD控制报文Length域的值大于封装BFD的协议的负载长度的时候,丢弃。

当收到的BFD控制报文的检测倍数是0的时候,丢弃。

当收到的BFD控制报文的M位不是0的时候,丢弃。

当收到的BFD控制报文的本地标识符为0的时候,丢弃。

当收到的BFD控制报文的远端标识符非0的时候,会在本地查找相应的会话,找不到的话,丢弃。

当收到的BFD控制报文的远端标识符为0,但是sta域不是down或者admindown的话,丢弃。

当收到的BFD控制报文远端标识符为0,需要综合多种因素决定,比如源ip,本端标识符域的值,收包接口等,若无匹配的话,新建或者丢弃,更详细的本文没有描述。

当收到的BFD控制报文的A标志位置位,但是AuthType0,丢弃。

当收到的BFD控制报文的A标志位未置位,但是AuthType0,丢弃。

如果A标志位置位,BFD控制报文必须认证,如果认证不合法,丢弃。

解析BFD控制报文,bfd.RemoteDiscr置为报文通告的My Discriminator

bfd.RemoteState置为报文的sta域值。

 

bfd.RemoteDemandMode 置为报文的D标志位。

bfd.RemoteMinRxInterval 置为报文通告的期望最小收包间隔。

当最小回声报文收包间隔为0,如果正在发送回声报文,必须停止。

当本端发送了一些列的P包,并且收到了对端回应的F包,则P包发送必须停止。

根据章节6.8.2更新发包间隔,根据章节6.8.4更新检测时间。

如果bfd.SessionState是管理down,丢包。

如果收到的报文标识远端是管理down,而且本端state不是down,那么置bfd.LocalDiag3,表示远端标记会话down,置bfd.SessionStatedown

否则,若本端statedown,而且收到的报文表明远端也是down,本端进入initbfd.SessionState置为init。若本端statedown,收到的报文表明远端是init,则本端进入upbfd.SessionState置为up

若本端为init,而且收到的报文表明远端是init状态或者up状态,本端都进入upbfd.SessionState置为up

若本端为up状态,而且收到的报文表明远端是down状态,则bfd.LocalDiag置为3,表明远端标记会话down。本端state跳转到downbfd.SessionState置为down

检查查询模式是否需要开启。

如果bfd.RemoteDemandMode1bfd.SessionStateupbfd.RemoteSessionStateup。表明远端开启了查询模式,那么本端停止周期发送BFD控制报文。

如果bfd.RemoteDemandMode0,或者bfd.SessionState并非up,或者bfd.RemoteSessionState并非up,表明远端并未开启查询模式,那么本端开始周期发送BFD控制报文。

如果收到的包为P包,那么回复远端F包。

如果收到的包没有被丢弃,那么根据章节6.8.4判断是否检测时间超时。

 

6.8.7 BFD控制报文发包处理

系统发包的频率不应该高于本端最小发包间隔和远端最小收包间隔,也就是说,系统发包的速度是两端通告的速率中的较低者(同情弱者原则)。

每两个BFD控制报文之间的发包时间间隔应该随机的减小025%,这是为了避免与同一子网中其它系统之间BFD收发包自同步。因此,实际上的平均发包间隔应该是比协商值小12.5%的。

如果bfd.DetectMult1,那么发包时间间隔不允许超过协商值的90%,并且不小于协商值的75%,这是为了保证远端系统上估算的超时时间不会在收到下一个BFD控制报文之前超时。

系统计算的发包时间间隔是本端最小发包间隔和远端最小收包间隔中的较大者,这二者只要有一个值改变了,系统的发包时间间隔都得重新计算。

如果收到的BFD控制报文表明远端的标识符为0,即bfd.RemoteDiscr0,且本端系统是passive模式,本端系统不发包。

如果bfd.RemoteMinRxInterval0,则本端不周期发包。

如果远端为查询模式,即bfd.RemoteDemandMode1bfd.SessionStateupbfd.RemoteSessionStateup,在没有收到远端发来的P包之前本端不周期性发送BFD控制报文。

如果本端收到远端发来的P包,则立即回应远端一个F包,无论本端状态是否是up,查询模式是否开启,或者其它发包的限制。

 

如果要将报文D位置1,条件是bfd.DemandMode1bfd.SessionStateupbfd.RemoteSessionStateup,缺一不可。

周期发送BFD控制报文的时候,由于某些参数随时可能变化,前后两个报文的内容可能不是相同的,BFD报文内容的确定遵循以下约定:

Version:置为1

Diag:置为bfd.LocalDiag

Sta:根据bfd.SessionState设置。

P:当要发一个P包序列的时候,置为1,否则,置为0

F:当要回应一个P包的时候,置为1,否则,置为0

C:控制面分离(独立于控制面),则置为1,反之,置为0

A:认证标志,需要认证,置位,反之,复位。

D:如果bfd.SessionStateup,且bfd.RemoteSessionStateup,那么D标志位置为bfd.DemandMode。反之,置为0

M:置为0

Detect Mult:检测倍数,置为bfd.DetectMult

Length:报文长度,如果没有认证部分,则为24,如果有,则为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:置为最小回声报文收包时间间隔,若为0,表示本端不希望收到回声报文或者没有环回远端发来的回声报文的能力,远端意识到后将不会发送回声报文。

Authentication Section:认证部分,若A置位,此部分必须有,若A复位,此部分必须没有。

 

6.8.8 BFD回声报文收包处理

(略)

6.8.9 BFD回声报文发包处理

(略)

 

6.8.10 最小收包时间间隔变化

如果期望改变接收远端发来的BFD控制报文的最小收包时间间隔,可以随时改变bfd.RequiredMinRxInterval值,该值改变后,本端发出的BFD控制报文中将携带改变后的期望最小收包间隔值,具体见6.8.3节。

 

6.8.11 最小发包时间间隔变化

最小发包时间间隔可以随时改变,改变bfd.DesiredMinTxInterval的值,具体规则见6.8.3节。

 

6.8.12 检测倍数变化

检测倍数值可以改变为任何非0值,新的值将会由下一个BFD控制报文携带给远端,该值的改变不是必须要发P包序列。

 

6.8.13 使能或去使能回声功能

任何时间都可以开启或者关闭回声功能以及环回回声报文的能力。开启或者关闭环回回声报文的能力可以通过设置最小期望回声报文收包时间间隔值为0或者非0来实现。

 

6.8.14 使能或去使能查询模式

任何时候都能够开启或者是关闭查询模式,只要通过设置bfd.DemandMode为相应的值即可,接下来的动作根据6.6节。

当远端退出查询模式以后,本端必须恢复周期发包。

 

6.8.15 转发面重置

本端的转发面重置,则bfd.LocalDiag设置为4,标明down的原因是转发面重置,bfd.SessionState置为down,状态机进入down状态。

 

6.8.16 管理控制

有这种情况,管理者希望使能或者去使能BFD会话,可以通过管理down的方式做到,不用删除和重建会话:

如果开启会话,将bfd.SessionState置为down状态。

如果关闭会话,将bfd.SessionState置为admindown状态,bfd.LocalDiag设置为合适的值(4?),并停止发送回声报文。

管理down后,BFD控制报文应该至少再发一个检测周期,以保证远端感知到本端状态的变化。

 

6.8.17 Concatenated Paths (串联路径?)

(略)

 

6.8.18 会话保持down状态

(略)

 

7. 运行考虑

主要是介绍BFD的使用场景以及从带宽消耗等角度给出一些协议运行的考虑。

(略)

8. IANA考虑

(略)

9. 安全考虑

(略)

 

10. 参考文献

(略)

 

附录A向后兼容

(略)

 

附录B贡献者

(略)

 

附录C致谢

(略)