网络编程之XDP技术的基础eBPF

一、XDP和TC的技术支撑

在前面分析了XDP和TC技术,从它们的细节里可以看出,它们都在调用eBPF的钩子函数。那么eBPF是什么呢?在2021年曾经写过一篇《eBPF介绍》的初级文章,对eBPF做了一个入门级的普及。但是未曾在技术层面上进行展开。这次借着XDP分析的机会,将其一并进行一下分析。先看一下XDP、TC及eBPF它们的关系图:
在这里插入图片描述

从图上可以看出,XDP和TC通过Maps调用内核中的eBPF来实现相关的功能。不过需要说明的是,eBPF的功能可不是支持XDP和TC。

二、eBPF

eBPF可以使相关的程序运行在内核空间,它拥有自己的指令集(等于抽象了一层),是一个抽象的虚拟机(VM)。所谓虚拟机,学习过包括Java在内的开发者应该非常明白它的基本原理了。
一般来说,做为开发者,在应用层开发相关功能已经能够满足大多的需求了。而且,OS将其管理空间划分为用户和内核态空间,也有着设计上的各种考虑。无论是从安全、易用性和可移植性等等方面的情况看,让绝大多数用户在用户态空间上进行开发。既隔离了OS系统本身的复杂和被误处理,又抽象出一层专门对外接口,衍生出专门的上层框架和库。即使从不同的角度来看这种设计形式,相对来说都是非常完善的。
但是世界上总有一些情况,需要在用户空间内想直接处理一些硬件的或者内核的信号或数据。有人说,可以开接口啊?让上层调用这些个接口。OK,这个想法说明具有了初步的面向接口开发的意识。但是,接口开发意味着有几种情况:
1、内核的稳定性,导致接口不可能随心所欲的设计和应用。说白了,就是爱情不是你想买,想买就能买。
2、开发周期的迭代导致的反应不及时。这里需要一个接口,还得等一个小版本甚至大版本。少则论月多则论年。
3、安全性,新的接口是否能够保证不影响其它功能并保持功能最小化。
4、不可动态编程性,接口是静态的,而需求是反复横跳,不断变化的。
而eBPF出现则缓解了这种矛盾。eBPF是虚拟的,意味着它可以在大多数的内核版本间移植(只要支持eBPF),它在内核沙箱中运行,即使有问题,也不会影响内核的安全和稳定。
eBPF的程序有三部分组成:
1、eBPF内核程序:其在内核中运行并响应各种事件
2、eBPF用户层程序:eBPF程序加载到内核并与之响应的程序
3、eBPF Maps(hash maps, arrays, ring / perf buffer):用来将eBPF内核程序和用户空间程序间的数据等共享。
在这里插入图片描述

上图很清晰的可以看到相关的eBPF整体的工作流程。因此,eBPF不但可以应用各种网络的安全、监控、过滤以及相关的开发外,还可以对内核的具体的某些情况进行控制和相关处理。

三、分析和说明

eBPF的程序在上面有过一个基本的说明,现在分析一下其基本的流程:
1、首先通过LLVM/CLANG将eBPF源码进行编译,生成bytecode代码
2、通过bpf()调用和BPF_PROG_LOAD调用,内核将bytecode进行验证
3、JIT将字节码编译并附加其到内核对象
4、运行并处理相关应用
目前内核对eBPF程序支持的类型有以下几类:

enum bpf_prog_type {BPF_PROG_TYPE_SOCKET_FILTER,// a network packet filterBPF_PROG_TYPE_KPROBE,//determine whether a kprobe should fire or notBPF_PROG_TYPE_SCHED_CLS,// a network traffic-control classifierBPF_PROG_TYPE_SCHED_ACT,//a network traffic-control actionBPF_PROG_TYPE_TRACEPOINT,// determine whether a tracepoint should fire or notBPF_PROG_TYPE_XDP,// a network packet filter run from the device-driver receive pathBPF_PROG_TYPE_PERF_EVENT,// determine whether a perf event handler should fire or notBPF_PROG_TYPE_CGROUP_SKB,// a network packet filter for control groupsBPF_PROG_TYPE_CGROUP_SOCK,// a network packet filter for control groups that is allowed to modify socket optionsBPF_PROG_TYPE_LWT_IN,BPF_PROG_TYPE_LWT_OUT,BPF_PROG_TYPE_LWT_XMIT,// a network packet filter for lightweight tunnelsBPF_PROG_TYPE_SOCK_OPS,// a program for setting socket parametersBPF_PROG_TYPE_SK_SKB,// a network packet filter for forwarding packets between socketsBPF_PROG_CGROUP_DEVICE,// determine if a device operation should be permitted or notBPF_PROG_TYPE_SK_MSG,BPF_PROG_TYPE_RAW_TRACEPOINT,BPF_PROG_TYPE_CGROUP_SOCK_ADDR,BPF_PROG_TYPE_LWT_SEG6LOCAL,BPF_PROG_TYPE_LIRC_MODE2,BPF_PROG_TYPE_SK_REUSEPORT,BPF_PROG_TYPE_FLOW_DISSECTOR,BPF_PROG_TYPE_CGROUP_SYSCTL,BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE,BPF_PROG_TYPE_CGROUP_SOCKOPT,BPF_PROG_TYPE_TRACING,BPF_PROG_TYPE_STRUCT_OPS,BPF_PROG_TYPE_EXT,BPF_PROG_TYPE_LSM,BPF_PROG_TYPE_SK_LOOKUP,BPF_PROG_TYPE_SYSCALL, /* a program that can execute syscalls */
};

而eBPF使用的主要数据结构有以下几类:

enum bpf_map_type {BPF_MAP_TYPE_UNSPEC,  /* Reserve 0 as invalid map type */BPF_MAP_TYPE_HASH,//a hash tableBPF_MAP_TYPE_ARRAY,//an array map, optimized for fast lookup speeds, often used for countersBPF_MAP_TYPE_PROG_ARRAY,//an array of file descriptors corresponding to eBPF programs; used to implement jump tables//and sub-programs to handle specific packet protocolsBPF_MAP_TYPE_PERF_EVENT_ARRAY,//stores pointers to struct perf_event, used to read and store perf event countersBPF_MAP_TYPE_PERCPU_HASH,//a per-CPU hash tableBPF_MAP_TYPE_PERCPU_ARRAY,//a per-CPU array, used to implement histograms of latencyBPF_MAP_TYPE_STACK_TRACE,// stores stack tracesBPF_MAP_TYPE_CGROUP_ARRAY,//stores pointers to control groupsBPF_MAP_TYPE_LRU_HASH,//a hash table that only retains the most recently used itemsBPF_MAP_TYPE_LRU_PERCPU_HASH,//a per-CPU hash table that only retains the most recently used itemsBPF_MAP_TYPE_LPM_TRIE,//a longest-prefix match trie, good for matching IP addresses to a rangeBPF_MAP_TYPE_ARRAY_OF_MAPS,// a map-in-map data structureBPF_MAP_TYPE_HASH_OF_MAPS,// a map-in-map data structureBPF_MAP_TYPE_DEVMAP,//for storing and looking up network device referencesBPF_MAP_TYPE_SOCKMAP,//stores and looks up sockets and allows socket redirection with BPF helper functionsBPF_MAP_TYPE_CPUMAP,BPF_MAP_TYPE_XSKMAP,BPF_MAP_TYPE_SOCKHASH,BPF_MAP_TYPE_CGROUP_STORAGE,BPF_MAP_TYPE_REUSEPORT_SOCKARRAY,BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE,BPF_MAP_TYPE_QUEUE,BPF_MAP_TYPE_STACK,/* See /usr/include/linux/bpf.h for the full list. */
};

更详细的请参考官方文档及下列源码:
include/uapi/linux/bpf.h:BPF头文件,包含相关的辅助函数列表、辅助函数使用的标记及结构体和常量的描述
net/core/filter.c:网络有关的辅助函数及使用的程序类型相关描述
kernel/trace/bpf_trace.c:程序跟踪有关辅助函数
kernel/bpf/verifier.c:辅助函数用于校验eBPF map有效性的函数
kernel/bpf/:其他辅助函数(如cgroups,sockmaps等)
samples/bpf/:例程

侯老师说过,源码之前,了无秘密。可以去查看相关的代码并运行,看一下,就明白了。

四、应用场景

eBPF之所以流行起来,最主要原因之一仍然是云,也就是虚拟化的快速应用。在前面的文章中也提到了BPF不是一个多么新鲜的事情,但真正的被广泛认知就是从云的不断的发展而引起的。云和虚拟化的应用中,动态管理和动态操作是最基本的要求。而此时对网络的管理和控制,特别是网络安全,就提到了最迫切的程度上来。而回顾前面的文章中XDP和TC的应用正好可以解决其中的一部分问题。举一个例子,通过eBPF的可编程性,可以替换iptables的相关策略,从而达到自主控制Socket的传输,实现负载均衡。
当然,eBPF不只是针对网络,只要能够达到的地方,都可以进行相关的事件、数据等的处理。所以从上面的分析来看,它可以应用于以下场景:
1、可观测网络或相关
2、安全监控和审计
3、自定义编程扩展功能
再介绍几个常见的实例:
1、K8S对网络系统的监控
2、各大云厂商基于eBPF的监控
3、mongodb 数据通信的解析
4、Cilium
5、其它很多

五、总结

eBPF的发展史,就是一部需求推进的发展史。所以说,技术不落地,发展的速度就会受限。反过来,强劲的落地需求,推动着技术不断的完善和快速发展。学习也是如此,如果只是为了学习新技术而学习,无法在实际工作中应用,那么技术学习了往往也会被忘记。而如果在实际的场景中应用到,那么对技术的理解会越来越深越来越通晓。这样,在后面的工作中会应用的如鱼得水。甚至有可能反过来,深入技术内部进行完善和修改。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决双击bootstrap.bat没有生成b2.exe文件

双击bootstrap.bat但是并没有没有生成b2.exe文件,会报如下错误: "cl" 不是内部或外部命令,也不是可运行的程序 或批处理文件。D:\cppsoft\boost_1_85_0\tools\build\src\engine>dir *.exe 驱动器 D 中的卷是 Data 卷的序列号是…

【机器学习 复习】第11章 神经网络与深度学习(重中之重)

一、概念 1.神经元模型 (1)神经网络的基本组成单位 (2)生物上,每个神经元通过树突接受来自其他被激活神经元的信息,通过轴突释放出来的化学递质改变当前神经元内的电位。当神经元内的电位累计到一个水平时…

广东省建筑施工安管人员考核报名流程及照片处理方法

广东省建筑施工企业安管人员考核工作现已全面启动,这对于提升建筑行业的安全生产管理水平至关重要。为了确保广大考生能够顺利报名并参与考核,本文精心梳理了考核报名流程,并提供了证件照的规范处理方法。同时,针对证件照这一关键…

嵌入式通信协议-----UART协议详解(基于智芯Z20k11X)

目录 一、简介 1.概念 2.结构 3.特点 4.优缺点 二、协议帧组成 1.起始位 2.数据位 3.奇偶校验位 4.停止位 三、UART通信过程 四、USART与UART区别 五、代码实现 1.硬件框图 2.软件实现 一、简介 1.概念 USART(Universal Synchronous Asynchronous R…

数字营销新玩法:拓新与裂变的完美结合

在当今这个飞速发展的数字化时代,数字营销已经成为了企业发展中至关重要的一环。拓新,简单来说就是不断去开拓新的客户群体,让更多的人了解并接触到我们的产品或服务。要做到这一点,那可得充分利用各种线上渠道。像热闹非凡的社交…

ffmpeg音视频开发从入门到精通——ffmpeg实现音频抽取

文章目录 FFmpeg 实现音频流抽取1. 包含FFmpeg头文件与命名空间声明2. 主函数与参数处理3. 打开输入文件4. 获取文件信息5. 查找音频流6. 分配输出文件上下文7. 猜测输出文件格式8. 创建新的音频流9. 打开输出文件10. 写入文件头信息11. 读取并写入音频数据12. 写入文件尾部信息…

vue实现的商品列表网页

一、商品列表效果如下 二、代码&#xff1b; vue实现的商品列表网页 &#xff0c; 图片在vue项目的Public文件夹里的 imgs中 <template><div class"common-layout"><!-- el-container:外层容器。 当子元素中包含 <el-header> 或 <el-foo…

如何修复“AI的原罪”

如何修复“AI的原罪” 上个月&#xff0c;《纽约时报》声称&#xff0c;科技巨头OpenAI和谷歌不顾服务条款和版权法的禁止&#xff0c;将大量YouTube视频转录成文本&#xff0c;并将其用作人工智能模型的额外训练数据&#xff0c;从而进入了版权灰色地带。《纽约时报》还援引Me…

细说MCU输出两路PWM波形及改变占空比的实现方法

目录 一、硬件及工程 二、建立工程 三、代码修改 四、下载运行 五、改变PWM波形占空比 1、定义两个全局变量 2、启动定时器 3、重写TIM3中断回调函数 六、下载并运行 一、硬件及工程 文章依赖的硬件及工程配置参考本文作者的其他文章&#xff1a;细说ARM MCU的串口接…

VC++学习(5)——文本编程,插入符的初始化,图形插入符;文字始终在窗口;字符输入功能,回车换行,删除,左键定位;字体修改,字体平滑变色

目录 引出第五讲 文本编程新建项目输入线的初始化根据字体大小定义插入符大小创建图形插入符文字始终保存在窗口中CString类通过字符串资源 路径层字符输入的功能键盘输入消息鼠标左键消息保存点击位置的坐标 输入回车键的处理删除文字的实现 字符输入功能代码字体的修改模拟卡…

开发中遇到的一个bug

遇到的报错信息是这样的&#xff1a; java: Annotation processing is not supported for module cycles. Please ensure that all modules from cycle [hm-api,hm-common,hm-service] are excluded from annotation processing 翻译过来就是存在循环引用的情况&#xff0c;导…

FFmpeg源码:AV_RB32宏定义分析

一、AV_RB32宏定义的作用 AV_RB32是FFmpeg源码中经常出现的一个宏&#xff0c;其定义如下&#xff1a; #ifndef AV_RB32 # define AV_RB32(p) AV_RB(32, p) #endif 该宏定义有多层。把它简化为函数&#xff0c;其函数声明可以等价于&#xff1a; uint32_t AV_RB32(uint…

【机器学习 复习】 第1章 概述

一、概念 1.机器学习是一种通过先验信息来提升模型能力的方式。 即从数据中产生“模型”( model )的算法&#xff0c;然后对新的数据集进行预测。 2.数据集&#xff08;Dataset&#xff09;&#xff1a;所有数据的集合称为数据集。 训练集&#xff1a;用来训练出一个适合模…

【分布式系列】分布式锁timeout了怎么办?

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

ffmpeg windows系统详细教程

视频做预览时黑屏&#xff0c;但有声音问题解决方案。 需要将 .mp4编成H.264格式的.mp4 一般上传视频的站点&#xff0c;如YouTube、Vimeo 等&#xff0c;通常会在用户上传视频时自动对视频进行转码&#xff0c;以确保视频能够在各种设备和网络条件下流畅播放。这些网站通常…

【尚庭公寓SpringBoot + Vue 项目实战】预约看房与租约管理(完结)

【尚庭公寓SpringBoot Vue 项目实战】预约看房与租约管理&#xff08;完结&#xff09; 文章目录 【尚庭公寓SpringBoot Vue 项目实战】预约看房与租约管理&#xff08;完结&#xff09;1、业务说明2、接口开发2.1、预约看房管理2.1.1.保存或更新看房预约2.1.2. 查询个人预约…

【Java】已解决java.io.InterruptedIOException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.io.InterruptedIOException异常 在Java中&#xff0c;java.io.InterruptedIOException异常通常与I/O操作被中断有关。这种中断可能由多种因素引起&#xff0c;如线程被中…

Palo Alto GlobalProtect App 6.3 (macOS, Linux, Windows, Andriod) - 端点网络安全客户端

Palo Alto GlobalProtect App 6.3 (macOS, Linux, Windows, Andriod) - 端点网络安全客户端 Palo Alto Networks 远程访问 VPN 客户端软件 请访问原文链接&#xff1a;https://sysin.org/blog/globalprotect-6/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。…

本地部署Ollama+qwen本地大语言模型Web交互界面

什么是 Ollama WebUI&#xff1f; Ollama WebUI 已经更名为 Open WebUI. Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 WebUI&#xff0c;旨在完全离线操作。它支持各种 LLM 运行程序&#xff0c;包括 Ollama 和 OpenAI 兼容的 API。 Ollama WebUI 是一个革命性的 L…

python数据分析-糖尿病数据集数据分析预测

一、研究背景和意义 糖尿病是美国最普遍的慢性病之一&#xff0c;每年影响数百万美国人&#xff0c;并对经济造成重大的经济负担。糖尿病是一种严重的慢性疾病&#xff0c;其中个体失去有效调节血液中葡萄糖水平的能力&#xff0c;并可能导致生活质量和预期寿命下降。。。。 …