FRR BGP 协议分析 3 --- FSM 状态机

BGP路由器协议排错教程:BGP 邻居状态 BGP 会与邻居路由器形成 TCP 会话,邻居路由器也称为对等体(Peer)。BGP 使用有限状 态机(FSM)构成的表,来维护所有 BGP 对等体及其运行状态。BGP 会话会报告以下状态: ? 空闲(Idle); ? 连接(Connect); ? 主动发送 OPEN 消息(Active); ? OPEN 消息已发送(OpenSent); ? OPEN 消息已确认(OpenConfirm); ? 已建立(Established)。 图 1-2 展示了 BGP 的有限状态机,以及建立 BGP 会话之前经历的状 阅读详情

前面创建完bgp peer之后,peer是active的话就会开启bgp start timer,然后开始BGP状态机的协商,不然费那么大劲创建出来不做事情就就很尴尬。

 

状态机简介

下面是BGP的状态和事件驱动的定义:

 

bgp是基于tcp协议的,即包含了tcp协议的优点,因此上面的状态机也就跟tcp连接有一定的关系: 

  • tcp连接建立阶段的状态:Idle, Connect, Active
  • tcp连接建立完成之后: OpenSent, OpenConfirm, Established

 

Idle
BGP协议初始时是处于Idle状态。在这个状态时,系统不分配任何资源,也拒绝所有进入的BGP连接。只有收到Start Event时,才分配BGP资源,启动ConnectRetry计时器, 启动对其它BGP对等体的传输层连接,同时也侦听是否有来自其它对等体的连接请求。
 

Connect
这个状态下,BGP等待TCP完成连接。若连接成功,本地清空ConnectRetry计时器,并向对等体发送OPEN报文,然后状态改变为OpenSent状态;否则,本地重置ConnectRetry计时器,侦听是否有对等体启动连接, 并移至Active状态。
 

Active
这个状态下,BGP初始化TCP连接来获得一个对等体。如果连接成功,本地清空ConnectRetry计时器,并向对等体发送OPEN报文,并转至OpenSent状态。
 

OpenSent
这个状态下,BGP等待对等体的OPEN报文。收到报文后对报文进行检查,如果发现错误, 本地发送NOTIFICATION报文给对等体,并改变状态为IDLE。如果报文正确,BGP发送KEEPALIVE报文,并转至OpenConfirm状态。
 

OpenConfirm
这个状态下,BGP等待KEEPALIVE或NOTIFICATION报文。如果收到KEEPALIVE报文,则进入Established状态,如果收到NOTIFICATION报文,则变为Idle状态。
 

Established
这 个 状 态 下,B G P 可 以 和 其 他 对 等 体 交 换 U P D A T E ,NOTIFICATION, KEEPALIVE报文。如果收到了正确的UPDATE或KEEPALIVE报文,就认为对端处于正常运行状态, 本地重置Hold Timer。如果收到NOTIFICATION报文,本地转到Idle状态。如果收到错误的UPDATE报文,本地发送NOTIFICATION报文通知对端,并改变本地状态为Idle。 如果收到了TCP拆链通知,本地关闭BGP连接,并回到Idle状态。

 

综上, 我们可以画出BGP的有限状态机:

BGP的FSM代码写的相当漂亮,使用当前状态 + EVENT作为FSM index,查找到对应的执行函数和下一个状态:

 

通过FSM数组,bgp_event_update让状态机转化的代码起到了化繁为简的神奇效果:

 

状态机转化
Peer初始状态是IDLE,那么对等体一旦start起来,就会进入各自的状态,在不同的状态下处理各自的事件消息。

 

  • IDLE

start定时器到期后,EVNET 为BGP_Start,在bgp_event_update函数里面,通过FSM的数组获取

next = Connect

func = bgp_start
 

bgp_start 做一些检查后,调用 bgp_connect 开始建立TCP的连接,bgp使用tcp连接,每个bgp实例自身是peer的一个tcp server端,同时也是peer的tcp client端,server端在bgp_create之后都建立自己的socket服务端开始监听179端口。

 

  • peer->fd = vrf_sockunion_socket 创建连接peer的客服端的TCP fd,同时设置FD为非阻塞,因为FRR是事件驱动,不能由于fd阻塞导致线程给挂起。
  • 如果配置了密码会添加TCP MD5签名验证选项。
if ((ret = setsockopt(sock, IPPROTO_TCP, TCP_MD5SIG, &md5sig,

                    sizeof md5sig));

上面的代码即完成MD5SIG选项。

如果md5值不正确或者密码错误,内核会丢弃当前的报文。

struct tcp_md5sig {

     struct __kernel_sockaddr_storage tcpm_addr;    /* address associated */

     __u16    __tcpm_pad1;                /* zero */

     __u16    tcpm_keylen;                /* key length */

     __u32    __tcpm_pad2;                /* zero */

     __u8    tcpm_key[TCP_MD5SIG_MAXKEYLEN];        /* key (binary) */

 };

在int tcp_v4_rcv(struct sk_buff *skb)函数里:

  #ifdef CONFIG_TCP_MD5SIG

      /*

       * We really want to reject the packet as early as possible

       * if:

       *  o We're expecting an MD5'd packet and this is no MD5 tcp option

       *  o There is an MD5 option and we're not expecting one

       */

      if (tcp_v4_inbound_md5_hash(sk, skb))

          goto discard_and_relse;

#endif

因此在服务端,直接由内核在tcp接收处理时就完成了签名验证。

 

  • 更新TCP连接的源IP地址

最后会调用bind 绑定配置的源IP地址

 

  • Connect 处理

最后调用sockunion_connect处理connect到服务端

由于fd 是no block的,所以调用connect触发TCP的三次握手,大概率不会立马成功(如果是阻塞的话,线程会被挂住),那小概率会返回成功是什么情况下会发生了??

按照connect的man帮助,返回值如下,查看解释,可以理解代码的返回值处理:

 

RETURN VALUE

  If the connection or binding succeeds, zero is returned.  On error, -1 is returned, and errno is set appropriately.

 

EINPROGRESS

   The  socket  is  nonblocking  and  the connection cannot be completed immediately.  It is possible to select(2) or poll(2) for completion by selecting the socket for writing.  After select(2) indicates writability,  use  getsock‐opt(2)  to  read  the  SO_ERROR  option  at level SOL_SOCKET to determine whether connect() completed successfully (SO_ERROR is zero) or unsuccessfully (SO_ERROR is one of the usual error codes listed here, explaining the  reason for the failure).

所以当bgp_connect返回的时候,根据返回值的不同会做不同的处理:

  1. connect_success :触发TCP_connection_open 事件 BGP_EVENT_ADD(peer, TCP_connection_open);
  2. connect_in_progress:说明connect并没有成功,会触发fd的可读和可写的事件(根据前面man的说明可以理解这点),bgp_connect_check 回调函数根据getsockopt(peer->fd, SOL_SOCKET, SO_ERROR, (void *)&status, &slen);来判断connect链接是否OK。

  

然后函数直接返回,最后达到bgp_event_update,会把peer的状态改成Connect (connect触发TCP链接不是立马成功的情况下)

 

Connect

当调用connect触发TCP的三次握手的时候,connect没有阻塞而是直接返回了,然后添加了FD可读和可写的事件,回调函数是bgp_connect_check函数,然后调用getsockopt 获取TCP connection的情况,如果status返回的是0,那么说明TCP connection is established,然后触发 TCP_connection_open事件:

而此时peer的状态是connect,根据全局的FSM可以知道:

下一个状态:OpenSent

回调函数:bgp_connect_success

 

bgp_connect_success 主要完成:

  • 开启IO线程对peer fd的可读事件,当对端发送消息到peer的时候,IO线程就会被唤醒,调用回调函数bgp_process_reads处理报文

  • 构造OPEN 报文,并开启IO线程对peer fd的可写事件,当本端发送消息到peer的时候,IO线程就会被唤醒,调用回调函数bgp_process_writes处理报文

当函数返回到bgp_event_update,会把peer的状态改成OpenSend

IO线程被唤醒,执行bgp_process_writes,然后调用bgp_write 把OPEN消息发送到对端。

 

OpenSend

IO线程此时睡眠,等待对端OPEN报文的到来,当收到报文后,IO线程就会被唤醒,调用回调函数bgp_process_reads处理报文

如果读取到了报文,那么放入peer的struct stream_fifo *ibuf; // packets waiting to be processed 里面,唤醒主线程取报文处理,主线程回调处理函数为bgp_process_packet

主线程唤醒执行bgp_process_packet 处理ibuf的报文,然后根据解析出来的BGP 报文类型,走不同的处理逻辑,本次我们关心的接受到OPEN的消息的处理,处理函数是bgp_open_receive

OPEN 报文包含各种能力值的验证,如果存在差错,则返回BGP_stop 事件,后续会发送Notification消息,并把状态迁移到IDLE状态,如果没有差错,则返回Receive_OPEN_message 事件,然后根据返回的事件处理状态机mprc的值本次就是Receive_OPEN_message

根据FSM数组可以定位到,收到OPEN消息后的处理,下一个状态是OpenConfirm,处理函数是:bgp_fsm_open

 

发送keeplive消息后,状态机转化为OpenConfirm

 

OpenConfirm

前面IO线程处理和bgp_process_packet处理都一样,只是此时OpenConfirm等待Keeplive或者Notification消息

事件是Receive_KEEPALIVE_message,根据FSM数组可以定位到,收到Keeplive消息后的处理,下一个状态是Established,处理函数是:bgp_establish

bgp_establish 会做很多事情,包含peer很多字段的赋值和一些处理,目前还不是很理解,等后续理解清楚了,在来补充

基于FRR全面解析BGP协议(五):FRR的BGP路由策略 FRR的BGP路由策略 过滤器 FRR提供了基于IP,基于Community和基于AS-PATH的三种类型过滤器来匹配路由。 IP Access List 基于IP的路由ACL规则,比较少使用,通常是用IP Prefix List来设置策略。 access-list NAME [seq (1-4294967295)] permit IPV4-NETWORK access-list NAME [seq (1-4294967295)] deny IPV4-NETWORK #NAME:规则名称 #seq:规则序 阅读详情

相关推荐

基于FRR全面解析BGP协议(二):BGP协议的路径属性

BGP协议的路径属性 当一条BGP路由被BGP路由器通告给其对等体时,这条BGP路由会携带多个路径属性值(Path Attributes)并传递给对等体。 这些路径属性,将影响BGP的路由优选,使得BGP的路由策略能力异常强大。 BGP路径属性分为公认属性和可选属性。公认属性是所有BGP协议实现必须都能正确识别的属性;可选属性是BGP协议实现可不支持的属性。公认属性又分为公认必遵和公认自决属性。公认必遵是在update报文中必须携带的属性;而公认自决并不要求必须包含在update报文中。可选属性分为可选传

m0_48594855的博客 2453

基于FRR全面解析BGP协议(一):BGP协议基础知识

#基于FRR全面解析BGP协议(一):BGP协议基础知识 ##BGP协议基础知识 ###定义 边界网关协议(Border Gateway Protocol,BGP)是一种实现自治系统AS之间的路由可达,并选择最佳路由的矢量性协议 。简单地讲,就是交换两个网络的路由信息。 ###特征 BGP使用TCP为传输层协议,TCP端口号179。 路由器之间的BGP会话基于TCP连接而建立。运行BGP的路由器被称为BGP发言者(BGP Speaker),或BGP路由器。 两个建立BGP会话的路由器互为对等

m0_48594855的博客 4881

【HCIE】FRR+BFD+OSPF与BGP联动

FRR+BFD+OSPF与BGP联动

Wenrs的博客 1995

BGPv4-原理介绍+报文分析+配置示例

IPv4 BGP version4原理解析、RFC4271标准介绍、BGP协议特性、BGP协议典型命令

fengxingzhe008的博客 4548

【信息科学与工程学】【通信工程】第一百九十一篇 路由器体系结构01

编号类型领域问题详细的数学分析参数列表(表达式 / 数值范围 / 边界 / 测量)关联知识1路由控制平面 · 图论 / 优化最短路径 / 最优下一跳如何计算?收敛边界?图模型​ G=(V,E),w:E→R+; SPF = Dijkstra O(∥E∥log∥V∥);BGP 策略用稳定路径问题 SPP(NP-hard),用博弈/不动点分析。收敛界:失效检测 tdetect​+tspf​+tupdate​,收敛时间 τ≤thold​+4RTT(BGP)。可用 Lyapunov​ 分析路由震荡。V: 节点数(10

weixin_49199313的博客 392

【信息科学与工程学】【通信工程】第二百四十篇 IPv4/IPv6 功能点、特性和算法及 IPv4→IPv6 迁移特性02

说明:按「纯数学 → 数学物理 → 多物理场 → 界面/表面科学耦合 + 数学化学 + 运动科学(0.01 nm → μm → mm → cm 精度及超长运动)」纵向穿透,每一行给出,最后挂。

weixin_49199313的博客 505

网络规划设计师必踩的8个架构陷阱(某金融头部项目真实翻车复盘)

网络规划设计师必避的8大架构陷阱,源自金融头部项目真实翻车复盘。聚焦高可用、安全合规与弹性扩展场景,提炼需求误判、冗余缺失等关键问题及落地对策。助你规避设计风险、提升方案交付质量,值得收藏。

QuickCode的博客 201

【信息科学与工程学】【通信工程】第一百八十八篇 通信网络中的数学物理01

因素及参数的数学建模与详细配置SDN将控制平面与数据平面分离,控制器负责全局视图与决策。控制器部署问题(Controller Placement Problem, CPP)常用图论建模:给定网络拓扑 G=(V,E),候选控制器位置集合 C⊆V,需选择k个控制器位置,使得交换机到最近控制器的平均时延或最坏时延最小化,同时考虑控制器间同步开销。

weixin_49199313的博客 600

HCIE-Datacom考试大纲本质是业务流量架构能力地图

数据通信(Datacom)是现代网络工程师的核心能力基础,其本质在于理解协议行为、建模业务流路径、反演故障根因并权衡架构决策。不同于传统路由交换知识堆砌,Datacom强调对OSI各层协议状态机的动态建模能力,以及Overlay与Underlay耦合关系的量化分析能力。技术价值体现在将设备配置升维为业务SLA保障手段,支撑智慧医疗、工业互联网、政务云等高确定性场景的端到端流量控制。本文深入解析HCIE-Datacom考试大纲背后的四层能力金字塔,揭示其作为‘业务流量架构师’能力筛选标准的真实逻辑。

weixin_34098209的博客 181

【信息科学与工程学】【通信工程】第一百九十一篇 路由器体系结构03

编号类型领域问题详细的数学分析(逐步推理)参数列表(表达式 / 数值范围 / 边界 / 测量)关联知识839DCI演进 · 收敛DCI 2030 年三大技术收敛方向步骤1:方向一:IPoDWDM 成为绝对主流(Omdia 2027 59% → 2030 80%+),OTN 退化为 OLS 纯光层。步骤2:方向二:800ZR+ 取代 400ZR 成为主力速率,PCS 使 800G 达 600–1000km。步骤3:方向三:AI 集群 DCI 催生 1.6T/3.2T 超短距(<10km)相干模块(OSFP-X

weixin_49199313的博客 856

【信息科学与工程学】【通信工程】 第九十二 OTN网络 01 各类函数01

​​硬件选型​​​高实时场景​​:选用带硬件加密的边缘网关(如华为OceanConnect),协议转换延迟<5ms​​AI训练场景​​:采用GPU裸金属服务器(NVIDIA A100),缩短模型训练时间50%以上​​安全优先级​​​Level 1​​:传输加密(TLS)+ 设备身份认证(防止非法接入)​​Level 2​​:操作审计日志 + 双因子认证(防范内部威胁)​​Level 3​​:网络分区分域 + 工业防火墙(隔离关键控制网)​​实施路径​​​阶段1​。

weixin_49199313的博客 1253

FRR搭建简单BGP网络环境

实验参考文章https://segmentfault.com/a/1190000019892263,并进一步解释完善。 一、BGP查询CLI命令 对frr的配置文件/etc/frr/daemon进一步修改,改为bgpd=yes启动bgp 通过vtysh命令行接口,查询frr中bgp配置 show ip bgp [x.x.x.x](longer) show ip bgp summary s...

turbock的博客 9345

【信息科学与工程学】【通信工程】第三百零六篇 IPv6/SRv6服务链中的学科知识01

序号数据类型 (主类)数据类型 (子类)示例/说明存储/表示方式备注/应用场景2246生物信息型DNA序列ATGC碱基序列FASTA格式基因组2247生物信息型RNA序列AUGC碱基序列FASTA转录组2248生物信息型蛋白质序列氨基酸序列FASTA蛋白组2249生物信息型基因注释GFF/GTF文件Gene annotation功能2250生物信息型变异数据VCF文件Variant call formatSNP/INDEL2251生物信息型表达矩阵基因×样本Expression matrix (FPKM/T

weixin_49199313的博客 89

FRR BGP 基础命令配置

前面了解了BGP基础概念,下面搭建简单的BGP实验场景,基于遇到的测试用例记录BGP不同测试场景下的配置方法。在FRR源码中 tests/topotests 目录下存在很多经典的场景配置,对路由网络有一定了解可以直接参考topotests下配置即可。本文主要记录学习BGP时从刚开始接触到慢慢了解的过程,后续会持续补充遇到的各种场景配置。BGP相关命令都是基于FRR,基础网络配置使用系统命令,数据面也涉及VPP相关命令。

csdn_3815的博客 1684

【信息科学与工程学】计算机科学与自动化——第三百零五篇 系统开发1001 关键因素01

编号类型系统因素【含锁】因素的数学辅助分析关联知识辅助分析1并发控制高性能高并发高可靠互斥锁(Mutex):最基本的同步原语,保证临界区互斥访问。在高并发下,锁竞争导致线程阻塞、上下文切换,影响吞吐量。需考虑公平锁与非公平锁的选择、锁的递归性、优先级反转等问题。排队论(M/M/1队列):将锁视为单服务员队列,请求到达率为λ,服务率μ,平均等待时间W = λ/(μ(μ-λ))。马尔可夫链:锁状态(空闲、持有、等待)转移概率矩阵,稳态概率计算阻塞概率。运筹学:通过Little定律L=λW估算系统中等待线程数。操

weixin_49199313的博客 16

FPGA串口通信----uart(一)

通过PLL锁相环IP的使用,可以输入时钟进行分频,倍频,也可以产生多路时钟输出信号。外部提供晶振的原因:①Fpga电路大多数需要时序分析②晶振在Fpga内部占空间大,所以放置于外部PCB板上Uart异步传输速率不能很快的原因:考虑到工程实际问题,假如时钟周期大(传输速率慢的话),采取到数据电平变化的边沿时刻的概率会小很多,这样数据也很准确,通常uart适用于2M.

mvpkuku的博客 968

Frr代码分析之BGP不同类型报文收发

bgp_packet.c中bgp_notify_send_internal函数调用bgp_packet_set_marker(s, BGP_MSG_NOTIFY)来设置Type字段,调用bgp_packet_set_size(s)来设置Length字段,bgp_notify_send函数参数中输入差错码字段与差错子码字段,同时调用bgp_notify_send_internal函数,以将差错码,差错子码传参至notify报文中进行发送。

2301_79967043的博客 688

一文带你看懂SAP-HANA的基本架构与原理

创作不易,希望大家一键三连支持!!!♥♥♥创作不易,希望大家一键三连支持!!!♥♥♥创作不易,希望大家一键三连支持!!!♥♥♥。

丷江南南的博客 5072

基于FRR全面解析BGP协议(三):BGP路由反射器

BGP路由反射器 背景 在中转AS65102中,BCDE路由互通。B与E运行BGP,并且两者建立IBGP对等体关系(两者并非直连,但是对于BGP,这是允许的,仅需确保两者之间能够正确建立TCP连接即可)。C与D并未运行BGP。 此时A将本地路由1.1.1.0/24通告到BGP,最终F能够通过BGP学习到该条路由。 但是C、D由于并未运行BGP,因此无法通过BGP学习到1.1.1.0/24路由。如此一来,F发往1.1.1.0/24网络的数据包在到达C/D后将被丢弃,在C及D路由器这里,就出现了路由黑洞。 水

m0_48594855的博客 2568

Matlab蒙特卡洛模拟二维伊辛模型相变过程

一、什么是伊辛模型 伊辛(Ising)模型是描述磁系统相变最简单的模型,但模型里自旋之间的相互作用赋予了它奇妙的特性,最有趣的就是对称性破缺。这一模型可以被推广用于研究连续的量子相变、基本粒子超弦理论、动力学临界行为等,甚至被认为可以描述深林火灾、交通拥堵、舆论传播等社会经济现象。 如图,每个格点的方向只有向上或向下两者状态,但临近的自旋之间有相互作用,而且点阵可以是一维、二维、三维、甚至更高维...

http://www.icfgblog.com/ 2万+

模拟调制系统实战:从AM到FM的5种调制方式对比与选型指南

本文深度解析AM、DSB、SSB、VSB、FM五种经典模拟调制方式,从实现电路、频谱效率、抗噪性能及工程成本等维度进行实战对比。通过MATLAB/Simulink仿真案例,提供清晰的选型决策框架,帮助工程师在无人机图传、短波通信、广播系统等具体项目中,根据带宽、功耗和抗干扰需求选择最优方案。

study的专栏 928
上一篇: 基于iproute命令集配置Linux网络(ip命令)
下一篇: 一步一步教你如何在GitHub上上传自己的项目
废言Pro
博客等级 码龄16年 1092粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值