デフォルトのlinux TCP/IPスタックでTCP send/recvにzero-copyを使用できますか?デフォルトの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
zero-copyを避けるために、受け取ったペイロード付きのsocket-bufferの一部をkernel-spaceからuser-spaceにマップできますか?