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

2024-06-22 11:36

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

这篇关于网络编程之XDP技术的基础eBPF的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1084177

相关文章

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

金融业开源技术 术语

金融业开源技术  术语 1  范围 本文件界定了金融业开源技术的常用术语。 本文件适用于金融业中涉及开源技术的相关标准及规范性文件制定和信息沟通等活动。

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

poj 3181 网络流,建图。

题意: 农夫约翰为他的牛准备了F种食物和D种饮料。 每头牛都有各自喜欢的食物和饮料,而每种食物和饮料都只能分配给一头牛。 问最多能有多少头牛可以同时得到喜欢的食物和饮料。 解析: 由于要同时得到喜欢的食物和饮料,所以网络流建图的时候要把牛拆点了。 如下建图: s -> 食物 -> 牛1 -> 牛2 -> 饮料 -> t 所以分配一下点: s  =  0, 牛1= 1~

poj 3068 有流量限制的最小费用网络流

题意: m条有向边连接了n个仓库,每条边都有一定费用。 将两种危险品从0运到n-1,除了起点和终点外,危险品不能放在一起,也不能走相同的路径。 求最小的费用是多少。 解析: 抽象出一个源点s一个汇点t,源点与0相连,费用为0,容量为2。 汇点与n - 1相连,费用为0,容量为2。 每条边之间也相连,费用为每条边的费用,容量为1。 建图完毕之后,求一条流量为2的最小费用流就行了

poj 2112 网络流+二分

题意: k台挤奶机,c头牛,每台挤奶机可以挤m头牛。 现在给出每只牛到挤奶机的距离矩阵,求最小化牛的最大路程。 解析: 最大值最小化,最小值最大化,用二分来做。 先求出两点之间的最短距离。 然后二分匹配牛到挤奶机的最大路程,匹配中的判断是在这个最大路程下,是否牛的数量达到c只。 如何求牛的数量呢,用网络流来做。 从源点到牛引一条容量为1的边,然后挤奶机到汇点引一条容量为m的边

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念