Können wir zero-copy für TCP send/recv mit dem Standard-Linux TCP/IP-Stack verwenden?Können wir zero-copy für TCP send/recv mit dem standardmäßigen Linux TCP/IP-Stack verwenden?
- Wie bekannt ist, können wir Socket-Puffer vom Kernel-Space auf den User-Space für RAW-Buchsen neu Karte: https://www.kernel.org/doc/Documentation/networking/packet_mmap.txt
Beispiel:
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);
- Ebenfalls bekannt , diese Nutzlast ändert sich beim Hochfahren mit dem TCP-Stack nicht: https://www.informatix-sol.com/docs/TCP_bypass.pdf
Also können wir einen Teil von Socket-Buffer mit empfangener Payload von Kernel-Space auf User-Space abbilden, um Nullkopie zu vermeiden?