首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于默认的linux /IP堆栈,我们可以对TCP发送/recv使用零拷贝吗?

对于默认的linux /IP堆栈,我们可以对TCP发送/recv使用零拷贝吗?
EN

Stack Overflow用户
提问于 2017-07-11 09:50:23
回答 2查看 6K关注 0票数 5

对于默认的linux /IP堆栈,我们可以使用zero-copy作为TCP发送/recv吗?

  • 众所周知,我们可以将套接字缓冲区从内核空间重新映射到原始套接字的用户空间:mmap.txt

示例:

代码语言:javascript
复制
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);
  • 也知道,在使用TCP-堆栈:bypass.pdf提升时,这个有效载荷不会改变。

那么,我们能否将接收到的有效载荷从内核空间映射到用户空间以避免零拷贝呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-27 14:28:38

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

票数 4
EN

Stack Overflow用户

发布于 2017-07-11 12:48:51

从技术上讲,实现零拷贝TCP是不可能的。

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

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

因此,唯一的方法是先写到内核区域,然后再复制到app区域。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45031093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档