# カーネルバイパスネットワーキング
パケット処理経路からカーネルのネットワークスタックを部分的または完全に迂回し、ユーザー空間プロセスが NIC と直接やり取りする設計パターン。
## 動機
従来の socket API では次のオーバーヘッドが線速到達を妨げる:
1. **パケットごとのメモリ割り当て・解放**(`kmalloc`/`kfree`)
2. **カーネル-ユーザー空間コピー**(`copy_to_user`/`copy_from_user`)
3. **システムコール**(`recvmsg`/`sendmsg` のたびに文脈切り替え)
4. **割り込み処理のオーバーヘッド**
これら全部が積み重なると、10 Gbit/s = 14.88 Mpps の規模では CPU 律速になる。
## 主要アプローチ
| 実装 | 戦略 | カーネルドライバ | 初出 |
|------|------|-----------------|------|
| **[[netmap]]** | 共有リング + プリアロケーション + バッチ syscall | 改変版を維持 | 2012(ATC) |
| **DPDK** | NIC の完全ユーザー空間制御(UIO/VFIO) | 排除 | 2013(Intel) |
| **PF_RING** | カーネルモジュール + 共有リング | 維持 | 〜2004 |
| **XDP(eXpress Data Path)** | eBPF でカーネル内の早期パス | 維持 | 2016(Linux) |
## netmap vs. DPDK の本質的差異
- **netmap**: OS 保護機構を維持。デバイスレジスタはカーネルドライバが管理。移植性・安全性重視。
- **DPDK**: デバイスをカーネルから完全に切り離しユーザー空間で直制御。生パフォーマンス最大化。
XDP はカーネル内で eBPF プログラムを実行し、ネットワークスタックを通過させる前にパケットを処理する点でやや異なる位置づけ。
## カーネルバイパスと OS チューニングの関係
[[RPS(Receive Packet Steering)]]・[[RFS(Receive Flow Steering)]]は**カーネル内**でのパケット分散最適化であり、カーネルバイパスとは異なるレイヤー。カーネルバイパスが「スタックを迂回」するのに対し、RPS/RFS は「スタック内でコアを効率活用」する。
## 主要ソース
- [[@2012__USENIX-ATC__netmap A Novel Framework for Fast Packet IO]] — netmap(Best Paper, ATC '12)
- [[@1993__USENIX__The BSD Packet Filter A New Architecture for User-level Packet Capture]] — ユーザー空間パケット処理の源流
## 横断的知見
- 今後の取り込みで、複数ソース間の関係を追記する。
## 未解決の問い
- この概念をどのソース群で継続的に検証するか。