FRR BGP协议分析12 -- ZEBRA路由的处理1

FRR代码分析系列第一篇:进程角色分类 FRR代码分析系列第一篇 FRRouting各进程角色分类,文章对FRR项目中各关键进程进程分类,搞清楚这个对理解进程通信框架有很大帮助。 FRR是Quagga的分支,用来替代Quagga的产品,并补充了更全面的路由协议。 阅读详情

当前面初始化完成的时候,zebra客户端线程(zebra_apic)静静等待客户端的消息,zebra dplane也急不可待了。

本次我们以BGP 为例,当BGP 根据自己的规则优选路由后,就会发给zebra,在函数bgp_process_main_one里面,把路由发布出去后,就会执行fib update动作,调用bgp_zebra_announce函数发布路由到zebra里面。

他们之间通过struct zapi_route 消息通信

首先填充消息内容,最后调用zclient_route_send 发送到zebra进程处理。

按照前面初始化阶段的分析,我们知道zebra为BGP创建的zebra_apic线程会被唤醒,执行fd可读的事件回调函数zserv_read。

本次我们先借助zserv_read来看下sock读取字节流的报文的处理方法,然后在继续讨论路由的处理。

  • 先读取头部

  • 解析头部,获取头部后面的数据区长度

  • 在根据头部里面的数据区长度,获取数据

获取完所有的消息后,又把消息添加事件到zebra主线程继续处理?为啥这么处理了?zebra_apic线程就只读取下消息,然后所有的消息给主线程处理?减少锁?

我们先看看zserv_process_messages函数的注释,然后继续跟踪消息的处理:

先从client的ibuf里面出队报文,然后缓存起来,然后遍历缓存,每个消息调用zserv_handle_commands来实现函数调转,路由添加的cmd是ZEBRA_ROUTE_ADD,对应执行函数是zread_route_add,此函数继续解析处理路由消息。

  • 使用zapi_route_decode解析路由消息的msg,获取前缀、nexthop等各种信息,还原struct zapi_route消息

  • 生成一个新的route entry然后填充里面的各种信息,这里我们先认识下zebra里面最重要的路由的节点的数据结构

然后处理nexthop的信息,遍历所有的nexthop生成struct nexthop数据结构,我们在来认识下这个重要的数据结构

生成nexthop信息,并加入route entry的nexthop链表里面,后续用于负载均衡

如果消息里面有mpls label的信息,也需要添加到nexthop里面

Route entry填充好后,继续调用rib_add_multipath处理路由信息添加,让我们继续走下去细看。

rib_add_multipath 又引入了两个新的数据结构struct route_table和struct route_node,我们来看下:

结合前面给出的nexthop,整个路由表项的处理就是由route_table\route_node\route_entry 组织而成的,route_table包含了一个二叉树结构来保存所有的路由前缀和下一跳路由表项,prefix结构保持了路由前缀的长度和值,用来做最长前缀匹配,那,说好的mtire树呢? 好吧,我们不太可能把成千上万的路由表项塞给linux内核,够用就行。

整体的数据结构关系如下图所示:

rib_add_multipath 先查找本次的路由表的route_table,然后在table中根据前缀查找是否有相同的route_node表项,其中srcdest_rnode_get查找如果没有node,则会生成一个新的route_node,然后加入route_table的二叉树中,然后调用rib_addnode,添加route_entry表项。

rib_addnode 直接调用rib_link 继续处理,首先会在route_node的info字段生成一个rib_dest_t的结构体,上面的图也已经画了出来,同时会把route_node里面的route_entry使用链表连接起来,表示同一个前缀的不同路由。

然后会判断是否有重分发的配置,如果bgp的路由重分发到ospf等,本次不分析,如果没有重分发,那么直接调用rib_queue_add入zebrad.mq work queue处理,当work queue调度处理的时候,会调回调函数meta_queue_process继续处理

 

CentOS8下VPP与FRR通过VRF实现跨协议栈通信(附完整配置命令) 本文详细介绍了在CentOS 8系统中,如何利用Linux内核的VRF技术,将高性能用户态数据平面VPP与开源路由套件FRR进行深度集成,实现跨协议栈的流量隔离与可控通信。文章提供了从环境准备、VRF与veth配置、VPP对接、FRR部署到最终测试验证的完整实战步骤与命令,为构建复杂的异构网络通信平台提供了清晰的解决方案。 阅读详情

相关推荐

BGP FRR快速重路由实战:抓包拆解毫秒级网络收敛的底层逻辑

BGP作为互联网核心路由协议,其收敛速度直接影响业务可用性。传统BGP依赖逐跳UPDATE传播和重新选路,故障切换往往需要秒级甚至分钟级时间,而控制平面与数据平面脱节正是延迟的根源。通过BFD毫秒级故障检测预联动,结合BGP FRR(快速重路由)的备用路径预计算机制,数据平面可在故障瞬间切换至备份下一跳,将收敛时间压缩至百毫秒以内。Wireshark抓包分析能够直观呈现从断链到数据面切换、再到控制面收敛的完整时间线,为网络工程师提供精确调优依据。本文从BGP收敛瓶颈出发,深入解析FRR工作原理,基于FRRo

weixin_34013044的博客 362

用Zebra做BGP实验

RIP和OSPF都是内部网关协议(IGP),BGP属于外部网关协议(EGP)。BGP广泛用于Internet以连接 ISP,并将企业与ISP互连。 当BGP的影响被完全了解,并且至少下列情况之一存在时,在AS中使用BGP才是最恰当的: 1 AS允许数据包穿过它到达其它自治系统(例如,某个服务提供商)。 2 AS有到其它自治系统的多条连接。 3 必须对进入和离开AS的数据流进行...

biaoming 1168

Frrouting Zebra协议详解:从Quagga到FRR 6.0,那些你该知道的版本变迁与核心指令

本文深入解析Frrouting Zebra协议的技术演进与核心指令,从Quagga到FRR 6.0的版本变迁,详细介绍了Zebra协议的架构、通信模型及实战应用。重点探讨了ZAPI的技术细节、版本兼容性优化及性能提升策略,为网络工程师提供全面的协议操作指南与故障排查方法。

weixin_28700593的博客 404

在 Linux 上构建网络路由器

动态、健壮的路由对于 Internet 网络来说极其重要,因此任何一个初涉此领域的网络工程师不仅需要理解路由的概念,而且要有能力在真正的环境下驾驭它。但是,路由领域由高端网络设备供应商(比如 Cisco)提供的产品一统天下,这就意味着对于大多数人来说,只能在学校或者实验室环境中才能学习路由,而且还要一直受到实践时间和实践条件的困扰。我们在组织一门关于 TCP/IP 路由的课程时就遇到了这样的困

软体疯子专栏 1654

FRRouting里的Zebra协议:从Quagga到FRR 8.0,这20年协议头都改了啥?

本文深入探讨了FRRouting中Zebra协议从Quagga到FRR 8.0的20年演进历程,重点解析了协议头结构的变迁及其对开源网络架构的影响。从最初的极简设计到支持多协议栈、IPv6、VRF等现代网络需求,Zebra协议通过版本标识、命令扩展等关键改进,展现了开源网络软件的进化轨迹。文章还详细介绍了协议命令集的扩展逻辑和数据平面优化技术,为读者提供了全面理解Zebra协议演进的视角。

weixin_42554408的博客 354

FRRouting里的Zebra协议:从Quagga到FRR 8.0,这20年它都经历了什么?

本文深入探讨了FRRouting(FRR)中Zebra协议20年的技术演进历程,从GNU Zebra到Quagga再到FRR 8.0的完整发展路径。文章详细解析了Zebra协议的核心架构、版本迭代的关键技术创新,以及在现代网络环境中处理多版本兼容性的实战经验,为网络工程师提供了宝贵的技术参考。

weixin_28702105的博客 219

Zebra路由器

Zebra 是一个开源的 TCP/IP 路由软件,同 Cisco Internet 网络操作系统(IOS)类似。它灵活而且具有强大的功能,可以管理IPv4和IPv6路由的工具。它支持BGP-4协议、BGP-4+协议、RIPv1协议、RIPv2协议、RIPng协议、OSPFv2协议和OSPFv3协议。从 www.Zebra.org 网站下载 Zebra 的最新源程序。 安装 tar -zvxf

王以山的专栏 3650

PHP版本对接支付宝支付接口 电脑网站 详细介绍 沙箱环境 超简单易懂

PHP版本对接支付宝支付接口 其实理顺了思路后,按照我接下来的步骤来,真的超级简单啊,为啥有那么多的朋友们折腾了那么久呢,嘿嘿,跟我走吧~ 我是昨天晚上洗完澡之后,大概八九点,才开始正式开工尝试去这一工程的,我去支付宝的蚂蚁金服开放平台里把各个知识点和文档大概都看了一遍,大致弄明白了要怎么操作了,建议大家看看电脑网站开发文档,忙到了夜里十二点左右,成功地用支付宝给的Demo完成了付款操...

爱玲姐姐的博客 1万+

FRR BGP协议分析9 -- FLOW SPEC

Flowspec引入了一种新的NLRI编码格式,用于分发流量规则流规范。基本上,IP前缀不是简单地依赖于IP前缀的目标IP地址,而是由包含规则的n元组替换。该规则可以是或多或少复杂的以下组合: 网络源/目标(可以是一个或另一个,或两者)。 UDP / TCP的第4层信息:源端口,目标端口或任何端口。 ICMP类型和ICMP代码的第4层信息。 TCP标志的第4层信息。 第3层信息:DSC...

~~ LINUX ~~ 5276

进程间通信的七种方法实战演示!值得收藏!

线程和进程间的通讯(Inter-Process Communication, IPC)是操作系统中的一个重要概念,用于实现不同进程或同一进程中的不同线程之间的数据交换和协调。以下是几个常见的进程间通信的方式:管道、消息队列、共享内存、信号、套接字、信号量、文件映射

十年饮冰,难凉热血,保持热爱,奔赴星海! 2816

父子Agent架构:解决AI系统上下文污染的技术方案

在AI系统设计中,上下文管理是核心挑战之一。传统单Agent架构在处理复杂任务时,常面临上下文无限膨胀导致的信息淹没和性能下降问题。父子Agent架构通过职责分离和上下文隔离机制,采用分而治之的思想,将大任务拆解为多个子任务由专门子Agent处理。该架构中父Agent负责任务规划和结果汇总,子Agent执行具体任务后立即销毁中间状态,通过精炼摘要进行通信。这种设计不仅能有效控制上下文长度,还能提升系统稳定性和执行效率,特别适用于编程辅助、自动化测试等需要多步骤处理的场景。父子Agent架构体现了计算机科学中

weixin_42531710的博客 352

FRR BGP协议分析 1 --- BGP 初始化

FRR支持BGP-4,BGP-4+协议,BGP协议本身的知识点,可以参考很多资料,TCP/IP路由技术是一本不错的书,建议多看几次,还有红茶哥的博客和视频http://blog.sina.com.cn/vinsoney 初始化在bgp_main.c的main函数里开始,其他协议也类似,比如ospf的main函数就在ospf_main.c. main里最重要是初始化,包含: 事件驱动的初始化...

~~ LINUX ~~ 3321

雷达气象学(8)——反射率因子图实战(强对流预警篇)

本文聚焦雷达反射率因子图在强对流预警中的实战应用,深入解析了柱状回波、有界弱回波区(BWER)、三体散射(TBSS)等关键回波结构特征,这些是识别超级单体风暴和大冰雹的核心“身份证”。文章强调从静态识别转向动态追踪与多源数据综合研判的思维转变,并提供了系统的实战分析流程与常见误区避坑指南,旨在提升对强对流天气的短临预警能力。

weixin_29213827的博客 485

FRR BGP协议分析13 -- ZEBRA路由的处理2

前面可知,消息被enqueue了mq的work queue,当zebra的mq的work queue被调度的时候,meta_queue_process回调函数会被执行,for循环执行一个就退出,是为了实现subq的绝对优先级调度。 process_subq 取出头结点的存放的struct route_node,然后直接调用rib_process继续处理route_node,其核心思想是遍历r...

~~ LINUX ~~ 2479

分析攻击流量样本

利用wireshark分析.pcap攻击样本的攻击流程,利用漏洞等。

一段旅途 6842

别再手动调参了!用MATLAB+改进PSO算法,5步搞定机械臂轨迹优化(附完整代码)

本文介绍如何利用MATLAB和改进PSO算法快速优化机械臂轨迹规划,仅需5步即可完成传统耗时的手动调参过程。通过混沌初始化、自适应权重等创新方法,改进PSO算法显著提升优化效率,实现全局最优解搜索,适用于工业自动化中的机械臂控制。文章包含完整MATLAB代码实现,帮助工程师轻松应用于实际生产场景。

weixin_29232121的博客 353

FRR BGP协议分析11 -- ZEBRA初始化

zebra,翻译是斑马,它负责管理其他所有协议进程的路由信息的更新与交互,并负责与内核交换信息,整体的架构如下: Zebra的初始化在zebra/main.c里面,代码也来的干净直接 frr_init创建zebra主进程的master数据结构,用来做事件驱动,我们可以看下thread_master的数据结构。 其整合了事件的可读、可写、定时器、信号的处理,后面有时间可以来学习下...

~~ LINUX ~~ 3878

YOLO11涨点优化:注意力魔改 | 引入Deformable Attention (可变形注意力),灵活感受野自适应复杂形变目标

Deformable Attention为YOLO11带来的不仅是2.6个百分点的mAP提升,更是一种全新的“形变感知”范式。标准卷积的固定感受野在非刚性目标、多尺度变化和遮挡场景下力不从心——Deformable Attention恰好填补了这一空白。从架构设计到代码实现,从竞品对比到部署方案,从生态工具到安全风险,本文覆盖了将Deformable Attention引入YOLO11所需的全部知识链路。

2601_95807009的博客 284

2021-08-20 SONiC中的FRR和Zebra

2021-08-20 SONiC中的FRR和Zebra SONiC中采用FRR和Zebra处理路由协议 以前写过SONiC系统所默认包含的BGP模块在201811版的SONiC之前是开源的Quagga软件,之后改成了更流行的FRR。完整的路由器系统需要协议处理、FIB/RIB维护、转发面芯片配置等功能。FRR提供了BGP路由协议的处理,除此以外,还需要对其他路由协议如各种IGP协议进行管理,SONiC系统通过路由协议获得的路由信息还需要和Redis数据库关联,进而通告订阅/通告机制和系统其他功能互动。SON

weixin_44316184的博客 2643

[计算机头歌]爬虫进阶

【代码】爬虫进阶。

M_inherit的博客 921

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

FRR与VPP路由和转发层面流程

  首先了解一下VPP和FRR结合的架构如下图所示 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7TlmGafp-1590764332456)(https://turbock79.cn/wordpress/wp-content/uploads/2020/04/vpp-frr-路由流程图.png)] 参考文档: 路由平面和转发平面分离:https://wiki.fd.io/view/VPP_Sandbox/router FRR实现官方文档:https://github.com

turbock的博客 7357

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

FRR BGP协议分析17 -- labeled-unicast

LABELED_UNICAST 的update消息和前面的不同点是在bgp_attr_parse解析属性的时候会调用bgp_mp_reach_parse解析BGP_ATTR_MP_REACH_NLRI,而在bgp_mp_reach_parse会处理label和vpn的一些选项,本地我们只说明处理label的,VPN的参照前面的文章。 在bgp_mp_reach_parse会解析label里面的n...

~~ LINUX ~~ 1201

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

FRR BGP协议分析8 -- BGP 层3隧道 (2)

本文,我们分析UPDATE消息的处理过程 层3VPN 的UPDATE消息和前面的路由更新报文的接受处理是一样的,从解析属性的地方开始区别,报文如下图: 2019/12/26 09:32:44 BGP: : 20.20.20.20 rcvd UPDATE w/ attr: , origin ?, metric 100, extcommunity RT:12.1.1.2:2, path 200...

~~ LINUX ~~ 1304

FRR BGP协议分析7 -- BGP 层3隧道 (1)

本文,我们分析BGP 和层3隧道 相关的命令处理 这些命令的原理这里不再介绍 labelexport auto 配置label export auto 后,执行如下的命令 命令会给每个VRF 分配一个标签,然后下发到MPLS 的LFIB表里面,涉及MPLS表项下发到内核的流程,先大概给个流程,后续再补充。 vpn_leak_postchange vpn...

~~ LINUX ~~ 886

FRR BGP协议分析14 -- 静态路由的处理流程

vty_execute静态路由进程执行命令 static_add_route static_install_route static_zebra_nht_register static_nht_update static_nht_update_safi static_zebra_route_add发往zebra ...

~~ LINUX ~~ 1164
上一篇: FRR BGP协议分析11 -- ZEBRA初始化
下一篇: FRR BGP协议分析13 -- ZEBRA路由的处理2
废言Pro
博客等级 码龄16年 1092粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值