网络编程之XDP和TC

news2024/11/29 18:28:07

一、TC之于XDP

在前面分析过XDP,今天简单分析一下与其相关的TC,即traffic control,流量控制。在分析XDP时知道其只能用于ingress方向触发,而TC却可以在两个方向即ingress和egress方向触发。也可以简单理解成它可以同时钩住进出两个方向的数据。
同时,XDP位于网络栈的最底层,可以加载到驱动上进行运行。而TC是在数据链路层,最主要的功能就是流量控制,这种流量控制要和TCP窗口流控区别开来。TC的控制主要是对数据包进行管理。也因为TC更接近上层,所以可以访问sk_buff(IP报文)这种数据结构,而不象XDP只能自己搞一个xdp_buff。也正因为如此,TC和硬件基本没有半毛钱关系了,这和XDP是一个比较明显的不同。
由于位置的不同所处的协议栈的层次不同,因此其对数据的处理就有所不同,XDP位于底层,数据更原始完整,可以进行原始报文的修改控制;而TC处于上层,但可以使用更强大的数据结构处理更复杂的修改需求。
在实践中经常遇到的tcpdump抓包程序,其抓包的位置入口方向在XDP和TC之间,而出口方向位于TC之后。这个很重要,否则不知道数据包的位置就无法正确的判断包的准确性和完整性。
下面的图可以说明二者的关系:

在这里插入图片描述

二、原理

XDP是基于eBPF钩子的,TC亦是如此。在更向上的TC中,可以使用ip数据报文,即数据结构体sk_buff。最重要的是在TC中可以通过BPF程序读取其中的很多元数据如protocol、napi_id等等。在元数据的支持下,对数据报文的修改会更安全更方便。不过,反过来也是如此,处理元数据本身就是一个很复杂的过程。
TC使用的hook是分别是:在ingress方向上:由__netif_receive_skb_core函数来调用sch_handle_ingress函数;在egress方向上:由__dev_queue_xmit函数来调用sch_handle_egress函数。
TC使用Classifiers(cls_bpf)和Action来处理相关的行为,有点类似于编程模式中的策略模式或者说链式调用。cls_bpf可以动态自动更新程序而勿需重启或中断网络,这就大体现出了其优势。通常情况下,egress方向上会存在附着到网络设备上的qdisc队列。而在两方向上,cls_bpf都用一个sch_clsact的伪qdisc进行管理,这个伪qdisc可以同时处理两个方向上的钩子。
cls_bpf实例中可以同时包含多个TC程序,但这么做会导致重复的报文解析,千万性能的下降。TC有四个组件:
1、Queuing disciplines,简称为qdisc,即有算法的队列,默认的算法是FIFO,形成了一个最简单的流量调度器
2、Class,也就是上面的分类器,即对qdisc进行分类
3、Filters,过滤器,过滤数据报文并使其流入对应class的qdisc
4、Policers,策略,其实它是filter一个规则管理,用来其后对网络包操作,如丢弃、延迟或限速

三、分析和应用场景

TC可以进行packet mangling(数据报文处理),但更倾向于packet scheduler,即网络包的丢弃、顺序和速度控制等。看到这儿,是不是可以一下子想起对网络的动态控制,比如对不同用户不同服务的网络资源进行管理。事情往往具有两面性,TC的优势恰恰也是其劣势,复杂的配置极可能导致事得其反的效果。
可以基于上层应用的TC命令来一窥其面貌。TC命令一般分成三类,即qdisc队列,Class类型(分类器)以及filter过滤器,二者均挂在qdisc上。这是不是和上面分析的有些相互响应。看一个简单的例子:

# creat cls_act class
sudo tc qdisc add dev eth0 cls_act

# load ingress eBPF
sudo tc filter add dev eth0 ingress bpf da obj tc-pro.o sec ingress

# load egress eBPF
sudo tc filter add dev eth0 egress bpf da obj tc-pro.o sec egress

更多的相关命令可参看Linux官方的文档。
其实TC的应用场景很多,但主流仍然是流控。

四、总结

创新是技术的灵魂。不断重复的技术其实就是一种落后的表现。做为一个开发者,加入创新技术的大军可能是很小概率的事件,但不代表对新技术的不敏感。对于开发者来说,新技术的优秀重点在于落地。不能落地的新技术,还不如老的技术。

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

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

相关文章

气膜球幕影院:多元化应用的新选择—轻空间

随着科技的进步和人们对体验需求的不断提升,气膜球幕影院以其独特的结构和灵活的应用,逐渐成为多个领域的重要工具。 教育领域 在教育领域,气膜球幕影院展现出强大的优势。其便捷的搭建方式使得教育机构可以在不同场合快速部署。通过全景投影…

HK1-BOX X3刷UBUNTU 24.04,并开启WIFI

端午刚好有点时间,顺便把改完散热的HK1-BOX刷了个最新OC版的UBUNTU 24,这里记录下操作的步骤: 准备材料 HK1-BOX S905X3:注意X4的不行固件没匹配的。建议先改完散热,不然作为7X24小时的机器长时间高温还是很伤硬件的…

6个免费自动写文章软件,简直好用到爆

对于创作者而言,创作一篇高质量的文章并非易事,它需要耗费大量的时间与精力去构思、组织语言、斟酌字句。灵感并非总是源源不断,有时我们可能会陷入思维的僵局,不知从何下手。而此时,免费自动写文章软件就如同黑暗中的…

Java--多维数组

1.多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组 2.二维数组 下列数组啊可看成一个两行五列的数组 int a[][] new int[2][5]; 3.输出二维数组的第一个数组中具体元素,通过调用打…

【JAVA开发笔记】实战演练,如何用EasyExcel导出表格,并且自定义合并单元格

目录 1. 前言 2. EasyExcel简介 3. EasyExcel简单导出案例讲解 3.1 EasyExcel依赖引入 3.2 测试类创建 3.3 Excel导出实现 4. EasyExcel合并单元案例讲解 4.1 实现自定义合并策略 4.2 使用自定义合并策略 5. 总结 1. 前言 项目上,需将一个列表数据导出Ex…

AI实践与学习6-RAG流程优化学习

背景 RAG流程很多细节优化点,助力AIGC。 内容 LangChain在RAG功能上的一些能力 多路向量检索 多向量检索器的核心想法是将我们想要用于答案合成的文档与我们想要用于检索的参考文献分开。这允许系统为搜索优化文档的版本(例如,摘要&…

Aivis:AI声音模仿系统的创新之旅

在人工智能技术的不断进步中,声音合成技术也迎来了新的发展机遇。Aivis项目正是这一领域的杰出代表,它提供了一个全流程的工具,让用户能够从数据集的创建到学习再到推理,一站式地生成逼真的语音。 Aivis是一个基于Bert-VITS2模型的…

八、BGP

目录 一、为何需要BGP? 二、BGP 2.1、BGP邻居 2.2、BGP报文 2.3、BGP路由 2.4、BGP通告遵循原则 2.5、BGP实验 第一步:建立邻居 第二步:引入路由 BGP路由黑洞 路由黑洞解决方案 1、IBGP全互联 2、路由引入 3、MPLS 多协…

MySQL Online DDL原理解读

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…

YOLOv10网络架构及特点

YOLOv10简介 YOLOv10是清华大学的研究人员在Ultralytics Python包的基础上,引入了一种新的实时目标检测方法,解决了YOLO 以前版本在后处理和模型架构方面的不足。通过消除非最大抑制(NMS)和优化各种模型组件,YOLOv…

matplotlib twinx多y轴但单个图例

matplotlib 用 twinx 画多 y 轴参考 [1]。现想在画图例时,多个 y 轴的图例画在一起,写法参考 [2]。本文展示一个简例,效果: Code 要手动指定颜色,否则原 y 轴的用色和新 y 轴会重合。 import matplotlib.pyplot as…

Echarts图表:地图都有哪些配置项,一文告诉你

地图是可视化大屏中最常见的组件,echart图表中关于地图的组件非常多,那么该如何进行配置,让地图和自己的设计稿保持一致。贝格前端工场为大家列举一下。 charts地图图表在配置项中有以下常用的配置选项: title:图表标…

深入理解计算机系统 家庭作业6.34

第一步先求(S,E,B,m) 题目说共C32个字节,块大小B为16个字节,那就是分为两组:0,1.然后每组存4个int 每个4字节 CB*E*S .B16 ,直接映射的E就是1,所以S2 m为啥等于7? 通过写出两个数组所有的地址可以得出m7. 得出高速缓存的参数:(S,E,B,m)(2,1,16,7),注意图6-26每个参数的定义…

欣九康诊疗系统让中医诊所创收不再难

近些年由于国家对中医药的支持政策不断地在推进落实,所以导致中医馆、中医诊所越开越多,再加上各行各业都在向数字化转型,也给中医诊所带来了冲击,所以如何平衡机遇与竞争,实现诊所创收便成了每位中医诊所的负责人所必…

推箱子-小游戏

学习目标: 巩固Java基础,数据类型、二维数组、条件语句等; 效果展示:

空手出门不是梦,华为手机还能这么用?

夏天到了,出门东西多,零碎又费事对吧?现在就教你把繁琐的各类钥匙、公交卡、地铁卡、门禁卡、身份证……统统收纳到手机里!手机化身手提包,轻松出门!今天,我就跟大家聊聊这两神奇的功能&#xf…

Maven引用存放在本地的jar包

场景 由于需要对接合作方的接口,合作方提供了一套加解密的方法,但是需要在项目中引用他们提供的jar包,才能使用此套方法。 解决方案 方案一:将合作方的jar包保存到项目中,在pom文件内指定jar包路径进行依赖 方案二…

STM32项目分享:智能窗帘系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB板打样焊接图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片: 哔哩哔哩视频链接: https://www.bilibili.c…

网络超时

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在访问一个网页时,如果该网页长时间未响应,系统就会判断该网页超时,所以无法打开网页。下面通过代码来模拟一个网…

【MySQL】索引(上)

https://www.wolai.com/curry00/fzTPy3kSsMDEgEcdvo4G5w https://www.bilibili.com/video/BV1Kr4y1i7ru/?p69 https://jimhackking.github.io/%E8%BF%90%E7%BB%B4/MySQL%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/#%E7%B4%A2%E5%BC%95 索引是一种用于快速查询和检索数据的数据结构…