【问题标题】:Implementing kernel bypass for a network card [closed]为网卡实现内核绕过[关闭]
【发布时间】:2013-08-24 07:55:57
【问题描述】:

我的情况:

我希望网卡上接收到的数据尽快到达我的应用程序。我得出的结论是,最好的(如最低延迟)解决方案是在我的用户空间中实现网络堆栈。

网络流量可以是专有协议(如果它使编写网络堆栈更容易的话),因为它只是在两台本地计算机之间。

1) 我的网络堆栈需要实现的最少功能列表是什么?

2) 我是否需要删除/禁用当前在我的 Linux 中的任何网络堆栈/我该怎么做?

3) 我将如何编写驱动程序?我想我需要找到调用驱动程序代码的确切位置,然后我不会调用驱动程序/网络堆栈,而是将数据发送到我可以从我的应用程序访问的一块内存中?

【问题讨论】:

  • 您是如何在没有实施它并测试相关性能和其他特性的情况下“得出”这个结论的?那句话应该以“我假设...”开始

标签: c linux network-programming linux-kernel driver


【解决方案1】:

我认为已经内置的 PF_PACKET 套接字类型正是您想要实现的。

缺点:应用程序必须以 root 权限启动。

本页描述了 PF_PACKET 系统的一些增强功能: Linux packet mmap

【讨论】:

  • 所以 PF_PACKET 将基本上跳过(内核)网络堆栈?
  • PF_PACKET 只会检查以太网帧类型(例如 0x800 是 IPv4)。您可以定义一个用户类型(例如 0x1234)并将具有此类型的数据包发送到您的应用程序。您的应用程序接收原始以太网数据包并发送原始以太网数据包。该系统似乎没有最佳性能 - 这就是链接(Linux 数据包 mmap)描述黑客攻击的原因。
【解决方案2】:

内核控制着网卡。每当您在内核和用户空间之间传递数据时,内核环之间都会发生上下文切换,这是昂贵的。我的理解是,您将使用标准 API,同时将缓冲区设置为更大的大小,从而允许一次在用户和内核空间之间复制更大的数据块,从而减少给定数据大小的上下文切换次数。

就实现您自己的堆栈而言,一个人不可能创建比内核中内置的堆栈更快的网络堆栈。

如果 linux 内核无法以您需要的速度处理数据包,您可能需要研究具有更多板载硬件处理能力的 NIC 卡。这些东西用于网络吞吐量测试等。

【讨论】:

  • 但这是一个专有协议,它确实不需要 Linux 网络堆栈的整个“重量”。后者是为了适应 TCP/UDP 等而编写的,而我只想要两台计算机之间的专用协议。另外我也想通过这个来学到很多东西。
  • 你看过他们是如何实现“PF_RING”ntop.org/products/pf_ring的吗?从根本上说,除非您只在内核空间中做所有事情,否则我认为这是不可能的。您能否提供有关您的申请的更多信息?
猜你喜欢
  • 1970-01-01
  • 2013-08-22
  • 2013-02-24
  • 2012-01-04
  • 1970-01-01
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
  • 2019-09-30
相关资源
最近更新 更多