解析数据包时 eBPF XDP 模式和套接字过滤模式的区别 header 信息

Difference in eBPF XDP mode and Socket Filter Mode when parsing a packet header information

我想知道在解析数据包header信息时,eBPF XDP 和 eBPF 套接字过滤模式之间是否存在差异。

假设我想使用 eBPF 从数据包 header 中检索目标 IP 地址和源 IP 地址。

如果在 XDP 和套接字过滤模式之间这样做没有区别,也许最好在 XDP 中实现数据包监控功能而不是在套接字过滤程序中实现它?

如果是这样,使用 XDP 而不是使用套接字缓冲区来监视每个传入数据包是否总是更好,因为在与硬件卸载模式一起使用时,XDP 可以将其操作卸载到 NIC?

谢谢!

如果您的 kernel supports direct packet access 用于套接字过滤器程序,那么使用套接字过滤器或 XDP 程序解析它们之间确实没有什么区别。

然而,还有其他原因使人们更喜欢 tc 或套接字过滤器程序而不是 XDP 程序。主要原因可能是 XDP 有 relatively few helpers available,尤其是与 tc 程序相比。然后,不同的程序类型可以访问不同的信息;例如,tc 程序可以部分访问 skb,套接字过滤器程序可以访问套接字 uid 和 cookie。

作为对 pchaigno 回答的补充:硬件卸载与此无关。它同时支持 XDP 和 TC 程序,并且在两种情况下都会为您带来相同的性能。

在 XDP 和套接字中解析数据包 filters/TC 是相同的,所以如果您想要性能,请选择 XDP,就这样吧。不使用 XDP 的原因是 pchaigno 所说的:TC 的更多助手,对套接字缓冲区的访问。或者您的驱动程序不支持 XDP(在这种情况下,通用 XDP 应该为您带来与 TC 相当的性能)。请注意,这些额外的助手和套接字缓冲区访问可能不适用于卸载到硬件的程序(在 Netronome NFP 上,从 XDP 和 TC 卸载的程序都表现相同并且可以访问相同的助手子集)。

与监控传入数据包无关,但目前 TC 的另一大优势是能够在出口端添加过滤器。在撰写本文时,XDP 的支持工作正在进行中,但没有合并到内核中。