对于默认的linux /IP堆栈,我们可以使用zero-copy作为TCP发送/recv吗?
示例:
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);

那么,我们能否将接收到的有效载荷从内核空间映射到用户空间以避免零拷贝呢?
发布于 2020-02-27 14:28:38
4.18合并的零拷贝接收对内核内TCP堆栈的支持,请参见:
发布于 2017-07-11 12:48:51
从技术上讲,实现零拷贝TCP是不可能的。
假设有多个应用程序使用TCP堆栈,每个应用程序都拥有一个内存区域,其中tcp数据应该被写入。
当数据包出现时,NIC硬件不知道数据包属于哪个连接,因此NIC无法确定写入数据包的内存区域。
因此,唯一的方法是先写到内核区域,然后再复制到app区域。
https://stackoverflow.com/questions/45031093
复制相似问题