# lwIP
lwIP(lightweight IP) は、[[Adam Dunkels]]が設計・実装した、機能性と移植性を重視する軽量 TCP/IP スタックである。
## 本論文での構成
- IP・ICMP・UDP・TCP を実装
- 複数のネットワークインターフェースと複数の TCP 接続をサポート
- TCP オプション、可変 MSS、RTT 推定、フロー制御、スライディングウィンドウ、輻輳制御、順序外データ、緊急データを実装
- 固定サイズバッファをグローバルなメモリプールから動的に割り当て、参照カウンタで複数箇所から共有
- 送信済みデータを確認応答までキューに保持し、スタック側で再送
## 評価
Ethernut/Atmega128 上の AVR 実験では、lwIP のコードサイズは 21,756 バイト、RAM 使用量は送信ウィンドウに応じて 5〜16 キロバイトだった。
送信ウィンドウが 3,000 バイトを超えると、1 RTT あたり 2 セグメントを送信でき、受信側の遅延 ACK による uIP と同型の低下を回避した。
遅延なしの最大スループットは、この組み込みシステム上で約 415 キロバイト/秒に達した。(Source: [[@2003__MobiSys__Full TCP IP for 8-Bit Architectures]] §8.2–8.4, Figure 7, Table 5)
## 本論文での利用
[[zpoline]] の評価では、lwIP を [[DPDK]] 上で動作させ、単純 HTTP サーバーと Redis へユーザー空間 TCP/IP スタックを透明に適用する基盤として使った。
システムコールフック機構の差が、ネットワーク処理の多い既存アプリケーションのスループットへ与える影響を比較する構成である。(Source: [[@2023__USENIX-ATC__zpoline - a system call hook mechanism based on binary rewriting]] §3.3)
## 関連
- [[uIP]] — 同じ論文で比較された、資源量を絶対最小化する実装。
- [[組み込みTCP IP|組み込みTCP/IP]] — lwIP と uIP が示す設計空間。
- [[zpoline]]
- [[DPDK]]