XDP学习笔记

        XDP的使用与eBPF程序分不开,因此要了解学历XDP,须知道什么是eBPF、什么是XDP。

概念

eBPF

         BPF(Berkeley Packet Filter)是一种灵活且高效的数据包过滤技术,最初由 BSD Unix 中的网络子系统引入;BPF 允许用户编写简单的程序来过滤和处理网络数据包,以实现网络监控、安全策略、流量分析等功能

        eBPF是Berkeley Packet Filter(BPF)的扩展版本(传统的BPF即cBPF)。它是在Linux内核中运行的抽象虚拟机 (VM),就像Java虚拟机(JVM)可以在受控环境中运行应用程序一样。eBPF可以在内核的沙箱内执行用户自定义的程序,它通常用在Linux中编写低级监控、跟踪或网络程序

XDP

        eXpress Data Path(XDP)是一个框架,可以在BPF应用程序中执行高速数据包处理。为了更快地响应网络操作,XDP会尽快运行BPF程序,通常是在网络接口接收到数据包后立即运行。

        XDP是一种允许开发人员将eBPF程序附加到低级钩子的技术,是Linux内核中的网络设备驱动程序以及在设备驱动程序之后运行的通用钩子实现。
        XDP可用于在eBPF架构中实现高性能数据包处理,主要使用内核旁路技术。这大大减少了内核所需的开销,因为它不需要处理上下文切换、网络层处理、中断等。网络接口卡(NIC)的控制被转移到eBPF程序。如果你需要更高的网络速度(10 Gbps及以上)工作,这一点尤其重要。

XDP工作原理

        XDP程序可以直接连接到网络接口,每当在网络接口上收到一个新的数据包时,XDP程序都会收到一个回调,并且可以快速地对数据包执行操作。

        AF_XDP 和 AF_INET 一样,也是 address family 的一种,AF_XDP 就相当于 socket 底层通讯方式的不同实现,AF_INET 可以用于 IPv4 类型地址的通讯,AF_XDP 则是一套基于 XDP 的通讯的实现。

XDP工作模式 

        XDP有三种工作模式:

        1)Native XDP,即运行在网络驱动实现的poll()函数中,需要网卡驱动的支持;

        2)Generic XDP,如果网卡驱动不支持XDP,则可以运行在receive_skb()函数中

        3)Offload XDP,这种模式是指将XDP程序offload到网卡中,这需要网卡硬件的支持,编译器将BPF代码翻译成网络原生指令并在网卡上运行。

XDP程序案例

        编写一个XDP程序的主要分为几个步骤:

        1) 安装必要的工具和软件包

  sudo apt-get install clang llvm libelf-dev linux-headers-$(uname -r) gcc-multilib

        2) 编写 XDP 代码并保存为 .c 文件,例如 xdp_xx.c;在编写xdp程序通常需要明确指定函数在哪个section,如:SEC("xx");

        3)使用 Clang 编译 XDP 代码并生成 ELF 文件

        4) 在需要应用 XDP 的网络接口上启用 XDP 程序

XDP程序返回码

        XDP程序结束后会返回一个结果,告诉调用者接下来如何处理这个包:

        1) XDP_DROP, 丢弃这个包,主要用于报文过滤的安全场景。

        2)XDP_PASS,将这个包“交给/还给内核”,继续走正常的内核处理流程。

        3)XDP_TX,从收到包的网卡上再将这个包发送出去(即hairpin模式),主要用于负载均衡模式;

        4)XDP_REDIRECT,和XDP_TX类似,但是通过另外一个网卡发送出去,除此之外,还可以实现将报文重定向到其他CPU处理,类似与XDP_PASS继续内核处理,当前CPU继续处理后续报文的接收。

        5)XDP_ABORTED,表示程序产生异常,行为类似XDP_DROP,但是会通过一个tracepoint打印日志追踪。

参考连接

epbf和xdp基础知识

  • 21
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
XDP(eXpress Data Path)是Linux内核中的一种高效、低延迟的数据包处理技术,它可以在数据包进入内核网络协议栈之前进行处理,从而避免了协议栈带来的性能开销。XDP主要用于数据包的过滤、转发、负载均衡等场景,可以在数据包处理过程中进行各种自定义操作,如修改数据包头、丢弃数据包等。 下面是Linux XDP的详细介绍: 1. XDP程序的开发 XDP程序是用C语言编写的,需要先安装相关的开发环境和依赖库,如clang、libbpf等。XDP程序需要使用eBPF技术来对数据包进行处理,因此需要熟悉eBPF的基本语法和数据结构。具体的开发步骤可以参考官方文档和相关教程。 2. XDP程序的加载 XDP程序可以通过几种方法加载到内核中,如使用iproute2工具中的ip命令、使用BPF系统调用、使用libbpf库等。加载XDP程序时需要指定网卡名称和XDP处理模式,如XDP_DROP、XDP_TX等。加载成功后,XDP程序会与网卡进行绑定,并开始处理接收到的数据包。 3. XDP程序的执行流程 当数据包到达网卡时,XDP程序会被触发进行处理。XDP程序可以访问数据包的各个字段,如源IP地址、目的IP地址、协议类型等,在此基础上进行过滤、转发等操作。XDP程序执行完成后,可以选择将数据包交给协议栈继续处理,也可以选择直接丢弃数据包。XDP程序的执行速度非常快,因此可以大大提升网络应用的性能。 4. XDP程序的应用场景 XDP程序可以应用于各种网络场景,如DDoS防护、网络监控、负载均衡等。实际应用中,可以根据具体需求编写不同的XDP程序,实现各种自定义功能。例如,在DDoS防护场景中,可以编写XDP程序对数据包进行过滤,防止恶意攻击;在负载均衡场景中,可以编写XDP程序对数据包进行分类,实现负载均衡等功能。 5. XDP程序的性能优化 为了进一步提高XDP程序的性能,可以采用一些优化技术,如使用多核CPU、使用XDP_REDIRECT模式等。多核CPU可以提高XDP程序的并发处理能力,同时使用XDP_REDIRECT模式可以将数据包发送到用户态应用程序中进行处理,从而进一步提高网络应用的性能。 以上就是Linux XDP的详细介绍,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值