bfd


bidirectional forwarding detect(BFD)可以在转发面实现快速、低overhead流量的path故障检测。

可检测的path非常广泛,可以是interface层面、链路层、网络层、转发引擎、虚拟电路、隧道等。如果需要,BFD也支持检测控制面的故障。


BFD有两种模式:异步模式和demand模式。

异步模式是BFD最常用的工作模式,这种模式下检测path两端的设备周期性的互发BFD control packet,如果detect time内没有接收到对端的BFD control packet,表示path出现了连通性故障。两端互发的BFD control报文的间隔是独立协商和确定的。


demand模式只有在需要的时候才发送BFD control packet,检测path故障,这样可以降低overhead流量。demand模式可以是单向的,也就是说BFD session双方可以一端是demand,另一端不是。


BFD还有echo工作方式,在异步模式和demand模式下都可以使能echo模式。也可以一端使能echo,另一端不使能。接收到echo BFD的一端会把报文内容返回回去。

echo报文是UDP报文,端口号为3875,目的ip地址是发送接口的ip地址,源ip地址只要不引起icmp重定向就可以。

BFD control packet format

    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

   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   |Vers |  Diag   |Sta|P|F|C|A|D|M|  Detect Mult  |    Length     |

   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   |                       My Discriminator                        |

   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   |                      Your Discriminator                       |

   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   |                    Desired Min TX Interval                    |

   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   |                   Required Min RX Interval                    |

   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   |                 Required Min Echo RX Interval                 |

   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

 

   An optional Authentication Section MAY be present:

 

    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

   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   |   Auth Type   |   Auth Len    |    Authentication Data...     |

   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


Diag   

通知远端设备本地设备BFD状态机变化的原因,编码如下:

         0 -- No Diagnostic

         1 -- Control Detection Time Expired

         2 -- Echo Function Failed

         3 -- Neighbor Signaled Session Down

         4 -- Forwarding Plane Reset

         5 -- Path Down

         6 -- Concatenated Path Down

         7 -- Administratively Down

         8 -- Reverse Concatenated Path Down

      9-31 -- Reserved for future use

Sta

通知远端设备本地设备BFD状态机的当前状态

P(poll)

用于协商BFD control报文的发送时间间隔和故障检测时间。远端设备接收到本地设备发送的poll=1的报文,会回应F=1的BFD control报文。本地设备接收到F报文后才会更高发送和检查时间间隔参数

F(final)

用于协商BFD control报文的发送时间间隔和故障检测时间。对poll BFD报文的响应

C

表示本BFD session与控制面无关

A

表示使能authentication功能,需要对报文进行验证。

D

通知远端设备本地设备的工作模式为demand模式,远端不需要或停止发BFD报文给本地设备

M(mutli-point)

表示point-to-multipoint检测模式,当前只支持检测point-to-point的path故障,固定填0

Detect Mult

通知远端设备进行故障检测时detect time=Detect Mult * 本地设备报文发送间隔。该值不能为0,否则丢弃报文。

Length     

BFD报文长度

My Discriminator

发送设备的session 区分符。接收设备会把这个值放在Your Discriminator域返回给发送设备,发送设备根据My Discriminator确定对应的BFD session

Your Discriminator 

解释见My Discriminator,由远端设备返回给本地设备。

Desired Min TX Interval 

通知远端设备本地设备希望自己发送BFD报文的最小间隔

Required Min RX Interval

通知远端设备本地设备希望远端设备发送BFD报文时的最小间隔

Required Min Echo RX Interval

通知远端设备本地设备希望远端设备发送BFD echo报文时的最小间隔


BFD状态机



上面状态机的转移条件down、init、up是指接收到的BFD control报文中的sta,也就是远端设备当前的状态


BFD报文发送间隔= min(本地设备Desired Min TX Interval,最近接收到的BFD报文的Required Min RX Interval)

detect time= 最近接收到的BFD报文的Detect Mult X max(本地设备Required Min RX Interval,最近接收到的BFD报文的Desired Min TX Interval)

BFD echo报文发送间隔=最近接收到的BFD报文的Required Min Echo RX Interval

如果要改变时间间隔,需要通过P和F报文交互完,经确认后才能修改


### BFD测试方法及相关工具 BFD(Bidirectional Forwarding Detection)是一种用于快速检测网络路径故障的技术。为了验证其功能和性能,通常可以通过手动配置以及借助专用的测试工具来完成。 #### 手动配置BFD测试 以下是基于命令行的手动配置方式来进行BFD测试: 1. **建立BFD会话** 配置两端设备上的BFD会话参数,指定本地和远端鉴别符(Discriminator)。例如,在R1和R2上分别执行以下命令[^4]: ```shell [R1]bfd [R1-bfd]quit [R1]bfd 1 bind peer-ip 12.1.1.2 source-ip 12.1.1.1 [R1-bfd-session-1]discriminator local 1 [R1-bfd-session-1]discriminator remote 2 [R1-bfd-session-1]commit [R2]bfd [R2-bfd]quit [R2]bfd 1 bind peer-ip 12.1.1.1 source-ip 12.1.1.2 [R2-bfd-session-1]discriminator local 2 [R2-bfd-session-1]discriminator remote 1 [R2-bfd-session-1]commit ``` 2. **绑定静态路由到BFD会话** 将静态路由与BFD会话关联起来,以便在网络发生故障时能够自动调整路由表项[^3]: ```shell [R1]ip route-static 2.2.2.0 255.255.255.0 12.1.1.2 track bfd-session 1 [R2]ip route-static 1.1.1.0 255.255.255.0 12.1.1.1 track bfd-session 1 ``` 3. **验证BFD状态** 使用`display bfd session all`命令查看当前BFD会话的状态,确认双方是否正常通信并保持UP状态[^4]: ```shell [R1] display bfd session all Session ID: 1, Peer IP Address: 12.1.1.2, State: Up ... ``` #### 自动化BFD测试工具 除了手工配置外,还可以利用自动化测试工具简化流程并提升效率。常见的工具有如下几种: 1. **IxNetwork/Ixia Chariot** Ixia系列工具支持模拟复杂的网络环境,并允许用户定义多个BFD会话及其属性。它能生成详细的统计报告,帮助分析延迟、丢包率等指标[^5]。 2. **Spirent TestCenter** Spirent提供全面的IP服务测试解决方案,其中包括对BFD协议的支持。它可以仿真大规模拓扑结构下的双向转发探测行为,适用于高性能场景评估[^6]。 3. **Scapy脚本开发** 如果希望定制专属的功能或者深入研究底层实现细节,则可考虑采用Python库——Scapy编写自定义程序发送/接收BFD控制消息[^7]。下面是一个简单的例子展示如何构建基础帧格式: ```python from scapy.all import * # 创建UDP层对象,设置目标地址及端口号为标准值(3784) udp_layer = UDP(dport=3784) # 构造假想中的BFD数据部分字段 my_bfd_payload = "\x01\x00\x0f\xff..." # 假设填充了一些必要字节序列 packet_to_send = Ether() / IP(dst="12.1.1.2") / udp_layer / Raw(load=my_bfd_payload) sendp(packet_to_send, iface="eth0", count=10) # 发送十次至特定接口 ``` 注意以上仅为示意代码片段,请依据实际情况修改相应变量名与逻辑条件后再投入使用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值