Cilium核心技术-eBPF XDPTC介绍

news2024/12/28 20:14:11

eBPF 是一项革命性技术,它能在内核中运行沙箱程序(sandbox programs), 而无需修改内核源码或者加载内核模块。
eBPF的一个重要特性是能够使用高级语言(如C)来实现程序。LLVM有一个eBPF后端,用于编辑包含eBPF指令的ELF文件,前端(如clang)可以用于生成程序。
在一个后端转换为字节码后,使用bpf()系统调用加载bpf程序,并校验安全性。JIT会将字节码编译进CPU架构中,并将该程序附加到内核对象上,当这些对象发生事件时会触发程序的执行(例如,当从一个网络接口发送报文时)。

eBPF work flow

在这里插入图片描述

eBPF MAP


eBPF map是用户空间和内核空间之间的数据交换、信息传递的桥梁。本质上是以「键/值」方式存储在内核中的数据结构,它们可以被任何知道它们的BPF程序访问。在内核空间的程序创建BPF Map并返回对应的文件描述符,在用户空间运行的程序就可以通过这个文件描述符来访问并操作BPF Map,这就是为什么BPF Map在BPF世界中是桥梁的存在了。

网络数据收发原理

在这里插入图片描述

1.数据包达到物理网卡(RX FIFO),通过DMA到内存中。内存指的是网卡的接收的Ring Buffer。
2.并且拷贝成一个一个的sk_buffer.
3.触发硬中断,通知CPU,已经有数据来了,CPU根据注册的中断函数,中断函数调用驱动程序,驱动先禁用网卡的中断,目的下次再来数据就直接处理就可以,就不再通知CPU的硬中断。
4.弥补硬中断处理时间问题,需要启用一个软中断。(主要是弥补硬中断处理时间不及的问题)
5.数据单元的sk_buffer然后再交给我们的协议栈处理。实际上就是交给网络层和传输层来处理。[被ip层协议和传输层协议处理]
6.去处掉网络层和传输层的头以后,CPU就把数据Copy到用户空间的应用程序。

内核单元层级关系

在这里插入图片描述

网络相关的(子系统),但对于存储和其他系统,问题都是类似的。图中列出了对这些子系统进行操作所需的工具。例如:

配置以太网驱动或者网络设备需要使用 ethtool 命令;
配置路由使用 ip 命令;
配置过滤使用 seccom 命令;
配置 IP 防火墙使用 iptables 命令,但如果你使用的是 raw sockets,那有很多地方都 会 bypass,因此这并不是一个完整的防火墙;
配置流量整形使用 tc 命令;
抓包使用 tcpdump 命令,但同样的,它并没有展示出全部信息,因为它只关注了一层;
如果有虚拟交换机,那使用 brctl 或 ovsctl;
所以我们看到,每个子系统都有自己的 API,这意味着如果要自动化这些东西,必须单独的使用这些工具。有一些工具这样做了,但这种方式意味着我们需要了解其中的每一层。

eBPF work point

在这里插入图片描述
需要弄清楚netfilter所处的位置:

BPF XDP ---> sk_buffer ---> TC[network stack Dividing Line] ---> IPv4 And IPv6 ---> Netfilter ---> TCP UDP RAW

XDP (eXpress Data Path)

XDP 代表 eXpress Data Path,提供了 BPF 框架,可在 Linux 内核中实现高性能可编程数据包处理。它在软件中尽早运行 BPF 程序,即在网络驱动程序收到数据包时。

在XDP中,驱动程序只是从ring buff中接收数据包,而没有执行任何其他的操作,例如分配 skb 将数据包进一步推入网络堆栈,也没有将数据包推入 GRO 引擎因此,XDP BPF 程序在 CPU 处理时最早执行。

XDP 中传递给 BPF 程序的数据包表示形式为 BPF 上下文如下所示:

struct xdp_buff {
    void *data;
    void *data_end;
    void *data_meta;
    void *data_hard_start;
    struct xdp_rxq_info *rxq;
};

处理后返回状态:

enum xdp_action {
    XDP_ABORTED = 0,
    XDP_DROP,
    XDP_PASS,
    XDP_TX,
    XDP_REDIRECT,
};

XDP_DROP:在驱动层丢弃报文,通常用于实现DDos或防火墙
XDP_PASS:允许报文上送到内核网络栈,同时处理该报文的CPU会分配并填充一个skb,将其传递到GRO引擎。之后的处理与没有XDP程序的过程相同。
XDP_TX:BPF程序通过该选项可以将网络报文从接收到该报文的NIC上发送出去。例如当集群中的部分机器实现了防火墙和负载均衡时,这些机器就可以作为hairpinned模式的负载均衡,在接收到报文,经过XDP BPF修改后将该报文原路发送出去。
XDP_REDIRECT:与XDP_TX类似,但是通过另一个网卡将包发出去。另外, XDP_REDIRECT 还可以将包重定向到一个 BPF cpumap,即,当前执行 XDP 程序的 CPU 可以将这个包交给某个远端 CPU,由后者将这个包送到更上层的内核栈,当前 CPU 则继续在这个网卡执行接收和处理包的任务。这和 XDP_PASS 类似,但当前 CPU 不用去做将包送到内核协议栈的准备工作(分配 skb,初始化等等),这部分开销还是很大的。
XDP_ABORTED:表示程序产生了异常,其行为和 XDP_DROP相同,但 XDP_ABORTED 会经过 trace_xdp_exception tracepoint,因此可以通过 tracing 工具来监控这种非正常行为。

TC (traffic control)

除了XDP之外,BPF 还可以工作在网络数据路径中的内核 TC(流量控制)层。 XDP BPF 程序与 tc BPF 的主要区别:
tc BPF 程序可以在ingress方向触发,也可以网络数据路径中的egress方向触发。

没有eBPF处理丢包的网络包路径:
在这里插入图片描述netfilter 丢包处理的网络包路径:
在这里插入图片描述
tc 丢包处理的网络包路径:
在这里插入图片描述XDP 丢包处理的网络包路径:
在这里插入图片描述下面是一张不同的网络包处理技术在处理路径图:
在这里插入图片描述

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

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

相关文章

WEB:Web_php_unserialize

背景知识 反序列化函数及绕过 正则表达式及绕过 题目 源码解析&#xff08;参考链接在最后&#xff09; <?php class Demo { //定义一个类private $file index.php; //变量属性public function __construct($file) { //类方法$this->file $file; …

分布式锁与同步锁

什么是分布式锁 分布式锁是一种在分布式系统中用于协调多个节点访问共享资源的机制。在分布式系统中&#xff0c;由于存在多个节点并行执行任务&#xff0c;可能会出现竞争条件和数据不一致的问题。分布式锁通过约束同一时刻只有一个节点能够获得锁的方式&#xff0c;确保了对…

【计算机视觉】DINOv2(Facebook自监督视觉学习)的环境部署和使用代码示范(含源代码)

文章目录 一、导读二、环境部署三、使用示例 我的代码示范已经上传了Kaggle平台&#xff0c;具体的笔记地址为&#xff1a; https://www.kaggle.com/code/holmes0610/dinov2一、导读 DINOv2&#xff1a;在没有监督的情况下学习鲁棒的视觉特征 这是第一种训练计算机视觉模型的…

2023爱分析·AIGC厂商全景报告|爱分析报告

关键发现 通用大模型市场当前虽入局者众多&#xff0c;但终局将高度集中&#xff0c;未来将由5-6家厂商主导&#xff1b;应用层厂商及甲方企业应着眼终局&#xff0c;从大算力、巨量数据集、端到端AI工程化能力以及应用生态伙伴等维度综合考虑&#xff0c;慎重选择合作伙伴。 …

【LeetCode每日一题合集】2023.7.10-2023.7.16

文章目录 16. 最接近的三数之和排序 双指针 1911. 最大子序列交替和解法——动态规划 2544. 交替数字和&#xff08;简单模拟&#xff09;931. 下降路径最小和&#xff08;线性DP&#xff09;979. 在二叉树中分配硬币⭐⭐⭐⭐⭐&#xff08;dfs&#xff09;18. 四数之和&#…

[JAVA]程序逻辑控制,输入输出

&#x1f349;内容专栏&#xff1a;【JAVA】 &#x1f349;本文脉络&#xff1a;程序逻辑控制&#xff0c;if语句&#xff0c;switch循环&#xff0c;while循环&#xff0c;for循环&#xff0c;do while循环输入输出&#xff0c;例子 &#x1f349;本文作者&#xff1a;Melon_西…

Python:基于matplotlib与mayavi的3D可视化

文章目录 &#xff08;1&#xff09;基于matplotlib的3D可视化&#xff08;2&#xff09;基于mayavi的3D可视化&#xff08;2.1&#xff09;立方体&#xff08;2.2&#xff09;体素体 3D可视化是一种用于呈现三维数据的方法&#xff0c;它可以帮助我们更好地理解和分析复杂的空…

搭建 Java 部署环境,部署 Web 项目到 Linux

为了进行部署&#xff0c;把写好的 java web 程序放到 Linux 上&#xff0c;需要先把对应的依赖的软件 (环境) 搭建好&#xff0c;安装一些必要的软件程序 JDKTomcatMySqL jdk 直接使用包管理器进行安装(基于yum安装) 一、yum 1、认识 yum yum (Yellow dog Updater, Modified…

随机产生50个55以内的不重复的整数,要求查找出一个缺失的整数。

一、设计思路 为随机产生50个55以内的整数且不能重复&#xff0c;应先将已经产生的随机数保存下来&#xff0c;然后在获取到新的随机数时&#xff0c;与之前保存下来的值进行对比&#xff0c;如果已经出现过则抛弃&#xff0c;并再次获取&#xff0c;直到获取到不同的随机值为止…

Redis 从入门到精通【进阶篇】之过期和淘汰策略详解

文章目录 0. 前言Redis过期策略&#xff1a;1. 定期删除&#xff08;定时器方式&#xff09;&#xff1a;2. 惰性删除&#xff08;访问时检查方式&#xff09;&#xff1a; Redis淘汰策略&#xff1a;1. noeviction&#xff1a;2. allkeys-lru&#xff1a;3. volatile-lru&…

GOPATH、GOROOT(VSCode编写第一个go程序)

1. GOROOT和GOPATH GOROOT 和 GOPATH 都是 Go 语言中的环境变量&#xff0c;用于指定 Go 工具链和工作区的路径。 GOROOT 指定了 Go 工具链的安装路径&#xff0c;它包含了 Go 语言的标准库、编译器等工具。在使用 Go 编译器、运行时等工具时&#xff0c;它们会默认从 GOROOT…

Linux ➾ 端口占用检查

Linux ➾ 端口占用检查 &#x1f53b; 前言&#x1f53b; 一、什么是监听端口&#x1f53b; 二、使用lsof命令查看端口占用情况&#x1f53b; 三、使用netstat命令检查监听端口&#x1f53b; 四、使用ss 检查监听端口&#x1f53b; 总结—温故知新 &#x1f53b; 前言 在Linux系…

举例说明基于线性回归的单层神经网络网络(以梯度下降算法来求解权重的过程)...

我们将通过一个简单的例子来说明基于线性回归的单层神经网络&#xff0c;以及如何使用梯度下降算法来求解权重。 假设我们有以下数据集&#xff0c;表示学生的学习时间&#xff08;小时&#xff09;与他们的考试分数&#xff1a; 学习时间&#xff08;X&#xff09;&#xff1a…

C# 反转无头链。

给定一个单链表的头结点pHead(该头节点是有值的&#xff0c;比如在下图&#xff0c;它的val是1)&#xff0c;长度为n&#xff0c;反转该链表后&#xff0c;返回新链表的表头。 数据范围&#xff1a; 0≤n≤1000 要求&#xff1a;空间复杂度 O(1) &#xff0c;时间复杂度 O(n) 。…

【SpringBoot应用篇】SpringBoot集成atomikos实现多数据源配置和分布式事务管理

【SpringBoot应用篇】SpringBoot集成atomikos实现多数据源配置和分布式事务管理 分布式事务概念XA和JTA概述SpringBoot集成atomikos数据库结构pom通用工具类RBaseControllerBaseExceptionCodeExceptionCodeBaseExceptionBaseUncheckedExceptionBizException application.yml数据…

【C语言】扫雷----详解(扩展版)

&#x1f341; 博客主页:江池俊的博客_CSDN博客 &#x1f341; 如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏&#x1f31f; 三连支持一下博主&#x1f49e; ✉️每一次努力都是一次进步&#xff0c;每一次尝试都是一次机会。无论遇到什么困难&#xff0c;…

SpringBoot 使用前缀树实现敏感词过滤

文章目录 前缀树介绍节点初始化前缀树添加敏感词删除敏感词敏感词过滤代码实现 前缀树介绍 前缀树&#xff08;Trie&#xff09;&#xff0c;也称为字典树或前缀字典树&#xff0c;是一种特殊的多叉树数据结构。它用于高效地存储和检索字符串集合。以下是前缀树的常见数据结构…

verilog实现led闪烁

文章目录 verilog实现led闪烁一、介绍二、代码三、仿真代码四、仿真结果五、总结 verilog实现led闪烁 一、介绍 使用verilog实现代码&#xff0c;实现led闪烁&#xff0c;每间隔200ms进行切换led灯 二、代码 module led (input wire clk,input wire rstn,output wire[3:0] …

深入解析向量数据库:定义、原理和应用的全面指南

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

C++智能指针(3/3)

目录 上一节内容 share_ptr用法 share_ptr指针可以用于上一节所说的错误 例子&#xff08;类定义&#xff09; 主函数代码 执行的结果 解释说明 share_ptr 相关构造 空的share指针可以指向其他相同类型的变量来进行托管 可以shared_ptr< T > sp2(new T())也可以s…