我们可以使用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);
那么我们可以将接收到的有效负载的一部分socket-buffer从内核空间映射到用户空间以避免零拷贝吗?
答案 0 :(得分:3)
4.18合并的零拷贝收到对内核TCP堆栈的支持,请参阅:
答案 1 :(得分:1)
您不能将零拷贝TCP与TCP的内核实现一起使用,没有。
有可用的用户空间TCP实现,请参阅User Space Networking Fuels NFV Performance中的列表。
答案 2 :(得分:1)
从技术上讲,无法实现零拷贝TCP。
假设有多个应用程序使用TCP堆栈,每个应用程序都拥有一个应该写入tcp数据的内存区域。
当数据包到来时,NIC硬件不知道该数据包属于哪个连接,因此NIC无法确定要写入数据包的内存区域。
所以唯一的方法是首先写入内核区域,然后再复制到应用程序区域。