网络编程之XDP和TC

一、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.mzph.cn/web/27464.shtml

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

相关文章

C 语言实例 - 输出数组

使用 for 循环输出数组 #include <stdio.h>int main() {int array[10] {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};int loop;for(loop 0; loop < 10; loop)printf("%d ", array[loop]);return 0; }输出结果为&#xff1a; 1 2 3 4 5 6 7 8 9 0使用 for 循环逆向输…

foxmai邮箱使用技巧图文板简单容易,服务器配置密钥配置

本人详解 作者&#xff1a;王文峰&#xff0c;参加过 CSDN 2020年度博客之星&#xff0c;《Java王大师王天师》 公众号&#xff1a;JAVA开发王大师&#xff0c;专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生&#xff0c;期待你的关注和支持&#xf…

手把手教你实现条纹结构光三维重建(2)——条纹解码

在第一讲中&#xff0c;我们讲到了条纹的生成&#xff0c;这一讲&#xff0c;我们将实现条纹的解码。我们这里的解码技术很简单&#xff0c;即高低频倍数解码&#xff0c;详细的论文可以参考&#xff1a;《Temporal phase unwrapping algorithms for fringe projection profilo…

基于 Transformer 的大语言模型

语言建模作为语言模型&#xff08;LMs&#xff09;的基本功能&#xff0c;涉及对单词序列的建模以及预测后续单词的分布。 近年来&#xff0c;研究人员发现&#xff0c;扩大语言模型的规模不仅增强了它们的语言建模能力&#xff0c;而且还产生了处理传统NLP任务之外更复杂任务…

RAC11G修改监听默认端口

大多数现场集群都采用的是默认端口&#xff0c;现XX现场客户领导要求不使用默认端口&#xff0c;以下是修改监听端口的步骤&#xff0c;配置过程中若有疑问可添加文末公众号发私信一对一答疑解惑。 一.修改SCAN listener port 1.1 修改SCAN listener port 1.1.1.crs配置中修…

C++11中的类型推演工具decltype

decltype是根据表达式的实际类型推演出定义变量时所用的类型 auto和decltype的区别 auto类型用编译器计算变量的初始值来推断其类型, decltype虽然也让编译器分析表达式并得到它的类型&#xff0c;但是不实际计算表达式的值。 推演表达式类型作为变量的定义类型 int main()…

4-字符串-11-反转字符串-LeetCode344

4-字符串-11-反转字符串-LeetCode344 LeetCode: 题目序号344 更多内容欢迎关注我&#xff08;持续更新中&#xff0c;欢迎Star✨&#xff09; Github&#xff1a;CodeZeng1998/Java-Developer-Work-Note 技术公众号&#xff1a;CodeZeng1998&#xff08;纯纯技术文&#xff0…

认识一些分布函数-Frechet分布及其应用

1. 何为Frechet分布 Frechet分布也称为极值分布(EVD)类型II,用于对数据集中的最大值进行建模。它是四种常用极值分布之一。另外三种是古贝尔分布、威布尔分布和广义极值分布(Gumbel Distribution, the Weibull Distribution and the Generalized Extreme Value Distributi…

MyBatis-PageHelper 源码解说

归档 GitHub: MyBatis-PageHelper-源码解说 总说明 源码仓库&#xff1a; https://github.com/pagehelper/Mybatis-PageHelper克隆&#xff1a;git clone https://github.com/pagehelper/Mybatis-PageHelper.git切分支&#xff08;tag&#xff09;&#xff1a;git checkout m…

亿达中国武汉园区入选“武汉市科技金融工作站”及“武汉市线下首贷服务站”

近日&#xff0c;武汉市2024科技金融早春行活动在深交所湖北资本市场培育基地举行。会上&#xff0c;第四批武汉市科技金融工作站试点单位名单及第五批武汉地区金融系统线下首贷服务站名单正式公布&#xff0c;武汉软件新城成功入选上述两个名单。 为缓解科技型企业融资难题&a…

vue2+echarts实现简易的2d地图效果

背景 公司的一个可视化数据大屏里面&#xff0c;有一个使用echarts实现的2d地图。不是我开发的&#xff0c;在此记录一下实现过程以及一些扩展解构。应该是从哪个航空航线图改动了一下&#xff0c;效果看起来还是可以的。 效果预览 版本 vue版本使用的是"^2.6.12"…

TypeScript中的数组类型

数组类型 目录 数组类型 目录自动推断类型配置只读数组多维数组 自动推断 不定义类型&#xff0c;推断为never let array []; //never推断为字符串数组 const akun [akun.com, akun001] //const akun : string[] hd.push(100) //因为类型不允许&#xff0c;所以报错推断…

我要成为算法高手-双指针篇

目录 什么是双指针?问题1&#xff1a;移动零问题2&#xff1a;复写零问题3&#xff1a;快乐数问题4&#xff1a;盛最多水的容器问题5&#xff1a;有效三角形个数问题6&#xff1a;查找总价格和为目标值的两个商品(两数之和)问题7&#xff1a;三数之和问题8&#xff1a;四数之和…

Linux中“计划任务”设置以及补充

目录 一、关闭防火墙 &#xff08;1&#xff09;关闭防火墙 &#xff08;2&#xff09;关闭防火墙2 &#xff08;3&#xff09;关闭selinux 二、安装 php 第一步&#xff1a;yum源 第二步&#xff1a;下载php 第三步&#xff1a;启动php 第四步&#xff1a; 检查php是…

web前端开发前途:探索、挑战与无限可能

web前端开发前途&#xff1a;探索、挑战与无限可能 在数字化浪潮席卷全球的今天&#xff0c;Web前端开发作为连接技术与用户的桥梁&#xff0c;其前途无疑充满了探索、挑战与无限可能。本文将从四个方面、五个方面、六个方面和七个方面&#xff0c;深入剖析Web前端开发的前途&…

私域流量新利器:大模型+智慧客服+知识智能多管齐下,效果倍增!

前言 随着互联网环境的发展&#xff0c;线上市场竞争日益激烈&#xff0c;越来越多的企业开始关注私域流量的运营和管理——将品牌的用户数据在品牌官网、微信公众号、APP等自有平台上进行管理和运营&#xff0c;通过与用户建立深入的关系和互动&#xff0c;提升用户黏性、增强…

LNMP搭建:Linux+Nginx+MySQL+PHP

关闭防火墙和核心防护&#xff0c;使用一台机器Node1搭建LNMP systemctl stop firewalld; setenforce 0 所需源码包&#xff1a;可以去官网下载 编译Nginx 创建/data&#xff0c;在/data/下放源码包 [rootNode1 ~]#:mkdir /data;cd /data 安装依赖包 [rootNode1 data]#:yum …

利用STM32F103驱动舵机的指南(使用HAL库)

利用STM32F103驱动舵机的指南&#xff08;使用HAL库&#xff09; 舵机是一种常用的执行器&#xff0c;可以在机器人、遥控模型、自动化装置等项目中用来进行角度控制。本文将介绍如何利用STM32F103微控制器&#xff0c;通过HAL库来驱动舵机。 硬件准备 STM32F103开发板&…

第一个SpringBoot程序

第一个SpringBoot程序 目录介绍 当我们创建了一个SpringBoot项目之后&#xff0c;会出现如下的目录结构 SpringBoot项⽬有两个主要的⽬录&#xff1a; src/main/java: Java源代码 src/main/resources:为静态资源或配置⽂件&#xff1a; /static&#xff1a;静态资源⽂件夹,⽐…

Spring Cloud Netflix 之 Ribbon

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言前言1、负载均衡1.1、服务端负载均衡1.2、客户端负载均衡 2、Ribbon实现服务…