2017-07-11 1 views
0

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?

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); 

Also können wir einen Teil von Socket-Buffer mit empfangener Payload von Kernel-Space auf User-Space abbilden, um Nullkopie zu vermeiden?

Antwort

1

Technisch ist es unmöglich, zero-copy TCP zu implementieren.

Angenommen, es gibt mehrere Anwendungen mit TCP-Stack, jede App besitzt eine Speicherregion, in die TCP-Daten geschrieben werden sollen.

Wenn ein Paket kommt, weiß die NIC-Hardware nicht, zu welcher Verbindung das Paket gehört, daher kann die NIC nicht feststellen, in welchem ​​Speicherbereich das Paket geschrieben werden soll.

Die einzige Möglichkeit besteht darin, zuerst in eine Kernel-Region zu schreiben und dann später in die App-Region zu kopieren.

Verwandte Themen