2017-07-11 21 views
0

デフォルトのlinux TCP/IPスタックでTCP send/recvにzero-copyを使用できますか?デフォルトの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); 

zero-copyを避けるために、受け取ったペイロード付きのsocket-bufferの一部をkernel-spaceからuser-spaceにマップできますか?

答えて

1

ゼロコピーTCPは、カーネル内のTCP実装では使用できません。

使用可能なユーザー空間のTCP実装があります。User Space Networking Fuels NFV Performanceのリストを参照してください。

1

技術的には、ゼロコピーTCPを実装することは不可能です。

TCPスタックを使用するアプリケーションが複数あると仮定すると、各アプリケーションは、TCPデータが書き込まれるはずのメモリ領域を所有しています。

パケットが到着すると、NICハードウェアはパケットがどの接続に属しているかを知らないので、NICはパケットを書き込むメモリ領域を判断できません。

唯一の方法は、最初にカーネル領域に書き込んだ後、後でアプリ領域にコピーすることです。

関連する問題