Linux 原始套接字和 DPDK 如何将数据传递到用户空间之间的区别?

问题描述 投票:0回答:1

我想了解 DPDK 如何将数据包数据传递到用户空间与 Linux 原始套接字之间的区别?

原始套接字的手册页暗示内核不进行数据包处理:

数据包套接字用于在设备上接收或发送原始数据包 驱动程序(OSI 第 2 层)级别。它们允许用户实现协议 物理层之上的用户空间中的模块。

SOCK_RAW 数据包在设备驱动程序之间传递,没有任何 数据包数据的变化。

https://man7.org/linux/man-pages/man7/packet.7.html

乍一看可能与“内核绕过”相同。但是,我认为这是不正确的,否则 DPDK、OpenOnload、AF_XDP 等就没有意义了?

那么,DPDK 如何将帧/数据包数据传递到用户空间与使用原始套接字有什么区别?

原始套接字数据包的答案是否仍然通过内核,仍然导致上下文切换和复制等,但用户空间(最终)看到整个数据包未修改?而相比之下,DPDK 将(未修改的)数据直接传递到用户空间,而无需复制和上下文切换(来自内核)?

所以两者都向用户空间提供相同的数据,只是通过不同的路径?

sockets linux-kernel network-programming dpdk raw-sockets
1个回答
0
投票

你离答案很近了。 SOCK_RAW 仍然需要内核上下文切换,最重要的是,数据包复制到/从内核内存。但 DPDK 不需要它们,数据包直接进入或来自用户空间内存。

© www.soinside.com 2019 - 2024. All rights reserved.