# ゼロコピーネットワーキング
パケットデータをカーネルバッファとユーザー空間バッファの間でコピーすることなく転送する技術群。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]] — 共有リング型ゼロコピーの体系的実装
## 横断的知見
- 今後の取り込みで、複数ソース間の関係を追記する。
## 未解決の問い
- この概念をどのソース群で継続的に検証するか。