有没有办法在 Linux 用户 space 中查询流哈希?

Is there a way to query flow hash in Linux user space?

假设我正在接收 UDP 数据包并且我想知道为该流计算了哪些网络哈希。有什么方法可以询问 OS 特定 socket/flow 的哈希是什么?

似乎应该有一种方法可以从用户空间查询 skb->hash,但我找不到获取该信息的方法。

您表示需要查询的是skb->hash。这让我误以为您可能对获取每个数据包 RSS 哈希值而不是一系列数据包的某些“流哈希”感兴趣。如果确实如此,答案是肯定的,有办法实现目标。

在Linux中,有PACKET_MMAP机制。长话短说,这个通用 API 允许应用程序设置一个 Rx/Tx 环 mmap 从内核到用户进程,绑定到给定的网络接口。接收到的数据包在环条目(槽)中可供应用程序使用,并且每个数据包都以内核定义的结构为前缀,其中包含有用的元信息。 PACKET_MMAP 机制有不同的 API 版本,特别是 TPACKET_V3(从 ~3.2 内核开始可用)在那里提供 RSS 散列(hv1.tp_rxhash 在 link下面),如果 requested/configured.

此外,应用程序可能要求数据包接收在进程之间进行负载平衡(PACKET_FANOUT_HASH 在下面的 link)。

您可能应该查看 https://www.kernel.org/doc/html/latest/networking/packet_mmap.html 以获得更多详细信息和有用的代码示例。