# ゼロコピーネットワーキング パケットデータをカーネルバッファとユーザー空間バッファの間でコピーすることなく転送する技術群。CPU サイクルとメモリ帯域を節約し、高スループット・低レイテンシを実現する。 ## なぜコピーが問題になるか 標準的な `recv()` 呼び出しの経路: ``` NIC DMA → カーネルバッファ (skb) → copy_to_user() → ユーザーバッファ ``` 10 Gbit/s = 14.88 Mpps の規模では、パケットごとの `memcpy` が CPU 律速になる。1500 バイト Ethernet フレームを 10 Mpps 処理するだけで**150 GB/s** 相当のメモリ帯域を消費する計算になる。 ## ゼロコピーの実現手法 ### 1. 共有メモリリング(netmap / PF_RING) カーネルとユーザー空間が同一物理メモリページを `mmap` で参照。パケットバッファのポインタだけを交換する。[[netmap]] はこの手法を OS プリミティブと統合した形で実装。 ### 2. sendfile / splice(ファイル→ソケット) `sendfile(2)` はファイルデータをユーザー空間を経由せずソケットへ直接転送。HTTP ファイル配信サーバ(Nginx 等)で広く使用。 ### 3. DMA 直接配置(DPDK / XDP) NIC の DMA エンジンがパケットをユーザー空間バッファに直接書き込む。カーネルスタックを完全に迂回。 ## netmap におけるゼロコピー [[netmap]] はゼロコピーを実現しつつ**デバイスレジスタ保護**を維持する点が特徴: - ユーザー空間からはリングバッファ(パケットデータ)のみアクセス可能 - NIC のコントロールレジスタへの直接アクセスは禁止 - DPDK(完全バイパス)とカーネル socket(完全コピー)の中間に位置する ## 関連概念 - [[カーネルバイパスネットワーキング]] — ゼロコピーを含むより広い設計パターン - [[netmap]] — OS 統合型ゼロコピーの実装例 ## 主要ソース - [[@2012__USENIX-ATC__netmap A Novel Framework for Fast Packet IO]] — 共有リング型ゼロコピーの体系的実装 ## 横断的知見 - 今後の取り込みで、複数ソース間の関係を追記する。 ## 未解決の問い - この概念をどのソース群で継続的に検証するか。