我们可以使用默认的linux TCP / IP堆栈对TCP send / recv进行零拷贝吗?

时间:2017-07-11 09:50:24

标签: c linux multithreading sockets tcp

我们可以使用zero-copy进行TCP send / recv和默认的linux TCP / IP堆栈吗?

示例:

int packet_socket = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); // raw-sockets

struct tpacket_req3 req;  
setsockopt(packet_socket, SOL_PACKET , PACKET_RX_RING , (void*)&req , sizeof(req));
mapped_buffer = (uint8_t*)mmap(NULL, req.tp_block_size * req.tp_block_nr,
    PROT_READ | PROT_WRITE, MAP_SHARED | MAP_LOCKED, packet_socket, 0);

enter image description here

那么我们可以将接收到的有效负载的一部分socket-buffer从内核空间映射到用户空间以避免零拷贝吗?

3 个答案:

答案 0 :(得分:3)

4.18合并的零拷贝收到对内核TCP堆栈的支持,请参阅:

答案 1 :(得分:1)

您不能将零拷贝TCP与TCP的内核实现一起使用,没有。

有可用的用户空间TCP实现,请参阅User Space Networking Fuels NFV Performance中的列表。

答案 2 :(得分:1)

从技术上讲,无法实现零拷贝TCP。

假设有多个应用程序使用TCP堆栈,每个应用程序都拥有一个应该写入tcp数据的内存区域。

当数据包到来时,NIC硬件不知道该数据包属于哪个连接,因此NIC无法确定要写入数据包的内存区域。

所以唯一的方法是首先写入内核区域,然后再复制到应用程序区域。