我们可以使用默认的 linux TCP/IP 堆栈对 TCP 发送/接收使用零拷贝吗?

Ale*_*lex 5 c sockets linux multithreading tcp

我们可以使用默认的 linux TCP/IP 堆栈对 TCP 发送/接收使用零拷贝吗?

例子:

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);
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

那么我们是否可以将接收到有效载荷的套接字缓冲区的一部分从内核空间映射到用户空间以避免零复制?

小智 5

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