Rust的eBFP框架Aya(一) - Linux内核网络基础

前言

在我的Rust入门及实战系列文章中已经说明, Rust是一门内存安全的高性能编程语言,从它的这些优秀特性来看,就是一门专为系统开发而诞生的语言。至于很多使用Rust来进行web开发的行为,不能说它们不好,只能说是杀鸡焉用牛刀耳。

本系列的文章旨在为大家介绍一个新的专用于开发eBPF程序的Rust框架:Aya。Aya 是 Rust 中的一个 eBPF(Extended Berkeley Packet Filter)库,提供了用 Rust 语言编写、加载和运行 eBPF 程序的能力。eBPF 是一种强大的技术,用于在 Linux 内核中安全地运行沙盒程序,常用于网络编程、性能监控和安全增强。我们在后面的文章中将对eBPF进行更加详细和深入的介绍。

Linux内核网络基础

如果你还不了解什么是eBPF, 那么其实从它的名称中便可见一斑,从Packet Filter可以看出,这显然是用于包的处理的一门技术。它通过在Linux的内核中的不同挂载点,加入一个隔离可控的二进制程序,来达到我们想要为内核增加功能处理网络包的目的。既然是在内核的网络处理流程中动手脚,那么在开始之前,我们有必要对Linux内核原本的网络处理流程有基本的认知, 否则,如果直接开始eBPF的编写,那么我们很可能会变成狗拿刺猬,无从下手。

网络模型概览

众所周知,网络模型的的划分有不同的方法, 最流行的莫过于经典的OSI七层网络模型, TCP/IP四层网络模型,还有综合两者而成的五层网络模型。从理解内核网络工作原理的角度出发,我们选择五层网络模型进行接下来的探究:
请添加图片描述

注: 在Linux系统中,内核源码的位置位于/usr/src/目录下的对应内核命名的目录下,例如我使用的azure虚拟机上,内核代码的目录为/usr/src/linux-headers-5.15.0-1052-azure。 后文提到的内核代码相关的目录都是以此为根的相对路径。

Linux内核在收到一个网络数据包后,首先会由网卡驱动程序(相关内核代码位于drivers/net/ethernet中)先进行处理, 然后回交由内核中处理协议栈相关的代码进行处理(相关内核代码位于kernel/net/中),处理完成后的结果,再由socket提供接口,供用户空间的应用层程序访问。

网络中断处理原理

那么从网卡收到数据包,是怎么传递给内核进行处理的呢,这里就要谈到中断处理了。 从硬件的角度来看,当一个网卡收到数据包时, 它会进行以下两件事情:

  • 将数据包以DMA(Direct Memory Access)的方式, 将收到的数据帧存放到内存的环形缓冲区中(Buffer Ring);
  • 向CPU的引脚施加一个电压变化,向CPU表明现在有一个数据来了,需要处理。

上述这种通过向CPU引脚施加电压的硬件操作,被称为硬中断。那么CPU此时就会对收到的数据包进行处理,那么如何处理呢?网络包如果一直不停的到来,而对网络包的处理往往又是复杂和耗时的,如果CPU每收到一个数据包都对它进行处理完成后再干别的工作,就会导致CPU的占用率过高,而无法对其他的硬中断进行响应了,比如鼠标键盘等设备发起的硬中断请求。

软中断注册

因此,当CPU收到一个网卡发来的硬中断时,它会告诉网卡驱动程序: “你先去内存登记一下待办事项吧”,于是网卡驱动程序会在内存中标记一个变量,表示这里有一个网络包需要人手来处理了。这个在内存中设置标志的操作,就被称为软中断。

上述过程的图示如下:
请添加图片描述

软中断处理

内核驱动程序处理

在我们的Linux启动后,内核中会运行一个进程ksoftirqd, 它的职责就是检测内存中是否有软中断需要处理, 一旦检测到这是一个网络驱动注册的软中断,就会调用网卡驱动中的poll函数,从内存的环形缓冲区中将网络数据包收下来并进行处理, 这个过程的图示如下:
请添加图片描述
其中, 网卡驱动程序中的igb_poll()函数会从内存的环形缓冲区中将完整的网络数据包取出来,然后调用igb_clean_rx_irq()函数进行处理,这些处理包括:

  • 校验收到的数据格式是否是一个合法的网络包;
  • 将收到的数据包格式化成skb,解析timestamp, VLAN id, protocol等字段信息
内核协议栈处理

在驱动程序对数据包进行处理后,处理完的数据将被发送到内核的协议栈进行处理,在进入协议栈之前,内核中存在一个GRO引擎,它的作用是把一些小的网络包合成一个大的网络包,一次性发给协议栈进行处理,目的是减少传送给协议栈的包数量,这有助于减少 CPU 的使用量。
请添加图片描述
如上图所示,在数据包进入协议栈后:

  • 首先会调用netif_receive_skb()函数,其中会辨别数据包的网络层协议,根据网络层协议调用不同的函数;
  • 例如判断得到这个数据包是个IP包,则会接下来调用ip_rcv()函数,在其中又会判断它的传输层协议,根据其是TCP还是UDP而调用不同的函数;
  • 例如判断得到这是一个TCP包,那么将继续调用tcp_rcv()函数对数据进行处理;
  • 处理完成后的数据可以供用户通过socket访问;

小结

网络模块在Linux内核中及其复杂,上面的介绍以尽可能简单明了的方式描述了一个数据包从网卡收到它开始,如何被内核进行处理的整个过程。其中包含了CPU硬中断,ksoftiqrd线程,软中断处理,网卡驱动对数据包的处理,skb的创建, 网络协议栈对数据包的处理等过程。

本文没有涉及用户空间应用程序从socket取包的过程,这涉及到recvfrom系统调用,也是一个比较复杂的话题。本系列文章旨在介绍Rust开发eBPF程序,只关注内核对网络包的处理流程,因此用户空间取包不在我们的关注范围内。在了解了网络包在内核中的处理流程之后,对于后需eBPF程序的挂载点,我们应当会有更清晰的认识。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

企业集团采购系统(供应商、询价、招投标)-源码

一、业务需求 企业招标询价供应商管理系统是一种专业的采购管理系统,旨在帮助企业实现供应商关系的管理和采购成本的控制。该系统涵盖了企业采购管理的各个方面,包括采购预算、供应商管理、产品管理、采购计划、询价、竞价、招标、采购订单、采购合同执…

python数据分析总结(pyecharts)

目录 安装依赖 Demo pyecharts.options 图表绘制 WordCloud.shape 安装依赖 pip install pyecharts Demo ### 对象式 from pyecharts.charts import Bar bar Bar() bar.add_xaxis([1,2,3,4,5]) bar.add_yaxis("数据1",[40,56,65,23,56]) bar.add_yaxis("数…

远程服务器QEMU+Ubuntu+GRUB+VNC最佳实践

远程服务器QEMUUbuntuGRUBVNC最佳实践 1. 准备2. QEMU启动安装Ubuntu2.1 服务器端2.2 本地端 3. 从服务器终端控制虚拟机GRUB与虚拟机终端 这段时间参与大量内核切换测试工作,实体机需要硬件自检太过笨重,因此主要通过QEMU验证正确性。有一个很大的问题是…

docker的资源控制

对容器使用宿主机的资源进行限制。例如:cpu、内容、磁盘I/O docker使用Linux自带的功能Cgroup功能进行控制 Cgroup是什么? Cgroup:Control grouos是Linux内核系统提供的一种可以限制、记录、隔离进程组所使用的物理资源机制。 docker借助…

Intel® Enclave Access Control and Data Structures(二)

文章目录 前言一、Overview of Enclave Execution Environment二、Terminology三、Access-control Requirements四、Segment-based Access Control五、Page-based Access Control5.1 Access-control for Accesses that Originate from non-SGX Instructions5.2 Memory Accesses…

原码,补码,反码(极简版)

原码补码反码 都有符号位,0表示正数,1表示负数 正数 正数的原码,补码,反码都相同 负数 负数的原码,最高位是1,其余的用正常二进制表示 负数的反码,对原码进行符号位不变,其余位…

网站高性能架构设计——web前端与池化

从公众号转载,关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一、高性能浏览器访问 1.减少HTTP请求 HTTP协议是无状态的应用层协议,也就是说每次HTTP请求都需要建立通信链路、进行数据传输&#xf…

vue-baidu-map实现在地图上选择范围并解决相关问题

vue-baidu-map实现在地图上选择范围并解决相关问题 实现地图上选择不规则范围实现功能遇到的问题1、覆盖物多边形怎么才能盖住覆盖物点2、遇到其他问题 实现地图上选择不规则范围 这个功能比较简单,只需要使用vue-baidu-map插件的覆盖物多边形功能就行了。直接看文…

重生奇迹mu卓越哪里掉的最多

项链篇 [火之项链] 1.地下城:(地狱猎犬怪,骷髅战士,地狱蜘蛛,死灵巫师,毒牛怪,暗黑骑士) 2.失落之塔:(鬼魂,剧毒鬼魂) 3.亚特兰蒂斯:(小巴哈姆特,死亡美人鱼,蓝翼海怪) [雷之项链] 1.地下城:(毒牛怪,暗黑骑士,魔鬼戈登) 2.失落之塔:(鬼魂,剧毒鬼魂,诅咒巫师,牛魔王,恶魔…

二叉树oj题总结

1.检查两颗树是否相同 https://leetcode.cn/problems/same-tree/ 分成子问题和结束条件 ,这里用前序的思想解题(先判断根,再左右子树),不然会很浪费时间。假如左右相等,最后根不同,白白比较了 …

员工持股平台模式有哪几种?

员工持股平台模式 目前在现有的市场环境下持股平台的模式主要有公司型的持股平台以及有限合伙企业的持股平台。 (一)公司型员工持股平台 设立公司型的员工持股平台的唯一目的是为了让平台公司受让母公司的股权,从而实现员工间接持有母公司股权…

自动定量包装机市场研究: 2023年行业发展潜力分析

中国包装机械业取得了快速发展,但也出现了一些低水平重复建设现象。据有关资料显示,与工业发达国家相比,中国食品和包装机械产品品种缺乏25%-30%,技术水平落后15-25年。我国包装专用设备制造行业规模以上企业有319家,主…

宁盾统一身份中台助力某集团公司实现统一身份认证和管理(如泛微OA、微软AD)

某集团公司是一家以钢铁为主业,涉足互联网金融、文化健康、智慧城市、现代物流等多领域的大型现代化企业集团。创业发展已有三十余年,拥有员工人数超万人,为了提升管理效率,同时实现国产化创新和数字化转型,公司采用了…

[MySQL] MySQL复合查询(多表查询、子查询)

前面我们学习了MySQL简单的单表查询。但是我们发现,在很多情况下单表查询并不能很好的满足我们的查询需求。本篇文章会重点讲解MySQL中的多表查询、子查询和一些复杂查询。希望本篇文章会对你有所帮助。 文章目录 一、基本查询回顾 二、多表查询 2、1 笛卡尔积 2、2…

JVM 命令行监控及诊断工具

面试题 你使用过Java虚拟机性能监控和故障处理工具吗?(美图) 怎么打出线程栈信息。(字节跳动) JVM诊断调优工具用过哪些? (京东) 怎么获取 Java 程序使用的内存?堆使用…

Linux学习教程(第十四章 Linux系统服务管理)一

第十四章 Linux系统服务管理(一) 什么是系统服务?服务是在后台运行的应用程序,并且可以提供一些本地系统或网络的功能。 那么,Linux 中常见的服务有那些,这些服务怎么分类,服务如何启动&#x…

diffusers pipeline拆解:理解pipelines、models和schedulers

diffusers pipeline拆解:理解pipelines、models和schedulers 翻译自:https://huggingface.co/docs/diffusers/using-diffusers/write_own_pipeline v0.24.0 diffusers 设计初衷就是作为一个简单且易用的工具包,来帮助你在自己的使用场景中构建…

四十、Saga模式

目录 一、定义 二、流程 三、优点 四、缺点 五、四种模式的对比 一、定义 Saga模式是一种用于处理复杂异步操作流的模式,通常用于React/Redux的应用程序中。在这种模式中,业务逻辑被分成多个离散步骤,每个步骤都是一个Generator函数&…

AUTOSAR CP Port Driver简介

Port Driver 1 背景2 基于 EB 及 TC39X 配置3 Port API 使用1 背景 Port driver 在 AUTOSAR 中是一个比较冷门的模块,基本上在 MCAL 层级,关注的人也少,他由不像其他模块那样通用型比较强,Port 在每种内核的 MCU 的配置都有区别,甚至有些芯片直接没有 Port 模块,使用其他方…

企业级高级美颜美妆SDK解决方案

人们对于美的追求已经不仅仅局限于现实世界,更延伸到了虚拟世界。为了满足这一需求,美摄科技全新开发了一款高级美颜美妆SDK,为企业提供了一站式的美颜美妆解决方案。 这款全新的美颜美妆SDK,是我们对美颜技术的一次全面升级。它…