bonding原理分析和问题排查

news2024/12/27 12:39:02

bonding原理

发送端:
使用网卡bond3模式(广播模式BOND_MODE_BROADCAST)将报文从两个网卡同时发出,无需修改报文。
接收端:
根据发送节点时间的链路通断状态,接收端设置一条线路为活动线,另一条为备份线,并将从活动线收到的报文上送到协议栈,备份线的报文被丢弃。
在这里插入图片描述

需要考虑的问题

1)网关MAC地址可配置 当发送端节点和接收端节点不在同一网段,需通过网关转发时,需确认网关MAC地址是否可配置,若网关MAC地址可配置,即两个网关可配置相同IP和MAC地址,构成两个完全对称的网络,报文无需进行特殊处理。
2)网关MAC地址不可配置 若网关MAC地址不可修改,则三层交换机虽配置了相同的IP地址,但对应的MAC地址却各不相同,由于ARP学习过程中,发送端节点只能学习到其中一个网关地址的MAC地址,例SW1的MAC地址,则K1从两个网络发出报文的目的MAC地址只是其中某个网关的MAC地址(如SW1的MAC地址),而永远无法到达另个网关(如SW2)。因此需要设计网关MAC地址自动学习模块,将报文的目的MAC地址替换为对应网络的网关MAC地址,才能顺利让报文通过两个网络到达对端。

数据发送时网关MAC地址自动修正:Bond驱动将数据通过物理网卡发送到网络上时,通过比较报文中的目的MAC地址是否与网关MAC地址表中的某一项网关MAC地址一致,来判断报文是否是发往网关。如果报文是发往网关的,则根据网关MAC地址表来修正报文中的目的MAC地址。物理网卡A发送的报文,将用物理网卡A对应的网关MAC地址来修正报文中的目的MAC地址。
在这里插入图片描述

bonding核心代码实现 发送端

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在bond_xmit_broadcast函数中通过bond_for_each_slave_rcu(bond, slave, iter)遍历所有bond的网卡并调用bond_dev_queue_xmit通过该网卡进行报文发送。
在这里插入图片描述
bond各个模式的含义:
BOND_MODE_ROUNDROBIN(循环调度):数据包按照循环顺序分发到不同的网络接口上,实现负载均衡。
BOND_MODE_ACTIVEBACKUP(主备模式):只有一个网络接口处于活动状态,其他接口作为备份。当活动接口故障时,备份接口会接管数据传输。
BOND_MODE_XOR(异或模式):使用异或操作将源和目的 MAC 地址的一部分与网络接口数量进行运算,将数据包分发到不同的接口。
BOND_MODE_BROADCAST(广播模式):将数据包广播到所有网络接口,实现广播传输。
BOND_MODE_8023AD(IEEE 802.3ad 动态链接聚合):使用 IEEE 802.3ad 协议实现链路聚合,将多个网络接口绑定成一个逻辑接口,提供更高带宽和冗余。
BOND_MODE_TLB(传输负载平衡):根据传输流的源和目的 IP 地址,将数据包分发到不同的网络接口,以实现负载均衡。
BOND_MODE_ALB(TLB + RLB 组合模式):结合传输负载平衡(TLB)和接收负载平衡(RLB),实现传输和接收两个方向上的负载平衡。

bonding核心代码实现 接收端

在这里插入图片描述
在bond_open中根据bond模式将回调函数设置为bond->recv_probe = bond_link_probe;
在这里插入图片描述
对每个bond的网卡注册__netif_receive_skb_core接收报文时的回调函数bond_handle_frame。例如有两个网卡A和Bbond,当这两个网卡接收到报文时会在进入协议栈之前先进行bond_handle_frame函数的处理。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在__netif_receive_skb_core函数中最开始会经过trace_netif_receive_skb即trace追踪报文,如何经过list_for_each_entry_rcu(ptype, &ptype_all, list)即tcpdump抓包点,然后再经过rx_handler回调函数,并根据其返回值进行后续处理,最后经过deliver_ptype_list_skb(skb, &pt_prev, orig_dev, type,&ptype_base[ntohs(type) &PTYPE_HASH_MASK]);即ip协议栈处理。
其中
RX_HANDLER_CONSUMED: 表示当前处理函数已经处理完此数据包,不需要其他处理函数再处理。
RX_HANDLER_ANOTHER: 表示当前处理函数已经处理了部分数据包内容,但仍需要其他函数处理剩余内容。
RX_HANDLER_EXACT: 表示当前处理函数与数据包匹配程度很高, strongly suggests给下一个函数。但它还可以继续处理。
RX_HANDLER_PASS: 表示当前处理函数与数据包不匹配,直接跳过该处理函数,传给下一个函数处理。
在这里插入图片描述
在这里插入图片描述
bond_handle_frame函数即为bond接收报文的核心处理函数。以BOND_MODE_BROADCAST模式为例,recv_probe回调函数为bond_link_probe。其中skb->dev = bond->dev;表示通过该源ip进行报文响应时由于skb->dev改为了bond->dev,所以发送报文xmit的回调函数也改为了bond->dev的发送报文回调函数。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
bond_active_link_filter函数的含义为,为每个源ip报文创建一个struct link_state_entry表项。初始时由于memset(entry, 0, sizeof(*entry));所以最开始entry->cur_index为0,其0号对应的网卡为entry->state_tlb[0].line = slave;。然后每来一个报文更新一下网卡对应state_tlb的状态。即entry->state_tlb数组的每个元素代表每个网卡。在bond_entry_update_state函数中总共有两个for循环两个if判断,当if判断满足时就会return退出,所以只会更新该网卡对应state_tlb的信息。例如最开始网卡A先kmalloc申请struct link_state_entry,即entry->state_tlb[0].line为网卡A且entry->cur_index为0;然后网卡B再收到同样的报文,经过bond_entry_update_state函数更新状态,即entry->state_tlb[1].line为网卡B。
最后在if( entry->state_tlb[entry->cur_index].line != slave )判断中只有网卡A的报文会被上送到协议栈,网卡B的报文由于返回值为RX_HANDLER_CONSUMED会被丢弃。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
bond_link_state_reselect_one函数即为链路切换流程,通过if(time_after(tmp->last_active,best->last_active +msecs_to_jiffies(bond->params.cycle_time * bond->params.switch_cycle)))判断,当遍历到的网卡tmp->last_active时间小于阈值时间时if( tmp->state_count++ >= bond->params.delay_cycle )即代表网卡tmp连续state_count次正常收到报文,即将活动网卡即active切换到该网卡即best_index = i;最后再entry->cur_index = best_index;。
回到bond_active_link_filter函数的if( entry->state_tlb[entry->cur_index].line != slave )判断中,由于entry->cur_index值发生了改变,进而使活丢弃报文的网卡发生改变。例如原来为网卡A上送报文到协议栈网卡B丢弃报文,切换后变为网卡B上送报文到协议栈网卡A丢弃报文。

问题排查

在这里插入图片描述
服务端使用bond进行tcp通信,服务端connect连接不成功,但是可以互相ping通。通过tcpdump抓包,用测试程序进行测试发现服务端bond绑定的两物理个网卡都能收到客户端connect系统调用发送报文,但是服务端bond创建的虚拟网卡没有收到该报文,即服务端将两个物理网卡接收到的connect连接报文都丢弃了没有进一步上送到协议栈中。

但是用ssh连接时也用的tcp协议,两个物理网卡都能收到报文,并能正确将其中一个网卡的报文上送给协议栈将另一个网卡的报文丢弃。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
ICMP_ECHOREPLY (类型 0): 回显应答。用于回应ICMP ECHO请求消息,通常用于网络连通性测试。
ICMP_DEST_UNREACH (类型 3): 目的地不可达。用于通知发送方无法到达目标主机或网络。
ICMP_SOURCE_QUENCH (类型 4): 源抑制。用于通知发送方降低发送速率,以防止网络拥塞。
ICMP_REDIRECT (类型 5): 重定向。用于通知发送方更改路由以优化数据包传输。
ICMP_ECHO (类型 8): 回显请求。用于发送方向目标主机发送一个回显请求,以测试网络延迟和可达性。
ICMP_TIME_EXCEEDED (类型 11): 超时。用于通知数据包在传输过程中超过了允许的生存时间。
ICMP_PARAMETERPROB (类型 12): 参数问题。用于通知发送方数据包中存在错误或不支持的参数。
ICMP_TIMESTAMP (类型 13): 时间戳请求。用于发送方向目标主机请求时间戳信息。
ICMP_TIMESTAMPREPLY (类型 14): 时间戳应答。用于目标主机回应时间戳请求。
ICMP_INFO_REQUEST (类型 15): 信息请求。用于发送方向目标主机请求附加信息。
ICMP_INFO_REPLY (类型 16): 信息应答。用于目标主机回应信息请求。
ICMP_ADDRESS (类型 17): 地址掩码请求。用于发送方向目标主机请求子网掩码信息。
ICMP_ADDRESSREPLY (类型 18): 地址掩码应答。用于目标主机回应子网掩码请求

在这里插入图片描述
在这里插入图片描述
通过上述信息可知道,主要是开了nft防火墙限制了tcp服务端绑定的端口。可通过systemctl stop firewalld.service停止该服务,或者firewall-cmd --add-port=10000/tcp添加白名单端口。即可进行tcp通信。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从上述信息可以看到tcpdump抓包可以抓到bond的两个网卡,网卡A和网卡B都能抓到请求和响应icmp报文,但是bond3网卡只能抓到响应icmp报文。原理即为两个bond的网卡都能收到对端发送的icmp请求报文,但是bond3的响应报文tcpdump抓包点都能抓到包。
在这里插入图片描述
dev_queue_xmit_nit即为发送报文的抓包点,netdev_start_xmit最开始为bond3的发送报文是会被抓包回调函数即bond_start_xmit然后再通过两个物理网卡发送出去,即实际物理网卡发送报文时会再次被tcpdump抓包。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1605093.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

yolov7模型输出层预测方法解读

本文从代码的角度分析模型训练阶段输出层的预测包括以下几个方面: 标注数据(下文统称targets)的正样本分配策略,代码实现位于find_3_positive。候选框的生成,会介绍输出层的预测值、GT、grid、 anchor之间的联系损失函…

操作系统-一个学习能力的新高度

目录 一、目标二、计划三、完成情况四、提升改进(最少3点)五、意外之喜(最少2点)六、总结 一、目标 通过考试,当然这是眼前目标;通过对知识的学习,补上在计算机中那些透明的东西,从而让知识可以按照逻辑一层一层的构建知识大厦&a…

鸿蒙入门07-Blank组件

空白填充组件 在容器 主轴方向 上 空白填充组件具有自动填充空余部分的能力 注意 : 仅在父组件为 Row 或者 Column 的时候有效 注意 : 不能使用通用属性修饰 参数 参数名 参数类型 是否必填 默认值 参数描述 min number | string 否 …

就业班 第三阶段(nginx) 2401--4.17 day1 nginx1

负载均衡集群 1、集群是什么? 1 集群(cluster)技术是一种较新的技术,通过集群技术,可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益,其任务调度则是集群系统中的核心技术。 …

【python】描述性统计计算偏斜度和峭度

文章目录 1.编写计算偏斜度和峭度的函数。并用自己编写的函数计算课本23页的习题1.5数据的偏斜度和峭度。2.从1.5数据中随机抽取2个容量为20的样本,分别计算它们的平均数和标准差3.请绘制给定数据的频率分布直方图,计算数据的均值、标准差、偏斜度和峭度…

Linux LVM 逻辑卷管理

Logical Volume Manager,逻辑卷管理 能够在保持现有数据不变的情况下动态调整磁盘容量,从而提高磁盘管理的灵活性/boot分区用于存放引导文件,不能基于LVM创建 三大概念: 物理卷PV基于硬盘或分区设备创建而来,生成N多…

抖音小店类目怎么选?新手开店这几个类目别碰!

大家好,我是电商笨笨熊 刚进入抖音小店,一定不要着急选品,而是先选择适合自己的类目。 类目决定抖店未来的发展方向,类目不对,努力白费! 今天我们就来聊聊新手做抖店该如何正确挑选合适的类目。 新手进入…

微信投票活动制作步骤是什么

随着社交媒体的不断发展,微信已成为人们生活中不可或缺的一部分。而微信投票活动,作为一种新颖、有趣的互动方式,正逐渐受到越来越多企业和个人的青睐。那么,如何制作一场成功的微信投票活动呢?今天,就让我…

JavaSE:继承 多态

继承 继承的本质 子类能够使用父类的方法和变量 使用场景:代码复用 在一个类中实现了一个很复杂的方法,给一个新类重新实现这个方法,我们直接继承即可 public class Student {public String sno;public void study() {System.out.printl…

多个微信如何自动化管理?

01 批量自动加好友 微信私域管理系统可以批量导入客户号码或微信号,设置多个号同步加好友任务。这一功能极大地减轻了手动添加好友的繁琐操作,避免因操作过多导致频繁而封号。 02 机器人自动回复 在系统上可以设置自动通过好友、通过好友后自动回复以…

物联网在工业中的应用是什么?——青创智通

工业物联网解决方案-工业IOT-青创智通 物联网在工业中的应用已经日益广泛,它为企业带来了前所未有的机会和挑战。物联网技术通过连接各种设备和系统,实现了数据的实时采集、分析和优化,从而提高了生产效率、降低了成本并提升了企业的竞争力。…

Nextjs使用recoil遇到的报错

Expectation Violation: Duplicate atom key “userInfo”. This is a FATAL ERROR in production. But it is safe to ignore this warning if it occurred because of hot module replacement. 可能在服务端和客户端都运行导致重复声明 可在 _app.tsx / _app.jsx 入口页 将r…

预选小标题

海岛,广东小岛 汕头 南澳岛(推荐) 距离东凤镇 500公里 珠海 需要坐船出海, 到达珠海码头 75公里 东澳岛, 桂山岛 海岛基本都差不多 阳江市海陵岛 可以赶海 距离东凤镇 240公里 江门 川岛, 下川岛 可下海 距离东凤镇 150公里 山林丹霞地貌 韶关 丹霞景区, 韶石景区,巴寨景…

【ZYNQ】PS和PL数据交互丨AXI总线(主机模块RTL代码实现)

文章目录 一、PS-PL数据交互桥梁:AXI总线1.1 AXI总线和AXI4总线协议1.2 PS-PL数据传输的主要场景1.2.1 PL通过AXI_HP操作DDR3 Controller读写DDR31.2.2 PS作主机使用GP接口传输数据 1.3 AXI端口带宽理论1.4 AXI 总线的读写分离机制1.5 握手机制1.6 AXI_Lite总线1.7 …

C++类和对象第二弹(构造,析构和拷贝构造函数)

目录 前言 1. 类的6个默认成员函数 2. 构造函数 2.1 概念 2.2 特性 3. 析构函数 3.1 概念 3.2 特性 4. 拷贝构造函数 4.1 概念 4.2 特征 总结 前言 本文主要讲解类中构造函数、析构函数和拷贝构造函数。关于这三个类中默认成员函数的知识点很多,有许多…

【C++20】学习笔记:在事件驱动使用携程

2021年文章:比物理线程都好用的C++20的协程,在事件驱动代码中的应用解析 大神给出了可以用的例子:例子代码执行 源码 //https://bbs.huaweicloud.com/blogs/266537 #include <iostream> #include <vector>//这只是一个极简的模型示例,真实的代码要远比它复杂得…

基于工程车辆/物流车辆/消防车辆远程通信的车队管理解决方案

交通运输对全球经济至关重要&#xff0c;特别是长途卡车在现今的供应链中发挥着重要作用。目前&#xff0c;货运物流面临许多挑战&#xff0c;包括不断上升的燃料价格和排放污染等问题。由于重型卡车的尺寸和载重量大&#xff0c;这意味着它们产生更多的二氧化碳排放足迹。在国…

【CDN产品测评-笔记】探索云服务中的安全和性能增强功能

【CDN产品测评-笔记】探索云服务中的安全和性能增强功能 写在最前面1. DNS管理&#xff1a;核心的域名服务功能2. DDoS防护&#xff1a;构筑坚不可摧的防线3. Web防护&#xff1a;智能化的网络攻击防御4. BOT管理&#xff1a;精准识别与流量控制5. 加速服务&#xff1a;提升全球…

航芯通用MCU技术常见问题 | F4专题

日常工作中&#xff0c;我们的销售或技术工程师经常会收到来自用户的问题&#xff0c;其中一些问题是比较常见的&#xff0c;所以为满足日常用户对航芯产品使用及服务的了解&#xff0c;航芯特此推出“通用MCU技术常见问题”专题&#xff0c;分为F0专题及F4专题&#xff0c;欢迎…

Ubuntu 22.04 配置VirtualBox安装Windows 10虚拟机

Ubuntu 22.04 配置VirtualBox安装Windows 10虚拟机 文章目录 Ubuntu 22.04 配置VirtualBox安装Windows 10虚拟机1.安装virtualbox2.下载Window.iso文件并载入3.问题解决3.1 Kernel driver not installed (rc-1908)3.2 VT-x is disabled in the BIOS for all CPU modes 4.安装Wi…