2017-07-11 43 views
0

我們可以使用zero-copy作爲TCP send/recv與默認的linux TCP/IP協議棧嗎?我們可以使用默認的linux TCP/IP協議棧的TCP send/recv的零拷貝嗎?

實施例:

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

enter image description here

那麼我們可以將套接字緩衝區的一部分與接收到的有效載荷從內核空間映射到用戶空間以避免零複製?

回答

1

從技術上講,不可能實現零拷貝TCP。

假設有多個應用程序使用TCP堆棧,每個應用程序擁有一個內存區域,其中應該寫入tcp數據。

當數據包到達時,NIC硬件不知道數據包屬於哪個連接,所以NIC無法確定要寫入數據包的內存區域。

所以唯一的方法是先寫入內核區域,然後再複製到應用程序區域。