我們可以使用zero-copy作爲TCP send/recv與默認的linux TCP/IP協議棧嗎?我們可以使用默認的linux TCP/IP協議棧的TCP send/recv的零拷貝嗎?
- 如已知的,我們可以重新映射從內核空間套接字緩衝區爲RAW-插座用戶空間:https://www.kernel.org/doc/Documentation/networking/packet_mmap.txt
實施例:
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堆棧提升時,有效載荷不會改變:https://www.informatix-sol.com/docs/TCP_bypass.pdf
那麼我們可以將套接字緩衝區的一部分與接收到的有效載荷從內核空間映射到用戶空間以避免零複製?