我正在研究在我的应用程序中使用 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/