当前位置: 首页 > news >正文

网络编程之XDP技术介绍

一、简介

XDP:eXpress Data Path,快速数据面,听名字是不是很高大上。其实它就是一个快速处理Rx数据包的数据面技术。为什么现在对数据处理如此敏感?原因非常简单,随着网络的不断覆盖社会的各个层面,海量的数据不断出现,而处理这些数据就要求一个字,快。
无论是Linux亦或是Windows,它们都产生于早期的计算机系统,对快速的网络数据处理,大多天生就带有一些不足,这也导致了很多的问题。一般来说,操作系统的特点就是要有相当大的通用性,而这种通用性往往也是性能的瓶颈,这个瓶颈自然也包括网络数据通信。如果说早期的网络尚未普及阶段,数据的量对计算机来说还是可以承受的,但随着网络带宽的不断增加,大型网站的不断出现,导致大规模的并发不断出现,从而使得数据量以无法想象的速度快速增长。通用型的设计在面对这些场景时往往力不从心。
当双11和618的同时支付数量不断上升到一个新层面时,当大量的在线视频用户不断突破上限时…,新的技术需求已经涌现。而针对这些需求,除了应用层、中间层的不断发展,对操作系统也不可避免的提出了更高的技术要求。虽然做为操作系统稳定压倒一切,但稳定不代表不前进。
在前面的文章“eBPF介绍”中就已经对eBPF进行了初步的分析。而此篇的XDP技术就是基于此技术的。

二、原理

在早期的网络编程中,一般能到C1K就已经不错了,后来提高到C10K,C100K,C1000K…可以负责任的说,这个数字一定会继续发展下去。那么,传统的Linux系统对网络协议栈的处理未免有些跟不上潮流。当各种的优化,不管是从硬件还是驱动还是OS还是应用层,都无能为力时,但网卡的性能还在不断增加,传输速率从10G到100G而且还在不断的增加时,新的技术就会应运而生。Intel公司率先提出了自己的解决方案DPDK,但做一家知名的大公司与开源的Linux天生就不会合群的,你有的,Linux一定也会有的,这也就是David S. Miller说的那句名言“DPDK is not Linux”。随着Linux技术准备完成,在Linux4.8以上版本,提供了XDP技术支持。
XDP可以理解成一个Linux内核网络栈的最底层的数据处理机制,利用钩子为BPF提供了一个加载的入口。而这个入口可以直接操作数据而无需劳动内核其它的部分。说的简单一些,去一家公司办事,在门口就被拦了下来,能处理就处理,不能处理的再按套路来。这样,就灵活快捷了很多。XDP只能用来处理Rx路径上的数据包而不会处理Tx路径上的数据包。

在这里插入图片描述

XDP有三种处理模式:
1、offload(卸载)模式即网卡需要支持将XDP程序直接运行到网卡上。这种械是最强的编程模式,它可以直接在最原始的网络数据入口处对数据进行处理(过滤、丢弃等),其效率和速度当然是最好的,但缺点是它需要硬件的支持即NIC的支持,这个就比较麻烦了。一般来说,硬件厂商是无利不起早的,所以这个模式目前还有点难缠。
2、native(原生或者本地)模式,相对于上面的处理,退而求其次,运行在网卡驱动中,而这种层级,也是相当底层的,处理数据的性能也非常高。相对来说,驱动做为一种固件,升级还是比硬件升级容易不少,所以在这种模式下支持XDP程序的网卡还是有不少。
3、generic(通用)模式,一听通用,大家可能明白了,这就是一种兼容模式。也就是说网卡不支持,驱动不支持都没事儿,反正现在是虚拟的设备横行。没有可以模拟出一个来,但这样一来,对内核的要求就高了。当然,模拟的总归不如真实的,直接的表现就是性能会显著降低。网上的资料其与native模式大约有10倍左右的差距。

在这里插入图片描述

XDP通过上述的方式提供了内核网络栈的可编程机会并且解决了使用kernel bypass出现的一些问题,这才是重点。

三、优点和缺点

一个技术不可能光有优点也不可能光有缺点,对XDP而言也是如此:
XDP的优点主要有:
1、对网络数据处理及时、快捷
2、性能高度优化
3、支持指令虚拟机(BPF)
4、可扩展
5、可编程
6、不需要专门的硬件
7、不需要kernel bypass(或者说Linux自己的kernel bypass)
8、与传统网络协议栈(TCP/IP)很好融合
XDP的缺点:
1、通用性差,毕竟XDP是专用的
2、XDP没有缓存队列,所以可能在Tx和Rx不匹配时,可能丢包
3、对IP分片支持不友好

四、应用

明白了XDP的优势,就可以有针对性的在相应的场景下应用:
1、防火墙,各种数据过滤
2、阻止一些网络攻击,如DDoS
3、处理网络的负载均衡
4、高并发处理(如交易、金融等)
5、网络数据采集(采样和统计分析等)

五、总结

我们学习了很多的Linux的相关的新技术,这次又是XDP。网络技术的不断前进最主要的原因是需求的爆发式增长,为了解决问题,各种技术不断的涌现,有临时的,有侧重一点的,有关心一层的,诸多种类,不一而足。学习一个技术点,然后将其它相关的技术点整合成线,最终融合成面,那么对这些相关的技术的整体综合运用就会得心应手。

相关文章:

  • VFS:8.fd管理-fs/file.c源码阅读
  • Rockmongo详解:高效管理MongoDB的图形化利器
  • SM201,SM203主控模块备件
  • 算法——二分查找
  • 开关电源中电感设计
  • R语言探索与分析14-美国房价及其影响因素分析
  • Codeforces Round 951 (Div. 2) D. Fixing a Binary String 题解
  • Linux系统之部署Blog-Index导航页
  • nginx c++模块编译
  • 【JS重点知识05】正则表达式
  • java基础练习题
  • Web前端与REST API:深度解析与实战指南
  • vue antdesgin table 动态表头动态数据示例
  • [AIGC] SpringBoot的自动配置解析
  • Faiss assertion ‘err == cudaSuccess‘ failed in void faiss::gpu:runL2Norm()
  • Angular2开发踩坑系列-生产环境编译
  • eclipse的离线汉化
  • emacs初体验
  • jQuery(一)
  • js学习笔记
  • Netty 4.1 源代码学习:线程模型
  • node 版本过低
  • Swoft 源码剖析 - 代码自动更新机制
  • Twitter赢在开放,三年创造奇迹
  • Vue2 SSR 的优化之旅
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 深度学习入门:10门免费线上课程推荐
  • 通过git安装npm私有模块
  • 进程与线程(三)——进程/线程间通信
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • ‌前端列表展示1000条大量数据时,后端通常需要进行一定的处理。‌
  • #{}和${}的区别是什么 -- java面试
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • $.ajax()
  • (2020)Java后端开发----(面试题和笔试题)
  • (3)选择元素——(17)练习(Exercises)
  • (bean配置类的注解开发)学习Spring的第十三天
  • (二)斐波那契Fabonacci函数
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (七)glDrawArry绘制
  • (十一)手动添加用户和文件的特殊权限
  • (四)c52学习之旅-流水LED灯
  • (转)winform之ListView
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .Net插件开发开源框架
  • .NET和.COM和.CN域名区别
  • @JSONField或@JsonProperty注解使用
  • @Query中countQuery的介绍
  • @RequestBody详解:用于获取请求体中的Json格式参数
  • [ 第一章] JavaScript 简史
  • [ 数据结构 - C++]红黑树RBTree
  • []指针