深入理解BPF:从流量控制到快速数据路径
1. 流量控制基础
流量控制(Traffic Control)是管理网络流量的强大机制,其中涉及到队列规则(qdisc)、过滤器(filters)和类(classes)等概念。
-类(Classes):类是只能存在于有类队列规则(classful qdisc)中的对象,用于创建流量控制的层次结构。类可以附加过滤器,这些过滤器可作为另一个类或队列规则的入口点。
-无类队列规则(Classless qdiscs):无类队列规则不能有子对象,因为它不允许关联任何类。这意味着不能为无类队列规则附加过滤器,从BPF的角度来看,无类队列规则不太有趣,但对于简单的流量控制需求仍然有用。
2. 使用cls_bpf的流量控制分类器程序
cls_bpf分类器是一种特殊的分类器,它允许在网络数据路径中运行BPF程序。通过将BPF程序直接挂钩到入站(ingress)和出站(egress)层,这些程序可以访问相应数据包的sk_buff结构体。
以下是流量控制中BPF程序的执行流程:
graph LR A[网络流量进入] --> B[流量控制入站钩子] B --> C[执行入站BPF程序] C --> D[网络栈通知应用程序] D --> E[应用程序响应] E --> F[执行出站BPF程序] F --> G[返回控制给内核] G