BPF 流量控制分类器详解
1. 流量控制概述
流量控制(Traffic Control)是内核数据包调度子系统架构,由机制和排队系统组成,可决定数据包的流动方式和接收情况。其常见用例包括:
- 对特定类型的数据包进行优先级排序。
- 丢弃特定类型的数据包。
- 带宽分配。
当需要在系统中重新分配网络资源时,流量控制是一种有效的方式。为了充分发挥其作用,需要根据要运行的应用程序类型部署特定的流量控制配置。
流量控制提供了一个可编程的分类器 cls_bpf,可用于在调度操作的不同级别进行挂钩,从而读取和更新套接字缓冲区及数据包元数据,实现流量整形、跟踪、预处理等功能。从内核 4.1 开始,cls_bpf 支持 eBPF,这意味着此类程序可以访问 eBPF 映射、支持尾调用、访问 IPv4/IPv6 隧道元数据,并使用 eBPF 提供的帮助函数和实用工具。
与流量控制网络配置交互的工具属于 iproute2 套件,其中包括用于操作网络接口的ip命令和用于操作流量控制配置的tc命令。
2. 相关术语
2.1 排队规则(Queueing Disciplines,qdisc)
排队规则(qdisc)定义了用于将数据包排入接口的调度对象,可分为无类(classless)和有类(classful)两种。默认的 qdisc 是pfifo_fast,它是无类的,将数据包排入三个先进先出(FIFO)队列,并根据优先级进行出队操作。但对于回环(lo)或虚拟以太网设备(veth)等虚拟设