【问题标题】:Is there a way to query flow hash in Linux user space?有没有办法在 Linux 用户空间中查询流哈希?
【发布时间】:2021-10-18 02:04:52
【问题描述】:

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

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

【问题讨论】:

  • 为什么操作系统会计算哈希?
  • “网络哈希”是什么意思?路由器用于负载平衡的哈希?
  • 由 NIC 计算并由操作系统使用的哈希在 kernel documentation 中进行了描述,但我一直无法找到在用户空间中查询它的方法。了解散列值有助于优化用于数据包处理的 CPU。
  • 可能是tcpdump?

标签: linux sockets networking hash


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 2021-06-21
    • 2010-09-10
    • 2020-06-27
    • 2022-10-23
    • 1970-01-01
    相关资源
    最近更新 更多