ネットワークスタックの高速化を見ていく前に、TCPの入出力についてざっと把握しておいた方がいい。TCP受信時のFreeBSDにおける処理の流れは次のとおり。
- NICデバイス: データ受信
- カーネル: データ取得、リンクレイヤヘッダをデータから除く (ithread)
- カーネル: IPチェックサム検証、IPヘッダをデータから除く (netisr software ithread)
- カーネル: TCPチェックサム検証、TCPヘッダをデータから除く (netisr software ithread)
- カーネル: ソケットルックアップ (netisr software ithread)
- カーネル: セグメント再構築、ソケットへ配送 (netisr software ithread)
- カーネル: mbufs+clustersのデータをコピー (user thread)
- ユーザランド: ソケット経由でデータ受信 (user thread)
TCP送信時の処理の流れは次のとおり。
- ユーザランド: ソケット経由でデータ送信 (user thread)
- カーネル: mbufs+clustersへデータをコピー (user thread)
- カーネル: データをTCPセグメントへと分割 (user thread)
- カーネル: TCPヘッダカプセル化、チェックサム生成 (user thread)
- カーネル: IPヘッダカプセル化、チェックサム生成 (user thread)
- カーネル: Ethernetフレームカプセル化 (ithread)
- NICデバイス: データ送信
ithreadはカーネルの割り込みスレッドだ。