c++ - TCP 和 PF_RING

标签 c++ c linux-kernel pf-ring

我正在研究在我的应用程序中使用 PF_RING 进行发送和接收。

如果我打算使用 PF_RING 来维护 TCP 连接,看起来我需要自己手动“伪造”IP 和 TCP 消息,如 pfring_send发送原始数据包。这是否意味着我必须在 PF_RING 之上手动重新实现 TCP?

我知道使用 PF_RING 接收有明显的优势,有没有人尝试使用 PF_RING 发送数据?与普通发送调用相比有明显优势吗?

注意:我没有使用 DNA(直接 NIC 访问),我只是使用带有 NIC 感知驱动程序的内核部分绕过。

最佳答案

要回答您的第一个问题,是的,您必须从头开始手动构建 TCP/IP 消息、MAC 地址等。举个例子看看 pfsend.c来自 ntop.org .

ntop.org 也做了一个 PF_RING user guide可用,包含解释。

至于使用 PF_RING 发送数据,这是绝对可行的,其想法是绕过任何和所有关于线路上实际数据的概念并尽可能快地发送,请参阅 wire speed traffic generation来自 ntop.org。与使用 TCP/IP 内核的正常发送调用相比,它的唯一优势是您可以发送数据 1. 更快, 2. 完全未格式化到网络上。例如,当您想将以前捕获的数据包/多个数据包回放到网络上时,2 可能会很方便。


除非您有特定的用例要求您在没有内核干预的情况下访问原始底层数据,否则绝对没有充分的理由以任何方式使用 PF_RING。您最好的选择是使用可用的标准 socket(),在大多数情况下,您可以获得的性能绰绰有余。

您想到了什么具体的用例?

关于c++ - TCP 和 PF_RING,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13059070/

相关文章:

C++ 模板,模棱两可的重载

c - 了解进程是否已被 exec() 调用

c - 调用位于堆中的函数时出现段错误

linux - 如何在 sysfs 中获取路径的父对象?

linux - 为什么进程的虚拟地址空间有空洞

c - 从以太网 header 打印 MAC 地址

c++ - 为什么map.find使用<运算符而不是==运算符?

c++ - 如何实时找到 OpenCV 轮廓的平均强度

c++ - 确定点是否在 boost::geometry::linear_ring 会计方向内

c - 使用 malloc 后无法复制数组